1
0
Fork 0
polaris-task-force/src/collections/banking/BankAccounts.ts

106 lines
2.8 KiB
TypeScript

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(),
},
],
};