106 lines
2.8 KiB
TypeScript
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(),
|
|
},
|
|
],
|
|
};
|