@things-factory/accounting 10.1.208 → 10.1.210

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 (53) hide show
  1. package/dist-client/tsconfig.tsbuildinfo +1 -1
  2. package/dist-server/service/account/account-match.d.ts +4 -5
  3. package/dist-server/service/account/account-match.js +7 -8
  4. package/dist-server/service/account/account-match.js.map +1 -1
  5. package/dist-server/service/expenditure-request/expenditure-request-mutation.d.ts +1 -1
  6. package/dist-server/service/expenditure-request/expenditure-request-mutation.js +5 -4
  7. package/dist-server/service/expenditure-request/expenditure-request-mutation.js.map +1 -1
  8. package/dist-server/service/expenditure-request/expenditure-request-service.d.ts +2 -0
  9. package/dist-server/service/expenditure-request/expenditure-request-service.js +17 -0
  10. package/dist-server/service/expenditure-request/expenditure-request-service.js.map +1 -1
  11. package/dist-server/service/expenditure-request/index.d.ts +2 -2
  12. package/dist-server/service/financial-statement/index.d.ts +1 -1
  13. package/dist-server/service/index.d.ts +1 -1
  14. package/dist-server/service/recurring-cash-item/recurring-cash-item-mutation.d.ts +0 -1
  15. package/dist-server/service/recurring-cash-item/recurring-cash-item-mutation.js +0 -17
  16. package/dist-server/service/recurring-cash-item/recurring-cash-item-mutation.js.map +1 -1
  17. package/dist-server/service/recurring-cash-item/recurring-cash-item-service.d.ts +2 -9
  18. package/dist-server/service/recurring-cash-item/recurring-cash-item-service.js +2 -39
  19. package/dist-server/service/recurring-cash-item/recurring-cash-item-service.js.map +1 -1
  20. package/dist-server/service/recurring-cash-item/recurring-cash-item-type.js +1 -1
  21. package/dist-server/service/recurring-cash-item/recurring-cash-item-type.js.map +1 -1
  22. package/dist-server/service/recurring-cash-item/recurring-cash-item.d.ts +2 -2
  23. package/dist-server/service/recurring-cash-item/recurring-cash-item.js +5 -5
  24. package/dist-server/service/recurring-cash-item/recurring-cash-item.js.map +1 -1
  25. package/dist-server/service/recurring-cash-item/recurring-schedule.d.ts +6 -18
  26. package/dist-server/service/recurring-cash-item/recurring-schedule.js +13 -26
  27. package/dist-server/service/recurring-cash-item/recurring-schedule.js.map +1 -1
  28. package/dist-server/service/transaction/transaction-history.d.ts +1 -7
  29. package/dist-server/service/transaction/transaction-history.js +0 -25
  30. package/dist-server/service/transaction/transaction-history.js.map +1 -1
  31. package/dist-server/service/transaction/transaction-period.d.ts +0 -8
  32. package/dist-server/service/transaction/transaction-period.js +0 -30
  33. package/dist-server/service/transaction/transaction-period.js.map +1 -1
  34. package/dist-server/service/transaction/transaction-query.d.ts +0 -2
  35. package/dist-server/service/transaction/transaction-query.js +2 -16
  36. package/dist-server/service/transaction/transaction-query.js.map +1 -1
  37. package/dist-server/service/transaction/transaction-service.d.ts +1 -4
  38. package/dist-server/service/transaction/transaction-service.js +6 -31
  39. package/dist-server/service/transaction/transaction-service.js.map +1 -1
  40. package/dist-server/service/transaction/transaction-type.d.ts +1 -15
  41. package/dist-server/service/transaction/transaction-type.js +2 -58
  42. package/dist-server/service/transaction/transaction-type.js.map +1 -1
  43. package/dist-server/service/transaction/transaction.d.ts +6 -15
  44. package/dist-server/service/transaction/transaction.js +13 -52
  45. package/dist-server/service/transaction/transaction.js.map +1 -1
  46. package/dist-server/tsconfig.tsbuildinfo +1 -1
  47. package/package.json +4 -4
  48. package/translations/en.json +4 -5
  49. package/translations/es.json +4 -5
  50. package/translations/ja.json +4 -1
  51. package/translations/ko.json +4 -5
  52. package/translations/ms.json +4 -1
  53. package/translations/zh.json +4 -1
@@ -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 { Attachment, createAttachment, deleteAttachment } 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. */\n/**\n * What the caller may cite. A tax invoice is the tax-invoice ledger's (ADR-0139): `accounting-self` writes the\n * caller's own request, and does not open someone else's ledger by naming a row of it.\n */\nexport interface Citing {\n taxInvoices: boolean\n}\n\nasync function saveItems(tx: EntityManager, domain: { id: string }, user: any, request: ExpenditureRequest, patches: ItemPatch[], citing: Citing) {\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 if (patch.taxInvoice?.id && !citing.taxInvoices)\n throw new Refusal('expenditure-invoice-not-readable', {}, 'citing a tax invoice needs the tax-invoice ledger')\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[], citing: Citing): 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, citing)\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 /*\n * Who is paid, as a reference: the approval screens draw a value with a __typename as a link to\n * its 360 (worklist decision-content) - the counterparty for a vendor payment, the employee for\n * a claim. `payee` and `requester` stay as the words the search keys find.\n */\n paidTo: vendor\n ? { __typename: 'Counterparty', id: request.counterpartyId, name: payee }\n : { __typename: 'User', id: user.id, name: who },\n /* The request itself, as a reference: the approval card opens it - the lines and their receipts and papers. */\n request: { __typename: 'ExpenditureRequest', id: request.id, name: request.title },\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 photos and files picked with it are attached to the line.\n */\nexport async function addLine(tx: EntityManager, domain: any, user: any, line: ItemPatch & { month?: string; files?: 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 { files, month: _month, ...fields } = line\n const request = await saveRequest(tx, domain, user, joinId ? { id: joinId } : { kind: ExpenditureKind.REIMBURSEMENT, month }, [{ ...fields, spentDate, cuFlag: '+' }], { taxInvoices: false })\n\n if (files?.length) {\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) for (const file of files) await attachFile(latest.id, file, context)\n }\n return request\n}\n\n/** A line of the caller's own request, while the request can still be changed. */\nexport async function editableLine(tx: EntityManager, domain: any, user: any, itemId: string): 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 return item\n}\n\n/**\n * Attach files to a line and take others off it, in one go - only the requester, only while editable. A file taken\n * off is deleted: what approvers judge is what the line has when it is submitted.\n */\nexport async function saveLineFiles(\n tx: EntityManager,\n domain: any,\n user: any,\n itemId: string,\n change: { attach?: any[]; remove?: string[] },\n context: ResolverContext\n): Promise<ExpenditureRequestItem> {\n const item = await editableLine(tx, domain, user, itemId)\n\n const remove = [...new Set(change.remove ?? [])]\n if (remove.length) {\n const onLine = await tx.getRepository(Attachment).find({ where: { domain: { id: domain.id }, refType: RECEIPT_REF_TYPE, refBy: item.id, id: In(remove) } as any })\n if (onLine.length !== remove.length) throw new Refusal('expenditure-file-not-on-line', {}, 'a file is not on this line - reload and try again')\n for (const one of onLine) await deleteAttachment(null, { id: one.id }, context)\n }\n for (const file of change.attach ?? []) await attachFile(item.id, file, context)\n return item\n}\n\nasync function attachFile(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"]}
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, LessThan } 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 { Attachment, createAttachment, deleteAttachment } 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. */\n/**\n * What the caller may cite. A tax invoice is the tax-invoice ledger's (ADR-0139): `accounting-self` writes the\n * caller's own request, and does not open someone else's ledger by naming a row of it.\n */\nexport interface Citing {\n taxInvoices: boolean\n /** Bulk preparation refuses partial/complete payments and amended evidence for individual review. */\n unpaidInvoicesOnly?: boolean\n}\n\nasync function saveItems(tx: EntityManager, domain: { id: string }, user: any, request: ExpenditureRequest, patches: ItemPatch[], citing: Citing) {\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 if (patch.taxInvoice?.id && !citing.taxInvoices)\n throw new Refusal('expenditure-invoice-not-readable', {}, 'citing a tax invoice needs the tax-invoice ledger')\n // Serialize citation checks on PostgreSQL; SQLite already has the request write in this transaction.\n if (patch.taxInvoice?.id && tx.connection.options.type === 'postgres') {\n await tx.getRepository(TaxInvoice).findOne({ where: { id: patch.taxInvoice.id, domain: { id: domain.id } } as any, lock: { mode: 'pessimistic_write' } })\n }\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 if (citing.unpaidInvoicesOnly) {\n const party = await tx.getRepository(Counterparty).findOne({ where: { id: request.counterpartyId, domain: { id: domain.id } } as any })\n const digits = (value: unknown) => String(value ?? '').replace(/\\D/g, '')\n if (!party || !digits(party.businessNumber) || digits(party.businessNumber) !== digits(invoice.supplierBusinessRegistrationNumber))\n throw new Refusal('expenditure-bulk-party', {}, 'The supplier must match the selected counterparty; review this invoice individually')\n const payments = await tx.getRepository(Payment).find({ where: { domain: { id: domain.id }, targetType: TAX_INVOICE_TARGET, targetId: invoice.id } as any })\n if (payments.length)\n throw new Refusal('expenditure-bulk-paid', {}, 'This invoice already has payment links; review partial or completed payments individually')\n const negatives = await tx.getRepository(TaxInvoice).find({ where: { domain: { id: domain.id }, totalAmount: LessThan(0) } as any })\n const amended = negatives.some(one => one.originalApprovalNo === invoice.approvalNo || (invoice.approvalNo && [one.remark0, one.remark1, one.remark2].some(text => text?.includes(invoice.approvalNo))))\n if (!(Number(invoice.totalAmount) > 0) || invoice.originalApprovalNo || invoice.invoiceType?.startsWith('02') || amended)\n throw new Refusal('expenditure-bulk-amended', {}, 'Review amended or non-positive invoices individually before requesting payment')\n }\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[], citing: Citing): 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, citing)\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 /*\n * Who is paid, as a reference: the approval screens draw a value with a __typename as a link to\n * its 360 (worklist decision-content) - the counterparty for a vendor payment, the employee for\n * a claim. `payee` and `requester` stay as the words the search keys find.\n */\n paidTo: vendor\n ? { __typename: 'Counterparty', id: request.counterpartyId, name: payee }\n : { __typename: 'User', id: user.id, name: who },\n /* The request itself, as a reference: the approval card opens it - the lines and their receipts and papers. */\n request: { __typename: 'ExpenditureRequest', id: request.id, name: request.title },\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 photos and files picked with it are attached to the line.\n */\nexport async function addLine(tx: EntityManager, domain: any, user: any, line: ItemPatch & { month?: string; files?: 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 { files, month: _month, ...fields } = line\n const request = await saveRequest(tx, domain, user, joinId ? { id: joinId } : { kind: ExpenditureKind.REIMBURSEMENT, month }, [{ ...fields, spentDate, cuFlag: '+' }], { taxInvoices: false })\n\n if (files?.length) {\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) for (const file of files) await attachFile(latest.id, file, context)\n }\n return request\n}\n\n/** A line of the caller's own request, while the request can still be changed. */\nexport async function editableLine(tx: EntityManager, domain: any, user: any, itemId: string): 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 return item\n}\n\n/**\n * Attach files to a line and take others off it, in one go - only the requester, only while editable. A file taken\n * off is deleted: what approvers judge is what the line has when it is submitted.\n */\nexport async function saveLineFiles(\n tx: EntityManager,\n domain: any,\n user: any,\n itemId: string,\n change: { attach?: any[]; remove?: string[] },\n context: ResolverContext\n): Promise<ExpenditureRequestItem> {\n const item = await editableLine(tx, domain, user, itemId)\n\n const remove = [...new Set(change.remove ?? [])]\n if (remove.length) {\n const onLine = await tx.getRepository(Attachment).find({ where: { domain: { id: domain.id }, refType: RECEIPT_REF_TYPE, refBy: item.id, id: In(remove) } as any })\n if (onLine.length !== remove.length) throw new Refusal('expenditure-file-not-on-line', {}, 'a file is not on this line - reload and try again')\n for (const one of onLine) await deleteAttachment(null, { id: one.id }, context)\n }\n for (const file of change.attach ?? []) await attachFile(item.id, file, context)\n return item\n}\n\nasync function attachFile(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"]}
@@ -3,6 +3,6 @@ import { ExpenditureRequestItem } from './expenditure-request-item';
3
3
  import { ExpenditureRequestItemQuery, ExpenditureRequestQuery } from './expenditure-request-query';
4
4
  import { ExpenditureRequestMutation } from './expenditure-request-mutation';
5
5
  import './expenditure-target';
6
- export declare const entities: (typeof ExpenditureRequest | typeof ExpenditureRequestItem)[];
7
- export declare const resolvers: (typeof ExpenditureRequestMutation | typeof ExpenditureRequestQuery | typeof ExpenditureRequestItemQuery)[];
6
+ export declare const entities: (typeof ExpenditureRequestItem | typeof ExpenditureRequest)[];
7
+ export declare const resolvers: (typeof ExpenditureRequestQuery | typeof ExpenditureRequestItemQuery | typeof ExpenditureRequestMutation)[];
8
8
  export declare const subscribers: any[];
@@ -4,6 +4,6 @@ import { FinancialStatementHistory } from './financial-statement-history';
4
4
  import { FinancialStatementLineQuery, FinancialStatementQuery } from './financial-statement-query';
5
5
  import { FinancialStatementMutation } from './financial-statement-mutation';
6
6
  import { FinancialStatementHistoryEntitySubscriber } from './event-subscriber';
7
- export declare const entities: (typeof FinancialStatement | typeof FinancialStatementLine | typeof FinancialStatementHistory)[];
7
+ export declare const entities: (typeof FinancialStatementLine | typeof FinancialStatement | typeof FinancialStatementHistory)[];
8
8
  export declare const resolvers: (typeof FinancialStatementQuery | typeof FinancialStatementLineQuery | typeof FinancialStatementMutation)[];
9
9
  export declare const subscribers: (typeof FinancialStatementHistoryEntitySubscriber)[];
@@ -42,5 +42,5 @@ export * from './expenditure-request/expenditure-request-service';
42
42
  export declare const entities: any[];
43
43
  export declare const subscribers: any[];
44
44
  export declare const schema: {
45
- resolverClasses: (typeof import("./expenditure-request/expenditure-request-mutation").ExpenditureRequestMutation | typeof import("./expenditure-request/expenditure-request-query").ExpenditureRequestQuery | typeof import("./expenditure-request/expenditure-request-query").ExpenditureRequestItemQuery | typeof import("./financial-statement/financial-statement-query").FinancialStatementQuery | typeof import("./financial-statement/financial-statement-query").FinancialStatementLineQuery | typeof import("./financial-statement/financial-statement-mutation").FinancialStatementMutation | typeof import("./accounting-category/accounting-category-query").AccountingCategoryQuery | typeof import("./accounting-category/accounting-category-mutation").AccountingCategoryMutation | typeof import("./transaction/transaction-query").TransactionQuery | typeof import("./transaction/transaction-mutation").TransactionMutation | typeof import("./bank-account/bank-account-query").BankAccountQuery | typeof import("./bank-account/bank-account-mutation").BankAccountMutation | typeof import("./bank-statement/bank-statement-query").BankStatementQuery | typeof import("./bank-statement/bank-import-mutation").BankImportMutation | typeof import("./payment/payment-query").PaymentQuery | typeof import("./payment/payment-mutation").PaymentMutation | typeof import("./account/account-query").AccountQuery | typeof import("./account/account-mutation").AccountMutation | typeof import("./accounting-document/accounting-document-query").AccountingDocumentQuery | typeof import("./accounting-document/accounting-document-mutation").AccountingDocumentMutation | typeof import("./recurring-cash-item/recurring-cash-item-query").RecurringCashItemQuery | typeof import("./recurring-cash-item/recurring-cash-item-mutation").RecurringCashItemMutation | typeof import("./financial-institution/financial-institution-query").FinancialInstitutionQuery | typeof import("./financial-institution/financial-institution-mutation").FinancialInstitutionMutation | typeof import("./fiscal-month/fiscal-month-query").FiscalMonthQuery | typeof import("./fiscal-month/fiscal-month-mutation").FiscalMonthMutation | typeof import("./fiscal-quarter/fiscal-quarter-query").FiscalQuarterQuery | typeof import("./fiscal-quarter/fiscal-quarter-mutation").FiscalQuarterMutation | typeof import("./fiscal-year/fiscal-year-query").FiscalYearQuery | typeof import("./fiscal-year/fiscal-year-mutation").FiscalYearMutation | typeof import("./counterparty-account/counterparty-account-query").CounterpartyAccountQuery)[];
45
+ resolverClasses: (typeof import("./financial-statement/financial-statement-query").FinancialStatementQuery | typeof import("./financial-statement/financial-statement-query").FinancialStatementLineQuery | typeof import("./financial-statement/financial-statement-mutation").FinancialStatementMutation | typeof import("./accounting-category/accounting-category-query").AccountingCategoryQuery | typeof import("./accounting-category/accounting-category-mutation").AccountingCategoryMutation | typeof import("./transaction/transaction-query").TransactionQuery | typeof import("./transaction/transaction-mutation").TransactionMutation | typeof import("./bank-account/bank-account-query").BankAccountQuery | typeof import("./bank-account/bank-account-mutation").BankAccountMutation | typeof import("./bank-statement/bank-statement-query").BankStatementQuery | typeof import("./bank-statement/bank-import-mutation").BankImportMutation | typeof import("./payment/payment-query").PaymentQuery | typeof import("./payment/payment-mutation").PaymentMutation | typeof import("./account/account-query").AccountQuery | typeof import("./account/account-mutation").AccountMutation | typeof import("./accounting-document/accounting-document-query").AccountingDocumentQuery | typeof import("./accounting-document/accounting-document-mutation").AccountingDocumentMutation | typeof import("./recurring-cash-item/recurring-cash-item-query").RecurringCashItemQuery | typeof import("./recurring-cash-item/recurring-cash-item-mutation").RecurringCashItemMutation | typeof import("./financial-institution/financial-institution-query").FinancialInstitutionQuery | typeof import("./financial-institution/financial-institution-mutation").FinancialInstitutionMutation | typeof import("./fiscal-month/fiscal-month-query").FiscalMonthQuery | typeof import("./fiscal-month/fiscal-month-mutation").FiscalMonthMutation | typeof import("./fiscal-quarter/fiscal-quarter-query").FiscalQuarterQuery | typeof import("./fiscal-quarter/fiscal-quarter-mutation").FiscalQuarterMutation | typeof import("./fiscal-year/fiscal-year-query").FiscalYearQuery | typeof import("./fiscal-year/fiscal-year-mutation").FiscalYearMutation | typeof import("./counterparty-account/counterparty-account-query").CounterpartyAccountQuery | typeof import("./expenditure-request/expenditure-request-query").ExpenditureRequestQuery | typeof import("./expenditure-request/expenditure-request-query").ExpenditureRequestItemQuery | typeof import("./expenditure-request/expenditure-request-mutation").ExpenditureRequestMutation)[];
46
46
  };
@@ -3,5 +3,4 @@ import { RecurringCashItemPatch } from './recurring-cash-item-type';
3
3
  export declare class RecurringCashItemMutation {
4
4
  updateMultipleRecurringCashItem(patches: RecurringCashItemPatch[], context: ResolverContext): Promise<RecurringCashItem[]>;
5
5
  deleteRecurringCashItems(ids: string[], context: ResolverContext): Promise<boolean>;
6
- generateForecasts(year: number, month: number, context: ResolverContext): Promise<number>;
7
6
  }
@@ -17,10 +17,6 @@ let RecurringCashItemMutation = class RecurringCashItemMutation {
17
17
  await (0, recurring_cash_item_service_1.saveRecurringCashItems)(tx, domain, user, ids.map(id => ({ id, cuFlag: '-' })));
18
18
  return true;
19
19
  }
20
- async generateForecasts(year, month, context) {
21
- const { domain, user, tx } = context.state;
22
- return await (0, recurring_cash_item_service_1.makeForecasts)(tx, domain, user, year, month);
23
- }
24
20
  };
25
21
  exports.RecurringCashItemMutation = RecurringCashItemMutation;
26
22
  tslib_1.__decorate([
@@ -43,19 +39,6 @@ tslib_1.__decorate([
43
39
  tslib_1.__metadata("design:paramtypes", [Array, Object]),
44
40
  tslib_1.__metadata("design:returntype", Promise)
45
41
  ], RecurringCashItemMutation.prototype, "deleteRecurringCashItems", null);
46
- tslib_1.__decorate([
47
- (0, type_graphql_1.Directive)('@transaction'),
48
- (0, type_graphql_1.Directive)('@privilege(category: "accounting", privilege: "mutation", domainOwnerGranted: true)'),
49
- (0, type_graphql_1.Mutation)(returns => type_graphql_1.Int, {
50
- description: "Make a month's forecasts from the recurring items; returns how many were made"
51
- }),
52
- tslib_1.__param(0, (0, type_graphql_1.Arg)('year', type => type_graphql_1.Int)),
53
- tslib_1.__param(1, (0, type_graphql_1.Arg)('month', type => type_graphql_1.Int)),
54
- tslib_1.__param(2, (0, type_graphql_1.Ctx)()),
55
- tslib_1.__metadata("design:type", Function),
56
- tslib_1.__metadata("design:paramtypes", [Number, Number, Object]),
57
- tslib_1.__metadata("design:returntype", Promise)
58
- ], RecurringCashItemMutation.prototype, "generateForecasts", null);
59
42
  exports.RecurringCashItemMutation = RecurringCashItemMutation = tslib_1.__decorate([
60
43
  (0, type_graphql_1.Resolver)(recurring_cash_item_1.RecurringCashItem),
61
44
  (0, type_graphql_1.UseMiddleware)(shell_1.SpeakRefusals)
@@ -1 +1 @@
1
- {"version":3,"file":"recurring-cash-item-mutation.js","sourceRoot":"","sources":["../../../server/service/recurring-cash-item/recurring-cash-item-mutation.ts"],"names":[],"mappings":";;;;AAAA,+CAA0F;AAE1F,iDAAqD;AAErD,+DAAyD;AACzD,+EAAqF;AACrF,yEAAmE;AAI5D,IAAM,yBAAyB,GAA/B,MAAM,yBAAyB;IAI9B,AAAN,KAAK,CAAC,+BAA+B,CACe,OAAiC,EAC5E,OAAwB;QAE/B,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,KAAK,CAAA;QAE1C,OAAO,MAAM,IAAA,oDAAsB,EAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,CAAA;IAChE,CAAC;IAKK,AAAN,KAAK,CAAC,wBAAwB,CACE,GAAa,EACpC,OAAwB;QAE/B,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,KAAK,CAAA;QAC1C,MAAM,IAAA,oDAAsB,EAC1B,EAAE,EACF,MAAM,EACN,IAAI,EACJ,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,CACrC,CAAA;QAED,OAAO,IAAI,CAAA;IACb,CAAC;IAOK,AAAN,KAAK,CAAC,iBAAiB,CACK,IAAY,EACX,KAAa,EACjC,OAAwB;QAE/B,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,KAAK,CAAA;QAE1C,OAAO,MAAM,IAAA,2CAAa,EAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,CAAA;IAC3D,CAAC;CACF,CAAA;AA7CY,8DAAyB;AAI9B;IAHL,IAAA,wBAAS,EAAC,cAAc,CAAC;IACzB,IAAA,wBAAS,EAAC,qFAAqF,CAAC;IAChG,IAAA,uBAAQ,EAAC,OAAO,CAAC,EAAE,CAAC,CAAC,uCAAiB,CAAC,EAAE,EAAE,WAAW,EAAE,uDAAuD,EAAE,CAAC;IAEhH,mBAAA,IAAA,kBAAG,EAAC,SAAS,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,iDAAsB,CAAC,CAAC,CAAA;IAChD,mBAAA,IAAA,kBAAG,GAAE,CAAA;;;;gFAKP;AAKK;IAHL,IAAA,wBAAS,EAAC,cAAc,CAAC;IACzB,IAAA,wBAAS,EAAC,qFAAqF,CAAC;IAChG,IAAA,uBAAQ,EAAC,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,WAAW,EAAE,uCAAuC,EAAE,CAAC;IAEpF,mBAAA,IAAA,kBAAG,EAAC,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAA;IAC5B,mBAAA,IAAA,kBAAG,GAAE,CAAA;;;;yEAWP;AAOK;IALL,IAAA,wBAAS,EAAC,cAAc,CAAC;IACzB,IAAA,wBAAS,EAAC,qFAAqF,CAAC;IAChG,IAAA,uBAAQ,EAAC,OAAO,CAAC,EAAE,CAAC,kBAAG,EAAE;QACxB,WAAW,EAAE,+EAA+E;KAC7F,CAAC;IAEC,mBAAA,IAAA,kBAAG,EAAC,MAAM,EAAE,IAAI,CAAC,EAAE,CAAC,kBAAG,CAAC,CAAA;IACxB,mBAAA,IAAA,kBAAG,EAAC,OAAO,EAAE,IAAI,CAAC,EAAE,CAAC,kBAAG,CAAC,CAAA;IACzB,mBAAA,IAAA,kBAAG,GAAE,CAAA;;;;kEAKP;oCA5CU,yBAAyB;IAFrC,IAAA,uBAAQ,EAAC,uCAAiB,CAAC;IAC3B,IAAA,4BAAa,EAAC,qBAAa,CAAC;GAChB,yBAAyB,CA6CrC","sourcesContent":["import { Resolver, Mutation, Arg, Ctx, Directive, Int, UseMiddleware } from 'type-graphql'\n\nimport { SpeakRefusals } from '@things-factory/shell'\n\nimport { RecurringCashItem } from './recurring-cash-item'\nimport { makeForecasts, saveRecurringCashItems } from './recurring-cash-item-service'\nimport { RecurringCashItemPatch } from './recurring-cash-item-type'\n\n@Resolver(RecurringCashItem)\n@UseMiddleware(SpeakRefusals)\nexport class RecurringCashItemMutation {\n @Directive('@transaction')\n @Directive('@privilege(category: \"accounting\", privilege: \"mutation\", domainOwnerGranted: true)')\n @Mutation(returns => [RecurringCashItem], { description: 'To add, modify and delete multiple RecurringCashItems' })\n async updateMultipleRecurringCashItem(\n @Arg('patches', type => [RecurringCashItemPatch]) patches: RecurringCashItemPatch[],\n @Ctx() context: ResolverContext\n ): Promise<RecurringCashItem[]> {\n const { domain, user, tx } = context.state\n\n return await saveRecurringCashItems(tx, domain, user, patches)\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"accounting\", privilege: \"mutation\", domainOwnerGranted: true)')\n @Mutation(returns => Boolean, { description: 'To delete multiple RecurringCashItems' })\n async deleteRecurringCashItems(\n @Arg('ids', type => [String]) ids: string[],\n @Ctx() context: ResolverContext\n ): Promise<boolean> {\n const { domain, user, tx } = context.state\n await saveRecurringCashItems(\n tx,\n domain,\n user,\n ids.map(id => ({ id, cuFlag: '-' }))\n )\n\n return true\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"accounting\", privilege: \"mutation\", domainOwnerGranted: true)')\n @Mutation(returns => Int, {\n description: \"Make a month's forecasts from the recurring items; returns how many were made\"\n })\n async generateForecasts(\n @Arg('year', type => Int) year: number,\n @Arg('month', type => Int) month: number,\n @Ctx() context: ResolverContext\n ): Promise<number> {\n const { domain, user, tx } = context.state\n\n return await makeForecasts(tx, domain, user, year, month)\n }\n}\n"]}
1
+ {"version":3,"file":"recurring-cash-item-mutation.js","sourceRoot":"","sources":["../../../server/service/recurring-cash-item/recurring-cash-item-mutation.ts"],"names":[],"mappings":";;;;AAAA,+CAAqF;AAErF,iDAAqD;AAErD,+DAAyD;AACzD,+EAAsE;AACtE,yEAAmE;AAI5D,IAAM,yBAAyB,GAA/B,MAAM,yBAAyB;IAI9B,AAAN,KAAK,CAAC,+BAA+B,CACe,OAAiC,EAC5E,OAAwB;QAE/B,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,KAAK,CAAA;QAE1C,OAAO,MAAM,IAAA,oDAAsB,EAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,CAAA;IAChE,CAAC;IAKK,AAAN,KAAK,CAAC,wBAAwB,CACE,GAAa,EACpC,OAAwB;QAE/B,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,KAAK,CAAA;QAC1C,MAAM,IAAA,oDAAsB,EAC1B,EAAE,EACF,MAAM,EACN,IAAI,EACJ,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,CACrC,CAAA;QAED,OAAO,IAAI,CAAA;IACb,CAAC;CACF,CAAA;AA9BY,8DAAyB;AAI9B;IAHL,IAAA,wBAAS,EAAC,cAAc,CAAC;IACzB,IAAA,wBAAS,EAAC,qFAAqF,CAAC;IAChG,IAAA,uBAAQ,EAAC,OAAO,CAAC,EAAE,CAAC,CAAC,uCAAiB,CAAC,EAAE,EAAE,WAAW,EAAE,uDAAuD,EAAE,CAAC;IAEhH,mBAAA,IAAA,kBAAG,EAAC,SAAS,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,iDAAsB,CAAC,CAAC,CAAA;IAChD,mBAAA,IAAA,kBAAG,GAAE,CAAA;;;;gFAKP;AAKK;IAHL,IAAA,wBAAS,EAAC,cAAc,CAAC;IACzB,IAAA,wBAAS,EAAC,qFAAqF,CAAC;IAChG,IAAA,uBAAQ,EAAC,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,WAAW,EAAE,uCAAuC,EAAE,CAAC;IAEpF,mBAAA,IAAA,kBAAG,EAAC,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAA;IAC5B,mBAAA,IAAA,kBAAG,GAAE,CAAA;;;;yEAWP;oCA7BU,yBAAyB;IAFrC,IAAA,uBAAQ,EAAC,uCAAiB,CAAC;IAC3B,IAAA,4BAAa,EAAC,qBAAa,CAAC;GAChB,yBAAyB,CA8BrC","sourcesContent":["import { Resolver, Mutation, Arg, Ctx, Directive, UseMiddleware } from 'type-graphql'\n\nimport { SpeakRefusals } from '@things-factory/shell'\n\nimport { RecurringCashItem } from './recurring-cash-item'\nimport { saveRecurringCashItems } from './recurring-cash-item-service'\nimport { RecurringCashItemPatch } from './recurring-cash-item-type'\n\n@Resolver(RecurringCashItem)\n@UseMiddleware(SpeakRefusals)\nexport class RecurringCashItemMutation {\n @Directive('@transaction')\n @Directive('@privilege(category: \"accounting\", privilege: \"mutation\", domainOwnerGranted: true)')\n @Mutation(returns => [RecurringCashItem], { description: 'To add, modify and delete multiple RecurringCashItems' })\n async updateMultipleRecurringCashItem(\n @Arg('patches', type => [RecurringCashItemPatch]) patches: RecurringCashItemPatch[],\n @Ctx() context: ResolverContext\n ): Promise<RecurringCashItem[]> {\n const { domain, user, tx } = context.state\n\n return await saveRecurringCashItems(tx, domain, user, patches)\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"accounting\", privilege: \"mutation\", domainOwnerGranted: true)')\n @Mutation(returns => Boolean, { description: 'To delete multiple RecurringCashItems' })\n async deleteRecurringCashItems(\n @Arg('ids', type => [String]) ids: string[],\n @Ctx() context: ResolverContext\n ): Promise<boolean> {\n const { domain, user, tx } = context.state\n await saveRecurringCashItems(\n tx,\n domain,\n user,\n ids.map(id => ({ id, cuFlag: '-' }))\n )\n\n return true\n }\n}\n"]}
@@ -11,16 +11,9 @@ export type RecurringCashItemInput = Partial<Omit<RecurringCashItem, 'account' |
11
11
  } | null;
12
12
  };
13
13
  /**
14
- * Apply rows to a domain's recurring items: `+` (or no id) adds, `M` changes, `-` deletes (softly). An item its forecast
15
- * lines were made from is not deleted while they are there (§`refuseTiedRows`).
14
+ * Apply rows to a domain's recurring items: `+` (or no id) adds, `M` changes, `-` deletes (softly). An item another row
15
+ * still names is not deleted (§`refuseTiedRows`).
16
16
  */
17
17
  export declare function saveRecurringCashItems(tx: EntityManager, domain: {
18
18
  id: string;
19
19
  }, user: any, inputs: RecurringCashItemInput[]): Promise<RecurringCashItem[]>;
20
- /**
21
- * Make the month's forecasts from the recurring items. A forecast already made from an item for that month is not
22
- * made again, so running it twice changes nothing. Returns how many were made.
23
- */
24
- export declare function makeForecasts(tx: EntityManager, domain: {
25
- id: string;
26
- }, user: any, year: number, month: number): Promise<number>;
@@ -1,13 +1,9 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.saveRecurringCashItems = saveRecurringCashItems;
4
- exports.makeForecasts = makeForecasts;
5
4
  const typeorm_1 = require("typeorm");
6
5
  const shell_1 = require("@things-factory/shell");
7
- const transaction_1 = require("../transaction/transaction");
8
- const transaction_service_1 = require("../transaction/transaction-service");
9
6
  const recurring_cash_item_1 = require("./recurring-cash-item");
10
- const recurring_schedule_1 = require("./recurring-schedule");
11
7
  const MONTH = /^\d{4}-(0[1-9]|1[0-2])$/;
12
8
  function rowOf(input, current) {
13
9
  const { id, cuFlag, ...row } = input;
@@ -32,8 +28,8 @@ function rowOf(input, current) {
32
28
  return row;
33
29
  }
34
30
  /**
35
- * Apply rows to a domain's recurring items: `+` (or no id) adds, `M` changes, `-` deletes (softly). An item its forecast
36
- * lines were made from is not deleted while they are there (§`refuseTiedRows`).
31
+ * Apply rows to a domain's recurring items: `+` (or no id) adds, `M` changes, `-` deletes (softly). An item another row
32
+ * still names is not deleted (§`refuseTiedRows`).
37
33
  */
38
34
  async function saveRecurringCashItems(tx, domain, user, inputs) {
39
35
  const repo = tx.getRepository(recurring_cash_item_1.RecurringCashItem);
@@ -59,37 +55,4 @@ async function saveRecurringCashItems(tx, domain, user, inputs) {
59
55
  }
60
56
  return saved;
61
57
  }
62
- /**
63
- * Make the month's forecasts from the recurring items. A forecast already made from an item for that month is not
64
- * made again, so running it twice changes nothing. Returns how many were made.
65
- */
66
- async function makeForecasts(tx, domain, user, year, month) {
67
- if (!(month >= 1 && month <= 12))
68
- throw new shell_1.Refusal('month-out-of-range', { month }, 'month: must be 1 to 12');
69
- const items = await tx.getRepository(recurring_cash_item_1.RecurringCashItem).find({ where: { domain: { id: domain.id } } });
70
- const made = await tx
71
- .getRepository(transaction_1.Transaction)
72
- .find({
73
- where: { domain: { id: domain.id }, category: transaction_1.TransactionCategory.FORECAST, year, month },
74
- relations: ['recurringItem']
75
- });
76
- const already = new Set(made.map(one => one.recurringItem?.id).filter(Boolean));
77
- const lines = (0, recurring_schedule_1.linesFor)(items, year, month, already);
78
- await (0, transaction_service_1.saveTransactions)(tx, domain, user, lines.map(line => {
79
- return {
80
- cuFlag: '+',
81
- category: transaction_1.TransactionCategory.FORECAST,
82
- type: line.type,
83
- year: line.year,
84
- month: line.month,
85
- description: line.name,
86
- amount: line.amount,
87
- currency: line.currency,
88
- timing: line.timing ?? undefined,
89
- status: transaction_1.ForecastStatus.PLANNED,
90
- recurringItem: { id: line.recurringItemId }
91
- };
92
- }));
93
- return lines.length;
94
- }
95
58
  //# sourceMappingURL=recurring-cash-item-service.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"recurring-cash-item-service.js","sourceRoot":"","sources":["../../../server/service/recurring-cash-item/recurring-cash-item-service.ts"],"names":[],"mappings":"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","sourcesContent":["import { EntityManager, In } from 'typeorm'\n\nimport { Refusal, refuseTiedRows } from '@things-factory/shell'\n\nimport { ForecastStatus, Transaction, TransactionCategory } from '../transaction/transaction'\nimport { saveTransactions } from '../transaction/transaction-service'\nimport { RecurringCashItem } from './recurring-cash-item'\nimport { linesFor } from './recurring-schedule'\n\nconst MONTH = /^\\d{4}-(0[1-9]|1[0-2])$/\n\nexport type RecurringCashItemInput = Partial<Omit<RecurringCashItem, 'account' | 'counterparty'>> & {\n id?: string\n cuFlag?: string\n account?: { id: string } | null\n counterparty?: { id: string } | null\n}\n\nfunction rowOf(input: RecurringCashItemInput, current: RecurringCashItem | undefined): Record<string, any> {\n const { id, cuFlag, ...row } = input as Record<string, any>\n const merged = { ...current, ...row }\n if (!String(merged.name ?? '').trim()) throw new Refusal('recurring-name-required', {}, 'name: what it is')\n if (!merged.type) throw new Refusal('transaction-type-required', {}, 'type: money in or money out')\n if (!MONTH.test(String(merged.startMonth ?? '')))\n throw new Refusal('recurring-start-required', {}, 'startMonth: YYYY-MM')\n if (merged.endMonth && !MONTH.test(merged.endMonth))\n throw new Refusal('recurring-end-not-a-month', {}, 'endMonth: YYYY-MM')\n if (merged.endMonth && merged.endMonth < merged.startMonth)\n throw new Refusal('recurring-end-before-start', {}, 'endMonth: before startMonth')\n if (\n merged.dayOfMonth !== null &&\n merged.dayOfMonth !== undefined &&\n !(merged.dayOfMonth >= 1 && merged.dayOfMonth <= 31)\n ) {\n throw new Refusal('day-of-month-out-of-range', {}, 'dayOfMonth: must be 1 to 31')\n }\n if (!current && (row.amount === undefined || row.amount === null))\n throw new Refusal('recurring-amount-required', {}, 'amount: every month')\n return row\n}\n\n/**\n * Apply rows to a domain's recurring items: `+` (or no id) adds, `M` changes, `-` deletes (softly). An item its forecast\n * lines were made from is not deleted while they are there (§`refuseTiedRows`).\n */\nexport async function saveRecurringCashItems(\n tx: EntityManager,\n domain: { id: string },\n user: any,\n inputs: RecurringCashItemInput[]\n): Promise<RecurringCashItem[]> {\n const repo = tx.getRepository(RecurringCashItem)\n const deletes = [...new Set(inputs.filter(one => one.cuFlag === '-' && one.id).map(one => one.id!))]\n if (deletes.length) {\n const found = await repo.find({ where: { domain: { id: domain.id }, id: In(deletes) } })\n if (found.length !== deletes.length)\n throw new Refusal('recurring-not-found', {}, 'a recurring item was not found - reload and try again')\n await refuseTiedRows(tx, RecurringCashItem, deletes)\n await repo.softRemove(found)\n }\n\n const saved: RecurringCashItem[] = []\n for (const input of inputs.filter(one => one.cuFlag !== '-')) {\n const isNew = !input.id || input.cuFlag === '+'\n const current = isNew ? undefined : await repo.findOne({ where: { domain: { id: domain.id }, id: input.id } })\n if (!isNew && !current)\n throw new Refusal('recurring-not-found', {}, 'a recurring item was not found - reload and try again')\n saved.push(\n await repo.save({\n ...(current ?? { domain, creator: user }),\n ...rowOf(input, current),\n updater: user\n } as RecurringCashItem)\n )\n }\n return saved\n}\n\n/**\n * Make the month's forecasts from the recurring items. A forecast already made from an item for that month is not\n * made again, so running it twice changes nothing. Returns how many were made.\n */\nexport async function makeForecasts(\n tx: EntityManager,\n domain: { id: string },\n user: any,\n year: number,\n month: number\n): Promise<number> {\n if (!(month >= 1 && month <= 12)) throw new Refusal('month-out-of-range', { month }, 'month: must be 1 to 12')\n\n const items = await tx.getRepository(RecurringCashItem).find({ where: { domain: { id: domain.id } } })\n const made = await tx\n .getRepository(Transaction)\n .find({\n where: { domain: { id: domain.id }, category: TransactionCategory.FORECAST, year, month },\n relations: ['recurringItem']\n })\n const already = new Set(made.map(one => one.recurringItem?.id).filter(Boolean) as string[])\n\n const lines = linesFor(items, year, month, already)\n await saveTransactions(\n tx,\n domain,\n user,\n lines.map(line => {\n return {\n cuFlag: '+',\n category: TransactionCategory.FORECAST,\n type: line.type as any,\n year: line.year,\n month: line.month,\n description: line.name,\n amount: line.amount,\n currency: line.currency,\n timing: line.timing ?? undefined,\n status: ForecastStatus.PLANNED,\n recurringItem: { id: line.recurringItemId }\n }\n })\n )\n\n return lines.length\n}\n"]}
1
+ {"version":3,"file":"recurring-cash-item-service.js","sourceRoot":"","sources":["../../../server/service/recurring-cash-item/recurring-cash-item-service.ts"],"names":[],"mappings":"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","sourcesContent":["import { EntityManager, In } from 'typeorm'\n\nimport { Refusal, refuseTiedRows } from '@things-factory/shell'\n\nimport { RecurringCashItem } from './recurring-cash-item'\n\nconst MONTH = /^\\d{4}-(0[1-9]|1[0-2])$/\n\nexport type RecurringCashItemInput = Partial<Omit<RecurringCashItem, 'account' | 'counterparty'>> & {\n id?: string\n cuFlag?: string\n account?: { id: string } | null\n counterparty?: { id: string } | null\n}\n\nfunction rowOf(input: RecurringCashItemInput, current: RecurringCashItem | undefined): Record<string, any> {\n const { id, cuFlag, ...row } = input as Record<string, any>\n const merged = { ...current, ...row }\n if (!String(merged.name ?? '').trim()) throw new Refusal('recurring-name-required', {}, 'name: what it is')\n if (!merged.type) throw new Refusal('transaction-type-required', {}, 'type: money in or money out')\n if (!MONTH.test(String(merged.startMonth ?? '')))\n throw new Refusal('recurring-start-required', {}, 'startMonth: YYYY-MM')\n if (merged.endMonth && !MONTH.test(merged.endMonth))\n throw new Refusal('recurring-end-not-a-month', {}, 'endMonth: YYYY-MM')\n if (merged.endMonth && merged.endMonth < merged.startMonth)\n throw new Refusal('recurring-end-before-start', {}, 'endMonth: before startMonth')\n if (\n merged.dayOfMonth !== null &&\n merged.dayOfMonth !== undefined &&\n !(merged.dayOfMonth >= 1 && merged.dayOfMonth <= 31)\n ) {\n throw new Refusal('day-of-month-out-of-range', {}, 'dayOfMonth: must be 1 to 31')\n }\n if (!current && (row.amount === undefined || row.amount === null))\n throw new Refusal('recurring-amount-required', {}, 'amount: every month')\n return row\n}\n\n/**\n * Apply rows to a domain's recurring items: `+` (or no id) adds, `M` changes, `-` deletes (softly). An item another row\n * still names is not deleted (§`refuseTiedRows`).\n */\nexport async function saveRecurringCashItems(\n tx: EntityManager,\n domain: { id: string },\n user: any,\n inputs: RecurringCashItemInput[]\n): Promise<RecurringCashItem[]> {\n const repo = tx.getRepository(RecurringCashItem)\n const deletes = [...new Set(inputs.filter(one => one.cuFlag === '-' && one.id).map(one => one.id!))]\n if (deletes.length) {\n const found = await repo.find({ where: { domain: { id: domain.id }, id: In(deletes) } })\n if (found.length !== deletes.length)\n throw new Refusal('recurring-not-found', {}, 'a recurring item was not found - reload and try again')\n await refuseTiedRows(tx, RecurringCashItem, deletes)\n await repo.softRemove(found)\n }\n\n const saved: RecurringCashItem[] = []\n for (const input of inputs.filter(one => one.cuFlag !== '-')) {\n const isNew = !input.id || input.cuFlag === '+'\n const current = isNew ? undefined : await repo.findOne({ where: { domain: { id: domain.id }, id: input.id } })\n if (!isNew && !current)\n throw new Refusal('recurring-not-found', {}, 'a recurring item was not found - reload and try again')\n saved.push(\n await repo.save({\n ...(current ?? { domain, creator: user }),\n ...rowOf(input, current),\n updater: user\n } as RecurringCashItem)\n )\n }\n return saved\n}\n"]}
@@ -54,7 +54,7 @@ tslib_1.__decorate([
54
54
  tslib_1.__metadata("design:type", shell_1.ObjectRef)
55
55
  ], RecurringCashItemPatch.prototype, "counterparty", void 0);
56
56
  tslib_1.__decorate([
57
- (0, type_graphql_1.Field)({ nullable: true, description: 'Whether it still makes forecasts' }),
57
+ (0, type_graphql_1.Field)({ nullable: true, description: 'Whether it still falls in its months' }),
58
58
  tslib_1.__metadata("design:type", Boolean)
59
59
  ], RecurringCashItemPatch.prototype, "active", void 0);
60
60
  tslib_1.__decorate([
@@ -1 +1 @@
1
- {"version":3,"file":"recurring-cash-item-type.js","sourceRoot":"","sources":["../../../server/service/recurring-cash-item/recurring-cash-item-type.ts"],"names":[],"mappings":";;;;AAAA,+CAA2E;AAE3E,iDAAiD;AAEjD,sDAAgD;AAChD,+DAAyD;AAGlD,IAAM,sBAAsB,GAA5B,MAAM,sBAAsB;CA0ClC,CAAA;AA1CY,wDAAsB;AAEjC;IADC,IAAA,oBAAK,EAAC,IAAI,CAAC,EAAE,CAAC,iBAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,8BAA8B,EAAE,CAAC;;kDACxE;AAGX;IADC,IAAA,oBAAK,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,YAAY,EAAE,CAAC;;oDACxC;AAGb;IADC,IAAA,oBAAK,EAAC,IAAI,CAAC,EAAE,CAAC,iBAAS,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,qCAAqC,EAAE,CAAC;sCACvF,iBAAS;uDAAA;AAGnB;IADC,IAAA,oBAAK,EAAC,IAAI,CAAC,EAAE,CAAC,6BAAY,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,uBAAuB,EAAE,CAAC;;oDACnE;AAGnB;IADC,IAAA,oBAAK,EAAC,IAAI,CAAC,EAAE,CAAC,oBAAK,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,oBAAoB,EAAE,CAAC;;sDAC7D;AAGf;IADC,IAAA,oBAAK,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,eAAe,EAAE,CAAC;;wDACvC;AAGjB;IADC,IAAA,oBAAK,EAAC,IAAI,CAAC,EAAE,CAAC,kBAAG,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC;;0DACzC;AAGnB;IADC,IAAA,oBAAK,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,sCAAsC,EAAE,CAAC;;8DACvD;AAGxB;IADC,IAAA,oBAAK,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,uBAAuB,EAAE,CAAC;;0DAC7C;AAGnB;IADC,IAAA,oBAAK,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,sBAAsB,EAAE,CAAC;;wDAC9C;AAGjB;IADC,IAAA,oBAAK,EAAC,IAAI,CAAC,EAAE,CAAC,iBAAS,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,oCAAoC,EAAE,CAAC;sCACjF,iBAAS;4DAAA;AAGxB;IADC,IAAA,oBAAK,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,kCAAkC,EAAE,CAAC;;sDAC3D;AAGhB;IADC,IAAA,oBAAK,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC;;qDAClC;AAGd;IADC,IAAA,oBAAK,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,8BAA8B,EAAE,CAAC;;sDACxD;iCAzCJ,sBAAsB;IADlC,IAAA,wBAAS,EAAC,EAAE,WAAW,EAAE,sEAAsE,EAAE,CAAC;GACtF,sBAAsB,CA0ClC;AAGM,IAAM,qBAAqB,GAA3B,MAAM,qBAAqB;CAMjC,CAAA;AANY,sDAAqB;AAEhC;IADC,IAAA,oBAAK,EAAC,IAAI,CAAC,EAAE,CAAC,CAAC,uCAAiB,CAAC,EAAE,EAAE,WAAW,EAAE,wBAAwB,EAAE,CAAC;;oDACpD;AAG1B;IADC,IAAA,oBAAK,EAAC,IAAI,CAAC,EAAE,CAAC,kBAAG,EAAE,EAAE,WAAW,EAAE,2BAA2B,EAAE,CAAC;;oDACpD;gCALF,qBAAqB;IADjC,IAAA,yBAAU,EAAC,EAAE,WAAW,EAAE,2BAA2B,EAAE,CAAC;GAC5C,qBAAqB,CAMjC","sourcesContent":["import { ObjectType, Field, Float, InputType, Int, ID } from 'type-graphql'\n\nimport { ObjectRef } from '@things-factory/shell'\n\nimport { CashFlowType } from '../cash-flow-type'\nimport { RecurringCashItem } from './recurring-cash-item'\n\n@InputType({ description: 'A recurring item, or a grid row: cuFlag + adds, M changes, - deletes' })\nexport class RecurringCashItemPatch {\n @Field(type => ID, { nullable: true, description: 'The item to change or delete' })\n id?: string\n\n @Field({ nullable: true, description: 'What it is' })\n name?: string\n\n @Field(type => ObjectRef, { nullable: true, description: 'The account subject it is booked to' })\n account?: ObjectRef\n\n @Field(type => CashFlowType, { nullable: true, description: 'Money in or money out' })\n type?: CashFlowType\n\n @Field(type => Float, { nullable: true, description: 'Amount every month' })\n amount?: number\n\n @Field({ nullable: true, description: 'ISO 4217 code' })\n currency?: string\n\n @Field(type => Int, { nullable: true, description: '1-31' })\n dayOfMonth?: number\n\n @Field({ nullable: true, description: 'Falls on the last day of every month' })\n lastDayOfMonth?: boolean\n\n @Field({ nullable: true, description: 'First month - YYYY-MM' })\n startMonth?: string\n\n @Field({ nullable: true, description: 'Last month - YYYY-MM' })\n endMonth?: string\n\n @Field(type => ObjectRef, { nullable: true, description: 'Who it is paid to or received from' })\n counterparty?: ObjectRef\n\n @Field({ nullable: true, description: 'Whether it still makes forecasts' })\n active?: boolean\n\n @Field({ nullable: true, description: 'Notes' })\n notes?: string\n\n @Field({ nullable: true, description: '+ adds, M changes, - deletes' })\n cuFlag?: string\n}\n\n@ObjectType({ description: 'A page of recurring items' })\nexport class RecurringCashItemList {\n @Field(type => [RecurringCashItem], { description: 'The items on this page' })\n items: RecurringCashItem[]\n\n @Field(type => Int, { description: 'How many there are in all' })\n total: number\n}\n"]}
1
+ {"version":3,"file":"recurring-cash-item-type.js","sourceRoot":"","sources":["../../../server/service/recurring-cash-item/recurring-cash-item-type.ts"],"names":[],"mappings":";;;;AAAA,+CAA2E;AAE3E,iDAAiD;AAEjD,sDAAgD;AAChD,+DAAyD;AAGlD,IAAM,sBAAsB,GAA5B,MAAM,sBAAsB;CA0ClC,CAAA;AA1CY,wDAAsB;AAEjC;IADC,IAAA,oBAAK,EAAC,IAAI,CAAC,EAAE,CAAC,iBAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,8BAA8B,EAAE,CAAC;;kDACxE;AAGX;IADC,IAAA,oBAAK,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,YAAY,EAAE,CAAC;;oDACxC;AAGb;IADC,IAAA,oBAAK,EAAC,IAAI,CAAC,EAAE,CAAC,iBAAS,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,qCAAqC,EAAE,CAAC;sCACvF,iBAAS;uDAAA;AAGnB;IADC,IAAA,oBAAK,EAAC,IAAI,CAAC,EAAE,CAAC,6BAAY,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,uBAAuB,EAAE,CAAC;;oDACnE;AAGnB;IADC,IAAA,oBAAK,EAAC,IAAI,CAAC,EAAE,CAAC,oBAAK,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,oBAAoB,EAAE,CAAC;;sDAC7D;AAGf;IADC,IAAA,oBAAK,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,eAAe,EAAE,CAAC;;wDACvC;AAGjB;IADC,IAAA,oBAAK,EAAC,IAAI,CAAC,EAAE,CAAC,kBAAG,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC;;0DACzC;AAGnB;IADC,IAAA,oBAAK,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,sCAAsC,EAAE,CAAC;;8DACvD;AAGxB;IADC,IAAA,oBAAK,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,uBAAuB,EAAE,CAAC;;0DAC7C;AAGnB;IADC,IAAA,oBAAK,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,sBAAsB,EAAE,CAAC;;wDAC9C;AAGjB;IADC,IAAA,oBAAK,EAAC,IAAI,CAAC,EAAE,CAAC,iBAAS,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,oCAAoC,EAAE,CAAC;sCACjF,iBAAS;4DAAA;AAGxB;IADC,IAAA,oBAAK,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,sCAAsC,EAAE,CAAC;;sDAC/D;AAGhB;IADC,IAAA,oBAAK,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC;;qDAClC;AAGd;IADC,IAAA,oBAAK,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,8BAA8B,EAAE,CAAC;;sDACxD;iCAzCJ,sBAAsB;IADlC,IAAA,wBAAS,EAAC,EAAE,WAAW,EAAE,sEAAsE,EAAE,CAAC;GACtF,sBAAsB,CA0ClC;AAGM,IAAM,qBAAqB,GAA3B,MAAM,qBAAqB;CAMjC,CAAA;AANY,sDAAqB;AAEhC;IADC,IAAA,oBAAK,EAAC,IAAI,CAAC,EAAE,CAAC,CAAC,uCAAiB,CAAC,EAAE,EAAE,WAAW,EAAE,wBAAwB,EAAE,CAAC;;oDACpD;AAG1B;IADC,IAAA,oBAAK,EAAC,IAAI,CAAC,EAAE,CAAC,kBAAG,EAAE,EAAE,WAAW,EAAE,2BAA2B,EAAE,CAAC;;oDACpD;gCALF,qBAAqB;IADjC,IAAA,yBAAU,EAAC,EAAE,WAAW,EAAE,2BAA2B,EAAE,CAAC;GAC5C,qBAAqB,CAMjC","sourcesContent":["import { ObjectType, Field, Float, InputType, Int, ID } from 'type-graphql'\n\nimport { ObjectRef } from '@things-factory/shell'\n\nimport { CashFlowType } from '../cash-flow-type'\nimport { RecurringCashItem } from './recurring-cash-item'\n\n@InputType({ description: 'A recurring item, or a grid row: cuFlag + adds, M changes, - deletes' })\nexport class RecurringCashItemPatch {\n @Field(type => ID, { nullable: true, description: 'The item to change or delete' })\n id?: string\n\n @Field({ nullable: true, description: 'What it is' })\n name?: string\n\n @Field(type => ObjectRef, { nullable: true, description: 'The account subject it is booked to' })\n account?: ObjectRef\n\n @Field(type => CashFlowType, { nullable: true, description: 'Money in or money out' })\n type?: CashFlowType\n\n @Field(type => Float, { nullable: true, description: 'Amount every month' })\n amount?: number\n\n @Field({ nullable: true, description: 'ISO 4217 code' })\n currency?: string\n\n @Field(type => Int, { nullable: true, description: '1-31' })\n dayOfMonth?: number\n\n @Field({ nullable: true, description: 'Falls on the last day of every month' })\n lastDayOfMonth?: boolean\n\n @Field({ nullable: true, description: 'First month - YYYY-MM' })\n startMonth?: string\n\n @Field({ nullable: true, description: 'Last month - YYYY-MM' })\n endMonth?: string\n\n @Field(type => ObjectRef, { nullable: true, description: 'Who it is paid to or received from' })\n counterparty?: ObjectRef\n\n @Field({ nullable: true, description: 'Whether it still falls in its months' })\n active?: boolean\n\n @Field({ nullable: true, description: 'Notes' })\n notes?: string\n\n @Field({ nullable: true, description: '+ adds, M changes, - deletes' })\n cuFlag?: string\n}\n\n@ObjectType({ description: 'A page of recurring items' })\nexport class RecurringCashItemList {\n @Field(type => [RecurringCashItem], { description: 'The items on this page' })\n items: RecurringCashItem[]\n\n @Field(type => Int, { description: 'How many there are in all' })\n total: number\n}\n"]}
@@ -4,8 +4,8 @@ import { Counterparty } from '@things-factory/biz-base';
4
4
  import { Account } from '../account/account';
5
5
  import { CashFlowType } from '../cash-flow-type';
6
6
  /**
7
- * Money that comes in or goes out every month on a known day - rent, a subscription, a loan's interest. Each month it
8
- * falls in, it makes a forecast (§`Transaction.recurringItem`).
7
+ * Money that comes in or goes out every month on a known day - rent, a subscription, a loan's interest. An app reads
8
+ * the months it falls in as money still to come (§`recurring-schedule`); nothing is written for them.
9
9
  */
10
10
  export declare class RecurringCashItem {
11
11
  readonly id: string;