import { CollectionConfig } from "payload"; import { isDeveloper } from "@/utils/access-control/isRole"; import hasRoles from "@/utils/access-control/hasRoles"; export const BankAccounts: CollectionConfig = { slug: "bank-accounts", admin: { group: "Banking", useAsTitle: "name", defaultColumns: [ "name", "accountType", "ownerUser", "ownerFaction", "balance", "status", "currency", ], }, access: { read: ({ req }) => !!req.user, create: ({ req }) => hasRoles(["admin", "developer"], req.user), update: ({ req }) => hasRoles(["admin", "developer"], req.user), delete: isDeveloper, }, fields: [ { name: "name", type: "text", required: true, admin: { description: 'Display name for the account (e.g., "Unit Treasury", "Red Faction Reserve").', }, }, { name: "accountType", type: "select", required: true, defaultValue: "personal", options: [ { label: "Treasury", value: "treasury" }, { label: "Faction", value: "faction" }, { label: "Personal", value: "personal" }, ], admin: { description: "Treasury = unit-level central funds. Faction = a specific faction's funds. Personal = an individual operator's wallet.", }, }, { name: "ownerFaction", type: "relationship", relationTo: "factions", admin: { condition: (data, siblingData) => (siblingData?.accountType ?? data?.accountType) === "faction", description: "The faction that owns this account.", }, }, { name: "ownerUser", type: "relationship", relationTo: "users", admin: { condition: (data, siblingData) => (siblingData?.accountType ?? data?.accountType) === "personal", description: "The operator who owns this personal account.", }, }, { name: "currency", type: "relationship", relationTo: "resources", required: true, admin: { description: "The currency this account is denominated in (normally the main currency set in Game Rules).", }, }, { name: "balance", type: "number", defaultValue: 0, admin: { readOnly: true, description: "Current account balance. Maintained automatically by banking transactions.", }, }, { name: "status", type: "select", required: true, defaultValue: "open", options: [ { label: "Open", value: "open" }, { label: "Frozen", value: "frozen" }, { label: "Closed", value: "closed" }, ], }, { name: "createdAt", type: "date", defaultValue: () => new Date().toISOString(), }, ], };