@things-factory/accounting 10.1.158 → 10.1.162

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 (31) hide show
  1. package/dist-client/tsconfig.tsbuildinfo +1 -1
  2. package/dist-server/service/expenditure-request/expenditure-payment-state.js +3 -2
  3. package/dist-server/service/expenditure-request/expenditure-payment-state.js.map +1 -1
  4. package/dist-server/service/expenditure-request/expenditure-request-service.js +2 -1
  5. package/dist-server/service/expenditure-request/expenditure-request-service.js.map +1 -1
  6. package/dist-server/service/expenditure-request/expenditure-target.js +10 -3
  7. package/dist-server/service/expenditure-request/expenditure-target.js.map +1 -1
  8. package/dist-server/service/index.d.ts +1 -0
  9. package/dist-server/service/index.js +1 -0
  10. package/dist-server/service/index.js.map +1 -1
  11. package/dist-server/service/payment/document-targets.d.ts +0 -2
  12. package/dist-server/service/payment/document-targets.js +16 -28
  13. package/dist-server/service/payment/document-targets.js.map +1 -1
  14. package/dist-server/service/payment/payment-currency.d.ts +11 -0
  15. package/dist-server/service/payment/payment-currency.js +57 -0
  16. package/dist-server/service/payment/payment-currency.js.map +1 -0
  17. package/dist-server/service/payment/payment-service.d.ts +3 -2
  18. package/dist-server/service/payment/payment-service.js +5 -2
  19. package/dist-server/service/payment/payment-service.js.map +1 -1
  20. package/dist-server/service/payment/payment-targets.d.ts +7 -0
  21. package/dist-server/service/payment/payment-targets.js +2 -0
  22. package/dist-server/service/payment/payment-targets.js.map +1 -1
  23. package/dist-server/service/payment/transfer-target.js +8 -2
  24. package/dist-server/service/payment/transfer-target.js.map +1 -1
  25. package/dist-server/service/transaction/transaction-service.js +2 -0
  26. package/dist-server/service/transaction/transaction-service.js.map +1 -1
  27. package/dist-server/tsconfig.tsbuildinfo +1 -1
  28. package/package.json +9 -9
  29. package/translations/en.json +5 -5
  30. package/translations/es.json +4 -4
  31. package/translations/ko.json +5 -5
@@ -7,6 +7,7 @@ const typeorm_1 = require("typeorm");
7
7
  const type_graphql_1 = require("type-graphql");
8
8
  const payment_1 = require("../payment/payment");
9
9
  const document_targets_1 = require("../payment/document-targets");
10
+ const payment_currency_1 = require("../payment/payment-currency");
10
11
  const expenditure_request_rules_1 = require("./expenditure-request-rules");
11
12
  /** The payment target kind of an expenditure request - the money paid on it directly, with no document between. */
12
13
  exports.EXPENDITURE_TARGET = 'ExpenditureRequest';
@@ -90,9 +91,9 @@ async function paymentStatesOf(tx, domain, requests) {
90
91
  : [];
91
92
  const invoicePayments = new Map();
92
93
  for (const one of onInvoices)
93
- invoicePayments.set(one.targetId, [...(invoicePayments.get(one.targetId) ?? []), partOf(one, (0, document_targets_1.paidOfDocument)(one))]);
94
+ invoicePayments.set(one.targetId, [...(invoicePayments.get(one.targetId) ?? []), partOf(one, (0, payment_currency_1.paidOfTarget)(one))]);
94
95
  for (const request of requests) {
95
- const settlements = direct.filter(one => one.targetId === request.id).map(one => partOf(one, Number(one.amount)));
96
+ const settlements = direct.filter(one => one.targetId === request.id).map(one => partOf(one, (0, payment_currency_1.paidOfTarget)(one)));
96
97
  states.set(request.id, paymentStateFrom(request.items ?? [], settlements, invoicePayments));
97
98
  }
98
99
  return states;
@@ -1 +1 @@
1
- {"version":3,"file":"expenditure-payment-state.js","sourceRoot":"","sources":["../../../server/service/expenditure-request/expenditure-payment-state.ts"],"names":[],"mappings":"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","sourcesContent":["import { EntityManager, In } from 'typeorm'\nimport { registerEnumType } from 'type-graphql'\n\nimport { Payment } from '../payment/payment'\nimport { paidOfDocument, TAX_INVOICE_TARGET } from '../payment/document-targets'\nimport { isPayable, type RequestLine } from './expenditure-request-rules'\n\n/** The payment target kind of an expenditure request - the money paid on it directly, with no document between. */\nexport const EXPENDITURE_TARGET = 'ExpenditureRequest'\n\nexport enum ExpenditurePaymentState {\n /** Only corporate-card lines - the company already paid. */\n NOTHING_TO_PAY = 'NOTHING_TO_PAY',\n UNPAID = 'UNPAID',\n PARTLY_PAID = 'PARTLY_PAID',\n PAID = 'PAID'\n}\n\nregisterEnumType(ExpenditurePaymentState, {\n name: 'ExpenditurePaymentState',\n description: 'How much of an expenditure request the bank lines that paid it cover'\n})\n\nexport interface PaidPart {\n amount: number\n transactionId: string\n /** The line was matched to the bank statement (it carries the statement's fingerprint). */\n reconciled: boolean\n}\n\nexport interface PaymentState {\n state: ExpenditurePaymentState\n payable: number\n paid: number\n outstanding: number\n /** What is paid on the request directly - the payable part not cited from a tax invoice. */\n settleable: number\n settled: number\n /** Every bank line that paid it was matched to the bank statement. */\n reconciled: boolean\n transactionIds: string[]\n /** What is still to pay of each tax invoice a payable line cites - a reader that counts the invoice elsewhere takes it off. */\n cited: { taxInvoiceId: string; outstanding: number }[]\n}\n\n/**\n * How far a request is paid (ADR-0135 §2-4, §2-5). Pure.\n *\n * A payable line that cites a purchase tax invoice is paid when that invoice is - the bank line pays the invoice, and\n * the request reads it (ADR-0122 §3-3: one path for one fact). The rest of the request is paid by the payments on the\n * request itself.\n */\nexport function paymentStateFrom(\n lines: readonly RequestLine[],\n settlements: readonly PaidPart[],\n invoicePayments: ReadonlyMap<string, readonly PaidPart[]>\n): PaymentState {\n const payableLines = lines.filter(isPayable)\n const payable = payableLines.reduce((sum, line) => sum + (line.amount || 0), 0)\n\n let citedTotal = 0\n let paidByInvoices = 0\n const cited: PaymentState['cited'] = []\n const parts: PaidPart[] = [...settlements]\n for (const line of payableLines.filter(one => one.taxInvoiceId)) {\n citedTotal += line.amount || 0\n const ofInvoice = invoicePayments.get(line.taxInvoiceId!) ?? []\n const paidOfLine = Math.min(line.amount || 0, ofInvoice.reduce((sum, one) => sum + one.amount, 0))\n paidByInvoices += paidOfLine\n cited.push({ taxInvoiceId: line.taxInvoiceId!, outstanding: (line.amount || 0) - paidOfLine })\n parts.push(...ofInvoice)\n }\n const settled = settlements.reduce((sum, one) => sum + one.amount, 0)\n const paid = paidByInvoices + settled\n const outstanding = Math.max(0, payable - paid)\n\n const state =\n payable <= 0\n ? ExpenditurePaymentState.NOTHING_TO_PAY\n : paid <= 0\n ? ExpenditurePaymentState.UNPAID\n : outstanding > 0\n ? ExpenditurePaymentState.PARTLY_PAID\n : ExpenditurePaymentState.PAID\n\n return {\n state,\n payable,\n paid,\n outstanding,\n settleable: payable - citedTotal,\n settled,\n reconciled: parts.length > 0 && parts.every(one => one.reconciled),\n transactionIds: [...new Set(parts.map(one => one.transactionId))],\n cited\n }\n}\n\nconst partOf = (payment: Payment, amount: number): PaidPart => ({\n amount,\n transactionId: payment.transaction.id,\n reconciled: !!payment.transaction.bankFingerprint\n})\n\n/**\n * **The one reader of whether requests were paid and reconciled** - the payment queue, the forecast of what is to go\n * out, the AI and every 360 read it from here, never each on their own.\n */\nexport async function paymentStatesOf(\n tx: EntityManager,\n domain: { id: string },\n requests: readonly { id: string; items?: readonly RequestLine[] | null }[]\n): Promise<Map<string, PaymentState>> {\n const states = new Map<string, PaymentState>()\n if (!requests.length) return states\n\n const repo = tx.getRepository(Payment)\n const direct = await repo.find({\n where: { domain: { id: domain.id }, targetType: EXPENDITURE_TARGET, targetId: In(requests.map(one => one.id)) } as any,\n relations: ['transaction']\n })\n const invoiceIds = [...new Set(requests.flatMap(one => (one.items ?? []).map(item => item.taxInvoiceId).filter(Boolean) as string[]))]\n const onInvoices = invoiceIds.length\n ? await repo.find({ where: { domain: { id: domain.id }, targetType: TAX_INVOICE_TARGET, targetId: In(invoiceIds) } as any, relations: ['transaction'] })\n : []\n\n const invoicePayments = new Map<string, PaidPart[]>()\n for (const one of onInvoices) invoicePayments.set(one.targetId, [...(invoicePayments.get(one.targetId) ?? []), partOf(one, paidOfDocument(one))])\n\n for (const request of requests) {\n const settlements = direct.filter(one => one.targetId === request.id).map(one => partOf(one, Number(one.amount)))\n states.set(request.id, paymentStateFrom(request.items ?? [], settlements, invoicePayments))\n }\n return states\n}\n"]}
1
+ {"version":3,"file":"expenditure-payment-state.js","sourceRoot":"","sources":["../../../server/service/expenditure-request/expenditure-payment-state.ts"],"names":[],"mappings":"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","sourcesContent":["import { EntityManager, In } from 'typeorm'\nimport { registerEnumType } from 'type-graphql'\n\nimport { Payment } from '../payment/payment'\nimport { TAX_INVOICE_TARGET } from '../payment/document-targets'\nimport { paidOfTarget } from '../payment/payment-currency'\nimport { isPayable, type RequestLine } from './expenditure-request-rules'\n\n/** The payment target kind of an expenditure request - the money paid on it directly, with no document between. */\nexport const EXPENDITURE_TARGET = 'ExpenditureRequest'\n\nexport enum ExpenditurePaymentState {\n /** Only corporate-card lines - the company already paid. */\n NOTHING_TO_PAY = 'NOTHING_TO_PAY',\n UNPAID = 'UNPAID',\n PARTLY_PAID = 'PARTLY_PAID',\n PAID = 'PAID'\n}\n\nregisterEnumType(ExpenditurePaymentState, {\n name: 'ExpenditurePaymentState',\n description: 'How much of an expenditure request the bank lines that paid it cover'\n})\n\nexport interface PaidPart {\n amount: number\n transactionId: string\n /** The line was matched to the bank statement (it carries the statement's fingerprint). */\n reconciled: boolean\n}\n\nexport interface PaymentState {\n state: ExpenditurePaymentState\n payable: number\n paid: number\n outstanding: number\n /** What is paid on the request directly - the payable part not cited from a tax invoice. */\n settleable: number\n settled: number\n /** Every bank line that paid it was matched to the bank statement. */\n reconciled: boolean\n transactionIds: string[]\n /** What is still to pay of each tax invoice a payable line cites - a reader that counts the invoice elsewhere takes it off. */\n cited: { taxInvoiceId: string; outstanding: number }[]\n}\n\n/**\n * How far a request is paid (ADR-0135 §2-4, §2-5). Pure.\n *\n * A payable line that cites a purchase tax invoice is paid when that invoice is - the bank line pays the invoice, and\n * the request reads it (ADR-0122 §3-3: one path for one fact). The rest of the request is paid by the payments on the\n * request itself.\n */\nexport function paymentStateFrom(\n lines: readonly RequestLine[],\n settlements: readonly PaidPart[],\n invoicePayments: ReadonlyMap<string, readonly PaidPart[]>\n): PaymentState {\n const payableLines = lines.filter(isPayable)\n const payable = payableLines.reduce((sum, line) => sum + (line.amount || 0), 0)\n\n let citedTotal = 0\n let paidByInvoices = 0\n const cited: PaymentState['cited'] = []\n const parts: PaidPart[] = [...settlements]\n for (const line of payableLines.filter(one => one.taxInvoiceId)) {\n citedTotal += line.amount || 0\n const ofInvoice = invoicePayments.get(line.taxInvoiceId!) ?? []\n const paidOfLine = Math.min(line.amount || 0, ofInvoice.reduce((sum, one) => sum + one.amount, 0))\n paidByInvoices += paidOfLine\n cited.push({ taxInvoiceId: line.taxInvoiceId!, outstanding: (line.amount || 0) - paidOfLine })\n parts.push(...ofInvoice)\n }\n const settled = settlements.reduce((sum, one) => sum + one.amount, 0)\n const paid = paidByInvoices + settled\n const outstanding = Math.max(0, payable - paid)\n\n const state =\n payable <= 0\n ? ExpenditurePaymentState.NOTHING_TO_PAY\n : paid <= 0\n ? ExpenditurePaymentState.UNPAID\n : outstanding > 0\n ? ExpenditurePaymentState.PARTLY_PAID\n : ExpenditurePaymentState.PAID\n\n return {\n state,\n payable,\n paid,\n outstanding,\n settleable: payable - citedTotal,\n settled,\n reconciled: parts.length > 0 && parts.every(one => one.reconciled),\n transactionIds: [...new Set(parts.map(one => one.transactionId))],\n cited\n }\n}\n\nconst partOf = (payment: Payment, amount: number): PaidPart => ({\n amount,\n transactionId: payment.transaction.id,\n reconciled: !!payment.transaction.bankFingerprint\n})\n\n/**\n * **The one reader of whether requests were paid and reconciled** - the payment queue, the forecast of what is to go\n * out, the AI and every 360 read it from here, never each on their own.\n */\nexport async function paymentStatesOf(\n tx: EntityManager,\n domain: { id: string },\n requests: readonly { id: string; items?: readonly RequestLine[] | null }[]\n): Promise<Map<string, PaymentState>> {\n const states = new Map<string, PaymentState>()\n if (!requests.length) return states\n\n const repo = tx.getRepository(Payment)\n const direct = await repo.find({\n where: { domain: { id: domain.id }, targetType: EXPENDITURE_TARGET, targetId: In(requests.map(one => one.id)) } as any,\n relations: ['transaction']\n })\n const invoiceIds = [...new Set(requests.flatMap(one => (one.items ?? []).map(item => item.taxInvoiceId).filter(Boolean) as string[]))]\n const onInvoices = invoiceIds.length\n ? await repo.find({ where: { domain: { id: domain.id }, targetType: TAX_INVOICE_TARGET, targetId: In(invoiceIds) } as any, relations: ['transaction'] })\n : []\n\n const invoicePayments = new Map<string, PaidPart[]>()\n for (const one of onInvoices) invoicePayments.set(one.targetId, [...(invoicePayments.get(one.targetId) ?? []), partOf(one, paidOfTarget(one))])\n\n for (const request of requests) {\n const settlements = direct.filter(one => one.targetId === request.id).map(one => partOf(one, paidOfTarget(one)))\n states.set(request.id, paymentStateFrom(request.items ?? [], settlements, invoicePayments))\n }\n return states\n}\n"]}
@@ -26,6 +26,7 @@ const bank_account_1 = require("../bank-account/bank-account");
26
26
  const cash_flow_type_1 = require("../cash-flow-type");
27
27
  const payment_1 = require("../payment/payment");
28
28
  const document_targets_1 = require("../payment/document-targets");
29
+ const payment_currency_1 = require("../payment/payment-currency");
29
30
  const payment_service_1 = require("../payment/payment-service");
30
31
  const transaction_1 = require("../transaction/transaction");
31
32
  const transaction_service_1 = require("../transaction/transaction-service");
@@ -405,7 +406,7 @@ async function putOnLine(tx, domain, user, request, state, lineId, amount) {
405
406
  where: { domain: { id: domain.id }, targetType: document_targets_1.TAX_INVOICE_TARGET, targetId: (0, typeorm_1.In)(cited.map(item => item.taxInvoiceId)) }
406
407
  });
407
408
  for (const item of cited) {
408
- const paid = onInvoices.filter(one => one.targetId === item.taxInvoiceId).reduce((sum, one) => sum + (0, document_targets_1.paidOfDocument)(one), 0);
409
+ const paid = onInvoices.filter(one => one.targetId === item.taxInvoiceId).reduce((sum, one) => sum + (0, payment_currency_1.paidOfTarget)(one), 0);
409
410
  const put = Math.min(remaining, Math.max(0, Number(item.amount) - paid));
410
411
  if (put > 0)
411
412
  patches.push(patchFor(document_targets_1.TAX_INVOICE_TARGET, item.taxInvoiceId, put));
@@ -1 +1 @@
1
- {"version":3,"file":"expenditure-request-service.js","sourceRoot":"","sources":["../../../server/service/expenditure-request/expenditure-request-service.ts"],"names":[],"mappings":"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","sourcesContent":["import { EntityManager, In } from 'typeorm'\n\nimport { Refusal } from '@things-factory/shell'\nimport { accountKey, Counterparty, CounterpartyBankAccount } from '@things-factory/biz-base'\nimport { Employee } from '@things-factory/organization'\nimport { Category, TaxInvoice } from '@things-factory/tax-invoice'\nimport { abort, activityNamed, approvalLineRefusal, approvalLineStanding, issue } from '@things-factory/worklist'\nimport { createAttachment, replaceAttachment } from '@things-factory/attachment-base'\n\nimport { activityOfKind } from '../../activities/expenditure-activity-names'\nimport { Account } from '../account/account'\nimport { accountMatcher } from '../account/account-match'\nimport { BankAccount } from '../bank-account/bank-account'\nimport { CashFlowType } from '../cash-flow-type'\nimport { Payment } from '../payment/payment'\nimport { paidOfDocument, TAX_INVOICE_TARGET } from '../payment/document-targets'\nimport { savePayments } from '../payment/payment-service'\nimport { Transaction, TransactionCategory, TransactionSource } from '../transaction/transaction'\nimport { saveTransactions } from '../transaction/transaction-service'\nimport { ExpenditureKind, ExpenditureRequest, ExpenditureRequestStatus } from './expenditure-request'\nimport { ExpenditurePaymentMethod, ExpenditureRequestItem } from './expenditure-request-item'\nimport { EXPENDITURE_TARGET, paymentStatesOf, type PaymentState } from './expenditure-payment-state'\nimport {\n canEdit,\n dayOf,\n isPayable,\n monthOf,\n payeeAccountDrift,\n requestForLine,\n submitRefusal,\n totalsOf,\n type RequestKind,\n type RequestStatus\n} from './expenditure-request-rules'\n\nexport const RECEIPT_REF_TYPE = 'ExpenditureRequestItem'\n\nconst won = (value: number) => `${Math.round(value || 0).toLocaleString()}원`\nconst KINDS = Object.values(ExpenditureKind) as string[]\nconst METHODS = Object.values(ExpenditurePaymentMethod) as string[]\n\nexport interface RequestHead {\n id?: string\n kind?: string\n title?: string\n month?: string\n dueDate?: string\n counterparty?: { id: string } | null\n payeeAccount?: { id: string } | null\n notes?: string\n}\n\nexport interface ItemPatch {\n id?: string\n cuFlag?: string\n spentDate?: string\n category?: string\n account?: { id: string } | null\n merchant?: string\n description?: string\n amount?: number\n vatAmount?: number\n paymentMethod?: string\n taxInvoice?: { id: string } | null\n}\n\n/** A request somebody is judging (or that is decided) - it changes only after it is withdrawn. */\nexport const lockedRequest = (status: string) =>\n new Refusal('expenditure-locked', { status: String(status).toLowerCase() }, `a ${String(status).toLowerCase()} request cannot be changed - withdraw it first`)\n\n/** The request of this domain, refusing one that is not the caller's own. */\nexport async function ownRequest(tx: EntityManager, id: string, domain: { id: string }, user: { id: string }): Promise<ExpenditureRequest> {\n const request = await tx.getRepository(ExpenditureRequest).findOne({ where: { id, domain: { id: domain.id } } as any, relations: ['requester'] })\n if (!request) throw new Refusal('expenditure-not-found', {}, `expenditure request '${id}' was not found`)\n if (request.requester?.id !== user.id) throw new Refusal('expenditure-not-yours', {}, 'only the requester can change this request')\n return request\n}\n\nasync function employeeOf(tx: EntityManager, domain: { id: string }, user: { id: string }) {\n return await tx.getRepository(Employee).findOne({ where: { domain: { id: domain.id }, user: { id: user.id } } as any, relations: ['department'] })\n}\n\nasync function linesOf(tx: EntityManager, requestId: string): Promise<ExpenditureRequestItem[]> {\n return await tx.getRepository(ExpenditureRequestItem).find({ where: { request: { id: requestId } } as any, order: { spentDate: 'ASC', createdAt: 'ASC' } as any })\n}\n\nasync function refreshTotals(tx: EntityManager, request: ExpenditureRequest): Promise<ExpenditureRequest> {\n const totals = totalsOf(await linesOf(tx, request.id))\n request.totalAmount = totals.total\n request.payableAmount = totals.payable\n return await tx.getRepository(ExpenditureRequest).save(request)\n}\n\nasync function inDomain<T>(tx: EntityManager, entity: new () => T, domain: { id: string }, ref: { id: string } | null | undefined, field: string): Promise<T | null> {\n if (!ref?.id) return null\n const row = await tx.getRepository(entity).findOne({ where: { domain: { id: domain.id }, id: ref.id } as any })\n if (!row) throw new Refusal('expenditure-reference-not-found', { field }, `${field} was not found - reload and try again`)\n return row\n}\n\n/** The counterparty and the account of it a counterparty payment names - the account must be that counterparty's. */\nasync function payeeOf(tx: EntityManager, domain: { id: string }, head: RequestHead, current?: ExpenditureRequest) {\n const counterparty = 'counterparty' in head ? await inDomain(tx, Counterparty, domain, head.counterparty, 'counterparty') : undefined\n const account = 'payeeAccount' in head ? await inDomain(tx, CounterpartyBankAccount, domain, head.payeeAccount, 'payeeAccount') : undefined\n const counterpartyId = counterparty === undefined ? current?.counterpartyId : counterparty?.id\n if (account && account.counterpartyId !== counterpartyId)\n throw new Refusal('expenditure-account-not-of-payee', {}, \"the account is not the counterparty's - choose one of its accounts\")\n return { counterparty, account }\n}\n\n/** Apply line patches to a request - checks each line's references and the tax invoice it cites. */\nasync function saveItems(tx: EntityManager, domain: { id: string }, user: any, request: ExpenditureRequest, patches: ItemPatch[]) {\n const repo = tx.getRepository(ExpenditureRequestItem)\n\n const deletes = patches.filter(one => one.cuFlag === '-' && one.id).map(one => one.id!)\n if (deletes.length) {\n const own = await repo.find({ where: { request: { id: request.id }, id: In(deletes) } as any })\n if (own.length !== new Set(deletes).size) throw new Refusal('expenditure-line-not-found', {}, 'a line was not found - reload and try again')\n await repo.softDelete({ id: In(deletes) })\n }\n\n const writes = patches.filter(one => one.cuFlag !== '-')\n const accounts = writes.some(one => !('account' in one) && (one.category || one.description))\n ? await tx.getRepository(Account).find({ where: { domain: { id: domain.id }, active: true } as any })\n : []\n const match = accountMatcher(accounts)\n\n for (const patch of writes) {\n const isNew = !patch.id || patch.cuFlag === '+'\n const current = isNew ? undefined : await repo.findOne({ where: { request: { id: request.id }, id: patch.id } as any })\n if (!isNew && !current) throw new Refusal('expenditure-line-not-found', {}, 'a line was not found - reload and try again')\n\n const row: Record<string, any> = {}\n if ('spentDate' in patch) {\n row.spentDate = patch.spentDate ? dayOf(patch.spentDate) : null\n if (patch.spentDate && !row.spentDate) throw new Refusal('expenditure-line-day-invalid', { value: String(patch.spentDate) }, `'${patch.spentDate}' is not a day (use YYYY-MM-DD)`)\n }\n for (const field of ['category', 'merchant', 'description'] as const) if (field in patch) row[field] = patch[field]?.trim() || null\n if ('amount' in patch) row.amount = Number(patch.amount) || 0\n if ('vatAmount' in patch) row.vatAmount = patch.vatAmount === null || patch.vatAmount === undefined ? null : Number(patch.vatAmount)\n if ('paymentMethod' in patch && patch.paymentMethod) {\n if (!METHODS.includes(patch.paymentMethod)) throw new Refusal('expenditure-line-method-invalid', { value: patch.paymentMethod }, `'${patch.paymentMethod}' is not a way to pay`)\n row.paymentMethod = patch.paymentMethod\n } else if (isNew) row.paymentMethod = request.kind === ExpenditureKind.VENDOR ? ExpenditurePaymentMethod.TRANSFER : ExpenditurePaymentMethod.PERSONAL_CARD\n\n if ('account' in patch) row.account = await inDomain(tx, Account, domain, patch.account, 'account')\n else {\n /* A line that names no account is given the one its words mean, by its category then its description (§`accountMatcher`). */\n const words = [patch.category ?? current?.category, patch.description ?? current?.description]\n const found = (isNew || 'category' in patch || 'description' in patch) && accounts.length ? match(words, CashFlowType.EXPENSE) : undefined\n if (found) row.account = found\n }\n\n if ('taxInvoice' in patch) {\n const invoice = await inDomain(tx, TaxInvoice, domain, patch.taxInvoice, 'taxInvoice')\n if (invoice) {\n if (request.kind !== ExpenditureKind.VENDOR) throw new Refusal('expenditure-invoice-on-reimbursement', {}, 'a reimbursement cites receipts, not tax invoices')\n if (invoice.category !== Category.IMPORT) throw new Refusal('expenditure-invoice-not-purchase', {}, 'cite a purchase tax invoice')\n const elsewhere = await repo.find({ where: { domain: { id: domain.id }, taxInvoice: { id: invoice.id } } as any, relations: ['request'] })\n if (elsewhere.some(one => one.id !== current?.id && one.request && !one.request.deletedAt))\n throw new Refusal('expenditure-invoice-cited-twice', { issueDate: invoice.issueDate }, 'another request already pays this tax invoice')\n if (!('amount' in patch) || !(row.amount > 0)) row.amount = Number(invoice.totalAmount)\n if (!('spentDate' in patch)) row.spentDate = invoice.issueDate\n }\n row.taxInvoice = invoice\n }\n\n /* What a line says of its money holds whenever it is written, not only when it is submitted. */\n const amount = 'amount' in row ? row.amount : Number(current?.amount ?? 0)\n if ('amount' in row && !(row.amount > 0)) throw new Refusal('expenditure-line-amount-missing', {}, 'every line needs an amount above zero')\n const vat = 'vatAmount' in row ? row.vatAmount : current?.vatAmount\n if (vat && amount && Number(vat) > amount) throw new Refusal('expenditure-line-vat-over-amount', {}, 'the VAT is more than the amount')\n\n /* A line that cites an invoice asks no more than the invoice - whichever of the two changed. */\n const citedId = 'taxInvoice' in patch ? row.taxInvoice?.id : current?.taxInvoiceId\n if (citedId && ('amount' in row || 'taxInvoice' in patch)) {\n const invoice = row.taxInvoice ?? (await tx.getRepository(TaxInvoice).findOne({ where: { id: citedId } as any, withDeleted: true }))\n if (invoice && amount > Number(invoice.totalAmount) + 0.005)\n throw new Refusal('expenditure-line-over-invoice', { total: won(Number(invoice.totalAmount)) }, 'a line asks more than the tax invoice it cites')\n }\n\n await repo.save({ ...(current ?? { domain, request, creator: user, amount: 0 }), ...row, updater: user } as any)\n }\n}\n\n/**\n * Save a request and its lines in one go - the head, then the lines. A new request belongs to the caller; an existing\n * one only to its requester, and only while it is editable.\n */\nexport async function saveRequest(tx: EntityManager, domain: any, user: any, head: RequestHead, items: ItemPatch[]): Promise<ExpenditureRequest> {\n const repo = tx.getRepository(ExpenditureRequest)\n\n let request: ExpenditureRequest\n if (head.id) {\n request = await ownRequest(tx, head.id, domain, user)\n if (!canEdit(request.status as RequestStatus)) throw lockedRequest(request.status)\n if (head.kind && head.kind !== request.kind) throw new Refusal('expenditure-kind-fixed', {}, 'a request keeps the kind it was written as')\n } else {\n if (!head.kind || !KINDS.includes(head.kind)) throw new Refusal('expenditure-kind-missing', {}, 'say whether it pays a counterparty or pays an employee back')\n const employee = await employeeOf(tx, domain, user)\n request = repo.create({\n domain,\n kind: head.kind as ExpenditureKind,\n requester: user,\n department: employee?.department ?? null,\n status: ExpenditureRequestStatus.DRAFT,\n currency: 'KRW',\n totalAmount: 0,\n payableAmount: 0,\n creator: user\n } as any) as unknown as ExpenditureRequest\n }\n\n const reimbursement = request.kind === ExpenditureKind.REIMBURSEMENT\n if ('month' in head || (!head.id && reimbursement)) {\n const month = monthOf(head.month)\n if (reimbursement && !month) throw new Refusal('expenditure-month-invalid', { value: String(head.month ?? '') }, `month: '${head.month ?? ''}' is not a month (use YYYY-MM)`)\n if (head.month && !month) throw new Refusal('expenditure-month-invalid', { value: String(head.month) }, `month: '${head.month}' is not a month (use YYYY-MM)`)\n request.month = month ?? null\n }\n if ('dueDate' in head) {\n request.dueDate = head.dueDate ? dayOf(head.dueDate) ?? null : null\n if (head.dueDate && !request.dueDate) throw new Refusal('expenditure-due-date-invalid', { value: String(head.dueDate) }, `'${head.dueDate}' is not a day (use YYYY-MM-DD)`)\n }\n if (reimbursement && ('counterparty' in head || 'payeeAccount' in head)) throw new Refusal('expenditure-reimbursement-pays-requester', {}, 'a reimbursement pays the employee who wrote it')\n const { counterparty, account } = await payeeOf(tx, domain, head, head.id ? request : undefined)\n if (counterparty !== undefined) request.counterparty = counterparty\n if (account !== undefined) request.payeeAccount = account\n /* A changed counterparty drops the account chosen of the former one. */\n if (counterparty !== undefined && account === undefined && request.payeeAccountId) {\n const kept = await tx.getRepository(CounterpartyBankAccount).findOne({ where: { id: request.payeeAccountId } as any })\n if (kept?.counterpartyId !== counterparty?.id) request.payeeAccount = null\n }\n\n if (head.title?.trim()) request.title = head.title.trim()\n else if (!request.title) request.title = reimbursement ? `${request.month} 경비` : `${counterparty?.name ?? ''} 지급`.trim()\n if (head.notes !== undefined) request.notes = head.notes\n request.updater = user\n request = await repo.save(request)\n\n if (items?.length) await saveItems(tx, domain, user, request, items)\n return await refreshTotals(tx, request)\n}\n\n/** The payee's account as approvers will see it - written on the request when it is submitted (ADR-0135 §5). */\nasync function payeeSnapshot(tx: EntityManager, domain: { id: string }, request: ExpenditureRequest, user: any) {\n if (request.kind === ExpenditureKind.VENDOR) {\n const account = await tx.getRepository(CounterpartyBankAccount).findOne({ where: { domain: { id: domain.id }, id: request.payeeAccountId } as any })\n if (!account || account.counterpartyId !== request.counterpartyId)\n throw new Refusal('expenditure-payee-account-missing', {}, \"choose the counterparty's account to pay into\")\n return { payeeBankName: account.bankName ?? null, payeeAccountNumber: account.accountNumber, payeeHolderName: account.holderName ?? null }\n }\n const employee = await employeeOf(tx, domain, user)\n return {\n payeeBankName: employee?.bankName ?? null,\n payeeAccountNumber: employee?.bankAccount ? accountKey(employee.bankAccount) || null : null,\n payeeHolderName: user.name ?? null\n }\n}\n\n/** Put a request up for approval. The approval carries what the approver needs to judge it. */\nexport async function submitRequest(tx: EntityManager, domain: any, user: any, id: string, context: ResolverContext): Promise<ExpenditureRequest> {\n const request = await ownRequest(tx, id, domain, user)\n const items = await linesOf(tx, request.id)\n\n const refusal = submitRefusal(\n {\n kind: request.kind as RequestKind,\n status: request.status as RequestStatus,\n month: request.month,\n dueDate: request.dueDate,\n counterpartyId: request.counterpartyId,\n payeeAccountId: request.payeeAccountId\n },\n items\n )\n if (refusal) throw refusal\n Object.assign(request, await payeeSnapshot(tx, domain, request, user))\n\n const form = activityOfKind(request.kind)\n const carrier = await activityNamed(form, context)\n if (!carrier) throw new Refusal('expenditure-approval-not-installed', { form }, `the approval '${form}' is not installed in this domain`)\n const line = await approvalLineStanding(carrier, context)\n if (line.refusal) throw approvalLineRefusal(line.refusal)\n\n const totals = totalsOf(items)\n const who = user.name || user.email || ''\n const vendor = request.kind === ExpenditureKind.VENDOR\n const payee = vendor ? (await tx.getRepository(Counterparty).findOne({ where: { id: request.counterpartyId } as any }))?.name ?? '' : who\n const account = [request.payeeBankName, request.payeeAccountNumber, request.payeeHolderName].filter(Boolean).join(' ')\n\n const instance = await issue(\n {\n name: vendor ? `지출결의 ${payee} ${request.title}` : `경비 청구 ${who} ${request.month}`,\n description: `${won(totals.total)} · ${totals.count}건${totals.payable !== totals.total ? ` (지급할 금액 ${won(totals.payable)})` : ''}`,\n activityId: carrier.id,\n approvalLine: carrier.approvalLine,\n input: {\n requestId: request.id,\n month: request.month ?? request.dueDate?.slice(0, 7) ?? '',\n requester: who,\n payee,\n headline: vendor\n ? `${payee} · ${request.title} ${won(totals.payable)}${request.dueDate ? ` — ${request.dueDate} 지급` : ''}`\n : `${who} · ${request.month} 경비 ${won(totals.total)} (${totals.count}건)`,\n total: totals.total,\n payable: totals.payable,\n account,\n lines: items.map(item =>\n `${item.spentDate ?? ''} ${item.category ?? ''} ${item.merchant ?? ''} ${won(item.amount)}${item.paymentMethod === ExpenditurePaymentMethod.CORPORATE_CARD ? ' (법인카드)' : ''}${item.taxInvoiceId ? ' (세금계산서)' : ''} — ${item.description ?? ''}`\n .replace(/\\s+/g, ' ')\n .trim()\n ),\n consequence:\n totals.payable > 0\n ? `승인하면 ${won(totals.payable)}을 ${payee}에게 지급할 대상이 됩니다${account ? ` (${account})` : ''}`\n : '법인카드 사용분만 있어 지급할 금액은 없습니다'\n },\n threadsMin: 1,\n threadsMax: 1,\n requireApproval: true\n } as any,\n context\n )\n\n request.status = ExpenditureRequestStatus.SUBMITTED\n request.activityInstanceId = instance.id\n request.submittedAt = new Date()\n request.decidedAt = null\n request.decidedBy = null\n request.updater = user\n return await tx.getRepository(ExpenditureRequest).save(request)\n}\n\n/** Take a request back from its approvers. worklist's abort does not call the activity back, so the request is set here. */\nexport async function withdrawRequest(tx: EntityManager, domain: any, user: any, id: string, context: ResolverContext): Promise<ExpenditureRequest> {\n const request = await ownRequest(tx, id, domain, user)\n if (request.status !== ExpenditureRequestStatus.SUBMITTED)\n throw new Refusal('expenditure-not-submitted', { status: String(request.status).toLowerCase() }, 'only a request waiting on approvers can be withdrawn')\n\n if (request.activityInstanceId) await abort({ id: request.activityInstanceId, reason: '작성자가 회수함' }, context)\n\n request.status = ExpenditureRequestStatus.WITHDRAWN\n request.updater = user\n return await tx.getRepository(ExpenditureRequest).save(request)\n}\n\n/** Delete one of the caller's requests that nobody is judging - with its lines. */\nexport async function deleteRequest(tx: EntityManager, domain: any, user: any, id: string): Promise<boolean> {\n const request = await ownRequest(tx, id, domain, user)\n if (!canEdit(request.status as RequestStatus))\n throw new Refusal('expenditure-cannot-delete', { status: request.status.toLowerCase() }, `a ${request.status.toLowerCase()} request cannot be deleted`)\n await tx.getRepository(ExpenditureRequestItem).softDelete({ request: { id } } as any)\n await tx.getRepository(ExpenditureRequest).softDelete({ id })\n return true\n}\n\n/**\n * Add one line from the phone. It joins the caller's editable reimbursement of that month (§`requestForLine`), or\n * starts one. The receipt photo is attached to the line.\n */\nexport async function addLine(tx: EntityManager, domain: any, user: any, line: ItemPatch & { month?: string; receipt?: any }, context: ResolverContext): Promise<ExpenditureRequest> {\n const spentDate = dayOf(line.spentDate)\n if (!spentDate) throw new Refusal('expenditure-line-day-missing', {}, 'every line needs its day')\n const month = monthOf(line.month) ?? spentDate.slice(0, 7)\n\n const mine = await tx.getRepository(ExpenditureRequest).find({\n where: { domain: { id: domain.id }, requester: { id: user.id }, kind: ExpenditureKind.REIMBURSEMENT, month } as any\n })\n const joinId = requestForLine(\n mine.map(one => ({ id: one.id, status: one.status as RequestStatus, month: one.month, updatedAt: one.updatedAt })),\n month\n )\n\n const { receipt, month: _month, ...fields } = line\n const request = await saveRequest(tx, domain, user, joinId ? { id: joinId } : { kind: ExpenditureKind.REIMBURSEMENT, month }, [{ ...fields, spentDate, cuFlag: '+' }])\n\n if (receipt) {\n const [latest] = await tx.getRepository(ExpenditureRequestItem).find({ where: { request: { id: request.id } } as any, order: { createdAt: 'DESC' } as any, take: 1 })\n if (latest) await attachReceipt(latest.id, receipt, context)\n }\n return request\n}\n\n/** Put a receipt on a line - replacing the one it had. Only the requester, only while editable. */\nexport async function replaceReceipt(tx: EntityManager, domain: any, user: any, itemId: string, file: any, context: ResolverContext): Promise<ExpenditureRequestItem> {\n const item = await tx.getRepository(ExpenditureRequestItem).findOne({ where: { id: itemId, domain: { id: domain.id } } as any, relations: ['request'] })\n if (!item?.request) throw new Refusal('expenditure-line-not-found', {}, 'a line was not found - reload and try again')\n const request = await ownRequest(tx, item.request.id, domain, user)\n if (!canEdit(request.status as RequestStatus)) throw lockedRequest(request.status)\n\n await replaceAttachment({ file, refType: RECEIPT_REF_TYPE, refBy: item.id, category: 'receipt' }, context)\n return item\n}\n\nasync function attachReceipt(itemId: string, file: any, context: ResolverContext) {\n await createAttachment(null, { attachment: { file, refType: RECEIPT_REF_TYPE, refBy: itemId, category: 'receipt' } } as any, context)\n}\n\n/** Approved requests with their lines and how far each is paid - what the payment queue and payments are made of. */\nexport async function approvedWithStates(tx: EntityManager, domain: { id: string }, ids?: string[]) {\n const requests = await tx.getRepository(ExpenditureRequest).find({\n where: { domain: { id: domain.id }, status: ExpenditureRequestStatus.APPROVED, ...(ids ? { id: In(ids) } : {}) } as any,\n relations: ['items', 'requester', 'counterparty', 'payeeAccount']\n })\n for (const request of requests) request.items = (request.items ?? []).filter(item => !item.deletedAt)\n const states = await paymentStatesOf(tx, domain, requests as any)\n return { requests, states }\n}\n\n/** Whether the account approvers saw is still the one on file (§`payeeAccountDrift`); `missing` when none was written. */\nexport async function driftOf(tx: EntityManager, request: ExpenditureRequest): Promise<string | undefined> {\n if (!request.payeeAccountNumber) return 'missing'\n if (request.kind !== ExpenditureKind.VENDOR) return undefined\n const current = request.payeeAccountId\n ? await tx.getRepository(CounterpartyBankAccount).findOne({ where: { id: request.payeeAccountId } as any, withDeleted: true })\n : null\n return payeeAccountDrift(request, current, accountKey)\n}\n\n/**\n * Put a part of a withdrawal on a request (ADR-0135 §2-5). A payable line that cites a tax invoice is paid on that\n * invoice; the rest on the request itself. A link the line already has to the same target is raised, not doubled.\n */\nasync function putOnLine(tx: EntityManager, domain: { id: string }, user: any, request: ExpenditureRequest, state: PaymentState, lineId: string, amount: number) {\n if (amount > state.outstanding + 0.005)\n throw new Refusal('expenditure-paid-over', { title: request.title }, `more is put on ${request.title} than it asks`)\n\n const existing = await tx.getRepository(Payment).find({ where: { domain: { id: domain.id }, transaction: { id: lineId } } as any })\n const patchFor = (targetType: string, targetId: string, put: number) => {\n const twin = existing.find(one => one.targetType === targetType && one.targetId === targetId)\n return twin ? { id: twin.id, cuFlag: 'M', amount: Number(twin.amount) + put } : { cuFlag: '+', transaction: { id: lineId }, targetType, targetId, amount: put }\n }\n\n let remaining = amount\n const patches: any[] = []\n const cited = (request.items ?? []).filter(item => isPayable(item) && item.taxInvoiceId)\n if (cited.length) {\n const onInvoices = await tx.getRepository(Payment).find({\n where: { domain: { id: domain.id }, targetType: TAX_INVOICE_TARGET, targetId: In(cited.map(item => item.taxInvoiceId)) } as any\n })\n for (const item of cited) {\n const paid = onInvoices.filter(one => one.targetId === item.taxInvoiceId).reduce((sum, one) => sum + paidOfDocument(one), 0)\n const put = Math.min(remaining, Math.max(0, Number(item.amount) - paid))\n if (put > 0) patches.push(patchFor(TAX_INVOICE_TARGET, item.taxInvoiceId!, put))\n remaining -= put\n }\n }\n const direct = Math.min(remaining, Math.max(0, state.settleable - state.settled))\n if (direct > 0) patches.push(patchFor(EXPENDITURE_TARGET, request.id, direct))\n remaining -= direct\n if (remaining > 0.005) throw new Refusal('expenditure-paid-over', { title: request.title }, `more is put on ${request.title} than it asks`)\n\n await savePayments(tx, domain, user, patches)\n}\n\nexport interface PaymentRecord {\n paidDate: string\n bankAccount?: { id: string } | null\n}\n\n/**\n * Pay approved requests - finance transferred the money at the bank and records it. Each request gets a withdrawal of\n * what it still asks, written as a person's line; the next bank statement import matches it, and then the payment is\n * reconciled (§`bank-reconcile`).\n */\nexport async function payRequests(tx: EntityManager, domain: any, user: any, ids: string[], record: PaymentRecord): Promise<ExpenditureRequest[]> {\n const paidDate = dayOf(record.paidDate)\n if (!paidDate) throw new Refusal('expenditure-paid-date-missing', {}, 'paidDate: the day the money went out')\n const bankAccount = await inDomain(tx, BankAccount, domain, record.bankAccount, 'bankAccount')\n\n const { requests, states } = await approvedWithStates(tx, domain, [...new Set(ids)])\n if (requests.length !== new Set(ids).size) {\n const found = await tx.getRepository(ExpenditureRequest).find({ where: { domain: { id: domain.id }, id: In(ids) } as any })\n const titles = found.filter(one => one.status !== ExpenditureRequestStatus.APPROVED).map(one => one.title).join(', ')\n if (titles) throw new Refusal('expenditure-not-approved', { title: titles }, `only an approved request is paid - ${titles}`)\n throw new Refusal('expenditure-not-found', {}, 'some requests were not found - reload and try again')\n }\n\n for (const request of requests) {\n const state = states.get(request.id)!\n if (!(state.outstanding > 0)) throw new Refusal('expenditure-paid-already', { title: request.title }, `${request.title} has nothing left to pay`)\n const payee = request.kind === ExpenditureKind.VENDOR ? request.counterparty?.name : request.requester?.name\n const [line] = await saveTransactions(tx, domain, user, [\n {\n cuFlag: '+',\n category: TransactionCategory.CONFIRMED,\n source: TransactionSource.MANUAL,\n type: CashFlowType.EXPENSE,\n transactionDate: paidDate,\n amount: state.outstanding,\n description: `지출 — ${request.title}`,\n counterpartyName: payee ?? undefined,\n ...(request.counterpartyId ? { counterparty: { id: request.counterpartyId } } : {}),\n ...(bankAccount ? { bankAccount: { id: bankAccount.id } } : { currency: request.currency })\n }\n ])\n await putOnLine(tx, domain, user, request, state, line.id, state.outstanding)\n }\n return requests\n}\n\n/**\n * Pay a request with a withdrawal already in the books - a bank statement brought it in first. The part put on the\n * request is what it still asks unless a smaller amount is given.\n */\nexport async function payWithLine(tx: EntityManager, domain: any, user: any, requestId: string, transactionId: string, amount?: number | null): Promise<ExpenditureRequest> {\n const { requests, states } = await approvedWithStates(tx, domain, [requestId])\n const [request] = requests\n if (!request) {\n const found = await tx.getRepository(ExpenditureRequest).findOne({ where: { domain: { id: domain.id }, id: requestId } as any })\n if (found) throw new Refusal('expenditure-not-approved', { title: found.title }, `only an approved request is paid - ${found.title}`)\n throw new Refusal('expenditure-not-found', {}, `expenditure request '${requestId}' was not found`)\n }\n const line = await tx.getRepository(Transaction).findOne({ where: { domain: { id: domain.id }, id: transactionId, category: TransactionCategory.CONFIRMED } as any })\n if (!line) throw new Refusal('expenditure-line-gone', {}, 'the bank line was not found - reload and try again')\n\n const state = states.get(request.id)!\n const put = amount === null || amount === undefined ? Math.min(state.outstanding, Number(line.amount)) : Number(amount)\n if (!(put > 0)) throw new Refusal('expenditure-paid-already', { title: request.title }, `${request.title} has nothing left to pay`)\n await putOnLine(tx, domain, user, request, state, line.id, put)\n return request\n}\n"]}
1
+ {"version":3,"file":"expenditure-request-service.js","sourceRoot":"","sources":["../../../server/service/expenditure-request/expenditure-request-service.ts"],"names":[],"mappings":"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","sourcesContent":["import { EntityManager, In } from 'typeorm'\n\nimport { Refusal } from '@things-factory/shell'\nimport { accountKey, Counterparty, CounterpartyBankAccount } from '@things-factory/biz-base'\nimport { Employee } from '@things-factory/organization'\nimport { Category, TaxInvoice } from '@things-factory/tax-invoice'\nimport { abort, activityNamed, approvalLineRefusal, approvalLineStanding, issue } from '@things-factory/worklist'\nimport { createAttachment, replaceAttachment } from '@things-factory/attachment-base'\n\nimport { activityOfKind } from '../../activities/expenditure-activity-names'\nimport { Account } from '../account/account'\nimport { accountMatcher } from '../account/account-match'\nimport { BankAccount } from '../bank-account/bank-account'\nimport { CashFlowType } from '../cash-flow-type'\nimport { Payment } from '../payment/payment'\nimport { TAX_INVOICE_TARGET } from '../payment/document-targets'\nimport { paidOfTarget } from '../payment/payment-currency'\nimport { savePayments } from '../payment/payment-service'\nimport { Transaction, TransactionCategory, TransactionSource } from '../transaction/transaction'\nimport { saveTransactions } from '../transaction/transaction-service'\nimport { ExpenditureKind, ExpenditureRequest, ExpenditureRequestStatus } from './expenditure-request'\nimport { ExpenditurePaymentMethod, ExpenditureRequestItem } from './expenditure-request-item'\nimport { EXPENDITURE_TARGET, paymentStatesOf, type PaymentState } from './expenditure-payment-state'\nimport {\n canEdit,\n dayOf,\n isPayable,\n monthOf,\n payeeAccountDrift,\n requestForLine,\n submitRefusal,\n totalsOf,\n type RequestKind,\n type RequestStatus\n} from './expenditure-request-rules'\n\nexport const RECEIPT_REF_TYPE = 'ExpenditureRequestItem'\n\nconst won = (value: number) => `${Math.round(value || 0).toLocaleString()}원`\nconst KINDS = Object.values(ExpenditureKind) as string[]\nconst METHODS = Object.values(ExpenditurePaymentMethod) as string[]\n\nexport interface RequestHead {\n id?: string\n kind?: string\n title?: string\n month?: string\n dueDate?: string\n counterparty?: { id: string } | null\n payeeAccount?: { id: string } | null\n notes?: string\n}\n\nexport interface ItemPatch {\n id?: string\n cuFlag?: string\n spentDate?: string\n category?: string\n account?: { id: string } | null\n merchant?: string\n description?: string\n amount?: number\n vatAmount?: number\n paymentMethod?: string\n taxInvoice?: { id: string } | null\n}\n\n/** A request somebody is judging (or that is decided) - it changes only after it is withdrawn. */\nexport const lockedRequest = (status: string) =>\n new Refusal('expenditure-locked', { status: String(status).toLowerCase() }, `a ${String(status).toLowerCase()} request cannot be changed - withdraw it first`)\n\n/** The request of this domain, refusing one that is not the caller's own. */\nexport async function ownRequest(tx: EntityManager, id: string, domain: { id: string }, user: { id: string }): Promise<ExpenditureRequest> {\n const request = await tx.getRepository(ExpenditureRequest).findOne({ where: { id, domain: { id: domain.id } } as any, relations: ['requester'] })\n if (!request) throw new Refusal('expenditure-not-found', {}, `expenditure request '${id}' was not found`)\n if (request.requester?.id !== user.id) throw new Refusal('expenditure-not-yours', {}, 'only the requester can change this request')\n return request\n}\n\nasync function employeeOf(tx: EntityManager, domain: { id: string }, user: { id: string }) {\n return await tx.getRepository(Employee).findOne({ where: { domain: { id: domain.id }, user: { id: user.id } } as any, relations: ['department'] })\n}\n\nasync function linesOf(tx: EntityManager, requestId: string): Promise<ExpenditureRequestItem[]> {\n return await tx.getRepository(ExpenditureRequestItem).find({ where: { request: { id: requestId } } as any, order: { spentDate: 'ASC', createdAt: 'ASC' } as any })\n}\n\nasync function refreshTotals(tx: EntityManager, request: ExpenditureRequest): Promise<ExpenditureRequest> {\n const totals = totalsOf(await linesOf(tx, request.id))\n request.totalAmount = totals.total\n request.payableAmount = totals.payable\n return await tx.getRepository(ExpenditureRequest).save(request)\n}\n\nasync function inDomain<T>(tx: EntityManager, entity: new () => T, domain: { id: string }, ref: { id: string } | null | undefined, field: string): Promise<T | null> {\n if (!ref?.id) return null\n const row = await tx.getRepository(entity).findOne({ where: { domain: { id: domain.id }, id: ref.id } as any })\n if (!row) throw new Refusal('expenditure-reference-not-found', { field }, `${field} was not found - reload and try again`)\n return row\n}\n\n/** The counterparty and the account of it a counterparty payment names - the account must be that counterparty's. */\nasync function payeeOf(tx: EntityManager, domain: { id: string }, head: RequestHead, current?: ExpenditureRequest) {\n const counterparty = 'counterparty' in head ? await inDomain(tx, Counterparty, domain, head.counterparty, 'counterparty') : undefined\n const account = 'payeeAccount' in head ? await inDomain(tx, CounterpartyBankAccount, domain, head.payeeAccount, 'payeeAccount') : undefined\n const counterpartyId = counterparty === undefined ? current?.counterpartyId : counterparty?.id\n if (account && account.counterpartyId !== counterpartyId)\n throw new Refusal('expenditure-account-not-of-payee', {}, \"the account is not the counterparty's - choose one of its accounts\")\n return { counterparty, account }\n}\n\n/** Apply line patches to a request - checks each line's references and the tax invoice it cites. */\nasync function saveItems(tx: EntityManager, domain: { id: string }, user: any, request: ExpenditureRequest, patches: ItemPatch[]) {\n const repo = tx.getRepository(ExpenditureRequestItem)\n\n const deletes = patches.filter(one => one.cuFlag === '-' && one.id).map(one => one.id!)\n if (deletes.length) {\n const own = await repo.find({ where: { request: { id: request.id }, id: In(deletes) } as any })\n if (own.length !== new Set(deletes).size) throw new Refusal('expenditure-line-not-found', {}, 'a line was not found - reload and try again')\n await repo.softDelete({ id: In(deletes) })\n }\n\n const writes = patches.filter(one => one.cuFlag !== '-')\n const accounts = writes.some(one => !('account' in one) && (one.category || one.description))\n ? await tx.getRepository(Account).find({ where: { domain: { id: domain.id }, active: true } as any })\n : []\n const match = accountMatcher(accounts)\n\n for (const patch of writes) {\n const isNew = !patch.id || patch.cuFlag === '+'\n const current = isNew ? undefined : await repo.findOne({ where: { request: { id: request.id }, id: patch.id } as any })\n if (!isNew && !current) throw new Refusal('expenditure-line-not-found', {}, 'a line was not found - reload and try again')\n\n const row: Record<string, any> = {}\n if ('spentDate' in patch) {\n row.spentDate = patch.spentDate ? dayOf(patch.spentDate) : null\n if (patch.spentDate && !row.spentDate) throw new Refusal('expenditure-line-day-invalid', { value: String(patch.spentDate) }, `'${patch.spentDate}' is not a day (use YYYY-MM-DD)`)\n }\n for (const field of ['category', 'merchant', 'description'] as const) if (field in patch) row[field] = patch[field]?.trim() || null\n if ('amount' in patch) row.amount = Number(patch.amount) || 0\n if ('vatAmount' in patch) row.vatAmount = patch.vatAmount === null || patch.vatAmount === undefined ? null : Number(patch.vatAmount)\n if ('paymentMethod' in patch && patch.paymentMethod) {\n if (!METHODS.includes(patch.paymentMethod)) throw new Refusal('expenditure-line-method-invalid', { value: patch.paymentMethod }, `'${patch.paymentMethod}' is not a way to pay`)\n row.paymentMethod = patch.paymentMethod\n } else if (isNew) row.paymentMethod = request.kind === ExpenditureKind.VENDOR ? ExpenditurePaymentMethod.TRANSFER : ExpenditurePaymentMethod.PERSONAL_CARD\n\n if ('account' in patch) row.account = await inDomain(tx, Account, domain, patch.account, 'account')\n else {\n /* A line that names no account is given the one its words mean, by its category then its description (§`accountMatcher`). */\n const words = [patch.category ?? current?.category, patch.description ?? current?.description]\n const found = (isNew || 'category' in patch || 'description' in patch) && accounts.length ? match(words, CashFlowType.EXPENSE) : undefined\n if (found) row.account = found\n }\n\n if ('taxInvoice' in patch) {\n const invoice = await inDomain(tx, TaxInvoice, domain, patch.taxInvoice, 'taxInvoice')\n if (invoice) {\n if (request.kind !== ExpenditureKind.VENDOR) throw new Refusal('expenditure-invoice-on-reimbursement', {}, 'a reimbursement cites receipts, not tax invoices')\n if (invoice.category !== Category.IMPORT) throw new Refusal('expenditure-invoice-not-purchase', {}, 'cite a purchase tax invoice')\n const elsewhere = await repo.find({ where: { domain: { id: domain.id }, taxInvoice: { id: invoice.id } } as any, relations: ['request'] })\n if (elsewhere.some(one => one.id !== current?.id && one.request && !one.request.deletedAt))\n throw new Refusal('expenditure-invoice-cited-twice', { issueDate: invoice.issueDate }, 'another request already pays this tax invoice')\n if (!('amount' in patch) || !(row.amount > 0)) row.amount = Number(invoice.totalAmount)\n if (!('spentDate' in patch)) row.spentDate = invoice.issueDate\n }\n row.taxInvoice = invoice\n }\n\n /* What a line says of its money holds whenever it is written, not only when it is submitted. */\n const amount = 'amount' in row ? row.amount : Number(current?.amount ?? 0)\n if ('amount' in row && !(row.amount > 0)) throw new Refusal('expenditure-line-amount-missing', {}, 'every line needs an amount above zero')\n const vat = 'vatAmount' in row ? row.vatAmount : current?.vatAmount\n if (vat && amount && Number(vat) > amount) throw new Refusal('expenditure-line-vat-over-amount', {}, 'the VAT is more than the amount')\n\n /* A line that cites an invoice asks no more than the invoice - whichever of the two changed. */\n const citedId = 'taxInvoice' in patch ? row.taxInvoice?.id : current?.taxInvoiceId\n if (citedId && ('amount' in row || 'taxInvoice' in patch)) {\n const invoice = row.taxInvoice ?? (await tx.getRepository(TaxInvoice).findOne({ where: { id: citedId } as any, withDeleted: true }))\n if (invoice && amount > Number(invoice.totalAmount) + 0.005)\n throw new Refusal('expenditure-line-over-invoice', { total: won(Number(invoice.totalAmount)) }, 'a line asks more than the tax invoice it cites')\n }\n\n await repo.save({ ...(current ?? { domain, request, creator: user, amount: 0 }), ...row, updater: user } as any)\n }\n}\n\n/**\n * Save a request and its lines in one go - the head, then the lines. A new request belongs to the caller; an existing\n * one only to its requester, and only while it is editable.\n */\nexport async function saveRequest(tx: EntityManager, domain: any, user: any, head: RequestHead, items: ItemPatch[]): Promise<ExpenditureRequest> {\n const repo = tx.getRepository(ExpenditureRequest)\n\n let request: ExpenditureRequest\n if (head.id) {\n request = await ownRequest(tx, head.id, domain, user)\n if (!canEdit(request.status as RequestStatus)) throw lockedRequest(request.status)\n if (head.kind && head.kind !== request.kind) throw new Refusal('expenditure-kind-fixed', {}, 'a request keeps the kind it was written as')\n } else {\n if (!head.kind || !KINDS.includes(head.kind)) throw new Refusal('expenditure-kind-missing', {}, 'say whether it pays a counterparty or pays an employee back')\n const employee = await employeeOf(tx, domain, user)\n request = repo.create({\n domain,\n kind: head.kind as ExpenditureKind,\n requester: user,\n department: employee?.department ?? null,\n status: ExpenditureRequestStatus.DRAFT,\n currency: 'KRW',\n totalAmount: 0,\n payableAmount: 0,\n creator: user\n } as any) as unknown as ExpenditureRequest\n }\n\n const reimbursement = request.kind === ExpenditureKind.REIMBURSEMENT\n if ('month' in head || (!head.id && reimbursement)) {\n const month = monthOf(head.month)\n if (reimbursement && !month) throw new Refusal('expenditure-month-invalid', { value: String(head.month ?? '') }, `month: '${head.month ?? ''}' is not a month (use YYYY-MM)`)\n if (head.month && !month) throw new Refusal('expenditure-month-invalid', { value: String(head.month) }, `month: '${head.month}' is not a month (use YYYY-MM)`)\n request.month = month ?? null\n }\n if ('dueDate' in head) {\n request.dueDate = head.dueDate ? dayOf(head.dueDate) ?? null : null\n if (head.dueDate && !request.dueDate) throw new Refusal('expenditure-due-date-invalid', { value: String(head.dueDate) }, `'${head.dueDate}' is not a day (use YYYY-MM-DD)`)\n }\n if (reimbursement && ('counterparty' in head || 'payeeAccount' in head)) throw new Refusal('expenditure-reimbursement-pays-requester', {}, 'a reimbursement pays the employee who wrote it')\n const { counterparty, account } = await payeeOf(tx, domain, head, head.id ? request : undefined)\n if (counterparty !== undefined) request.counterparty = counterparty\n if (account !== undefined) request.payeeAccount = account\n /* A changed counterparty drops the account chosen of the former one. */\n if (counterparty !== undefined && account === undefined && request.payeeAccountId) {\n const kept = await tx.getRepository(CounterpartyBankAccount).findOne({ where: { id: request.payeeAccountId } as any })\n if (kept?.counterpartyId !== counterparty?.id) request.payeeAccount = null\n }\n\n if (head.title?.trim()) request.title = head.title.trim()\n else if (!request.title) request.title = reimbursement ? `${request.month} 경비` : `${counterparty?.name ?? ''} 지급`.trim()\n if (head.notes !== undefined) request.notes = head.notes\n request.updater = user\n request = await repo.save(request)\n\n if (items?.length) await saveItems(tx, domain, user, request, items)\n return await refreshTotals(tx, request)\n}\n\n/** The payee's account as approvers will see it - written on the request when it is submitted (ADR-0135 §5). */\nasync function payeeSnapshot(tx: EntityManager, domain: { id: string }, request: ExpenditureRequest, user: any) {\n if (request.kind === ExpenditureKind.VENDOR) {\n const account = await tx.getRepository(CounterpartyBankAccount).findOne({ where: { domain: { id: domain.id }, id: request.payeeAccountId } as any })\n if (!account || account.counterpartyId !== request.counterpartyId)\n throw new Refusal('expenditure-payee-account-missing', {}, \"choose the counterparty's account to pay into\")\n return { payeeBankName: account.bankName ?? null, payeeAccountNumber: account.accountNumber, payeeHolderName: account.holderName ?? null }\n }\n const employee = await employeeOf(tx, domain, user)\n return {\n payeeBankName: employee?.bankName ?? null,\n payeeAccountNumber: employee?.bankAccount ? accountKey(employee.bankAccount) || null : null,\n payeeHolderName: user.name ?? null\n }\n}\n\n/** Put a request up for approval. The approval carries what the approver needs to judge it. */\nexport async function submitRequest(tx: EntityManager, domain: any, user: any, id: string, context: ResolverContext): Promise<ExpenditureRequest> {\n const request = await ownRequest(tx, id, domain, user)\n const items = await linesOf(tx, request.id)\n\n const refusal = submitRefusal(\n {\n kind: request.kind as RequestKind,\n status: request.status as RequestStatus,\n month: request.month,\n dueDate: request.dueDate,\n counterpartyId: request.counterpartyId,\n payeeAccountId: request.payeeAccountId\n },\n items\n )\n if (refusal) throw refusal\n Object.assign(request, await payeeSnapshot(tx, domain, request, user))\n\n const form = activityOfKind(request.kind)\n const carrier = await activityNamed(form, context)\n if (!carrier) throw new Refusal('expenditure-approval-not-installed', { form }, `the approval '${form}' is not installed in this domain`)\n const line = await approvalLineStanding(carrier, context)\n if (line.refusal) throw approvalLineRefusal(line.refusal)\n\n const totals = totalsOf(items)\n const who = user.name || user.email || ''\n const vendor = request.kind === ExpenditureKind.VENDOR\n const payee = vendor ? (await tx.getRepository(Counterparty).findOne({ where: { id: request.counterpartyId } as any }))?.name ?? '' : who\n const account = [request.payeeBankName, request.payeeAccountNumber, request.payeeHolderName].filter(Boolean).join(' ')\n\n const instance = await issue(\n {\n name: vendor ? `지출결의 ${payee} ${request.title}` : `경비 청구 ${who} ${request.month}`,\n description: `${won(totals.total)} · ${totals.count}건${totals.payable !== totals.total ? ` (지급할 금액 ${won(totals.payable)})` : ''}`,\n activityId: carrier.id,\n approvalLine: carrier.approvalLine,\n input: {\n requestId: request.id,\n month: request.month ?? request.dueDate?.slice(0, 7) ?? '',\n requester: who,\n payee,\n headline: vendor\n ? `${payee} · ${request.title} ${won(totals.payable)}${request.dueDate ? ` — ${request.dueDate} 지급` : ''}`\n : `${who} · ${request.month} 경비 ${won(totals.total)} (${totals.count}건)`,\n total: totals.total,\n payable: totals.payable,\n account,\n lines: items.map(item =>\n `${item.spentDate ?? ''} ${item.category ?? ''} ${item.merchant ?? ''} ${won(item.amount)}${item.paymentMethod === ExpenditurePaymentMethod.CORPORATE_CARD ? ' (법인카드)' : ''}${item.taxInvoiceId ? ' (세금계산서)' : ''} — ${item.description ?? ''}`\n .replace(/\\s+/g, ' ')\n .trim()\n ),\n consequence:\n totals.payable > 0\n ? `승인하면 ${won(totals.payable)}을 ${payee}에게 지급할 대상이 됩니다${account ? ` (${account})` : ''}`\n : '법인카드 사용분만 있어 지급할 금액은 없습니다'\n },\n threadsMin: 1,\n threadsMax: 1,\n requireApproval: true\n } as any,\n context\n )\n\n request.status = ExpenditureRequestStatus.SUBMITTED\n request.activityInstanceId = instance.id\n request.submittedAt = new Date()\n request.decidedAt = null\n request.decidedBy = null\n request.updater = user\n return await tx.getRepository(ExpenditureRequest).save(request)\n}\n\n/** Take a request back from its approvers. worklist's abort does not call the activity back, so the request is set here. */\nexport async function withdrawRequest(tx: EntityManager, domain: any, user: any, id: string, context: ResolverContext): Promise<ExpenditureRequest> {\n const request = await ownRequest(tx, id, domain, user)\n if (request.status !== ExpenditureRequestStatus.SUBMITTED)\n throw new Refusal('expenditure-not-submitted', { status: String(request.status).toLowerCase() }, 'only a request waiting on approvers can be withdrawn')\n\n if (request.activityInstanceId) await abort({ id: request.activityInstanceId, reason: '작성자가 회수함' }, context)\n\n request.status = ExpenditureRequestStatus.WITHDRAWN\n request.updater = user\n return await tx.getRepository(ExpenditureRequest).save(request)\n}\n\n/** Delete one of the caller's requests that nobody is judging - with its lines. */\nexport async function deleteRequest(tx: EntityManager, domain: any, user: any, id: string): Promise<boolean> {\n const request = await ownRequest(tx, id, domain, user)\n if (!canEdit(request.status as RequestStatus))\n throw new Refusal('expenditure-cannot-delete', { status: request.status.toLowerCase() }, `a ${request.status.toLowerCase()} request cannot be deleted`)\n await tx.getRepository(ExpenditureRequestItem).softDelete({ request: { id } } as any)\n await tx.getRepository(ExpenditureRequest).softDelete({ id })\n return true\n}\n\n/**\n * Add one line from the phone. It joins the caller's editable reimbursement of that month (§`requestForLine`), or\n * starts one. The receipt photo is attached to the line.\n */\nexport async function addLine(tx: EntityManager, domain: any, user: any, line: ItemPatch & { month?: string; receipt?: any }, context: ResolverContext): Promise<ExpenditureRequest> {\n const spentDate = dayOf(line.spentDate)\n if (!spentDate) throw new Refusal('expenditure-line-day-missing', {}, 'every line needs its day')\n const month = monthOf(line.month) ?? spentDate.slice(0, 7)\n\n const mine = await tx.getRepository(ExpenditureRequest).find({\n where: { domain: { id: domain.id }, requester: { id: user.id }, kind: ExpenditureKind.REIMBURSEMENT, month } as any\n })\n const joinId = requestForLine(\n mine.map(one => ({ id: one.id, status: one.status as RequestStatus, month: one.month, updatedAt: one.updatedAt })),\n month\n )\n\n const { receipt, month: _month, ...fields } = line\n const request = await saveRequest(tx, domain, user, joinId ? { id: joinId } : { kind: ExpenditureKind.REIMBURSEMENT, month }, [{ ...fields, spentDate, cuFlag: '+' }])\n\n if (receipt) {\n const [latest] = await tx.getRepository(ExpenditureRequestItem).find({ where: { request: { id: request.id } } as any, order: { createdAt: 'DESC' } as any, take: 1 })\n if (latest) await attachReceipt(latest.id, receipt, context)\n }\n return request\n}\n\n/** Put a receipt on a line - replacing the one it had. Only the requester, only while editable. */\nexport async function replaceReceipt(tx: EntityManager, domain: any, user: any, itemId: string, file: any, context: ResolverContext): Promise<ExpenditureRequestItem> {\n const item = await tx.getRepository(ExpenditureRequestItem).findOne({ where: { id: itemId, domain: { id: domain.id } } as any, relations: ['request'] })\n if (!item?.request) throw new Refusal('expenditure-line-not-found', {}, 'a line was not found - reload and try again')\n const request = await ownRequest(tx, item.request.id, domain, user)\n if (!canEdit(request.status as RequestStatus)) throw lockedRequest(request.status)\n\n await replaceAttachment({ file, refType: RECEIPT_REF_TYPE, refBy: item.id, category: 'receipt' }, context)\n return item\n}\n\nasync function attachReceipt(itemId: string, file: any, context: ResolverContext) {\n await createAttachment(null, { attachment: { file, refType: RECEIPT_REF_TYPE, refBy: itemId, category: 'receipt' } } as any, context)\n}\n\n/** Approved requests with their lines and how far each is paid - what the payment queue and payments are made of. */\nexport async function approvedWithStates(tx: EntityManager, domain: { id: string }, ids?: string[]) {\n const requests = await tx.getRepository(ExpenditureRequest).find({\n where: { domain: { id: domain.id }, status: ExpenditureRequestStatus.APPROVED, ...(ids ? { id: In(ids) } : {}) } as any,\n relations: ['items', 'requester', 'counterparty', 'payeeAccount']\n })\n for (const request of requests) request.items = (request.items ?? []).filter(item => !item.deletedAt)\n const states = await paymentStatesOf(tx, domain, requests as any)\n return { requests, states }\n}\n\n/** Whether the account approvers saw is still the one on file (§`payeeAccountDrift`); `missing` when none was written. */\nexport async function driftOf(tx: EntityManager, request: ExpenditureRequest): Promise<string | undefined> {\n if (!request.payeeAccountNumber) return 'missing'\n if (request.kind !== ExpenditureKind.VENDOR) return undefined\n const current = request.payeeAccountId\n ? await tx.getRepository(CounterpartyBankAccount).findOne({ where: { id: request.payeeAccountId } as any, withDeleted: true })\n : null\n return payeeAccountDrift(request, current, accountKey)\n}\n\n/**\n * Put a part of a withdrawal on a request (ADR-0135 §2-5). A payable line that cites a tax invoice is paid on that\n * invoice; the rest on the request itself. A link the line already has to the same target is raised, not doubled.\n */\nasync function putOnLine(tx: EntityManager, domain: { id: string }, user: any, request: ExpenditureRequest, state: PaymentState, lineId: string, amount: number) {\n if (amount > state.outstanding + 0.005)\n throw new Refusal('expenditure-paid-over', { title: request.title }, `more is put on ${request.title} than it asks`)\n\n const existing = await tx.getRepository(Payment).find({ where: { domain: { id: domain.id }, transaction: { id: lineId } } as any })\n const patchFor = (targetType: string, targetId: string, put: number) => {\n const twin = existing.find(one => one.targetType === targetType && one.targetId === targetId)\n return twin ? { id: twin.id, cuFlag: 'M', amount: Number(twin.amount) + put } : { cuFlag: '+', transaction: { id: lineId }, targetType, targetId, amount: put }\n }\n\n let remaining = amount\n const patches: any[] = []\n const cited = (request.items ?? []).filter(item => isPayable(item) && item.taxInvoiceId)\n if (cited.length) {\n const onInvoices = await tx.getRepository(Payment).find({\n where: { domain: { id: domain.id }, targetType: TAX_INVOICE_TARGET, targetId: In(cited.map(item => item.taxInvoiceId)) } as any\n })\n for (const item of cited) {\n const paid = onInvoices.filter(one => one.targetId === item.taxInvoiceId).reduce((sum, one) => sum + paidOfTarget(one), 0)\n const put = Math.min(remaining, Math.max(0, Number(item.amount) - paid))\n if (put > 0) patches.push(patchFor(TAX_INVOICE_TARGET, item.taxInvoiceId!, put))\n remaining -= put\n }\n }\n const direct = Math.min(remaining, Math.max(0, state.settleable - state.settled))\n if (direct > 0) patches.push(patchFor(EXPENDITURE_TARGET, request.id, direct))\n remaining -= direct\n if (remaining > 0.005) throw new Refusal('expenditure-paid-over', { title: request.title }, `more is put on ${request.title} than it asks`)\n\n await savePayments(tx, domain, user, patches)\n}\n\nexport interface PaymentRecord {\n paidDate: string\n bankAccount?: { id: string } | null\n}\n\n/**\n * Pay approved requests - finance transferred the money at the bank and records it. Each request gets a withdrawal of\n * what it still asks, written as a person's line; the next bank statement import matches it, and then the payment is\n * reconciled (§`bank-reconcile`).\n */\nexport async function payRequests(tx: EntityManager, domain: any, user: any, ids: string[], record: PaymentRecord): Promise<ExpenditureRequest[]> {\n const paidDate = dayOf(record.paidDate)\n if (!paidDate) throw new Refusal('expenditure-paid-date-missing', {}, 'paidDate: the day the money went out')\n const bankAccount = await inDomain(tx, BankAccount, domain, record.bankAccount, 'bankAccount')\n\n const { requests, states } = await approvedWithStates(tx, domain, [...new Set(ids)])\n if (requests.length !== new Set(ids).size) {\n const found = await tx.getRepository(ExpenditureRequest).find({ where: { domain: { id: domain.id }, id: In(ids) } as any })\n const titles = found.filter(one => one.status !== ExpenditureRequestStatus.APPROVED).map(one => one.title).join(', ')\n if (titles) throw new Refusal('expenditure-not-approved', { title: titles }, `only an approved request is paid - ${titles}`)\n throw new Refusal('expenditure-not-found', {}, 'some requests were not found - reload and try again')\n }\n\n for (const request of requests) {\n const state = states.get(request.id)!\n if (!(state.outstanding > 0)) throw new Refusal('expenditure-paid-already', { title: request.title }, `${request.title} has nothing left to pay`)\n const payee = request.kind === ExpenditureKind.VENDOR ? request.counterparty?.name : request.requester?.name\n const [line] = await saveTransactions(tx, domain, user, [\n {\n cuFlag: '+',\n category: TransactionCategory.CONFIRMED,\n source: TransactionSource.MANUAL,\n type: CashFlowType.EXPENSE,\n transactionDate: paidDate,\n amount: state.outstanding,\n description: `지출 — ${request.title}`,\n counterpartyName: payee ?? undefined,\n ...(request.counterpartyId ? { counterparty: { id: request.counterpartyId } } : {}),\n ...(bankAccount ? { bankAccount: { id: bankAccount.id } } : { currency: request.currency })\n }\n ])\n await putOnLine(tx, domain, user, request, state, line.id, state.outstanding)\n }\n return requests\n}\n\n/**\n * Pay a request with a withdrawal already in the books - a bank statement brought it in first. The part put on the\n * request is what it still asks unless a smaller amount is given.\n */\nexport async function payWithLine(tx: EntityManager, domain: any, user: any, requestId: string, transactionId: string, amount?: number | null): Promise<ExpenditureRequest> {\n const { requests, states } = await approvedWithStates(tx, domain, [requestId])\n const [request] = requests\n if (!request) {\n const found = await tx.getRepository(ExpenditureRequest).findOne({ where: { domain: { id: domain.id }, id: requestId } as any })\n if (found) throw new Refusal('expenditure-not-approved', { title: found.title }, `only an approved request is paid - ${found.title}`)\n throw new Refusal('expenditure-not-found', {}, `expenditure request '${requestId}' was not found`)\n }\n const line = await tx.getRepository(Transaction).findOne({ where: { domain: { id: domain.id }, id: transactionId, category: TransactionCategory.CONFIRMED } as any })\n if (!line) throw new Refusal('expenditure-line-gone', {}, 'the bank line was not found - reload and try again')\n\n const state = states.get(request.id)!\n const put = amount === null || amount === undefined ? Math.min(state.outstanding, Number(line.amount)) : Number(amount)\n if (!(put > 0)) throw new Refusal('expenditure-paid-already', { title: request.title }, `${request.title} has nothing left to pay`)\n await putOnLine(tx, domain, user, request, state, line.id, put)\n return request\n}\n"]}
@@ -11,10 +11,17 @@ const expenditure_request_item_1 = require("./expenditure-request-item");
11
11
  const expenditure_payment_state_1 = require("./expenditure-payment-state");
12
12
  /*
13
13
  * The bank lines that paid an expenditure request directly (ADR-0135 §2-5) - the part no tax invoice of it stands
14
- * for. A request is paid only once it is approved, only by withdrawals in its currency, and by no more than that part.
14
+ * for. A request is paid only once it is approved, only by withdrawals, and by no more than that part - in its
15
+ * currency (§`checkPaymentCurrencies`).
15
16
  */
16
17
  (0, payment_targets_1.registerPaymentTarget)(expenditure_payment_state_1.EXPENDITURE_TARGET, {
17
18
  purpose: payment_1.PaymentPurpose.SETTLEMENT,
19
+ async currencyOf(tx, domain, targetIds) {
20
+ const requests = await tx
21
+ .getRepository(expenditure_request_1.ExpenditureRequest)
22
+ .find({ where: { domain: { id: domain.id }, id: (0, typeorm_1.In)(targetIds) }, withDeleted: true });
23
+ return new Map(requests.map(one => [one.id, one.currency]));
24
+ },
18
25
  async label(tx, domain, targetIds) {
19
26
  const requests = await tx
20
27
  .getRepository(expenditure_request_1.ExpenditureRequest)
@@ -41,8 +48,8 @@ const expenditure_payment_state_1 = require("./expenditure-payment-state");
41
48
  if (request.status !== expenditure_request_1.ExpenditureRequestStatus.APPROVED)
42
49
  throw new shell_1.Refusal('expenditure-not-approved', { title: request.title }, `only an approved request is paid - ${request.title}`);
43
50
  for (const { transaction: line } of own)
44
- if (line.category !== transaction_1.TransactionCategory.CONFIRMED || line.type !== cash_flow_type_1.CashFlowType.EXPENSE || (line.currency ?? 'KRW') !== request.currency)
45
- throw new shell_1.Refusal('expenditure-paid-by-withdrawal', { currency: request.currency }, `a request is paid by a withdrawal in ${request.currency}`);
51
+ if (line.category !== transaction_1.TransactionCategory.CONFIRMED || line.type !== cash_flow_type_1.CashFlowType.EXPENSE)
52
+ throw new shell_1.Refusal('expenditure-paid-by-withdrawal', {}, 'a request is paid by a withdrawal');
46
53
  }
47
54
  const states = await (0, expenditure_payment_state_1.paymentStatesOf)(tx, domain, requests.map(one => ({ id: one.id, items: items.filter(item => item.requestId === one.id) })));
48
55
  for (const request of requests) {
@@ -1 +1 @@
1
- {"version":3,"file":"expenditure-target.js","sourceRoot":"","sources":["../../../server/service/expenditure-request/expenditure-target.ts"],"names":[],"mappings":"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","sourcesContent":["import { In } from 'typeorm'\n\nimport { Refusal } from '@things-factory/shell'\n\nimport { CashFlowType } from '../cash-flow-type'\nimport { Payment, PaymentPurpose } from '../payment/payment'\nimport { registerPaymentTarget } from '../payment/payment-targets'\nimport { TransactionCategory } from '../transaction/transaction'\nimport { ExpenditureRequest, ExpenditureRequestStatus } from './expenditure-request'\nimport { ExpenditureRequestItem } from './expenditure-request-item'\nimport { EXPENDITURE_TARGET, paymentStatesOf } from './expenditure-payment-state'\n\n/*\n * The bank lines that paid an expenditure request directly (ADR-0135 §2-5) - the part no tax invoice of it stands\n * for. A request is paid only once it is approved, only by withdrawals in its currency, and by no more than that part.\n */\nregisterPaymentTarget(EXPENDITURE_TARGET, {\n purpose: PaymentPurpose.SETTLEMENT,\n\n async label(tx, domain, targetIds) {\n const requests = await tx\n .getRepository(ExpenditureRequest)\n .find({ where: { domain: { id: domain.id }, id: In(targetIds) } as any, withDeleted: true })\n return new Map(requests.map(one => [one.id, one.title]))\n },\n\n async validate(tx, domain, { targetIds }) {\n const requests = await tx\n .getRepository(ExpenditureRequest)\n .find({ where: { domain: { id: domain.id }, id: In(targetIds) } as any })\n if (requests.length !== new Set(targetIds).size)\n throw new Refusal('expenditure-not-found', {}, 'the expenditure request was not found - reload and try again')\n\n const items = await tx\n .getRepository(ExpenditureRequestItem)\n .find({ where: { domain: { id: domain.id }, request: { id: In(targetIds) } } as any })\n const payments = await tx.getRepository(Payment).find({\n where: { domain: { id: domain.id }, targetType: EXPENDITURE_TARGET, targetId: In(targetIds) } as any,\n relations: ['transaction']\n })\n\n for (const request of requests) {\n const own = payments.filter(one => one.targetId === request.id)\n if (!own.length) continue\n if (request.status !== ExpenditureRequestStatus.APPROVED)\n throw new Refusal('expenditure-not-approved', { title: request.title }, `only an approved request is paid - ${request.title}`)\n for (const { transaction: line } of own)\n if (line.category !== TransactionCategory.CONFIRMED || line.type !== CashFlowType.EXPENSE || (line.currency ?? 'KRW') !== request.currency)\n throw new Refusal('expenditure-paid-by-withdrawal', { currency: request.currency }, `a request is paid by a withdrawal in ${request.currency}`)\n }\n\n const states = await paymentStatesOf(\n tx,\n domain,\n requests.map(one => ({ id: one.id, items: items.filter(item => item.requestId === one.id) }))\n )\n for (const request of requests) {\n const state = states.get(request.id)!\n if (state.settled > state.settleable + 0.005)\n throw new Refusal(\n 'expenditure-paid-over',\n { title: request.title },\n `more is put on ${request.title} than it asks - a line that cites a tax invoice is paid on that invoice`\n )\n }\n }\n})\n"]}
1
+ {"version":3,"file":"expenditure-target.js","sourceRoot":"","sources":["../../../server/service/expenditure-request/expenditure-target.ts"],"names":[],"mappings":"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","sourcesContent":["import { In } from 'typeorm'\n\nimport { Refusal } from '@things-factory/shell'\n\nimport { CashFlowType } from '../cash-flow-type'\nimport { Payment, PaymentPurpose } from '../payment/payment'\nimport { paidOfTarget } from '../payment/payment-currency'\nimport { registerPaymentTarget } from '../payment/payment-targets'\nimport { TransactionCategory } from '../transaction/transaction'\nimport { ExpenditureRequest, ExpenditureRequestStatus } from './expenditure-request'\nimport { ExpenditureRequestItem } from './expenditure-request-item'\nimport { EXPENDITURE_TARGET, paymentStatesOf } from './expenditure-payment-state'\n\n/*\n * The bank lines that paid an expenditure request directly (ADR-0135 §2-5) - the part no tax invoice of it stands\n * for. A request is paid only once it is approved, only by withdrawals, and by no more than that part - in its\n * currency (§`checkPaymentCurrencies`).\n */\nregisterPaymentTarget(EXPENDITURE_TARGET, {\n purpose: PaymentPurpose.SETTLEMENT,\n\n async currencyOf(tx, domain, targetIds) {\n const requests = await tx\n .getRepository(ExpenditureRequest)\n .find({ where: { domain: { id: domain.id }, id: In(targetIds) } as any, withDeleted: true })\n return new Map(requests.map(one => [one.id, one.currency]))\n },\n\n async label(tx, domain, targetIds) {\n const requests = await tx\n .getRepository(ExpenditureRequest)\n .find({ where: { domain: { id: domain.id }, id: In(targetIds) } as any, withDeleted: true })\n return new Map(requests.map(one => [one.id, one.title]))\n },\n\n async validate(tx, domain, { targetIds }) {\n const requests = await tx\n .getRepository(ExpenditureRequest)\n .find({ where: { domain: { id: domain.id }, id: In(targetIds) } as any })\n if (requests.length !== new Set(targetIds).size)\n throw new Refusal('expenditure-not-found', {}, 'the expenditure request was not found - reload and try again')\n\n const items = await tx\n .getRepository(ExpenditureRequestItem)\n .find({ where: { domain: { id: domain.id }, request: { id: In(targetIds) } } as any })\n const payments = await tx.getRepository(Payment).find({\n where: { domain: { id: domain.id }, targetType: EXPENDITURE_TARGET, targetId: In(targetIds) } as any,\n relations: ['transaction']\n })\n\n for (const request of requests) {\n const own = payments.filter(one => one.targetId === request.id)\n if (!own.length) continue\n if (request.status !== ExpenditureRequestStatus.APPROVED)\n throw new Refusal('expenditure-not-approved', { title: request.title }, `only an approved request is paid - ${request.title}`)\n for (const { transaction: line } of own)\n if (line.category !== TransactionCategory.CONFIRMED || line.type !== CashFlowType.EXPENSE)\n throw new Refusal('expenditure-paid-by-withdrawal', {}, 'a request is paid by a withdrawal')\n }\n\n const states = await paymentStatesOf(\n tx,\n domain,\n requests.map(one => ({ id: one.id, items: items.filter(item => item.requestId === one.id) }))\n )\n for (const request of requests) {\n const state = states.get(request.id)!\n if (state.settled > state.settleable + 0.005)\n throw new Refusal(\n 'expenditure-paid-over',\n { title: request.title },\n `more is put on ${request.title} than it asks - a line that cites a tax invoice is paid on that invoice`\n )\n }\n }\n})\n"]}
@@ -19,6 +19,7 @@ export * from './transaction/transaction-service';
19
19
  export * from './bank-account/bank-account-service';
20
20
  export * from './payment/payment-targets';
21
21
  export * from './payment/payment-service';
22
+ export * from './payment/payment-currency';
22
23
  export * from './payment/document-targets';
23
24
  export * from './financial-statement/financial-statement-line';
24
25
  export * from './financial-statement/financial-statement-service';
@@ -25,6 +25,7 @@ tslib_1.__exportStar(require("./transaction/transaction-service"), exports);
25
25
  tslib_1.__exportStar(require("./bank-account/bank-account-service"), exports);
26
26
  tslib_1.__exportStar(require("./payment/payment-targets"), exports);
27
27
  tslib_1.__exportStar(require("./payment/payment-service"), exports);
28
+ tslib_1.__exportStar(require("./payment/payment-currency"), exports);
28
29
  tslib_1.__exportStar(require("./payment/document-targets"), exports);
29
30
  tslib_1.__exportStar(require("./financial-statement/financial-statement-line"), exports);
30
31
  tslib_1.__exportStar(require("./financial-statement/financial-statement-service"), exports);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../server/service/index.ts"],"names":[],"mappings":";;;;AAAA,yBAAyB;AACzB,2DAAgC;AAChC,oFAAyD;AACzD,oFAAyD;AACzD,oEAAyC;AACzC,sEAA2C;AAC3C,0EAA+C;AAC/C,4DAAiC;AACjC,4DAAiC;AACjC,oFAAyD;AACzD,oFAAyD;AACzD,wFAA6D;AAC7D,sEAA2C;AAC3C,0EAA+C;AAC/C,oEAAyC;AACzC,oFAAyD;AACzD,yFAA8D;AAE9D,qBAAqB;AACrB,2EAAgD;AAChD,4EAAiD;AACjD,8EAAmD;AACnD,oEAAyC;AACzC,oEAAyC;AACzC,qEAA0C;AAC1C,yFAA8D;AAC9D,4FAAiE;AACjE,mFAAwD;AACxD,4FAAiE;AACjE,kEAAuC;AACvC,qEAA0C;AAC1C,uEAA4C;AAC5C,uEAA4C;AAC5C,0EAA+C;AAC/C,4EAAiD;AACjD,uEAA4C;AAC5C,4FAAiE;AACjE,8FAAmE;AACnE,0FAA+D;AAC/D,0FAA+D;AAC/D,4FAAiE;AAEjE,mCAAmC;AACnC,+DAI8B;AAC9B,+DAI8B;AAC9B,+CAIsB;AACtB,iDAIuB;AACvB,qDAIyB;AACzB,uCAIkB;AAClB,uCAIkB;AAClB,+DAI8B;AAC9B,+DAI8B;AAC9B,mEAIgC;AAChC,iDAIuB;AACvB,qDAIyB;AACzB,+CAIsB;AACtB,iEAI+B;AAC/B,+DAI8B;AAEjB,QAAA,QAAQ,GAAG;IACtB,GAAG,8BAA0B;IAC7B,GAAG,8BAA0B;IAC7B,GAAG,sBAAmB;IACtB,GAAG,uBAAmB;IACtB,GAAG,yBAAqB;IACxB,GAAG,kBAAe;IAClB,GAAG,kBAAe;IAClB,GAAG,8BAA0B;IAC7B,GAAG,8BAAyB;IAC5B,GAAG,gCAA4B;IAC/B,GAAG,uBAAmB;IACtB,GAAG,yBAAqB;IACxB,GAAG,sBAAkB;IACrB,GAAG,+BAA2B;IAC9B,GAAG,8BAA0B;CAC9B,CAAA;AAEY,QAAA,WAAW,GAAG;IACzB,GAAG,iCAA6B;IAChC,GAAG,iCAA6B;IAChC,GAAG,yBAAsB;IACzB,GAAG,0BAAsB;IACzB,GAAG,4BAAwB;IAC3B,GAAG,qBAAkB;IACrB,GAAG,qBAAkB;IACrB,GAAG,iCAA6B;IAChC,GAAG,iCAA4B;IAC/B,GAAG,mCAA+B;IAClC,GAAG,0BAAsB;IACzB,GAAG,4BAAwB;IAC3B,GAAG,yBAAqB;IACxB,GAAG,kCAA8B;IACjC,GAAG,iCAA6B;CACjC,CAAA;AAEY,QAAA,MAAM,GAAG;IACpB,eAAe,EAAE;QACf,GAAG,+BAA2B;QAC9B,GAAG,+BAA2B;QAC9B,GAAG,uBAAoB;QACvB,GAAG,wBAAoB;QACvB,GAAG,0BAAsB;QACzB,GAAG,mBAAgB;QACnB,GAAG,mBAAgB;QACnB,GAAG,+BAA2B;QAC9B,GAAG,+BAA0B;QAC7B,GAAG,iCAA6B;QAChC,GAAG,wBAAoB;QACvB,GAAG,0BAAsB;QACzB,GAAG,uBAAmB;QACtB,GAAG,gCAA4B;QAC/B,GAAG,+BAA2B;KAC/B;CACF,CAAA","sourcesContent":["/* EXPORT ENTITY TYPES */\nexport * from './cash-flow-type'\nexport * from './financial-statement/financial-statement'\nexport * from './accounting-category/accounting-category'\nexport * from './transaction/transaction'\nexport * from './bank-account/bank-account'\nexport * from './bank-statement/bank-statement'\nexport * from './payment/payment'\nexport * from './account/account'\nexport * from './accounting-document/accounting-document'\nexport * from './recurring-cash-item/recurring-cash-item'\nexport * from './financial-institution/financial-institution'\nexport * from './fiscal-month/fiscal-month'\nexport * from './fiscal-quarter/fiscal-quarter'\nexport * from './fiscal-year/fiscal-year'\nexport * from './expenditure-request/expenditure-request'\nexport * from './expenditure-request/expenditure-request-item'\n\n/* EXPORT SERVICES */\nexport * from './transaction/transaction-period'\nexport * from './transaction/transaction-service'\nexport * from './bank-account/bank-account-service'\nexport * from './payment/payment-targets'\nexport * from './payment/payment-service'\nexport * from './payment/document-targets'\nexport * from './financial-statement/financial-statement-line'\nexport * from './financial-statement/financial-statement-service'\nexport * from './recurring-cash-item/recurring-schedule'\nexport * from './recurring-cash-item/recurring-cash-item-service'\nexport * from './account/account-match'\nexport * from './account/default-accounts'\nexport * from './bank-statement/bank-source'\nexport * from './bank-statement/bank-parser'\nexport * from './bank-statement/bank-reconcile'\nexport * from './bank-statement/bank-import-type'\nexport * from './bank-statement/bank-import'\nexport * from './counterparty-account/counterparty-account-rules'\nexport * from './counterparty-account/counterparty-account-service'\nexport * from './expenditure-request/expenditure-request-rules'\nexport * from './expenditure-request/expenditure-payment-state'\nexport * from './expenditure-request/expenditure-request-service'\n\n/* IMPORT ENTITIES AND RESOLVERS */\nimport {\n entities as FinancialStatementEntities,\n resolvers as FinancialStatementResolvers,\n subscribers as FinancialStatementSubscribers\n} from './financial-statement'\nimport {\n entities as AccountingCategoryEntities,\n resolvers as AccountingCategoryResolvers,\n subscribers as AccountingCategorySubscribers\n} from './accounting-category'\nimport {\n entities as TransactionEntities,\n resolvers as TransactionResolvers,\n subscribers as TransactionSubscribers\n} from './transaction'\nimport {\n entities as BankAccountEntities,\n resolvers as BankAccountResolvers,\n subscribers as BankAccountSubscribers\n} from './bank-account'\nimport {\n entities as BankStatementEntities,\n resolvers as BankStatementResolvers,\n subscribers as BankStatementSubscribers\n} from './bank-statement'\nimport {\n entities as PaymentEntities,\n resolvers as PaymentResolvers,\n subscribers as PaymentSubscribers\n} from './payment'\nimport {\n entities as AccountEntities,\n resolvers as AccountResolvers,\n subscribers as AccountSubscribers\n} from './account'\nimport {\n entities as AccountingDocumentEntities,\n resolvers as AccountingDocumentResolvers,\n subscribers as AccountingDocumentSubscribers\n} from './accounting-document'\nimport {\n entities as RecurringCashItemEntities,\n resolvers as RecurringCashItemResolvers,\n subscribers as RecurringCashItemSubscribers\n} from './recurring-cash-item'\nimport {\n entities as FinancialInstitutionEntities,\n resolvers as FinancialInstitutionResolvers,\n subscribers as FinancialInstitutionSubscribers\n} from './financial-institution'\nimport {\n entities as FiscalMonthEntities,\n resolvers as FiscalMonthResolvers,\n subscribers as FiscalMonthSubscribers\n} from './fiscal-month'\nimport {\n entities as FiscalQuarterEntities,\n resolvers as FiscalQuarterResolvers,\n subscribers as FiscalQuarterSubscribers\n} from './fiscal-quarter'\nimport {\n entities as FiscalYearEntities,\n resolvers as FiscalYearResolvers,\n subscribers as FiscalYearSubscribers\n} from './fiscal-year'\nimport {\n entities as CounterpartyAccountEntities,\n resolvers as CounterpartyAccountResolvers,\n subscribers as CounterpartyAccountSubscribers\n} from './counterparty-account'\nimport {\n entities as ExpenditureRequestEntities,\n resolvers as ExpenditureRequestResolvers,\n subscribers as ExpenditureRequestSubscribers\n} from './expenditure-request'\n\nexport const entities = [\n ...FinancialStatementEntities,\n ...AccountingCategoryEntities,\n ...TransactionEntities,\n ...BankAccountEntities,\n ...BankStatementEntities,\n ...PaymentEntities,\n ...AccountEntities,\n ...AccountingDocumentEntities,\n ...RecurringCashItemEntities,\n ...FinancialInstitutionEntities,\n ...FiscalMonthEntities,\n ...FiscalQuarterEntities,\n ...FiscalYearEntities,\n ...CounterpartyAccountEntities,\n ...ExpenditureRequestEntities\n]\n\nexport const subscribers = [\n ...FinancialStatementSubscribers,\n ...AccountingCategorySubscribers,\n ...TransactionSubscribers,\n ...BankAccountSubscribers,\n ...BankStatementSubscribers,\n ...PaymentSubscribers,\n ...AccountSubscribers,\n ...AccountingDocumentSubscribers,\n ...RecurringCashItemSubscribers,\n ...FinancialInstitutionSubscribers,\n ...FiscalMonthSubscribers,\n ...FiscalQuarterSubscribers,\n ...FiscalYearSubscribers,\n ...CounterpartyAccountSubscribers,\n ...ExpenditureRequestSubscribers\n]\n\nexport const schema = {\n resolverClasses: [\n ...FinancialStatementResolvers,\n ...AccountingCategoryResolvers,\n ...TransactionResolvers,\n ...BankAccountResolvers,\n ...BankStatementResolvers,\n ...PaymentResolvers,\n ...AccountResolvers,\n ...AccountingDocumentResolvers,\n ...RecurringCashItemResolvers,\n ...FinancialInstitutionResolvers,\n ...FiscalMonthResolvers,\n ...FiscalQuarterResolvers,\n ...FiscalYearResolvers,\n ...CounterpartyAccountResolvers,\n ...ExpenditureRequestResolvers\n ]\n}\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../server/service/index.ts"],"names":[],"mappings":";;;;AAAA,yBAAyB;AACzB,2DAAgC;AAChC,oFAAyD;AACzD,oFAAyD;AACzD,oEAAyC;AACzC,sEAA2C;AAC3C,0EAA+C;AAC/C,4DAAiC;AACjC,4DAAiC;AACjC,oFAAyD;AACzD,oFAAyD;AACzD,wFAA6D;AAC7D,sEAA2C;AAC3C,0EAA+C;AAC/C,oEAAyC;AACzC,oFAAyD;AACzD,yFAA8D;AAE9D,qBAAqB;AACrB,2EAAgD;AAChD,4EAAiD;AACjD,8EAAmD;AACnD,oEAAyC;AACzC,oEAAyC;AACzC,qEAA0C;AAC1C,qEAA0C;AAC1C,yFAA8D;AAC9D,4FAAiE;AACjE,mFAAwD;AACxD,4FAAiE;AACjE,kEAAuC;AACvC,qEAA0C;AAC1C,uEAA4C;AAC5C,uEAA4C;AAC5C,0EAA+C;AAC/C,4EAAiD;AACjD,uEAA4C;AAC5C,4FAAiE;AACjE,8FAAmE;AACnE,0FAA+D;AAC/D,0FAA+D;AAC/D,4FAAiE;AAEjE,mCAAmC;AACnC,+DAI8B;AAC9B,+DAI8B;AAC9B,+CAIsB;AACtB,iDAIuB;AACvB,qDAIyB;AACzB,uCAIkB;AAClB,uCAIkB;AAClB,+DAI8B;AAC9B,+DAI8B;AAC9B,mEAIgC;AAChC,iDAIuB;AACvB,qDAIyB;AACzB,+CAIsB;AACtB,iEAI+B;AAC/B,+DAI8B;AAEjB,QAAA,QAAQ,GAAG;IACtB,GAAG,8BAA0B;IAC7B,GAAG,8BAA0B;IAC7B,GAAG,sBAAmB;IACtB,GAAG,uBAAmB;IACtB,GAAG,yBAAqB;IACxB,GAAG,kBAAe;IAClB,GAAG,kBAAe;IAClB,GAAG,8BAA0B;IAC7B,GAAG,8BAAyB;IAC5B,GAAG,gCAA4B;IAC/B,GAAG,uBAAmB;IACtB,GAAG,yBAAqB;IACxB,GAAG,sBAAkB;IACrB,GAAG,+BAA2B;IAC9B,GAAG,8BAA0B;CAC9B,CAAA;AAEY,QAAA,WAAW,GAAG;IACzB,GAAG,iCAA6B;IAChC,GAAG,iCAA6B;IAChC,GAAG,yBAAsB;IACzB,GAAG,0BAAsB;IACzB,GAAG,4BAAwB;IAC3B,GAAG,qBAAkB;IACrB,GAAG,qBAAkB;IACrB,GAAG,iCAA6B;IAChC,GAAG,iCAA4B;IAC/B,GAAG,mCAA+B;IAClC,GAAG,0BAAsB;IACzB,GAAG,4BAAwB;IAC3B,GAAG,yBAAqB;IACxB,GAAG,kCAA8B;IACjC,GAAG,iCAA6B;CACjC,CAAA;AAEY,QAAA,MAAM,GAAG;IACpB,eAAe,EAAE;QACf,GAAG,+BAA2B;QAC9B,GAAG,+BAA2B;QAC9B,GAAG,uBAAoB;QACvB,GAAG,wBAAoB;QACvB,GAAG,0BAAsB;QACzB,GAAG,mBAAgB;QACnB,GAAG,mBAAgB;QACnB,GAAG,+BAA2B;QAC9B,GAAG,+BAA0B;QAC7B,GAAG,iCAA6B;QAChC,GAAG,wBAAoB;QACvB,GAAG,0BAAsB;QACzB,GAAG,uBAAmB;QACtB,GAAG,gCAA4B;QAC/B,GAAG,+BAA2B;KAC/B;CACF,CAAA","sourcesContent":["/* EXPORT ENTITY TYPES */\nexport * from './cash-flow-type'\nexport * from './financial-statement/financial-statement'\nexport * from './accounting-category/accounting-category'\nexport * from './transaction/transaction'\nexport * from './bank-account/bank-account'\nexport * from './bank-statement/bank-statement'\nexport * from './payment/payment'\nexport * from './account/account'\nexport * from './accounting-document/accounting-document'\nexport * from './recurring-cash-item/recurring-cash-item'\nexport * from './financial-institution/financial-institution'\nexport * from './fiscal-month/fiscal-month'\nexport * from './fiscal-quarter/fiscal-quarter'\nexport * from './fiscal-year/fiscal-year'\nexport * from './expenditure-request/expenditure-request'\nexport * from './expenditure-request/expenditure-request-item'\n\n/* EXPORT SERVICES */\nexport * from './transaction/transaction-period'\nexport * from './transaction/transaction-service'\nexport * from './bank-account/bank-account-service'\nexport * from './payment/payment-targets'\nexport * from './payment/payment-service'\nexport * from './payment/payment-currency'\nexport * from './payment/document-targets'\nexport * from './financial-statement/financial-statement-line'\nexport * from './financial-statement/financial-statement-service'\nexport * from './recurring-cash-item/recurring-schedule'\nexport * from './recurring-cash-item/recurring-cash-item-service'\nexport * from './account/account-match'\nexport * from './account/default-accounts'\nexport * from './bank-statement/bank-source'\nexport * from './bank-statement/bank-parser'\nexport * from './bank-statement/bank-reconcile'\nexport * from './bank-statement/bank-import-type'\nexport * from './bank-statement/bank-import'\nexport * from './counterparty-account/counterparty-account-rules'\nexport * from './counterparty-account/counterparty-account-service'\nexport * from './expenditure-request/expenditure-request-rules'\nexport * from './expenditure-request/expenditure-payment-state'\nexport * from './expenditure-request/expenditure-request-service'\n\n/* IMPORT ENTITIES AND RESOLVERS */\nimport {\n entities as FinancialStatementEntities,\n resolvers as FinancialStatementResolvers,\n subscribers as FinancialStatementSubscribers\n} from './financial-statement'\nimport {\n entities as AccountingCategoryEntities,\n resolvers as AccountingCategoryResolvers,\n subscribers as AccountingCategorySubscribers\n} from './accounting-category'\nimport {\n entities as TransactionEntities,\n resolvers as TransactionResolvers,\n subscribers as TransactionSubscribers\n} from './transaction'\nimport {\n entities as BankAccountEntities,\n resolvers as BankAccountResolvers,\n subscribers as BankAccountSubscribers\n} from './bank-account'\nimport {\n entities as BankStatementEntities,\n resolvers as BankStatementResolvers,\n subscribers as BankStatementSubscribers\n} from './bank-statement'\nimport {\n entities as PaymentEntities,\n resolvers as PaymentResolvers,\n subscribers as PaymentSubscribers\n} from './payment'\nimport {\n entities as AccountEntities,\n resolvers as AccountResolvers,\n subscribers as AccountSubscribers\n} from './account'\nimport {\n entities as AccountingDocumentEntities,\n resolvers as AccountingDocumentResolvers,\n subscribers as AccountingDocumentSubscribers\n} from './accounting-document'\nimport {\n entities as RecurringCashItemEntities,\n resolvers as RecurringCashItemResolvers,\n subscribers as RecurringCashItemSubscribers\n} from './recurring-cash-item'\nimport {\n entities as FinancialInstitutionEntities,\n resolvers as FinancialInstitutionResolvers,\n subscribers as FinancialInstitutionSubscribers\n} from './financial-institution'\nimport {\n entities as FiscalMonthEntities,\n resolvers as FiscalMonthResolvers,\n subscribers as FiscalMonthSubscribers\n} from './fiscal-month'\nimport {\n entities as FiscalQuarterEntities,\n resolvers as FiscalQuarterResolvers,\n subscribers as FiscalQuarterSubscribers\n} from './fiscal-quarter'\nimport {\n entities as FiscalYearEntities,\n resolvers as FiscalYearResolvers,\n subscribers as FiscalYearSubscribers\n} from './fiscal-year'\nimport {\n entities as CounterpartyAccountEntities,\n resolvers as CounterpartyAccountResolvers,\n subscribers as CounterpartyAccountSubscribers\n} from './counterparty-account'\nimport {\n entities as ExpenditureRequestEntities,\n resolvers as ExpenditureRequestResolvers,\n subscribers as ExpenditureRequestSubscribers\n} from './expenditure-request'\n\nexport const entities = [\n ...FinancialStatementEntities,\n ...AccountingCategoryEntities,\n ...TransactionEntities,\n ...BankAccountEntities,\n ...BankStatementEntities,\n ...PaymentEntities,\n ...AccountEntities,\n ...AccountingDocumentEntities,\n ...RecurringCashItemEntities,\n ...FinancialInstitutionEntities,\n ...FiscalMonthEntities,\n ...FiscalQuarterEntities,\n ...FiscalYearEntities,\n ...CounterpartyAccountEntities,\n ...ExpenditureRequestEntities\n]\n\nexport const subscribers = [\n ...FinancialStatementSubscribers,\n ...AccountingCategorySubscribers,\n ...TransactionSubscribers,\n ...BankAccountSubscribers,\n ...BankStatementSubscribers,\n ...PaymentSubscribers,\n ...AccountSubscribers,\n ...AccountingDocumentSubscribers,\n ...RecurringCashItemSubscribers,\n ...FinancialInstitutionSubscribers,\n ...FiscalMonthSubscribers,\n ...FiscalQuarterSubscribers,\n ...FiscalYearSubscribers,\n ...CounterpartyAccountSubscribers,\n ...ExpenditureRequestSubscribers\n]\n\nexport const schema = {\n resolverClasses: [\n ...FinancialStatementResolvers,\n ...AccountingCategoryResolvers,\n ...TransactionResolvers,\n ...BankAccountResolvers,\n ...BankStatementResolvers,\n ...PaymentResolvers,\n ...AccountResolvers,\n ...AccountingDocumentResolvers,\n ...RecurringCashItemResolvers,\n ...FinancialInstitutionResolvers,\n ...FiscalMonthResolvers,\n ...FiscalQuarterResolvers,\n ...FiscalYearResolvers,\n ...CounterpartyAccountResolvers,\n ...ExpenditureRequestResolvers\n ]\n}\n"]}
@@ -2,8 +2,6 @@ import { EntityManager } from 'typeorm';
2
2
  import { Payment } from './payment';
3
3
  export declare const INVOICE_TARGET = "Invoice";
4
4
  export declare const TAX_INVOICE_TARGET = "TaxInvoice";
5
- /** What a payment pays of its document, in the document's currency. */
6
- export declare const paidOfDocument: (payment: Payment) => number;
7
5
  /** The payments on some documents of a kind, or of some bank lines, with their line. */
8
6
  export declare function documentPaymentsOf(tx: EntityManager, domain: {
9
7
  id: string;