@things-factory/accounting 10.1.232 → 10.1.234

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (90) hide show
  1. package/dist-client/tsconfig.tsbuildinfo +1 -1
  2. package/dist-server/service/account/account-mutation.js +7 -53
  3. package/dist-server/service/account/account-mutation.js.map +1 -1
  4. package/dist-server/service/account/account-service.d.ts +15 -0
  5. package/dist-server/service/account/account-service.js +40 -0
  6. package/dist-server/service/account/account-service.js.map +1 -1
  7. package/dist-server/service/bank-account/bank-account-history.d.ts +7 -0
  8. package/dist-server/service/bank-account/bank-account-history.js +29 -0
  9. package/dist-server/service/bank-account/bank-account-history.js.map +1 -1
  10. package/dist-server/service/bank-account/bank-account-mutation.js +4 -4
  11. package/dist-server/service/bank-account/bank-account-mutation.js.map +1 -1
  12. package/dist-server/service/bank-account/bank-account-query.d.ts +3 -0
  13. package/dist-server/service/bank-account/bank-account-query.js +23 -0
  14. package/dist-server/service/bank-account/bank-account-query.js.map +1 -1
  15. package/dist-server/service/bank-account/bank-account-service.d.ts +27 -0
  16. package/dist-server/service/bank-account/bank-account-service.js +55 -0
  17. package/dist-server/service/bank-account/bank-account-service.js.map +1 -1
  18. package/dist-server/service/bank-account/bank-account-type.d.ts +9 -0
  19. package/dist-server/service/bank-account/bank-account-type.js +33 -0
  20. package/dist-server/service/bank-account/bank-account-type.js.map +1 -1
  21. package/dist-server/service/bank-account/bank-account.d.ts +7 -0
  22. package/dist-server/service/bank-account/bank-account.js +29 -0
  23. package/dist-server/service/bank-account/bank-account.js.map +1 -1
  24. package/dist-server/service/bank-account/card-query.d.ts +24 -0
  25. package/dist-server/service/bank-account/card-query.js +140 -0
  26. package/dist-server/service/bank-account/card-query.js.map +1 -0
  27. package/dist-server/service/bank-account/card-rules.d.ts +21 -0
  28. package/dist-server/service/bank-account/card-rules.js +30 -0
  29. package/dist-server/service/bank-account/card-rules.js.map +1 -0
  30. package/dist-server/service/bank-account/card-summary.d.ts +29 -0
  31. package/dist-server/service/bank-account/card-summary.js +42 -0
  32. package/dist-server/service/bank-account/card-summary.js.map +1 -0
  33. package/dist-server/service/bank-account/index.d.ts +2 -1
  34. package/dist-server/service/bank-account/index.js +2 -1
  35. package/dist-server/service/bank-account/index.js.map +1 -1
  36. package/dist-server/service/expenditure-request/card-charge-query.d.ts +10 -0
  37. package/dist-server/service/expenditure-request/card-charge-query.js +54 -0
  38. package/dist-server/service/expenditure-request/card-charge-query.js.map +1 -0
  39. package/dist-server/service/expenditure-request/expenditure-request-item.d.ts +4 -0
  40. package/dist-server/service/expenditure-request/expenditure-request-item.js +19 -1
  41. package/dist-server/service/expenditure-request/expenditure-request-item.js.map +1 -1
  42. package/dist-server/service/expenditure-request/expenditure-request-mutation.js +2 -1
  43. package/dist-server/service/expenditure-request/expenditure-request-mutation.js.map +1 -1
  44. package/dist-server/service/expenditure-request/expenditure-request-rules.d.ts +26 -2
  45. package/dist-server/service/expenditure-request/expenditure-request-rules.js +19 -2
  46. package/dist-server/service/expenditure-request/expenditure-request-rules.js.map +1 -1
  47. package/dist-server/service/expenditure-request/expenditure-request-service.d.ts +6 -0
  48. package/dist-server/service/expenditure-request/expenditure-request-service.js +35 -1
  49. package/dist-server/service/expenditure-request/expenditure-request-service.js.map +1 -1
  50. package/dist-server/service/expenditure-request/expenditure-request-type.d.ts +2 -0
  51. package/dist-server/service/expenditure-request/expenditure-request-type.js +8 -0
  52. package/dist-server/service/expenditure-request/expenditure-request-type.js.map +1 -1
  53. package/dist-server/service/expenditure-request/index.d.ts +2 -1
  54. package/dist-server/service/expenditure-request/index.js +2 -1
  55. package/dist-server/service/expenditure-request/index.js.map +1 -1
  56. package/dist-server/service/index.d.ts +4 -1
  57. package/dist-server/service/index.js +3 -0
  58. package/dist-server/service/index.js.map +1 -1
  59. package/dist-server/service/payment/card-bill-target.d.ts +2 -0
  60. package/dist-server/service/payment/card-bill-target.js +37 -0
  61. package/dist-server/service/payment/card-bill-target.js.map +1 -0
  62. package/dist-server/service/payment/index.d.ts +1 -0
  63. package/dist-server/service/payment/index.js +1 -0
  64. package/dist-server/service/payment/index.js.map +1 -1
  65. package/dist-server/service/recurring-cash-item/recurring-cash-item-query.d.ts +2 -0
  66. package/dist-server/service/recurring-cash-item/recurring-cash-item-query.js +14 -0
  67. package/dist-server/service/recurring-cash-item/recurring-cash-item-query.js.map +1 -1
  68. package/dist-server/service/recurring-cash-item/recurring-cash-item-service.d.ts +5 -0
  69. package/dist-server/service/recurring-cash-item/recurring-cash-item-service.js +22 -1
  70. package/dist-server/service/recurring-cash-item/recurring-cash-item-service.js.map +1 -1
  71. package/dist-server/service/recurring-cash-item/recurring-schedule.d.ts +5 -1
  72. package/dist-server/service/recurring-cash-item/recurring-schedule.js +10 -2
  73. package/dist-server/service/recurring-cash-item/recurring-schedule.js.map +1 -1
  74. package/dist-server/service/transaction/transaction-query.d.ts +5 -0
  75. package/dist-server/service/transaction/transaction-query.js +3 -3
  76. package/dist-server/service/transaction/transaction-query.js.map +1 -1
  77. package/dist-server/service/transaction/transaction-service.d.ts +5 -1
  78. package/dist-server/service/transaction/transaction-service.js +15 -10
  79. package/dist-server/service/transaction/transaction-service.js.map +1 -1
  80. package/dist-server/service/transaction/transaction.d.ts +5 -3
  81. package/dist-server/service/transaction/transaction.js +6 -4
  82. package/dist-server/service/transaction/transaction.js.map +1 -1
  83. package/dist-server/tsconfig.tsbuildinfo +1 -1
  84. package/package.json +11 -10
  85. package/translations/en.json +30 -1
  86. package/translations/es.json +30 -1
  87. package/translations/ja.json +30 -1
  88. package/translations/ko.json +30 -1
  89. package/translations/ms.json +30 -1
  90. package/translations/zh.json +30 -1
@@ -10,63 +10,19 @@ const account_service_1 = require("./account-service");
10
10
  let AccountMutation = class AccountMutation {
11
11
  async createAccount(account, context) {
12
12
  const { domain, user, tx } = context.state;
13
- const result = await (0, shell_1.getRepository)(account_1.Account, tx).save({
14
- ...account,
15
- domain,
16
- creator: user,
17
- updater: user
18
- });
13
+ const [result] = await (0, account_service_1.saveAccounts)(tx, domain, user, [account]);
19
14
  return result;
20
15
  }
21
16
  async updateAccount(id, patch, context) {
22
17
  const { domain, user, tx } = context.state;
23
- const repository = (0, shell_1.getRepository)(account_1.Account, tx);
24
- const account = await repository.findOne({
25
- where: { domain: { id: domain.id }, id }
26
- });
27
- const result = await repository.save({
28
- ...account,
29
- ...patch,
30
- updater: user
31
- });
18
+ const [result] = await (0, account_service_1.saveAccounts)(tx, domain, user, [{ ...patch, id }]);
32
19
  return result;
33
20
  }
34
21
  async updateMultipleAccount(patches, context) {
35
22
  const { domain, user, tx } = context.state;
36
- let results = [];
37
- const _createRecords = patches.filter((patch) => patch.cuFlag.toUpperCase() === '+');
38
- const _updateRecords = patches.filter((patch) => patch.cuFlag.toUpperCase() === 'M');
39
- const accountRepo = (0, shell_1.getRepository)(account_1.Account, tx);
40
- if (_createRecords.length > 0) {
41
- for (let i = 0; i < _createRecords.length; i++) {
42
- const newRecord = _createRecords[i];
43
- const result = await accountRepo.save({
44
- ...newRecord,
45
- domain,
46
- creator: user,
47
- updater: user
48
- });
49
- results.push({ ...result, cuFlag: '+' });
50
- }
51
- }
52
- if (_updateRecords.length > 0) {
53
- for (let i = 0; i < _updateRecords.length; i++) {
54
- const updateRecord = _updateRecords[i];
55
- const account = await accountRepo.findOne({
56
- where: { domain: { id: domain.id }, id: updateRecord.id }
57
- });
58
- if (!account) {
59
- throw new Error(`failed to find account to update: ${updateRecord.id}`);
60
- }
61
- const result = await accountRepo.save({
62
- ...account,
63
- ...updateRecord,
64
- updater: user
65
- });
66
- results.push({ ...result, cuFlag: 'M' });
67
- }
68
- }
69
- return results;
23
+ const rows = patches.filter((patch) => ['+', 'M'].includes(patch.cuFlag?.toUpperCase()));
24
+ const saved = await (0, account_service_1.saveAccounts)(tx, domain, user, rows.map(({ cuFlag, ...patch }) => (cuFlag.toUpperCase() === '+' ? { ...patch, id: undefined } : patch)));
25
+ return saved.map((result, index) => ({ ...result, cuFlag: rows[index].cuFlag.toUpperCase() }));
70
26
  }
71
27
  async deleteAccount(id, context) {
72
28
  const { domain, tx } = context.state;
@@ -79,10 +35,8 @@ let AccountMutation = class AccountMutation {
79
35
  return true;
80
36
  }
81
37
  async importAccounts(accounts, context) {
82
- const { domain, tx } = context.state;
83
- await Promise.all(accounts.map(async (account) => {
84
- const createdAccount = await (0, shell_1.getRepository)(account_1.Account, tx).save({ domain, ...account });
85
- }));
38
+ const { domain, user, tx } = context.state;
39
+ await (0, account_service_1.saveAccounts)(tx, domain, user, accounts.map(({ cuFlag, ...account }) => account));
86
40
  return true;
87
41
  }
88
42
  };
@@ -1 +1 @@
1
- {"version":3,"file":"account-mutation.js","sourceRoot":"","sources":["../../../server/service/account/account-mutation.ts"],"names":[],"mappings":"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","sourcesContent":["import { Resolver, Mutation, Arg, Ctx, Directive, UseMiddleware } from 'type-graphql'\n\nimport { getRepository, SpeakRefusals } from '@things-factory/shell'\n\nimport { Account } from './account'\nimport { NewAccount, AccountPatch } from './account-type'\nimport { deleteAccounts } from './account-service'\n\n@Resolver(Account)\n@UseMiddleware(SpeakRefusals)\nexport class AccountMutation {\n @Directive('@transaction')\n @Directive('@privilege(category: \"accounting-master\", privilege: \"mutation\", domainOwnerGranted: true)')\n @Mutation(returns => Account, { description: 'To create new Account' })\n async createAccount(@Arg('account') account: NewAccount, @Ctx() context: ResolverContext): Promise<Account> {\n const { domain, user, tx } = context.state\n\n const result = await getRepository(Account, tx).save({\n ...account,\n domain,\n creator: user,\n updater: user\n })\n\n return result\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"accounting-master\", privilege: \"mutation\", domainOwnerGranted: true)')\n @Mutation(returns => Account, { description: 'To modify Account information' })\n async updateAccount(\n @Arg('id') id: string,\n @Arg('patch') patch: AccountPatch,\n @Ctx() context: ResolverContext\n ): Promise<Account> {\n const { domain, user, tx } = context.state\n\n const repository = getRepository(Account, tx)\n const account = await repository.findOne({\n where: { domain: { id: domain.id }, id }\n })\n\n const result = await repository.save({\n ...account,\n ...patch,\n updater: user\n })\n\n return result\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"accounting-master\", privilege: \"mutation\", domainOwnerGranted: true)')\n @Mutation(returns => [Account], { description: \"To modify multiple Accounts' information\" })\n async updateMultipleAccount(\n @Arg('patches', type => [AccountPatch]) patches: AccountPatch[],\n @Ctx() context: ResolverContext\n ): Promise<Account[]> {\n const { domain, user, tx } = context.state\n\n let results = []\n const _createRecords = patches.filter((patch: any) => patch.cuFlag.toUpperCase() === '+')\n const _updateRecords = patches.filter((patch: any) => patch.cuFlag.toUpperCase() === 'M')\n const accountRepo = getRepository(Account, tx)\n\n if (_createRecords.length > 0) {\n for (let i = 0; i < _createRecords.length; i++) {\n const newRecord = _createRecords[i]\n\n const result = await accountRepo.save({\n ...newRecord,\n domain,\n creator: user,\n updater: user\n })\n\n results.push({ ...result, cuFlag: '+' })\n }\n }\n\n if (_updateRecords.length > 0) {\n for (let i = 0; i < _updateRecords.length; i++) {\n const updateRecord = _updateRecords[i]\n const account = await accountRepo.findOne({\n where: { domain: { id: domain.id }, id: updateRecord.id }\n })\n\n if (!account) {\n throw new Error(`failed to find account to update: ${updateRecord.id}`)\n }\n\n const result = await accountRepo.save({\n ...account,\n ...updateRecord,\n updater: user\n })\n\n results.push({ ...result, cuFlag: 'M' })\n }\n }\n\n return results\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"accounting-master\", privilege: \"mutation\", domainOwnerGranted: true)')\n @Mutation(returns => Boolean, { description: 'To delete Account' })\n async deleteAccount(@Arg('id') id: string, @Ctx() context: ResolverContext): Promise<boolean> {\n const { domain, tx } = context.state\n\n await deleteAccounts(tx, domain, [id])\n\n return true\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"accounting-master\", privilege: \"mutation\", domainOwnerGranted: true)')\n @Mutation(returns => Boolean, { description: 'To delete multiple Accounts' })\n async deleteAccounts(@Arg('ids', type => [String]) ids: string[], @Ctx() context: ResolverContext): Promise<boolean> {\n const { domain, tx } = context.state\n\n await deleteAccounts(tx, domain, ids)\n\n return true\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"accounting-master\", privilege: \"mutation\", domainOwnerGranted: true)')\n @Mutation(returns => Boolean, { description: 'To import multiple Accounts' })\n async importAccounts(\n @Arg('accounts', type => [AccountPatch]) accounts: AccountPatch[],\n @Ctx() context: ResolverContext\n ): Promise<boolean> {\n const { domain, tx } = context.state\n\n await Promise.all(\n accounts.map(async (account: AccountPatch) => {\n const createdAccount: Account = await getRepository(Account, tx).save({ domain, ...account })\n })\n )\n\n return true\n }\n}\n"]}
1
+ {"version":3,"file":"account-mutation.js","sourceRoot":"","sources":["../../../server/service/account/account-mutation.ts"],"names":[],"mappings":"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","sourcesContent":["import { Resolver, Mutation, Arg, Ctx, Directive, UseMiddleware } from 'type-graphql'\n\nimport { SpeakRefusals } from '@things-factory/shell'\n\nimport { Account } from './account'\nimport { NewAccount, AccountPatch } from './account-type'\nimport { AccountInput, deleteAccounts, saveAccounts } from './account-service'\n\n@Resolver(Account)\n@UseMiddleware(SpeakRefusals)\nexport class AccountMutation {\n @Directive('@transaction')\n @Directive('@privilege(category: \"accounting-master\", privilege: \"mutation\", domainOwnerGranted: true)')\n @Mutation(returns => Account, { description: 'To create new Account' })\n async createAccount(@Arg('account') account: NewAccount, @Ctx() context: ResolverContext): Promise<Account> {\n const { domain, user, tx } = context.state\n\n const [result] = await saveAccounts(tx, domain, user, [account as AccountInput])\n\n return result\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"accounting-master\", privilege: \"mutation\", domainOwnerGranted: true)')\n @Mutation(returns => Account, { description: 'To modify Account information' })\n async updateAccount(\n @Arg('id') id: string,\n @Arg('patch') patch: AccountPatch,\n @Ctx() context: ResolverContext\n ): Promise<Account> {\n const { domain, user, tx } = context.state\n\n const [result] = await saveAccounts(tx, domain, user, [{ ...(patch as AccountInput), id }])\n\n return result\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"accounting-master\", privilege: \"mutation\", domainOwnerGranted: true)')\n @Mutation(returns => [Account], { description: \"To modify multiple Accounts' information\" })\n async updateMultipleAccount(\n @Arg('patches', type => [AccountPatch]) patches: AccountPatch[],\n @Ctx() context: ResolverContext\n ): Promise<Account[]> {\n const { domain, user, tx } = context.state\n\n const rows = patches.filter((patch: any) => ['+', 'M'].includes(patch.cuFlag?.toUpperCase()))\n const saved = await saveAccounts(\n tx,\n domain,\n user,\n rows.map(({ cuFlag, ...patch }: any) => (cuFlag.toUpperCase() === '+' ? { ...patch, id: undefined } : patch))\n )\n\n return saved.map((result, index) => ({ ...result, cuFlag: rows[index].cuFlag.toUpperCase() })) as any\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"accounting-master\", privilege: \"mutation\", domainOwnerGranted: true)')\n @Mutation(returns => Boolean, { description: 'To delete Account' })\n async deleteAccount(@Arg('id') id: string, @Ctx() context: ResolverContext): Promise<boolean> {\n const { domain, tx } = context.state\n\n await deleteAccounts(tx, domain, [id])\n\n return true\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"accounting-master\", privilege: \"mutation\", domainOwnerGranted: true)')\n @Mutation(returns => Boolean, { description: 'To delete multiple Accounts' })\n async deleteAccounts(@Arg('ids', type => [String]) ids: string[], @Ctx() context: ResolverContext): Promise<boolean> {\n const { domain, tx } = context.state\n\n await deleteAccounts(tx, domain, ids)\n\n return true\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"accounting-master\", privilege: \"mutation\", domainOwnerGranted: true)')\n @Mutation(returns => Boolean, { description: 'To import multiple Accounts' })\n async importAccounts(\n @Arg('accounts', type => [AccountPatch]) accounts: AccountPatch[],\n @Ctx() context: ResolverContext\n ): Promise<boolean> {\n const { domain, user, tx } = context.state\n\n await saveAccounts(tx, domain, user, accounts.map(({ cuFlag, ...account }: any) => account))\n\n return true\n }\n}\n"]}
@@ -1,5 +1,20 @@
1
1
  import { EntityManager } from 'typeorm';
2
+ import { Account } from './account';
2
3
  /** An account a line, a recurring item or another row still names is not deleted (§`refuseTiedRows`). */
3
4
  export declare function deleteAccounts(tx: EntityManager, domain: {
4
5
  id: string;
5
6
  }, ids: string[]): Promise<void>;
7
+ /** An account as a door takes it - with an `id` it changes that account, without one it is a new account. */
8
+ export type AccountInput = Partial<Omit<Account, 'category'>> & {
9
+ category?: {
10
+ id: string;
11
+ } | null;
12
+ };
13
+ /**
14
+ * Write accounts, new or changed. A code and a name each name one account in the domain, so either one already held
15
+ * by another account - stored, or written earlier in the same save - is refused naming the field and the value, before the
16
+ * unique index would answer with a database error.
17
+ */
18
+ export declare function saveAccounts(tx: EntityManager, domain: {
19
+ id: string;
20
+ }, user: any, inputs: AccountInput[]): Promise<Account[]>;
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.deleteAccounts = deleteAccounts;
4
+ exports.saveAccounts = saveAccounts;
4
5
  const typeorm_1 = require("typeorm");
5
6
  const shell_1 = require("@things-factory/shell");
6
7
  const account_1 = require("./account");
@@ -14,4 +15,43 @@ async function deleteAccounts(tx, domain, ids) {
14
15
  await (0, shell_1.refuseTiedRows)(tx, account_1.Account, unique);
15
16
  await repo.softRemove(found);
16
17
  }
18
+ /**
19
+ * Write accounts, new or changed. A code and a name each name one account in the domain, so either one already held
20
+ * by another account - stored, or written earlier in the same save - is refused naming the field and the value, before the
21
+ * unique index would answer with a database error.
22
+ */
23
+ async function saveAccounts(tx, domain, user, inputs) {
24
+ const repo = tx.getRepository(account_1.Account);
25
+ const rows = [];
26
+ for (const input of inputs) {
27
+ if (!input.id) {
28
+ rows.push({ domain, creator: user, ...input });
29
+ continue;
30
+ }
31
+ const current = await repo.findOne({ where: { domain: { id: domain.id }, id: input.id } });
32
+ if (!current)
33
+ throw new shell_1.Refusal('account-not-found', {}, 'an account was not found - reload and try again');
34
+ rows.push({ ...current, ...input });
35
+ }
36
+ /* The rows are written one after another, so each is checked against the domain as the rows before it left it. */
37
+ const held = (await repo.find({ where: { domain: { id: domain.id } } })).map(one => ({ id: one.id, code: one.code, name: one.name }));
38
+ for (const row of rows) {
39
+ for (const field of ['code', 'name']) {
40
+ const value = row[field];
41
+ if (value === undefined || value === null || String(value).trim() === '')
42
+ throw new shell_1.Refusal(`account-${field}-required`, {}, `${field}: an account has one`);
43
+ if (held.some(one => one[field] === value && (!row.id || one.id !== row.id)))
44
+ throw new shell_1.Refusal(`account-${field}-taken`, { value }, `${field}: ${value} is already another account's`);
45
+ }
46
+ const mine = row.id && held.find(one => one.id === row.id);
47
+ if (mine)
48
+ Object.assign(mine, { code: row.code, name: row.name });
49
+ else
50
+ held.push({ id: row.id, code: row.code, name: row.name });
51
+ }
52
+ const saved = [];
53
+ for (const row of rows)
54
+ saved.push(await repo.save({ ...row, domain, updater: user }));
55
+ return saved;
56
+ }
17
57
  //# sourceMappingURL=account-service.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"account-service.js","sourceRoot":"","sources":["../../../server/service/account/account-service.ts"],"names":[],"mappings":";;AAOA,wCAOC;AAdD,qCAA2C;AAE3C,iDAA+D;AAE/D,uCAAmC;AAEnC,yGAAyG;AAClG,KAAK,UAAU,cAAc,CAAC,EAAiB,EAAE,MAAsB,EAAE,GAAa;IAC3F,MAAM,MAAM,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,CAAA;IAChC,MAAM,IAAI,GAAG,EAAE,CAAC,aAAa,CAAC,iBAAO,CAAC,CAAA;IACtC,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,IAAA,YAAE,EAAC,MAAM,CAAC,EAAE,EAAE,CAAC,CAAA;IACvF,IAAI,KAAK,CAAC,MAAM,KAAK,MAAM,CAAC,MAAM;QAAE,MAAM,IAAI,eAAO,CAAC,mBAAmB,EAAE,EAAE,EAAE,iDAAiD,CAAC,CAAA;IACjI,MAAM,IAAA,sBAAc,EAAC,EAAE,EAAE,iBAAO,EAAE,MAAM,CAAC,CAAA;IACzC,MAAM,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAA;AAC9B,CAAC","sourcesContent":["import { EntityManager, In } from 'typeorm'\n\nimport { Refusal, refuseTiedRows } from '@things-factory/shell'\n\nimport { Account } from './account'\n\n/** An account a line, a recurring item or another row still names is not deleted (§`refuseTiedRows`). */\nexport async function deleteAccounts(tx: EntityManager, domain: { id: string }, ids: string[]): Promise<void> {\n const unique = [...new Set(ids)]\n const repo = tx.getRepository(Account)\n const found = await repo.find({ where: { domain: { id: domain.id }, id: In(unique) } })\n if (found.length !== unique.length) throw new Refusal('account-not-found', {}, 'an account was not found - reload and try again')\n await refuseTiedRows(tx, Account, unique)\n await repo.softRemove(found)\n}\n"]}
1
+ {"version":3,"file":"account-service.js","sourceRoot":"","sources":["../../../server/service/account/account-service.ts"],"names":[],"mappings":"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","sourcesContent":["import { EntityManager, In } from 'typeorm'\n\nimport { Refusal, refuseTiedRows } from '@things-factory/shell'\n\nimport { Account } from './account'\n\n/** An account a line, a recurring item or another row still names is not deleted (§`refuseTiedRows`). */\nexport async function deleteAccounts(tx: EntityManager, domain: { id: string }, ids: string[]): Promise<void> {\n const unique = [...new Set(ids)]\n const repo = tx.getRepository(Account)\n const found = await repo.find({ where: { domain: { id: domain.id }, id: In(unique) } })\n if (found.length !== unique.length) throw new Refusal('account-not-found', {}, 'an account was not found - reload and try again')\n await refuseTiedRows(tx, Account, unique)\n await repo.softRemove(found)\n}\n\n/** An account as a door takes it - with an `id` it changes that account, without one it is a new account. */\nexport type AccountInput = Partial<Omit<Account, 'category'>> & { category?: { id: string } | null }\n\n/**\n * Write accounts, new or changed. A code and a name each name one account in the domain, so either one already held\n * by another account - stored, or written earlier in the same save - is refused naming the field and the value, before the\n * unique index would answer with a database error.\n */\nexport async function saveAccounts(tx: EntityManager, domain: { id: string }, user: any, inputs: AccountInput[]): Promise<Account[]> {\n const repo = tx.getRepository(Account)\n const rows: AccountInput[] = []\n for (const input of inputs) {\n if (!input.id) {\n rows.push({ domain, creator: user, ...input } as AccountInput)\n continue\n }\n const current = await repo.findOne({ where: { domain: { id: domain.id }, id: input.id } })\n if (!current) throw new Refusal('account-not-found', {}, 'an account was not found - reload and try again')\n rows.push({ ...current, ...input })\n }\n\n /* The rows are written one after another, so each is checked against the domain as the rows before it left it. */\n const held = (await repo.find({ where: { domain: { id: domain.id } } })).map(one => ({ id: one.id, code: one.code, name: one.name }))\n for (const row of rows) {\n for (const field of ['code', 'name'] as const) {\n const value = row[field]\n if (value === undefined || value === null || String(value).trim() === '')\n throw new Refusal(`account-${field}-required`, {}, `${field}: an account has one`)\n if (held.some(one => one[field] === value && (!row.id || one.id !== row.id)))\n throw new Refusal(`account-${field}-taken`, { value }, `${field}: ${value} is already another account's`)\n }\n const mine = row.id && held.find(one => one.id === row.id)\n if (mine) Object.assign(mine, { code: row.code, name: row.name })\n else held.push({ id: row.id, code: row.code, name: row.name })\n }\n\n const saved: Account[] = []\n for (const row of rows) saved.push(await repo.save({ ...row, domain, updater: user } as Account))\n return saved\n}\n"]}
@@ -1,5 +1,6 @@
1
1
  import { HistoryActionType, HistoryEntityInterface } from '@operato/typeorm-history';
2
2
  import { User } from '@things-factory/auth-base';
3
+ import { Employee } from '@things-factory/organization';
3
4
  import { Domain } from '@things-factory/shell';
4
5
  import { AccountType, BankAccount, BankAccountPurpose } from './bank-account';
5
6
  /** Each version of a bank account, written when it changes. */
@@ -18,6 +19,12 @@ export declare class BankAccountHistory implements HistoryEntityInterface<BankAc
18
19
  purpose: BankAccountPurpose;
19
20
  statedBalance: number;
20
21
  statedBalanceDate: string;
22
+ holder: Employee;
23
+ holderId?: string;
24
+ settlementAccount: BankAccount;
25
+ settlementAccountId?: string;
26
+ paymentDay: number;
27
+ creditLimit: number;
21
28
  active: boolean;
22
29
  createdAt?: Date;
23
30
  updatedAt?: Date;
@@ -6,6 +6,7 @@ const type_graphql_1 = require("type-graphql");
6
6
  const typeorm_1 = require("typeorm");
7
7
  const typeorm_history_1 = require("@operato/typeorm-history");
8
8
  const auth_base_1 = require("@things-factory/auth-base");
9
+ const organization_1 = require("@things-factory/organization");
9
10
  const env_1 = require("@things-factory/env");
10
11
  const shell_1 = require("@things-factory/shell");
11
12
  const bank_account_1 = require("./bank-account");
@@ -89,6 +90,34 @@ tslib_1.__decorate([
89
90
  (0, type_graphql_1.Field)({ nullable: true, description: 'statedBalanceDate at this version' }),
90
91
  tslib_1.__metadata("design:type", String)
91
92
  ], BankAccountHistory.prototype, "statedBalanceDate", void 0);
93
+ tslib_1.__decorate([
94
+ (0, typeorm_1.ManyToOne)(type => organization_1.Employee, { nullable: true, createForeignKeyConstraints: false }),
95
+ (0, type_graphql_1.Field)(type => organization_1.Employee, { nullable: true, description: 'holder at this version' }),
96
+ tslib_1.__metadata("design:type", organization_1.Employee)
97
+ ], BankAccountHistory.prototype, "holder", void 0);
98
+ tslib_1.__decorate([
99
+ (0, typeorm_1.RelationId)((bankAccountHistory) => bankAccountHistory.holder),
100
+ tslib_1.__metadata("design:type", String)
101
+ ], BankAccountHistory.prototype, "holderId", void 0);
102
+ tslib_1.__decorate([
103
+ (0, typeorm_1.ManyToOne)(type => bank_account_1.BankAccount, { nullable: true, createForeignKeyConstraints: false }),
104
+ (0, type_graphql_1.Field)(type => bank_account_1.BankAccount, { nullable: true, description: 'settlementAccount at this version' }),
105
+ tslib_1.__metadata("design:type", bank_account_1.BankAccount)
106
+ ], BankAccountHistory.prototype, "settlementAccount", void 0);
107
+ tslib_1.__decorate([
108
+ (0, typeorm_1.RelationId)((bankAccountHistory) => bankAccountHistory.settlementAccount),
109
+ tslib_1.__metadata("design:type", String)
110
+ ], BankAccountHistory.prototype, "settlementAccountId", void 0);
111
+ tslib_1.__decorate([
112
+ (0, typeorm_1.Column)({ type: 'int', nullable: true }),
113
+ (0, type_graphql_1.Field)(type => type_graphql_1.Int, { nullable: true, description: 'paymentDay at this version' }),
114
+ tslib_1.__metadata("design:type", Number)
115
+ ], BankAccountHistory.prototype, "paymentDay", void 0);
116
+ tslib_1.__decorate([
117
+ (0, typeorm_1.Column)((0, shell_1.moneyColumn)({ nullable: true })),
118
+ (0, type_graphql_1.Field)(type => type_graphql_1.Float, { nullable: true, description: 'creditLimit at this version' }),
119
+ tslib_1.__metadata("design:type", Number)
120
+ ], BankAccountHistory.prototype, "creditLimit", void 0);
92
121
  tslib_1.__decorate([
93
122
  (0, typeorm_1.Column)({ nullable: true }),
94
123
  (0, type_graphql_1.Field)({ nullable: true, description: 'active at this version' }),
@@ -1 +1 @@
1
- {"version":3,"file":"bank-account-history.js","sourceRoot":"","sources":["../../../server/service/bank-account/bank-account-history.ts"],"names":[],"mappings":"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","sourcesContent":["import { Directive, Field, Float, ID, Int, ObjectType } from 'type-graphql'\nimport { Column, Entity, Index, ManyToOne, PrimaryGeneratedColumn, RelationId } from 'typeorm'\n\nimport {\n HistoryActionColumn,\n HistoryActionType,\n HistoryEntityInterface,\n HistoryOriginalIdColumn\n} from '@operato/typeorm-history'\nimport { User } from '@things-factory/auth-base'\nimport { config } from '@things-factory/env'\nimport { Domain, moneyColumn } from '@things-factory/shell'\n\nimport { AccountType, BankAccount, BankAccountPurpose } from './bank-account'\n\nconst ORMCONFIG = config.get('ormconfig', {})\nconst DATABASE_TYPE = ORMCONFIG.type\n\n/** Each version of a bank account, written when it changes. */\n@Entity()\n@Index(\n 'ix_bank_account_history_0',\n (bankAccountHistory: BankAccountHistory) => [bankAccountHistory.originalId, bankAccountHistory.version],\n { unique: true }\n)\n@Index(\n 'ix_bank_account_history_1',\n (bankAccountHistory: BankAccountHistory) => [\n bankAccountHistory.domain,\n bankAccountHistory.originalId,\n bankAccountHistory.version\n ],\n { unique: true }\n)\n@ObjectType({ description: 'History Entity of BankAccount' })\nexport class BankAccountHistory implements HistoryEntityInterface<BankAccount> {\n @PrimaryGeneratedColumn('uuid')\n @Field(type => ID, { description: 'Unique identifier of the version' })\n readonly id: string\n\n @Column({ nullable: true, default: 1 })\n @Field({ nullable: true, description: 'Version number' })\n version?: number = 1\n\n @ManyToOne(type => Domain)\n @Field(type => Domain, { nullable: true, description: 'The domain' })\n domain?: Domain\n\n @RelationId((bankAccountHistory: BankAccountHistory) => bankAccountHistory.domain)\n domainId?: string\n\n @Column({ nullable: true })\n @Field({ nullable: true, description: 'name at this version' })\n name: string\n\n @Column({ type: 'text', nullable: true })\n @Field({ nullable: true, description: 'description at this version' })\n description: string\n\n @Column({ nullable: true })\n @Field({ nullable: true, description: 'bankName at this version' })\n bankName: string\n\n @Column({ nullable: true })\n @Field({ nullable: true, description: 'accountNumber at this version' })\n accountNumber: string\n\n @Column({ nullable: true })\n @Field(type => AccountType, { nullable: true, description: 'accountType at this version' })\n accountType: AccountType\n\n @Column({ nullable: true })\n @Field({ nullable: true, description: 'currency at this version' })\n currency: string\n\n @Column({ nullable: true })\n @Field({ nullable: true, description: 'timezone at this version' })\n timezone: string\n\n @Column({ nullable: true })\n @Field(type => BankAccountPurpose, { nullable: true, description: 'purpose at this version' })\n purpose: BankAccountPurpose\n\n @Column(moneyColumn({ nullable: true }))\n @Directive('@privilege(category: \"bank\", privilege: \"query\", domainOwnerGranted: false)')\n @Field(type => Float, { nullable: true, description: 'statedBalance at this version' })\n statedBalance: number\n\n @Column({ nullable: true })\n @Directive('@privilege(category: \"bank\", privilege: \"query\", domainOwnerGranted: false)')\n @Field({ nullable: true, description: 'statedBalanceDate at this version' })\n statedBalanceDate: string\n\n @Column({ nullable: true })\n @Field({ nullable: true, description: 'active at this version' })\n active: boolean\n\n @Column({ nullable: true })\n @Field({ nullable: true, description: 'When it was created' })\n createdAt?: Date\n\n @Column({ nullable: true })\n @Field({ nullable: true, description: 'When this version was written' })\n updatedAt?: Date\n\n @Column({ nullable: true })\n @Field({ nullable: true, description: 'When it was deleted' })\n deletedAt?: Date\n\n @ManyToOne(type => User, { nullable: true })\n @Field(type => User, { nullable: true, description: 'Who created it' })\n creator?: User\n\n @RelationId((bankAccountHistory: BankAccountHistory) => bankAccountHistory.creator)\n creatorId?: string\n\n @ManyToOne(type => User, { nullable: true })\n @Field(type => User, { nullable: true, description: 'Who wrote this version' })\n updater?: User\n\n @RelationId((bankAccountHistory: BankAccountHistory) => bankAccountHistory.updater)\n updaterId?: string\n\n @HistoryOriginalIdColumn()\n public originalId!: string\n\n @HistoryActionColumn({\n nullable: false,\n type:\n DATABASE_TYPE == 'postgres' || DATABASE_TYPE == 'mysql' || DATABASE_TYPE == 'mariadb'\n ? 'enum'\n : DATABASE_TYPE == 'oracle'\n ? 'varchar2'\n : DATABASE_TYPE == 'mssql'\n ? 'nvarchar'\n : 'varchar',\n enum:\n DATABASE_TYPE == 'postgres' || DATABASE_TYPE == 'mysql' || DATABASE_TYPE == 'mariadb'\n ? HistoryActionType\n : undefined,\n length: DATABASE_TYPE == 'postgres' || DATABASE_TYPE == 'mysql' || DATABASE_TYPE == 'mariadb' ? undefined : 10\n })\n public action!: HistoryActionType\n}\n"]}
1
+ {"version":3,"file":"bank-account-history.js","sourceRoot":"","sources":["../../../server/service/bank-account/bank-account-history.ts"],"names":[],"mappings":"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","sourcesContent":["import { Directive, Field, Float, ID, Int, ObjectType } from 'type-graphql'\nimport { Column, Entity, Index, ManyToOne, PrimaryGeneratedColumn, RelationId } from 'typeorm'\n\nimport {\n HistoryActionColumn,\n HistoryActionType,\n HistoryEntityInterface,\n HistoryOriginalIdColumn\n} from '@operato/typeorm-history'\nimport { User } from '@things-factory/auth-base'\nimport { Employee } from '@things-factory/organization'\nimport { config } from '@things-factory/env'\nimport { Domain, moneyColumn } from '@things-factory/shell'\n\nimport { AccountType, BankAccount, BankAccountPurpose } from './bank-account'\n\nconst ORMCONFIG = config.get('ormconfig', {})\nconst DATABASE_TYPE = ORMCONFIG.type\n\n/** Each version of a bank account, written when it changes. */\n@Entity()\n@Index(\n 'ix_bank_account_history_0',\n (bankAccountHistory: BankAccountHistory) => [bankAccountHistory.originalId, bankAccountHistory.version],\n { unique: true }\n)\n@Index(\n 'ix_bank_account_history_1',\n (bankAccountHistory: BankAccountHistory) => [\n bankAccountHistory.domain,\n bankAccountHistory.originalId,\n bankAccountHistory.version\n ],\n { unique: true }\n)\n@ObjectType({ description: 'History Entity of BankAccount' })\nexport class BankAccountHistory implements HistoryEntityInterface<BankAccount> {\n @PrimaryGeneratedColumn('uuid')\n @Field(type => ID, { description: 'Unique identifier of the version' })\n readonly id: string\n\n @Column({ nullable: true, default: 1 })\n @Field({ nullable: true, description: 'Version number' })\n version?: number = 1\n\n @ManyToOne(type => Domain)\n @Field(type => Domain, { nullable: true, description: 'The domain' })\n domain?: Domain\n\n @RelationId((bankAccountHistory: BankAccountHistory) => bankAccountHistory.domain)\n domainId?: string\n\n @Column({ nullable: true })\n @Field({ nullable: true, description: 'name at this version' })\n name: string\n\n @Column({ type: 'text', nullable: true })\n @Field({ nullable: true, description: 'description at this version' })\n description: string\n\n @Column({ nullable: true })\n @Field({ nullable: true, description: 'bankName at this version' })\n bankName: string\n\n @Column({ nullable: true })\n @Field({ nullable: true, description: 'accountNumber at this version' })\n accountNumber: string\n\n @Column({ nullable: true })\n @Field(type => AccountType, { nullable: true, description: 'accountType at this version' })\n accountType: AccountType\n\n @Column({ nullable: true })\n @Field({ nullable: true, description: 'currency at this version' })\n currency: string\n\n @Column({ nullable: true })\n @Field({ nullable: true, description: 'timezone at this version' })\n timezone: string\n\n @Column({ nullable: true })\n @Field(type => BankAccountPurpose, { nullable: true, description: 'purpose at this version' })\n purpose: BankAccountPurpose\n\n @Column(moneyColumn({ nullable: true }))\n @Directive('@privilege(category: \"bank\", privilege: \"query\", domainOwnerGranted: false)')\n @Field(type => Float, { nullable: true, description: 'statedBalance at this version' })\n statedBalance: number\n\n @Column({ nullable: true })\n @Directive('@privilege(category: \"bank\", privilege: \"query\", domainOwnerGranted: false)')\n @Field({ nullable: true, description: 'statedBalanceDate at this version' })\n statedBalanceDate: string\n\n @ManyToOne(type => Employee, { nullable: true, createForeignKeyConstraints: false })\n @Field(type => Employee, { nullable: true, description: 'holder at this version' })\n holder: Employee\n\n @RelationId((bankAccountHistory: BankAccountHistory) => bankAccountHistory.holder)\n holderId?: string\n\n @ManyToOne(type => BankAccount, { nullable: true, createForeignKeyConstraints: false })\n @Field(type => BankAccount, { nullable: true, description: 'settlementAccount at this version' })\n settlementAccount: BankAccount\n\n @RelationId((bankAccountHistory: BankAccountHistory) => bankAccountHistory.settlementAccount)\n settlementAccountId?: string\n\n @Column({ type: 'int', nullable: true })\n @Field(type => Int, { nullable: true, description: 'paymentDay at this version' })\n paymentDay: number\n\n @Column(moneyColumn({ nullable: true }))\n @Field(type => Float, { nullable: true, description: 'creditLimit at this version' })\n creditLimit: number\n\n @Column({ nullable: true })\n @Field({ nullable: true, description: 'active at this version' })\n active: boolean\n\n @Column({ nullable: true })\n @Field({ nullable: true, description: 'When it was created' })\n createdAt?: Date\n\n @Column({ nullable: true })\n @Field({ nullable: true, description: 'When this version was written' })\n updatedAt?: Date\n\n @Column({ nullable: true })\n @Field({ nullable: true, description: 'When it was deleted' })\n deletedAt?: Date\n\n @ManyToOne(type => User, { nullable: true })\n @Field(type => User, { nullable: true, description: 'Who created it' })\n creator?: User\n\n @RelationId((bankAccountHistory: BankAccountHistory) => bankAccountHistory.creator)\n creatorId?: string\n\n @ManyToOne(type => User, { nullable: true })\n @Field(type => User, { nullable: true, description: 'Who wrote this version' })\n updater?: User\n\n @RelationId((bankAccountHistory: BankAccountHistory) => bankAccountHistory.updater)\n updaterId?: string\n\n @HistoryOriginalIdColumn()\n public originalId!: string\n\n @HistoryActionColumn({\n nullable: false,\n type:\n DATABASE_TYPE == 'postgres' || DATABASE_TYPE == 'mysql' || DATABASE_TYPE == 'mariadb'\n ? 'enum'\n : DATABASE_TYPE == 'oracle'\n ? 'varchar2'\n : DATABASE_TYPE == 'mssql'\n ? 'nvarchar'\n : 'varchar',\n enum:\n DATABASE_TYPE == 'postgres' || DATABASE_TYPE == 'mysql' || DATABASE_TYPE == 'mariadb'\n ? HistoryActionType\n : undefined,\n length: DATABASE_TYPE == 'postgres' || DATABASE_TYPE == 'mysql' || DATABASE_TYPE == 'mariadb' ? undefined : 10\n })\n public action!: HistoryActionType\n}\n"]}
@@ -10,7 +10,7 @@ const bank_account_type_1 = require("./bank-account-type");
10
10
  let BankAccountMutation = class BankAccountMutation {
11
11
  async createBankAccount(bankAccount, context) {
12
12
  const { domain, user, tx } = context.state;
13
- return await (0, shell_1.getRepository)(bank_account_1.BankAccount, tx).save({ ...bankAccount, domain, creator: user, updater: user });
13
+ return await (0, bank_account_service_1.saveBankAccount)(tx, domain, user, bankAccount);
14
14
  }
15
15
  async updateBankAccount(id, patch, context) {
16
16
  const { domain, user, tx } = context.state;
@@ -18,7 +18,7 @@ let BankAccountMutation = class BankAccountMutation {
18
18
  const bankAccount = await repository.findOne({ where: { domain: { id: domain.id }, id } });
19
19
  if (!bankAccount)
20
20
  throw new shell_1.Refusal('bank-account-not-found', {}, 'a bank account was not found - reload and try again');
21
- return await repository.save({ ...bankAccount, ...patch, updater: user });
21
+ return await (0, bank_account_service_1.saveBankAccount)(tx, domain, user, patch, bankAccount);
22
22
  }
23
23
  async updateMultipleBankAccount(patches, context) {
24
24
  const { domain, user, tx } = context.state;
@@ -26,13 +26,13 @@ let BankAccountMutation = class BankAccountMutation {
26
26
  const results = [];
27
27
  for (const { cuFlag, ...patch } of patches) {
28
28
  if (cuFlag?.toUpperCase() === '+') {
29
- results.push({ ...(await repository.save({ ...patch, domain, creator: user, updater: user })), cuFlag: '+' });
29
+ results.push({ ...(await (0, bank_account_service_1.saveBankAccount)(tx, domain, user, patch)), cuFlag: '+' });
30
30
  }
31
31
  else if (cuFlag?.toUpperCase() === 'M') {
32
32
  const bankAccount = await repository.findOne({ where: { domain: { id: domain.id }, id: patch.id } });
33
33
  if (!bankAccount)
34
34
  throw new shell_1.Refusal('bank-account-not-found', {}, 'a bank account was not found - reload and try again');
35
- results.push({ ...(await repository.save({ ...bankAccount, ...patch, updater: user })), cuFlag: 'M' });
35
+ results.push({ ...(await (0, bank_account_service_1.saveBankAccount)(tx, domain, user, patch, bankAccount)), cuFlag: 'M' });
36
36
  }
37
37
  }
38
38
  return results;
@@ -1 +1 @@
1
- {"version":3,"file":"bank-account-mutation.js","sourceRoot":"","sources":["../../../server/service/bank-account/bank-account-mutation.ts"],"names":[],"mappings":";;;;AAAA,+CAAqF;AAErF,iDAA6E;AAE7E,iDAA4C;AAC5C,iEAA2D;AAC3D,2DAAsE;AAI/D,IAAM,mBAAmB,GAAzB,MAAM,mBAAmB;IAIxB,AAAN,KAAK,CAAC,iBAAiB,CACD,WAA2B,EACxC,OAAwB;QAE/B,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,KAAK,CAAA;QAE1C,OAAO,MAAM,IAAA,qBAAa,EAAC,0BAAW,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,GAAG,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAA;IAC5G,CAAC;IAKK,AAAN,KAAK,CAAC,iBAAiB,CACV,EAAU,EACP,KAAuB,EAC9B,OAAwB;QAE/B,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,KAAK,CAAA;QAC1C,MAAM,UAAU,GAAG,IAAA,qBAAa,EAAC,0BAAW,EAAE,EAAE,CAAC,CAAA;QACjD,MAAM,WAAW,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAA;QAC1F,IAAI,CAAC,WAAW;YACd,MAAM,IAAI,eAAO,CAAC,wBAAwB,EAAE,EAAE,EAAE,qDAAqD,CAAC,CAAA;QAExG,OAAO,MAAM,UAAU,CAAC,IAAI,CAAC,EAAE,GAAG,WAAW,EAAE,GAAG,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAA;IAC3E,CAAC;IAKK,AAAN,KAAK,CAAC,yBAAyB,CACe,OAA2B,EAChE,OAAwB;QAE/B,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,KAAK,CAAA;QAC1C,MAAM,UAAU,GAAG,IAAA,qBAAa,EAAC,0BAAW,EAAE,EAAE,CAAC,CAAA;QACjD,MAAM,OAAO,GAAG,EAAE,CAAA;QAElB,KAAK,MAAM,EAAE,MAAM,EAAE,GAAG,KAAK,EAAE,IAAI,OAAO,EAAE,CAAC;YAC3C,IAAI,MAAM,EAAE,WAAW,EAAE,KAAK,GAAG,EAAE,CAAC;gBAClC,OAAO,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,MAAM,UAAU,CAAC,IAAI,CAAC,EAAE,GAAG,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAA;YAC/G,CAAC;iBAAM,IAAI,MAAM,EAAE,WAAW,EAAE,KAAK,GAAG,EAAE,CAAC;gBACzC,MAAM,WAAW,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,CAAA;gBACpG,IAAI,CAAC,WAAW;oBACd,MAAM,IAAI,eAAO,CAAC,wBAAwB,EAAE,EAAE,EAAE,qDAAqD,CAAC,CAAA;gBACxG,OAAO,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,MAAM,UAAU,CAAC,IAAI,CAAC,EAAE,GAAG,WAAW,EAAE,GAAG,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAA;YACxG,CAAC;QACH,CAAC;QAED,OAAO,OAAO,CAAA;IAChB,CAAC;IAKK,AAAN,KAAK,CAAC,iBAAiB,CAAY,EAAU,EAAS,OAAwB;QAC5E,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,KAAK,CAAA;QACpC,MAAM,IAAA,yCAAkB,EAAC,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;QAE1C,OAAO,IAAI,CAAA;IACb,CAAC;IAKK,AAAN,KAAK,CAAC,kBAAkB,CACQ,GAAa,EACpC,OAAwB;QAE/B,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,KAAK,CAAA;QACpC,MAAM,IAAA,yCAAkB,EAAC,EAAE,EAAE,MAAM,EAAE,GAAG,CAAC,CAAA;QAEzC,OAAO,IAAI,CAAA;IACb,CAAC;CACF,CAAA;AA7EY,kDAAmB;AAIxB;IAHL,IAAA,wBAAS,EAAC,cAAc,CAAC;IACzB,IAAA,wBAAS,EAAC,gFAAgF,CAAC;IAC3F,IAAA,uBAAQ,EAAC,OAAO,CAAC,EAAE,CAAC,0BAAW,EAAE,EAAE,WAAW,EAAE,2BAA2B,EAAE,CAAC;IAE5E,mBAAA,IAAA,kBAAG,EAAC,aAAa,CAAC,CAAA;IAClB,mBAAA,IAAA,kBAAG,GAAE,CAAA;;6CAD2B,kCAAc;;4DAMhD;AAKK;IAHL,IAAA,wBAAS,EAAC,cAAc,CAAC;IACzB,IAAA,wBAAS,EAAC,gFAAgF,CAAC;IAC3F,IAAA,uBAAQ,EAAC,OAAO,CAAC,EAAE,CAAC,0BAAW,EAAE,EAAE,WAAW,EAAE,mCAAmC,EAAE,CAAC;IAEpF,mBAAA,IAAA,kBAAG,EAAC,IAAI,CAAC,CAAA;IACT,mBAAA,IAAA,kBAAG,EAAC,OAAO,CAAC,CAAA;IACZ,mBAAA,IAAA,kBAAG,GAAE,CAAA;;qDADe,oCAAgB;;4DAUtC;AAKK;IAHL,IAAA,wBAAS,EAAC,cAAc,CAAC;IACzB,IAAA,wBAAS,EAAC,gFAAgF,CAAC;IAC3F,IAAA,uBAAQ,EAAC,OAAO,CAAC,EAAE,CAAC,CAAC,0BAAW,CAAC,EAAE,EAAE,WAAW,EAAE,8CAA8C,EAAE,CAAC;IAEjG,mBAAA,IAAA,kBAAG,EAAC,SAAS,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,oCAAgB,CAAC,CAAC,CAAA;IAC1C,mBAAA,IAAA,kBAAG,GAAE,CAAA;;;;oEAkBP;AAKK;IAHL,IAAA,wBAAS,EAAC,cAAc,CAAC;IACzB,IAAA,wBAAS,EAAC,gFAAgF,CAAC;IAC3F,IAAA,uBAAQ,EAAC,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,WAAW,EAAE,uBAAuB,EAAE,CAAC;IAC9C,mBAAA,IAAA,kBAAG,EAAC,IAAI,CAAC,CAAA;IAAc,mBAAA,IAAA,kBAAG,GAAE,CAAA;;;;4DAKpD;AAKK;IAHL,IAAA,wBAAS,EAAC,cAAc,CAAC;IACzB,IAAA,wBAAS,EAAC,gFAAgF,CAAC;IAC3F,IAAA,uBAAQ,EAAC,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,WAAW,EAAE,iCAAiC,EAAE,CAAC;IAE9E,mBAAA,IAAA,kBAAG,EAAC,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAA;IAC5B,mBAAA,IAAA,kBAAG,GAAE,CAAA;;;;6DAMP;8BA5EU,mBAAmB;IAF/B,IAAA,uBAAQ,EAAC,0BAAW,CAAC;IACrB,IAAA,4BAAa,EAAC,qBAAa,CAAC;GAChB,mBAAmB,CA6E/B","sourcesContent":["import { Resolver, Mutation, Arg, Ctx, Directive, UseMiddleware } from 'type-graphql'\n\nimport { getRepository, Refusal, SpeakRefusals } from '@things-factory/shell'\n\nimport { BankAccount } from './bank-account'\nimport { deleteBankAccounts } from './bank-account-service'\nimport { BankAccountPatch, NewBankAccount } from './bank-account-type'\n\n@Resolver(BankAccount)\n@UseMiddleware(SpeakRefusals)\nexport class BankAccountMutation {\n @Directive('@transaction')\n @Directive('@privilege(category: \"bank\", privilege: \"mutation\", domainOwnerGranted: false)')\n @Mutation(returns => BankAccount, { description: 'To create new BankAccount' })\n async createBankAccount(\n @Arg('bankAccount') bankAccount: NewBankAccount,\n @Ctx() context: ResolverContext\n ): Promise<BankAccount> {\n const { domain, user, tx } = context.state\n\n return await getRepository(BankAccount, tx).save({ ...bankAccount, domain, creator: user, updater: user })\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"bank\", privilege: \"mutation\", domainOwnerGranted: false)')\n @Mutation(returns => BankAccount, { description: 'To modify BankAccount information' })\n async updateBankAccount(\n @Arg('id') id: string,\n @Arg('patch') patch: BankAccountPatch,\n @Ctx() context: ResolverContext\n ): Promise<BankAccount> {\n const { domain, user, tx } = context.state\n const repository = getRepository(BankAccount, tx)\n const bankAccount = await repository.findOne({ where: { domain: { id: domain.id }, id } })\n if (!bankAccount)\n throw new Refusal('bank-account-not-found', {}, 'a bank account was not found - reload and try again')\n\n return await repository.save({ ...bankAccount, ...patch, updater: user })\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"bank\", privilege: \"mutation\", domainOwnerGranted: false)')\n @Mutation(returns => [BankAccount], { description: \"To modify multiple BankAccounts' information\" })\n async updateMultipleBankAccount(\n @Arg('patches', type => [BankAccountPatch]) patches: BankAccountPatch[],\n @Ctx() context: ResolverContext\n ): Promise<BankAccount[]> {\n const { domain, user, tx } = context.state\n const repository = getRepository(BankAccount, tx)\n const results = []\n\n for (const { cuFlag, ...patch } of patches) {\n if (cuFlag?.toUpperCase() === '+') {\n results.push({ ...(await repository.save({ ...patch, domain, creator: user, updater: user })), cuFlag: '+' })\n } else if (cuFlag?.toUpperCase() === 'M') {\n const bankAccount = await repository.findOne({ where: { domain: { id: domain.id }, id: patch.id } })\n if (!bankAccount)\n throw new Refusal('bank-account-not-found', {}, 'a bank account was not found - reload and try again')\n results.push({ ...(await repository.save({ ...bankAccount, ...patch, updater: user })), cuFlag: 'M' })\n }\n }\n\n return results\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"bank\", privilege: \"mutation\", domainOwnerGranted: false)')\n @Mutation(returns => Boolean, { description: 'To delete BankAccount' })\n async deleteBankAccount(@Arg('id') id: string, @Ctx() context: ResolverContext): Promise<boolean> {\n const { domain, tx } = context.state\n await deleteBankAccounts(tx, domain, [id])\n\n return true\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"bank\", privilege: \"mutation\", domainOwnerGranted: false)')\n @Mutation(returns => Boolean, { description: 'To delete multiple BankAccounts' })\n async deleteBankAccounts(\n @Arg('ids', type => [String]) ids: string[],\n @Ctx() context: ResolverContext\n ): Promise<boolean> {\n const { domain, tx } = context.state\n await deleteBankAccounts(tx, domain, ids)\n\n return true\n }\n}\n"]}
1
+ {"version":3,"file":"bank-account-mutation.js","sourceRoot":"","sources":["../../../server/service/bank-account/bank-account-mutation.ts"],"names":[],"mappings":"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","sourcesContent":["import { Resolver, Mutation, Arg, Ctx, Directive, UseMiddleware } from 'type-graphql'\n\nimport { getRepository, Refusal, SpeakRefusals } from '@things-factory/shell'\n\nimport { BankAccount } from './bank-account'\nimport { deleteBankAccounts, saveBankAccount } from './bank-account-service'\nimport { BankAccountPatch, NewBankAccount } from './bank-account-type'\n\n@Resolver(BankAccount)\n@UseMiddleware(SpeakRefusals)\nexport class BankAccountMutation {\n @Directive('@transaction')\n @Directive('@privilege(category: \"bank\", privilege: \"mutation\", domainOwnerGranted: false)')\n @Mutation(returns => BankAccount, { description: 'To create new BankAccount' })\n async createBankAccount(\n @Arg('bankAccount') bankAccount: NewBankAccount,\n @Ctx() context: ResolverContext\n ): Promise<BankAccount> {\n const { domain, user, tx } = context.state\n\n return await saveBankAccount(tx, domain, user, bankAccount as any)\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"bank\", privilege: \"mutation\", domainOwnerGranted: false)')\n @Mutation(returns => BankAccount, { description: 'To modify BankAccount information' })\n async updateBankAccount(\n @Arg('id') id: string,\n @Arg('patch') patch: BankAccountPatch,\n @Ctx() context: ResolverContext\n ): Promise<BankAccount> {\n const { domain, user, tx } = context.state\n const repository = getRepository(BankAccount, tx)\n const bankAccount = await repository.findOne({ where: { domain: { id: domain.id }, id } })\n if (!bankAccount)\n throw new Refusal('bank-account-not-found', {}, 'a bank account was not found - reload and try again')\n\n return await saveBankAccount(tx, domain, user, patch as any, bankAccount)\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"bank\", privilege: \"mutation\", domainOwnerGranted: false)')\n @Mutation(returns => [BankAccount], { description: \"To modify multiple BankAccounts' information\" })\n async updateMultipleBankAccount(\n @Arg('patches', type => [BankAccountPatch]) patches: BankAccountPatch[],\n @Ctx() context: ResolverContext\n ): Promise<BankAccount[]> {\n const { domain, user, tx } = context.state\n const repository = getRepository(BankAccount, tx)\n const results = []\n\n for (const { cuFlag, ...patch } of patches) {\n if (cuFlag?.toUpperCase() === '+') {\n results.push({ ...(await saveBankAccount(tx, domain, user, patch as any)), cuFlag: '+' })\n } else if (cuFlag?.toUpperCase() === 'M') {\n const bankAccount = await repository.findOne({ where: { domain: { id: domain.id }, id: patch.id } })\n if (!bankAccount)\n throw new Refusal('bank-account-not-found', {}, 'a bank account was not found - reload and try again')\n results.push({ ...(await saveBankAccount(tx, domain, user, patch as any, bankAccount)), cuFlag: 'M' })\n }\n }\n\n return results\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"bank\", privilege: \"mutation\", domainOwnerGranted: false)')\n @Mutation(returns => Boolean, { description: 'To delete BankAccount' })\n async deleteBankAccount(@Arg('id') id: string, @Ctx() context: ResolverContext): Promise<boolean> {\n const { domain, tx } = context.state\n await deleteBankAccounts(tx, domain, [id])\n\n return true\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"bank\", privilege: \"mutation\", domainOwnerGranted: false)')\n @Mutation(returns => Boolean, { description: 'To delete multiple BankAccounts' })\n async deleteBankAccounts(\n @Arg('ids', type => [String]) ids: string[],\n @Ctx() context: ResolverContext\n ): Promise<boolean> {\n const { domain, tx } = context.state\n await deleteBankAccounts(tx, domain, ids)\n\n return true\n }\n}\n"]}
@@ -1,11 +1,14 @@
1
1
  import { Domain, ListParam } from '@things-factory/shell';
2
2
  import { User } from '@things-factory/auth-base';
3
+ import { Employee } from '@things-factory/organization';
3
4
  import { BankAccount } from './bank-account';
4
5
  import { BankAccountList } from './bank-account-type';
5
6
  export declare class BankAccountQuery {
6
7
  bankAccount(id: string, context: ResolverContext): Promise<BankAccount>;
7
8
  bankAccounts(params: ListParam, context: ResolverContext): Promise<BankAccountList>;
8
9
  domain(bankAccount: BankAccount): Promise<Domain>;
10
+ holder(bankAccount: BankAccount): Promise<Employee | null>;
11
+ settlementAccount(bankAccount: BankAccount): Promise<BankAccount | null>;
9
12
  updater(bankAccount: BankAccount): Promise<User>;
10
13
  creator(bankAccount: BankAccount): Promise<User>;
11
14
  }
@@ -5,6 +5,7 @@ const tslib_1 = require("tslib");
5
5
  const type_graphql_1 = require("type-graphql");
6
6
  const shell_1 = require("@things-factory/shell");
7
7
  const auth_base_1 = require("@things-factory/auth-base");
8
+ const organization_1 = require("@things-factory/organization");
8
9
  const bank_account_1 = require("./bank-account");
9
10
  const bank_account_type_1 = require("./bank-account-type");
10
11
  let BankAccountQuery = class BankAccountQuery {
@@ -28,6 +29,14 @@ let BankAccountQuery = class BankAccountQuery {
28
29
  async domain(bankAccount) {
29
30
  return bankAccount.domainId && (await (0, shell_1.getRepository)(shell_1.Domain).findOneBy({ id: bankAccount.domainId }));
30
31
  }
32
+ async holder(bankAccount) {
33
+ return bankAccount.holderId ? await (0, shell_1.getRepository)(organization_1.Employee).findOneBy({ id: bankAccount.holderId }) : null;
34
+ }
35
+ async settlementAccount(bankAccount) {
36
+ return bankAccount.settlementAccountId
37
+ ? await (0, shell_1.getRepository)(bank_account_1.BankAccount).findOneBy({ id: bankAccount.settlementAccountId })
38
+ : null;
39
+ }
31
40
  async updater(bankAccount) {
32
41
  return bankAccount.updaterId && (await (0, shell_1.getRepository)(auth_base_1.User).findOneBy({ id: bankAccount.updaterId }));
33
42
  }
@@ -61,6 +70,20 @@ tslib_1.__decorate([
61
70
  tslib_1.__metadata("design:paramtypes", [bank_account_1.BankAccount]),
62
71
  tslib_1.__metadata("design:returntype", Promise)
63
72
  ], BankAccountQuery.prototype, "domain", null);
73
+ tslib_1.__decorate([
74
+ (0, type_graphql_1.FieldResolver)(type => organization_1.Employee, { nullable: true }),
75
+ tslib_1.__param(0, (0, type_graphql_1.Root)()),
76
+ tslib_1.__metadata("design:type", Function),
77
+ tslib_1.__metadata("design:paramtypes", [bank_account_1.BankAccount]),
78
+ tslib_1.__metadata("design:returntype", Promise)
79
+ ], BankAccountQuery.prototype, "holder", null);
80
+ tslib_1.__decorate([
81
+ (0, type_graphql_1.FieldResolver)(type => bank_account_1.BankAccount, { nullable: true }),
82
+ tslib_1.__param(0, (0, type_graphql_1.Root)()),
83
+ tslib_1.__metadata("design:type", Function),
84
+ tslib_1.__metadata("design:paramtypes", [bank_account_1.BankAccount]),
85
+ tslib_1.__metadata("design:returntype", Promise)
86
+ ], BankAccountQuery.prototype, "settlementAccount", null);
64
87
  tslib_1.__decorate([
65
88
  (0, type_graphql_1.FieldResolver)(type => auth_base_1.User),
66
89
  tslib_1.__param(0, (0, type_graphql_1.Root)()),
@@ -1 +1 @@
1
- {"version":3,"file":"bank-account-query.js","sourceRoot":"","sources":["../../../server/service/bank-account/bank-account-query.ts"],"names":[],"mappings":"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","sourcesContent":["import { Resolver, Query, FieldResolver, Root, Args, Arg, Ctx, Directive } from 'type-graphql'\nimport { Domain, getQueryBuilderFromListParams, getRepository, ListParam } from '@things-factory/shell'\nimport { User } from '@things-factory/auth-base'\nimport { BankAccount } from './bank-account'\nimport { BankAccountList } from './bank-account-type'\n\n@Resolver(BankAccount)\nexport class BankAccountQuery {\n @Directive('@privilege(category: \"bank\", privilege: \"query\", domainOwnerGranted: false)')\n @Query(returns => BankAccount!, { nullable: true, description: 'To fetch a BankAccount' })\n async bankAccount(@Arg('id') id: string, @Ctx() context: ResolverContext): Promise<BankAccount> {\n const { domain } = context.state\n\n return await getRepository(BankAccount).findOne({\n where: { domain: { id: domain.id }, id }\n })\n }\n\n @Directive('@privilege(category: \"bank\", privilege: \"query\", domainOwnerGranted: false)')\n @Query(returns => BankAccountList, { description: 'To fetch multiple BankAccounts' })\n async bankAccounts(\n @Args(type => ListParam) params: ListParam,\n @Ctx() context: ResolverContext\n ): Promise<BankAccountList> {\n const { domain } = context.state\n\n const queryBuilder = getQueryBuilderFromListParams({\n domain,\n params,\n repository: await getRepository(BankAccount),\n searchables: ['name', 'bankName', 'accountNumber', 'description']\n })\n\n const [items, total] = await queryBuilder.getManyAndCount()\n\n return { items, total }\n }\n\n @FieldResolver(type => Domain)\n async domain(@Root() bankAccount: BankAccount): Promise<Domain> {\n return bankAccount.domainId && (await getRepository(Domain).findOneBy({ id: bankAccount.domainId }))\n }\n\n @FieldResolver(type => User)\n async updater(@Root() bankAccount: BankAccount): Promise<User> {\n return bankAccount.updaterId && (await getRepository(User).findOneBy({ id: bankAccount.updaterId }))\n }\n\n @FieldResolver(type => User)\n async creator(@Root() bankAccount: BankAccount): Promise<User> {\n return bankAccount.creatorId && (await getRepository(User).findOneBy({ id: bankAccount.creatorId }))\n }\n}\n"]}
1
+ {"version":3,"file":"bank-account-query.js","sourceRoot":"","sources":["../../../server/service/bank-account/bank-account-query.ts"],"names":[],"mappings":"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","sourcesContent":["import { Resolver, Query, FieldResolver, Root, Args, Arg, Ctx, Directive } from 'type-graphql'\nimport { Domain, getQueryBuilderFromListParams, getRepository, ListParam } from '@things-factory/shell'\nimport { User } from '@things-factory/auth-base'\nimport { Employee } from '@things-factory/organization'\nimport { BankAccount } from './bank-account'\nimport { BankAccountList } from './bank-account-type'\n\n@Resolver(BankAccount)\nexport class BankAccountQuery {\n @Directive('@privilege(category: \"bank\", privilege: \"query\", domainOwnerGranted: false)')\n @Query(returns => BankAccount!, { nullable: true, description: 'To fetch a BankAccount' })\n async bankAccount(@Arg('id') id: string, @Ctx() context: ResolverContext): Promise<BankAccount> {\n const { domain } = context.state\n\n return await getRepository(BankAccount).findOne({\n where: { domain: { id: domain.id }, id }\n })\n }\n\n @Directive('@privilege(category: \"bank\", privilege: \"query\", domainOwnerGranted: false)')\n @Query(returns => BankAccountList, { description: 'To fetch multiple BankAccounts' })\n async bankAccounts(\n @Args(type => ListParam) params: ListParam,\n @Ctx() context: ResolverContext\n ): Promise<BankAccountList> {\n const { domain } = context.state\n\n const queryBuilder = getQueryBuilderFromListParams({\n domain,\n params,\n repository: await getRepository(BankAccount),\n searchables: ['name', 'bankName', 'accountNumber', 'description']\n })\n\n const [items, total] = await queryBuilder.getManyAndCount()\n\n return { items, total }\n }\n\n @FieldResolver(type => Domain)\n async domain(@Root() bankAccount: BankAccount): Promise<Domain> {\n return bankAccount.domainId && (await getRepository(Domain).findOneBy({ id: bankAccount.domainId }))\n }\n\n @FieldResolver(type => Employee, { nullable: true })\n async holder(@Root() bankAccount: BankAccount): Promise<Employee | null> {\n return bankAccount.holderId ? await getRepository(Employee).findOneBy({ id: bankAccount.holderId }) : null\n }\n\n @FieldResolver(type => BankAccount, { nullable: true })\n async settlementAccount(@Root() bankAccount: BankAccount): Promise<BankAccount | null> {\n return bankAccount.settlementAccountId\n ? await getRepository(BankAccount).findOneBy({ id: bankAccount.settlementAccountId })\n : null\n }\n\n @FieldResolver(type => User)\n async updater(@Root() bankAccount: BankAccount): Promise<User> {\n return bankAccount.updaterId && (await getRepository(User).findOneBy({ id: bankAccount.updaterId }))\n }\n\n @FieldResolver(type => User)\n async creator(@Root() bankAccount: BankAccount): Promise<User> {\n return bankAccount.creatorId && (await getRepository(User).findOneBy({ id: bankAccount.creatorId }))\n }\n}\n"]}
@@ -1,4 +1,5 @@
1
1
  import { EntityManager } from 'typeorm';
2
+ import { BankAccount } from './bank-account';
2
3
  /**
3
4
  * An account that lines were written on is made inactive, not deleted - the lines keep pointing at it, deleted ones
4
5
  * too, since a deleted financial row stays readable. Whatever else names it stops the delete (§`refuseTiedRows`).
@@ -6,3 +7,29 @@ import { EntityManager } from 'typeorm';
6
7
  export declare function deleteBankAccounts(tx: EntityManager, domain: {
7
8
  id: string;
8
9
  }, ids: string[]): Promise<void>;
10
+ /** A patch as the doors take it - relations by `{ id }`. */
11
+ export type BankAccountInput = Partial<Omit<BankAccount, 'holder' | 'settlementAccount'>> & {
12
+ holder?: {
13
+ id: string;
14
+ } | null;
15
+ settlementAccount?: {
16
+ id: string;
17
+ } | null;
18
+ };
19
+ /**
20
+ * What an account must hold before it is written, read off the account alone: a name, and - when given - an ISO 4217
21
+ * currency and an IANA time zone, the two a statement import reads its lines by (§`bankTimestamp`). Pure.
22
+ */
23
+ export declare function checkBankAccountFields(account: {
24
+ name?: string | null;
25
+ currency?: string | null;
26
+ timezone?: string | null;
27
+ }): void;
28
+ /**
29
+ * Write a bank account, new or changed. A card keeps a card's facts (§`checkCardFields`): its holder is an employee, its
30
+ * bill is paid from one of the domain's bank accounts. An account with lines keeps its type - a line's category is
31
+ * its account's (ADR-0178 결정 1).
32
+ */
33
+ export declare function saveBankAccount(tx: EntityManager, domain: {
34
+ id: string;
35
+ }, user: any, input: BankAccountInput, current?: BankAccount): Promise<BankAccount>;
@@ -1,10 +1,16 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.deleteBankAccounts = deleteBankAccounts;
4
+ exports.checkBankAccountFields = checkBankAccountFields;
5
+ exports.saveBankAccount = saveBankAccount;
6
+ const tslib_1 = require("tslib");
4
7
  const typeorm_1 = require("typeorm");
8
+ const moment_timezone_1 = tslib_1.__importDefault(require("moment-timezone"));
5
9
  const shell_1 = require("@things-factory/shell");
10
+ const organization_1 = require("@things-factory/organization");
6
11
  const transaction_1 = require("../transaction/transaction");
7
12
  const bank_account_1 = require("./bank-account");
13
+ const card_rules_1 = require("./card-rules");
8
14
  /**
9
15
  * An account that lines were written on is made inactive, not deleted - the lines keep pointing at it, deleted ones
10
16
  * too, since a deleted financial row stays readable. Whatever else names it stops the delete (§`refuseTiedRows`).
@@ -22,4 +28,53 @@ async function deleteBankAccounts(tx, domain, ids) {
22
28
  await (0, shell_1.refuseTiedRows)(tx, bank_account_1.BankAccount, ids);
23
29
  await repo.softRemove(found);
24
30
  }
31
+ const ISO_CURRENCIES = new Set(Intl.supportedValuesOf('currency'));
32
+ /**
33
+ * What an account must hold before it is written, read off the account alone: a name, and - when given - an ISO 4217
34
+ * currency and an IANA time zone, the two a statement import reads its lines by (§`bankTimestamp`). Pure.
35
+ */
36
+ function checkBankAccountFields(account) {
37
+ if (account.name === undefined || account.name === null || String(account.name).trim() === '')
38
+ throw new shell_1.Refusal('bank-account-name-required', {}, 'name: an account has one');
39
+ if (account.currency !== undefined && !ISO_CURRENCIES.has(String(account.currency ?? '')))
40
+ throw new shell_1.Refusal('bank-account-currency', { value: account.currency ?? '' }, `currency: ${account.currency ?? ''} is not a three-letter ISO 4217 code such as KRW`);
41
+ if (account.timezone !== undefined && !(account.timezone && moment_timezone_1.default.tz.zone(account.timezone)))
42
+ throw new shell_1.Refusal('bank-account-timezone', { value: account.timezone ?? '' }, `timezone: ${account.timezone ?? ''} is not an IANA time zone such as Asia/Seoul`);
43
+ }
44
+ /**
45
+ * Write a bank account, new or changed. A card keeps a card's facts (§`checkCardFields`): its holder is an employee, its
46
+ * bill is paid from one of the domain's bank accounts. An account with lines keeps its type - a line's category is
47
+ * its account's (ADR-0178 결정 1).
48
+ */
49
+ async function saveBankAccount(tx, domain, user, input, current) {
50
+ const repo = tx.getRepository(bank_account_1.BankAccount);
51
+ const merged = {
52
+ ...current,
53
+ holder: current?.holderId ? { id: current.holderId } : null,
54
+ settlementAccount: current?.settlementAccountId ? { id: current.settlementAccountId } : null,
55
+ accountType: current?.accountType ?? bank_account_1.AccountType.BANK,
56
+ ...input
57
+ };
58
+ (0, card_rules_1.checkCardFields)(merged);
59
+ checkBankAccountFields(merged);
60
+ if (await repo.findOne({ where: { domain: { id: domain.id }, name: merged.name, ...(current ? { id: (0, typeorm_1.Not)(current.id) } : {}) } }))
61
+ throw new shell_1.Refusal('bank-account-name-taken', { value: merged.name }, `name: ${merged.name} is already another account's`);
62
+ if (current && input.accountType && input.accountType !== current.accountType) {
63
+ const lines = await tx
64
+ .getRepository(transaction_1.Transaction)
65
+ .count({ where: { domain: { id: domain.id }, bankAccount: { id: current.id } }, withDeleted: true });
66
+ if (lines)
67
+ throw new shell_1.Refusal('account-type-has-lines', {}, 'accountType: lines were written on the account - its type stays');
68
+ }
69
+ if (input.holder?.id && !(await tx.getRepository(organization_1.Employee).findOne({ where: { domain: { id: domain.id }, id: input.holder.id } })))
70
+ throw new shell_1.Refusal('card-holder-not-found', {}, 'holder: the employee was not found');
71
+ if (input.settlementAccount?.id) {
72
+ const paidFrom = await repo.findOne({ where: { domain: { id: domain.id }, id: input.settlementAccount.id } });
73
+ if (!paidFrom || paidFrom.accountType !== bank_account_1.AccountType.BANK)
74
+ throw new shell_1.Refusal('card-settlement-not-bank', {}, 'settlementAccount: one of the bank accounts');
75
+ }
76
+ if (merged.accountType === bank_account_1.AccountType.CARD && typeof input.accountNumber === 'string')
77
+ input = { ...input, accountNumber: input.accountNumber.trim() };
78
+ return await repo.save({ ...(current ?? { domain, creator: user }), ...input, updater: user });
79
+ }
25
80
  //# sourceMappingURL=bank-account-service.js.map