@things-factory/accounting 10.1.182 → 10.1.183

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 (67) hide show
  1. package/dist-client/tsconfig.tsbuildinfo +1 -1
  2. package/dist-server/index.d.ts +1 -0
  3. package/dist-server/index.js +2 -0
  4. package/dist-server/index.js.map +1 -1
  5. package/dist-server/service/account/account-mutation.js +6 -6
  6. package/dist-server/service/account/account-mutation.js.map +1 -1
  7. package/dist-server/service/account/account-query.js +2 -2
  8. package/dist-server/service/account/account-query.js.map +1 -1
  9. package/dist-server/service/account/default-accounts.d.ts +5 -0
  10. package/dist-server/service/account/default-accounts.js +18 -1
  11. package/dist-server/service/account/default-accounts.js.map +1 -1
  12. package/dist-server/service/accounting-category/accounting-category-mutation.js +6 -6
  13. package/dist-server/service/accounting-category/accounting-category-mutation.js.map +1 -1
  14. package/dist-server/service/accounting-category/accounting-category-query.js +3 -3
  15. package/dist-server/service/accounting-category/accounting-category-query.js.map +1 -1
  16. package/dist-server/service/bank-account/bank-account-history.js +2 -0
  17. package/dist-server/service/bank-account/bank-account-history.js.map +1 -1
  18. package/dist-server/service/bank-account/bank-account-mutation.js +5 -5
  19. package/dist-server/service/bank-account/bank-account-mutation.js.map +1 -1
  20. package/dist-server/service/bank-account/bank-account-query.js +2 -2
  21. package/dist-server/service/bank-account/bank-account-query.js.map +1 -1
  22. package/dist-server/service/bank-account/bank-account.js +4 -0
  23. package/dist-server/service/bank-account/bank-account.js.map +1 -1
  24. package/dist-server/service/bank-statement/bank-import-mutation.js +1 -1
  25. package/dist-server/service/bank-statement/bank-import-mutation.js.map +1 -1
  26. package/dist-server/service/bank-statement/bank-statement-query.js +2 -2
  27. package/dist-server/service/bank-statement/bank-statement-query.js.map +1 -1
  28. package/dist-server/service/counterparty-account/counterparty-account-query.js +1 -1
  29. package/dist-server/service/counterparty-account/counterparty-account-query.js.map +1 -1
  30. package/dist-server/service/expenditure-request/expenditure-request-item.js +1 -0
  31. package/dist-server/service/expenditure-request/expenditure-request-item.js.map +1 -1
  32. package/dist-server/service/expenditure-request/expenditure-request-mutation.js +4 -2
  33. package/dist-server/service/expenditure-request/expenditure-request-mutation.js.map +1 -1
  34. package/dist-server/service/expenditure-request/expenditure-request-service.d.ts +9 -1
  35. package/dist-server/service/expenditure-request/expenditure-request-service.js +6 -5
  36. package/dist-server/service/expenditure-request/expenditure-request-service.js.map +1 -1
  37. package/dist-server/service/expenditure-request/receipt-reader.d.ts +20 -0
  38. package/dist-server/service/expenditure-request/receipt-reader.js +43 -0
  39. package/dist-server/service/expenditure-request/receipt-reader.js.map +1 -0
  40. package/dist-server/service/financial-institution/financial-institution-mutation.js +6 -6
  41. package/dist-server/service/financial-institution/financial-institution-mutation.js.map +1 -1
  42. package/dist-server/service/financial-institution/financial-institution-query.js +2 -2
  43. package/dist-server/service/financial-institution/financial-institution-query.js.map +1 -1
  44. package/dist-server/service/fiscal-month/fiscal-month-mutation.js +6 -6
  45. package/dist-server/service/fiscal-month/fiscal-month-mutation.js.map +1 -1
  46. package/dist-server/service/fiscal-month/fiscal-month-query.js +2 -2
  47. package/dist-server/service/fiscal-month/fiscal-month-query.js.map +1 -1
  48. package/dist-server/service/fiscal-quarter/fiscal-quarter-mutation.js +6 -6
  49. package/dist-server/service/fiscal-quarter/fiscal-quarter-mutation.js.map +1 -1
  50. package/dist-server/service/fiscal-quarter/fiscal-quarter-query.js +2 -2
  51. package/dist-server/service/fiscal-quarter/fiscal-quarter-query.js.map +1 -1
  52. package/dist-server/service/fiscal-year/fiscal-year-mutation.js +6 -6
  53. package/dist-server/service/fiscal-year/fiscal-year-mutation.js.map +1 -1
  54. package/dist-server/service/fiscal-year/fiscal-year-query.js +2 -2
  55. package/dist-server/service/fiscal-year/fiscal-year-query.js.map +1 -1
  56. package/dist-server/service/payment/payment-query.js +1 -1
  57. package/dist-server/service/payment/payment-query.js.map +1 -1
  58. package/dist-server/service/payment/payment.js +9 -2
  59. package/dist-server/service/payment/payment.js.map +1 -1
  60. package/dist-server/service/transaction/transaction-mutation.js +5 -5
  61. package/dist-server/service/transaction/transaction-mutation.js.map +1 -1
  62. package/dist-server/service/transaction/transaction-query.js +2 -2
  63. package/dist-server/service/transaction/transaction-query.js.map +1 -1
  64. package/dist-server/tsconfig.tsbuildinfo +1 -1
  65. package/package.json +9 -9
  66. package/translations/en.json +1 -0
  67. package/translations/ko.json +1 -0
@@ -1 +1 @@
1
- {"version":3,"file":"expenditure-request-service.js","sourceRoot":"","sources":["../../../server/service/expenditure-request/expenditure-request-service.ts"],"names":[],"mappings":"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","sourcesContent":["import { EntityManager, In } from 'typeorm'\n\nimport { Refusal } from '@things-factory/shell'\nimport { accountKey, Counterparty, CounterpartyBankAccount } from '@things-factory/biz-base'\nimport { Employee } from '@things-factory/organization'\nimport { Category, TaxInvoice } from '@things-factory/tax-invoice'\nimport { abort, activityNamed, approvalLineRefusal, approvalLineStanding, issue } from '@things-factory/worklist'\nimport { createAttachment, replaceAttachment } from '@things-factory/attachment-base'\n\nimport { activityOfKind } from '../../activities/expenditure-activity-names'\nimport { Account } from '../account/account'\nimport { accountMatcher } from '../account/account-match'\nimport { BankAccount } from '../bank-account/bank-account'\nimport { CashFlowType } from '../cash-flow-type'\nimport { Payment } from '../payment/payment'\nimport { TAX_INVOICE_TARGET } from '../payment/document-targets'\nimport { paidOfTarget } from '../payment/payment-currency'\nimport { savePayments } from '../payment/payment-service'\nimport { Transaction, TransactionCategory, TransactionSource } from '../transaction/transaction'\nimport { saveTransactions } from '../transaction/transaction-service'\nimport { ExpenditureKind, ExpenditureRequest, ExpenditureRequestStatus } from './expenditure-request'\nimport { ExpenditurePaymentMethod, ExpenditureRequestItem } from './expenditure-request-item'\nimport { EXPENDITURE_TARGET, paymentStatesOf, type PaymentState } from './expenditure-payment-state'\nimport {\n canEdit,\n dayOf,\n isPayable,\n monthOf,\n payeeAccountDrift,\n requestForLine,\n submitRefusal,\n totalsOf,\n type RequestKind,\n type RequestStatus\n} from './expenditure-request-rules'\n\nexport const RECEIPT_REF_TYPE = 'ExpenditureRequestItem'\n\nconst won = (value: number) => `${Math.round(value || 0).toLocaleString()}원`\nconst KINDS = Object.values(ExpenditureKind) as string[]\nconst METHODS = Object.values(ExpenditurePaymentMethod) as string[]\n\nexport interface RequestHead {\n id?: string\n kind?: string\n title?: string\n month?: string\n dueDate?: string\n counterparty?: { id: string } | null\n payeeAccount?: { id: string } | null\n notes?: string\n}\n\nexport interface ItemPatch {\n id?: string\n cuFlag?: string\n spentDate?: string\n category?: string\n account?: { id: string } | null\n merchant?: string\n description?: string\n amount?: number\n vatAmount?: number\n paymentMethod?: string\n taxInvoice?: { id: string } | null\n}\n\n/** A request somebody is judging (or that is decided) - it changes only after it is withdrawn. */\nexport const lockedRequest = (status: string) =>\n new Refusal('expenditure-locked', { status: String(status).toLowerCase() }, `a ${String(status).toLowerCase()} request cannot be changed - withdraw it first`)\n\n/** The request of this domain, refusing one that is not the caller's own. */\nexport async function ownRequest(tx: EntityManager, id: string, domain: { id: string }, user: { id: string }): Promise<ExpenditureRequest> {\n const request = await tx.getRepository(ExpenditureRequest).findOne({ where: { id, domain: { id: domain.id } } as any, relations: ['requester'] })\n if (!request) throw new Refusal('expenditure-not-found', {}, `expenditure request '${id}' was not found`)\n if (request.requester?.id !== user.id) throw new Refusal('expenditure-not-yours', {}, 'only the requester can change this request')\n return request\n}\n\nasync function employeeOf(tx: EntityManager, domain: { id: string }, user: { id: string }) {\n return await tx.getRepository(Employee).findOne({ where: { domain: { id: domain.id }, user: { id: user.id } } as any, relations: ['department'] })\n}\n\nasync function linesOf(tx: EntityManager, requestId: string): Promise<ExpenditureRequestItem[]> {\n return await tx.getRepository(ExpenditureRequestItem).find({ where: { request: { id: requestId } } as any, order: { spentDate: 'ASC', createdAt: 'ASC' } as any })\n}\n\nasync function refreshTotals(tx: EntityManager, request: ExpenditureRequest): Promise<ExpenditureRequest> {\n const totals = totalsOf(await linesOf(tx, request.id))\n request.totalAmount = totals.total\n request.payableAmount = totals.payable\n return await tx.getRepository(ExpenditureRequest).save(request)\n}\n\nasync function inDomain<T>(tx: EntityManager, entity: new () => T, domain: { id: string }, ref: { id: string } | null | undefined, field: string): Promise<T | null> {\n if (!ref?.id) return null\n const row = await tx.getRepository(entity).findOne({ where: { domain: { id: domain.id }, id: ref.id } as any })\n if (!row) throw new Refusal('expenditure-reference-not-found', { field }, `${field} was not found - reload and try again`)\n return row\n}\n\n/** The counterparty and the account of it a counterparty payment names - the account must be that counterparty's. */\nasync function payeeOf(tx: EntityManager, domain: { id: string }, head: RequestHead, current?: ExpenditureRequest) {\n const counterparty = 'counterparty' in head ? await inDomain(tx, Counterparty, domain, head.counterparty, 'counterparty') : undefined\n const account = 'payeeAccount' in head ? await inDomain(tx, CounterpartyBankAccount, domain, head.payeeAccount, 'payeeAccount') : undefined\n const counterpartyId = counterparty === undefined ? current?.counterpartyId : counterparty?.id\n if (account && account.counterpartyId !== counterpartyId)\n throw new Refusal('expenditure-account-not-of-payee', {}, \"the account is not the counterparty's - choose one of its accounts\")\n return { counterparty, account }\n}\n\n/** Apply line patches to a request - checks each line's references and the tax invoice it cites. */\nasync function saveItems(tx: EntityManager, domain: { id: string }, user: any, request: ExpenditureRequest, patches: ItemPatch[]) {\n const repo = tx.getRepository(ExpenditureRequestItem)\n\n const deletes = patches.filter(one => one.cuFlag === '-' && one.id).map(one => one.id!)\n if (deletes.length) {\n const own = await repo.find({ where: { request: { id: request.id }, id: In(deletes) } as any })\n if (own.length !== new Set(deletes).size) throw new Refusal('expenditure-line-not-found', {}, 'a line was not found - reload and try again')\n await repo.softDelete({ id: In(deletes) })\n }\n\n const writes = patches.filter(one => one.cuFlag !== '-')\n const accounts = writes.some(one => !('account' in one) && (one.category || one.description))\n ? await tx.getRepository(Account).find({ where: { domain: { id: domain.id }, active: true } as any })\n : []\n const match = accountMatcher(accounts)\n\n for (const patch of writes) {\n const isNew = !patch.id || patch.cuFlag === '+'\n const current = isNew ? undefined : await repo.findOne({ where: { request: { id: request.id }, id: patch.id } as any })\n if (!isNew && !current) throw new Refusal('expenditure-line-not-found', {}, 'a line was not found - reload and try again')\n\n const row: Record<string, any> = {}\n if ('spentDate' in patch) {\n row.spentDate = patch.spentDate ? dayOf(patch.spentDate) : null\n if (patch.spentDate && !row.spentDate) throw new Refusal('expenditure-line-day-invalid', { value: String(patch.spentDate) }, `'${patch.spentDate}' is not a day (use YYYY-MM-DD)`)\n }\n for (const field of ['category', 'merchant', 'description'] as const) if (field in patch) row[field] = patch[field]?.trim() || null\n if ('amount' in patch) row.amount = Number(patch.amount) || 0\n if ('vatAmount' in patch) row.vatAmount = patch.vatAmount === null || patch.vatAmount === undefined ? null : Number(patch.vatAmount)\n if ('paymentMethod' in patch && patch.paymentMethod) {\n if (!METHODS.includes(patch.paymentMethod)) throw new Refusal('expenditure-line-method-invalid', { value: patch.paymentMethod }, `'${patch.paymentMethod}' is not a way to pay`)\n row.paymentMethod = patch.paymentMethod\n } else if (isNew) row.paymentMethod = request.kind === ExpenditureKind.VENDOR ? ExpenditurePaymentMethod.TRANSFER : ExpenditurePaymentMethod.PERSONAL_CARD\n\n if ('account' in patch) row.account = await inDomain(tx, Account, domain, patch.account, 'account')\n else {\n /* A line that names no account is given the one its words mean, by its category then its description (§`accountMatcher`). */\n const words = [patch.category ?? current?.category, patch.description ?? current?.description]\n const found = (isNew || 'category' in patch || 'description' in patch) && accounts.length ? match(words, CashFlowType.EXPENSE) : undefined\n if (found) row.account = found\n }\n\n if ('taxInvoice' in patch) {\n const invoice = await inDomain(tx, TaxInvoice, domain, patch.taxInvoice, 'taxInvoice')\n if (invoice) {\n if (request.kind !== ExpenditureKind.VENDOR) throw new Refusal('expenditure-invoice-on-reimbursement', {}, 'a reimbursement cites receipts, not tax invoices')\n if (invoice.category !== Category.IMPORT) throw new Refusal('expenditure-invoice-not-purchase', {}, 'cite a purchase tax invoice')\n const elsewhere = await repo.find({ where: { domain: { id: domain.id }, taxInvoice: { id: invoice.id } } as any, relations: ['request'] })\n if (elsewhere.some(one => one.id !== current?.id && one.request && !one.request.deletedAt))\n throw new Refusal('expenditure-invoice-cited-twice', { issueDate: invoice.issueDate }, 'another request already pays this tax invoice')\n if (!('amount' in patch) || !(row.amount > 0)) row.amount = Number(invoice.totalAmount)\n if (!('spentDate' in patch)) row.spentDate = invoice.issueDate\n }\n row.taxInvoice = invoice\n }\n\n /* What a line says of its money holds whenever it is written, not only when it is submitted. */\n const amount = 'amount' in row ? row.amount : Number(current?.amount ?? 0)\n if ('amount' in row && !(row.amount > 0)) throw new Refusal('expenditure-line-amount-missing', {}, 'every line needs an amount above zero')\n const vat = 'vatAmount' in row ? row.vatAmount : current?.vatAmount\n if (vat && amount && Number(vat) > amount) throw new Refusal('expenditure-line-vat-over-amount', {}, 'the VAT is more than the amount')\n\n /* A line that cites an invoice asks no more than the invoice - whichever of the two changed. */\n const citedId = 'taxInvoice' in patch ? row.taxInvoice?.id : current?.taxInvoiceId\n if (citedId && ('amount' in row || 'taxInvoice' in patch)) {\n const invoice = row.taxInvoice ?? (await tx.getRepository(TaxInvoice).findOne({ where: { id: citedId } as any, withDeleted: true }))\n if (invoice && amount > Number(invoice.totalAmount) + 0.005)\n throw new Refusal('expenditure-line-over-invoice', { total: won(Number(invoice.totalAmount)) }, 'a line asks more than the tax invoice it cites')\n }\n\n await repo.save({ ...(current ?? { domain, request, creator: user, amount: 0 }), ...row, updater: user } as any)\n }\n}\n\n/**\n * Save a request and its lines in one go - the head, then the lines. A new request belongs to the caller; an existing\n * one only to its requester, and only while it is editable.\n */\nexport async function saveRequest(tx: EntityManager, domain: any, user: any, head: RequestHead, items: ItemPatch[]): Promise<ExpenditureRequest> {\n const repo = tx.getRepository(ExpenditureRequest)\n\n let request: ExpenditureRequest\n if (head.id) {\n request = await ownRequest(tx, head.id, domain, user)\n if (!canEdit(request.status as RequestStatus)) throw lockedRequest(request.status)\n if (head.kind && head.kind !== request.kind) throw new Refusal('expenditure-kind-fixed', {}, 'a request keeps the kind it was written as')\n } else {\n if (!head.kind || !KINDS.includes(head.kind)) throw new Refusal('expenditure-kind-missing', {}, 'say whether it pays a counterparty or pays an employee back')\n const employee = await employeeOf(tx, domain, user)\n request = repo.create({\n domain,\n kind: head.kind as ExpenditureKind,\n requester: user,\n department: employee?.department ?? null,\n status: ExpenditureRequestStatus.DRAFT,\n currency: 'KRW',\n totalAmount: 0,\n payableAmount: 0,\n creator: user\n } as any) as unknown as ExpenditureRequest\n }\n\n const reimbursement = request.kind === ExpenditureKind.REIMBURSEMENT\n if ('month' in head || (!head.id && reimbursement)) {\n const month = monthOf(head.month)\n if (reimbursement && !month) throw new Refusal('expenditure-month-invalid', { value: String(head.month ?? '') }, `month: '${head.month ?? ''}' is not a month (use YYYY-MM)`)\n if (head.month && !month) throw new Refusal('expenditure-month-invalid', { value: String(head.month) }, `month: '${head.month}' is not a month (use YYYY-MM)`)\n request.month = month ?? null\n }\n if ('dueDate' in head) {\n request.dueDate = head.dueDate ? dayOf(head.dueDate) ?? null : null\n if (head.dueDate && !request.dueDate) throw new Refusal('expenditure-due-date-invalid', { value: String(head.dueDate) }, `'${head.dueDate}' is not a day (use YYYY-MM-DD)`)\n }\n if (reimbursement && ('counterparty' in head || 'payeeAccount' in head)) throw new Refusal('expenditure-reimbursement-pays-requester', {}, 'a reimbursement pays the employee who wrote it')\n const { counterparty, account } = await payeeOf(tx, domain, head, head.id ? request : undefined)\n if (counterparty !== undefined) request.counterparty = counterparty\n if (account !== undefined) request.payeeAccount = account\n /* A changed counterparty drops the account chosen of the former one. */\n if (counterparty !== undefined && account === undefined && request.payeeAccountId) {\n const kept = await tx.getRepository(CounterpartyBankAccount).findOne({ where: { id: request.payeeAccountId } as any })\n if (kept?.counterpartyId !== counterparty?.id) request.payeeAccount = null\n }\n\n if (head.title?.trim()) request.title = head.title.trim()\n else if (!request.title) request.title = reimbursement ? `${request.month} 경비` : `${counterparty?.name ?? ''} 지급`.trim()\n if (head.notes !== undefined) request.notes = head.notes\n request.updater = user\n request = await repo.save(request)\n\n if (items?.length) await saveItems(tx, domain, user, request, items)\n return await refreshTotals(tx, request)\n}\n\n/** The payee's account as approvers will see it - written on the request when it is submitted (ADR-0135 §5). */\nasync function payeeSnapshot(tx: EntityManager, domain: { id: string }, request: ExpenditureRequest, user: any) {\n if (request.kind === ExpenditureKind.VENDOR) {\n const account = await tx.getRepository(CounterpartyBankAccount).findOne({ where: { domain: { id: domain.id }, id: request.payeeAccountId } as any })\n if (!account || account.counterpartyId !== request.counterpartyId)\n throw new Refusal('expenditure-payee-account-missing', {}, \"choose the counterparty's account to pay into\")\n return { payeeBankName: account.bankName ?? null, payeeAccountNumber: account.accountNumber, payeeHolderName: account.holderName ?? null }\n }\n const employee = await employeeOf(tx, domain, user)\n return {\n payeeBankName: employee?.bankName ?? null,\n payeeAccountNumber: employee?.bankAccount ? accountKey(employee.bankAccount) || null : null,\n payeeHolderName: user.name ?? null\n }\n}\n\n/** Put a request up for approval. The approval carries what the approver needs to judge it. */\nexport async function submitRequest(tx: EntityManager, domain: any, user: any, id: string, context: ResolverContext): Promise<ExpenditureRequest> {\n const request = await ownRequest(tx, id, domain, user)\n const items = await linesOf(tx, request.id)\n\n const refusal = submitRefusal(\n {\n kind: request.kind as RequestKind,\n status: request.status as RequestStatus,\n month: request.month,\n dueDate: request.dueDate,\n counterpartyId: request.counterpartyId,\n payeeAccountId: request.payeeAccountId\n },\n items\n )\n if (refusal) throw refusal\n Object.assign(request, await payeeSnapshot(tx, domain, request, user))\n\n const form = activityOfKind(request.kind)\n const carrier = await activityNamed(form, context)\n if (!carrier) throw new Refusal('expenditure-approval-not-installed', { form }, `the approval '${form}' is not installed in this domain`)\n const line = await approvalLineStanding(carrier, context)\n if (line.refusal) throw approvalLineRefusal(line.refusal)\n\n const totals = totalsOf(items)\n const who = user.name || user.email || ''\n const vendor = request.kind === ExpenditureKind.VENDOR\n const payee = vendor ? (await tx.getRepository(Counterparty).findOne({ where: { id: request.counterpartyId } as any }))?.name ?? '' : who\n const account = [request.payeeBankName, request.payeeAccountNumber, request.payeeHolderName].filter(Boolean).join(' ')\n\n const instance = await issue(\n {\n name: vendor ? `지출결의 ${payee} ${request.title}` : `경비 청구 ${who} ${request.month}`,\n description: `${won(totals.total)} · ${totals.count}건${totals.payable !== totals.total ? ` (지급할 금액 ${won(totals.payable)})` : ''}`,\n activityId: carrier.id,\n approvalLine: carrier.approvalLine,\n input: {\n requestId: request.id,\n month: request.month ?? request.dueDate?.slice(0, 7) ?? '',\n requester: who,\n payee,\n /*\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 headline: vendor\n ? `${payee} · ${request.title} ${won(totals.payable)}${request.dueDate ? ` — ${request.dueDate} 지급` : ''}`\n : `${who} · ${request.month} 경비 ${won(totals.total)} (${totals.count}건)`,\n total: totals.total,\n payable: totals.payable,\n account,\n lines: items.map(item =>\n `${item.spentDate ?? ''} ${item.category ?? ''} ${item.merchant ?? ''} ${won(item.amount)}${item.paymentMethod === ExpenditurePaymentMethod.CORPORATE_CARD ? ' (법인카드)' : ''}${item.taxInvoiceId ? ' (세금계산서)' : ''} — ${item.description ?? ''}`\n .replace(/\\s+/g, ' ')\n .trim()\n ),\n consequence:\n totals.payable > 0\n ? `승인하면 ${won(totals.payable)}을 ${payee}에게 지급할 대상이 됩니다${account ? ` (${account})` : ''}`\n : '법인카드 사용분만 있어 지급할 금액은 없습니다'\n },\n threadsMin: 1,\n threadsMax: 1,\n requireApproval: true\n } as any,\n context\n )\n\n request.status = ExpenditureRequestStatus.SUBMITTED\n request.activityInstanceId = instance.id\n request.submittedAt = new Date()\n request.decidedAt = null\n request.decidedBy = null\n request.updater = user\n return await tx.getRepository(ExpenditureRequest).save(request)\n}\n\n/** Take a request back from its approvers. worklist's abort does not call the activity back, so the request is set here. */\nexport async function withdrawRequest(tx: EntityManager, domain: any, user: any, id: string, context: ResolverContext): Promise<ExpenditureRequest> {\n const request = await ownRequest(tx, id, domain, user)\n if (request.status !== ExpenditureRequestStatus.SUBMITTED)\n throw new Refusal('expenditure-not-submitted', { status: String(request.status).toLowerCase() }, 'only a request waiting on approvers can be withdrawn')\n\n if (request.activityInstanceId) await abort({ id: request.activityInstanceId, reason: '작성자가 회수함' }, context)\n\n request.status = ExpenditureRequestStatus.WITHDRAWN\n request.updater = user\n return await tx.getRepository(ExpenditureRequest).save(request)\n}\n\n/** Delete one of the caller's requests that nobody is judging - with its lines. */\nexport async function deleteRequest(tx: EntityManager, domain: any, user: any, id: string): Promise<boolean> {\n const request = await ownRequest(tx, id, domain, user)\n if (!canEdit(request.status as RequestStatus))\n throw new Refusal('expenditure-cannot-delete', { status: request.status.toLowerCase() }, `a ${request.status.toLowerCase()} request cannot be deleted`)\n await tx.getRepository(ExpenditureRequestItem).softDelete({ request: { id } } as any)\n await tx.getRepository(ExpenditureRequest).softDelete({ id })\n return true\n}\n\n/**\n * Add one line from the phone. It joins the caller's editable reimbursement of that month (§`requestForLine`), or\n * starts one. The receipt photo is attached to the line.\n */\nexport async function addLine(tx: EntityManager, domain: any, user: any, line: ItemPatch & { month?: string; receipt?: any }, context: ResolverContext): Promise<ExpenditureRequest> {\n const spentDate = dayOf(line.spentDate)\n if (!spentDate) throw new Refusal('expenditure-line-day-missing', {}, 'every line needs its day')\n const month = monthOf(line.month) ?? spentDate.slice(0, 7)\n\n const mine = await tx.getRepository(ExpenditureRequest).find({\n where: { domain: { id: domain.id }, requester: { id: user.id }, kind: ExpenditureKind.REIMBURSEMENT, month } as any\n })\n const joinId = requestForLine(\n mine.map(one => ({ id: one.id, status: one.status as RequestStatus, month: one.month, updatedAt: one.updatedAt })),\n month\n )\n\n const { receipt, month: _month, ...fields } = line\n const request = await saveRequest(tx, domain, user, joinId ? { id: joinId } : { kind: ExpenditureKind.REIMBURSEMENT, month }, [{ ...fields, spentDate, cuFlag: '+' }])\n\n if (receipt) {\n const [latest] = await tx.getRepository(ExpenditureRequestItem).find({ where: { request: { id: request.id } } as any, order: { createdAt: 'DESC' } as any, take: 1 })\n if (latest) await attachReceipt(latest.id, receipt, context)\n }\n return request\n}\n\n/** Put a receipt on a line - replacing the one it had. Only the requester, only while editable. */\nexport async function replaceReceipt(tx: EntityManager, domain: any, user: any, itemId: string, file: any, context: ResolverContext): Promise<ExpenditureRequestItem> {\n const item = await tx.getRepository(ExpenditureRequestItem).findOne({ where: { id: itemId, domain: { id: domain.id } } as any, relations: ['request'] })\n if (!item?.request) throw new Refusal('expenditure-line-not-found', {}, 'a line was not found - reload and try again')\n const request = await ownRequest(tx, item.request.id, domain, user)\n if (!canEdit(request.status as RequestStatus)) throw lockedRequest(request.status)\n\n await replaceAttachment({ file, refType: RECEIPT_REF_TYPE, refBy: item.id, category: 'receipt' }, context)\n return item\n}\n\nasync function attachReceipt(itemId: string, file: any, context: ResolverContext) {\n await createAttachment(null, { attachment: { file, refType: RECEIPT_REF_TYPE, refBy: itemId, category: 'receipt' } } as any, context)\n}\n\n/** Approved requests with their lines and how far each is paid - what the payment queue and payments are made of. */\nexport async function approvedWithStates(tx: EntityManager, domain: { id: string }, ids?: string[]) {\n const requests = await tx.getRepository(ExpenditureRequest).find({\n where: { domain: { id: domain.id }, status: ExpenditureRequestStatus.APPROVED, ...(ids ? { id: In(ids) } : {}) } as any,\n relations: ['items', 'requester', 'counterparty', 'payeeAccount']\n })\n for (const request of requests) request.items = (request.items ?? []).filter(item => !item.deletedAt)\n const states = await paymentStatesOf(tx, domain, requests as any)\n return { requests, states }\n}\n\n/** Whether the account approvers saw is still the one on file (§`payeeAccountDrift`); `missing` when none was written. */\nexport async function driftOf(tx: EntityManager, request: ExpenditureRequest): Promise<string | undefined> {\n if (!request.payeeAccountNumber) return 'missing'\n if (request.kind !== ExpenditureKind.VENDOR) return undefined\n const current = request.payeeAccountId\n ? await tx.getRepository(CounterpartyBankAccount).findOne({ where: { id: request.payeeAccountId } as any, withDeleted: true })\n : null\n return payeeAccountDrift(request, current, accountKey)\n}\n\n/**\n * Put a part of a withdrawal on a request (ADR-0135 §2-5). A payable line that cites a tax invoice is paid on that\n * invoice; the rest on the request itself. A link the line already has to the same target is raised, not doubled.\n */\nasync function putOnLine(tx: EntityManager, domain: { id: string }, user: any, request: ExpenditureRequest, state: PaymentState, lineId: string, amount: number) {\n if (amount > state.outstanding + 0.005)\n throw new Refusal('expenditure-paid-over', { title: request.title }, `more is put on ${request.title} than it asks`)\n\n const existing = await tx.getRepository(Payment).find({ where: { domain: { id: domain.id }, transaction: { id: lineId } } as any })\n const patchFor = (targetType: string, targetId: string, put: number) => {\n const twin = existing.find(one => one.targetType === targetType && one.targetId === targetId)\n return twin ? { id: twin.id, cuFlag: 'M', amount: Number(twin.amount) + put } : { cuFlag: '+', transaction: { id: lineId }, targetType, targetId, amount: put }\n }\n\n let remaining = amount\n const patches: any[] = []\n const cited = (request.items ?? []).filter(item => isPayable(item) && item.taxInvoiceId)\n if (cited.length) {\n const onInvoices = await tx.getRepository(Payment).find({\n where: { domain: { id: domain.id }, targetType: TAX_INVOICE_TARGET, targetId: In(cited.map(item => item.taxInvoiceId)) } as any\n })\n for (const item of cited) {\n const paid = onInvoices.filter(one => one.targetId === item.taxInvoiceId).reduce((sum, one) => sum + paidOfTarget(one), 0)\n const put = Math.min(remaining, Math.max(0, Number(item.amount) - paid))\n if (put > 0) patches.push(patchFor(TAX_INVOICE_TARGET, item.taxInvoiceId!, put))\n remaining -= put\n }\n }\n const direct = Math.min(remaining, Math.max(0, state.settleable - state.settled))\n if (direct > 0) patches.push(patchFor(EXPENDITURE_TARGET, request.id, direct))\n remaining -= direct\n if (remaining > 0.005) throw new Refusal('expenditure-paid-over', { title: request.title }, `more is put on ${request.title} than it asks`)\n\n await savePayments(tx, domain, user, patches)\n}\n\nexport interface PaymentRecord {\n paidDate: string\n bankAccount?: { id: string } | null\n}\n\n/**\n * Pay approved requests - finance transferred the money at the bank and records it. Each request gets a withdrawal of\n * what it still asks, written as a person's line; the next bank statement import matches it, and then the payment is\n * reconciled (§`bank-reconcile`).\n */\nexport async function payRequests(tx: EntityManager, domain: any, user: any, ids: string[], record: PaymentRecord): Promise<ExpenditureRequest[]> {\n const paidDate = dayOf(record.paidDate)\n if (!paidDate) throw new Refusal('expenditure-paid-date-missing', {}, 'paidDate: the day the money went out')\n const bankAccount = await inDomain(tx, BankAccount, domain, record.bankAccount, 'bankAccount')\n\n const { requests, states } = await approvedWithStates(tx, domain, [...new Set(ids)])\n if (requests.length !== new Set(ids).size) {\n const found = await tx.getRepository(ExpenditureRequest).find({ where: { domain: { id: domain.id }, id: In(ids) } as any })\n const titles = found.filter(one => one.status !== ExpenditureRequestStatus.APPROVED).map(one => one.title).join(', ')\n if (titles) throw new Refusal('expenditure-not-approved', { title: titles }, `only an approved request is paid - ${titles}`)\n throw new Refusal('expenditure-not-found', {}, 'some requests were not found - reload and try again')\n }\n\n for (const request of requests) {\n const state = states.get(request.id)!\n if (!(state.outstanding > 0)) throw new Refusal('expenditure-paid-already', { title: request.title }, `${request.title} has nothing left to pay`)\n const payee = request.kind === ExpenditureKind.VENDOR ? request.counterparty?.name : request.requester?.name\n const [line] = await saveTransactions(tx, domain, user, [\n {\n cuFlag: '+',\n category: TransactionCategory.CONFIRMED,\n source: TransactionSource.MANUAL,\n type: CashFlowType.EXPENSE,\n transactionDate: paidDate,\n amount: state.outstanding,\n description: `지출 — ${request.title}`,\n counterpartyName: payee ?? undefined,\n ...(request.counterpartyId ? { counterparty: { id: request.counterpartyId } } : {}),\n ...(bankAccount ? { bankAccount: { id: bankAccount.id } } : { currency: request.currency })\n }\n ])\n await putOnLine(tx, domain, user, request, state, line.id, state.outstanding)\n }\n return requests\n}\n\n/**\n * Pay a request with a withdrawal already in the books - a bank statement brought it in first. The part put on the\n * request is what it still asks unless a smaller amount is given.\n */\nexport async function payWithLine(tx: EntityManager, domain: any, user: any, requestId: string, transactionId: string, amount?: number | null): Promise<ExpenditureRequest> {\n const { requests, states } = await approvedWithStates(tx, domain, [requestId])\n const [request] = requests\n if (!request) {\n const found = await tx.getRepository(ExpenditureRequest).findOne({ where: { domain: { id: domain.id }, id: requestId } as any })\n if (found) throw new Refusal('expenditure-not-approved', { title: found.title }, `only an approved request is paid - ${found.title}`)\n throw new Refusal('expenditure-not-found', {}, `expenditure request '${requestId}' was not found`)\n }\n const line = await tx.getRepository(Transaction).findOne({ where: { domain: { id: domain.id }, id: transactionId, category: TransactionCategory.CONFIRMED } as any })\n if (!line) throw new Refusal('expenditure-line-gone', {}, 'the bank line was not found - reload and try again')\n\n const state = states.get(request.id)!\n const put = amount === null || amount === undefined ? Math.min(state.outstanding, Number(line.amount)) : Number(amount)\n if (!(put > 0)) throw new Refusal('expenditure-paid-already', { title: request.title }, `${request.title} has nothing left to pay`)\n await putOnLine(tx, domain, user, request, state, line.id, put)\n return request\n}\n"]}
1
+ {"version":3,"file":"expenditure-request-service.js","sourceRoot":"","sources":["../../../server/service/expenditure-request/expenditure-request-service.ts"],"names":[],"mappings":"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","sourcesContent":["import { EntityManager, In } from 'typeorm'\n\nimport { Refusal } from '@things-factory/shell'\nimport { accountKey, Counterparty, CounterpartyBankAccount } from '@things-factory/biz-base'\nimport { Employee } from '@things-factory/organization'\nimport { Category, TaxInvoice } from '@things-factory/tax-invoice'\nimport { abort, activityNamed, approvalLineRefusal, approvalLineStanding, issue } from '@things-factory/worklist'\nimport { createAttachment, replaceAttachment } from '@things-factory/attachment-base'\n\nimport { activityOfKind } from '../../activities/expenditure-activity-names'\nimport { Account } from '../account/account'\nimport { accountMatcher } from '../account/account-match'\nimport { BankAccount } from '../bank-account/bank-account'\nimport { CashFlowType } from '../cash-flow-type'\nimport { Payment } from '../payment/payment'\nimport { TAX_INVOICE_TARGET } from '../payment/document-targets'\nimport { paidOfTarget } from '../payment/payment-currency'\nimport { savePayments } from '../payment/payment-service'\nimport { Transaction, TransactionCategory, TransactionSource } from '../transaction/transaction'\nimport { saveTransactions } from '../transaction/transaction-service'\nimport { ExpenditureKind, ExpenditureRequest, ExpenditureRequestStatus } from './expenditure-request'\nimport { ExpenditurePaymentMethod, ExpenditureRequestItem } from './expenditure-request-item'\nimport { EXPENDITURE_TARGET, paymentStatesOf, type PaymentState } from './expenditure-payment-state'\nimport {\n canEdit,\n dayOf,\n isPayable,\n monthOf,\n payeeAccountDrift,\n requestForLine,\n submitRefusal,\n totalsOf,\n type RequestKind,\n type RequestStatus\n} from './expenditure-request-rules'\n\nexport const RECEIPT_REF_TYPE = 'ExpenditureRequestItem'\n\nconst won = (value: number) => `${Math.round(value || 0).toLocaleString()}원`\nconst KINDS = Object.values(ExpenditureKind) as string[]\nconst METHODS = Object.values(ExpenditurePaymentMethod) as string[]\n\nexport interface RequestHead {\n id?: string\n kind?: string\n title?: string\n month?: string\n dueDate?: string\n counterparty?: { id: string } | null\n payeeAccount?: { id: string } | null\n notes?: string\n}\n\nexport interface ItemPatch {\n id?: string\n cuFlag?: string\n spentDate?: string\n category?: string\n account?: { id: string } | null\n merchant?: string\n description?: string\n amount?: number\n vatAmount?: number\n paymentMethod?: string\n taxInvoice?: { id: string } | null\n}\n\n/** A request somebody is judging (or that is decided) - it changes only after it is withdrawn. */\nexport const lockedRequest = (status: string) =>\n new Refusal('expenditure-locked', { status: String(status).toLowerCase() }, `a ${String(status).toLowerCase()} request cannot be changed - withdraw it first`)\n\n/** The request of this domain, refusing one that is not the caller's own. */\nexport async function ownRequest(tx: EntityManager, id: string, domain: { id: string }, user: { id: string }): Promise<ExpenditureRequest> {\n const request = await tx.getRepository(ExpenditureRequest).findOne({ where: { id, domain: { id: domain.id } } as any, relations: ['requester'] })\n if (!request) throw new Refusal('expenditure-not-found', {}, `expenditure request '${id}' was not found`)\n if (request.requester?.id !== user.id) throw new Refusal('expenditure-not-yours', {}, 'only the requester can change this request')\n return request\n}\n\nasync function employeeOf(tx: EntityManager, domain: { id: string }, user: { id: string }) {\n return await tx.getRepository(Employee).findOne({ where: { domain: { id: domain.id }, user: { id: user.id } } as any, relations: ['department'] })\n}\n\nasync function linesOf(tx: EntityManager, requestId: string): Promise<ExpenditureRequestItem[]> {\n return await tx.getRepository(ExpenditureRequestItem).find({ where: { request: { id: requestId } } as any, order: { spentDate: 'ASC', createdAt: 'ASC' } as any })\n}\n\nasync function refreshTotals(tx: EntityManager, request: ExpenditureRequest): Promise<ExpenditureRequest> {\n const totals = totalsOf(await linesOf(tx, request.id))\n request.totalAmount = totals.total\n request.payableAmount = totals.payable\n return await tx.getRepository(ExpenditureRequest).save(request)\n}\n\nasync function inDomain<T>(tx: EntityManager, entity: new () => T, domain: { id: string }, ref: { id: string } | null | undefined, field: string): Promise<T | null> {\n if (!ref?.id) return null\n const row = await tx.getRepository(entity).findOne({ where: { domain: { id: domain.id }, id: ref.id } as any })\n if (!row) throw new Refusal('expenditure-reference-not-found', { field }, `${field} was not found - reload and try again`)\n return row\n}\n\n/** The counterparty and the account of it a counterparty payment names - the account must be that counterparty's. */\nasync function payeeOf(tx: EntityManager, domain: { id: string }, head: RequestHead, current?: ExpenditureRequest) {\n const counterparty = 'counterparty' in head ? await inDomain(tx, Counterparty, domain, head.counterparty, 'counterparty') : undefined\n const account = 'payeeAccount' in head ? await inDomain(tx, CounterpartyBankAccount, domain, head.payeeAccount, 'payeeAccount') : undefined\n const counterpartyId = counterparty === undefined ? current?.counterpartyId : counterparty?.id\n if (account && account.counterpartyId !== counterpartyId)\n throw new Refusal('expenditure-account-not-of-payee', {}, \"the account is not the counterparty's - choose one of its accounts\")\n return { counterparty, account }\n}\n\n/** Apply line patches to a request - checks each line's references and the tax invoice it cites. */\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 headline: vendor\n ? `${payee} · ${request.title} ${won(totals.payable)}${request.dueDate ? ` — ${request.dueDate} 지급` : ''}`\n : `${who} · ${request.month} 경비 ${won(totals.total)} (${totals.count}건)`,\n total: totals.total,\n payable: totals.payable,\n account,\n lines: items.map(item =>\n `${item.spentDate ?? ''} ${item.category ?? ''} ${item.merchant ?? ''} ${won(item.amount)}${item.paymentMethod === ExpenditurePaymentMethod.CORPORATE_CARD ? ' (법인카드)' : ''}${item.taxInvoiceId ? ' (세금계산서)' : ''} — ${item.description ?? ''}`\n .replace(/\\s+/g, ' ')\n .trim()\n ),\n consequence:\n totals.payable > 0\n ? `승인하면 ${won(totals.payable)}을 ${payee}에게 지급할 대상이 됩니다${account ? ` (${account})` : ''}`\n : '법인카드 사용분만 있어 지급할 금액은 없습니다'\n },\n threadsMin: 1,\n threadsMax: 1,\n requireApproval: true\n } as any,\n context\n )\n\n request.status = ExpenditureRequestStatus.SUBMITTED\n request.activityInstanceId = instance.id\n request.submittedAt = new Date()\n request.decidedAt = null\n request.decidedBy = null\n request.updater = user\n return await tx.getRepository(ExpenditureRequest).save(request)\n}\n\n/** Take a request back from its approvers. worklist's abort does not call the activity back, so the request is set here. */\nexport async function withdrawRequest(tx: EntityManager, domain: any, user: any, id: string, context: ResolverContext): Promise<ExpenditureRequest> {\n const request = await ownRequest(tx, id, domain, user)\n if (request.status !== ExpenditureRequestStatus.SUBMITTED)\n throw new Refusal('expenditure-not-submitted', { status: String(request.status).toLowerCase() }, 'only a request waiting on approvers can be withdrawn')\n\n if (request.activityInstanceId) await abort({ id: request.activityInstanceId, reason: '작성자가 회수함' }, context)\n\n request.status = ExpenditureRequestStatus.WITHDRAWN\n request.updater = user\n return await tx.getRepository(ExpenditureRequest).save(request)\n}\n\n/** Delete one of the caller's requests that nobody is judging - with its lines. */\nexport async function deleteRequest(tx: EntityManager, domain: any, user: any, id: string): Promise<boolean> {\n const request = await ownRequest(tx, id, domain, user)\n if (!canEdit(request.status as RequestStatus))\n throw new Refusal('expenditure-cannot-delete', { status: request.status.toLowerCase() }, `a ${request.status.toLowerCase()} request cannot be deleted`)\n await tx.getRepository(ExpenditureRequestItem).softDelete({ request: { id } } as any)\n await tx.getRepository(ExpenditureRequest).softDelete({ id })\n return true\n}\n\n/**\n * Add one line from the phone. It joins the caller's editable reimbursement of that month (§`requestForLine`), or\n * starts one. The receipt photo is attached to the line.\n */\nexport async function addLine(tx: EntityManager, domain: any, user: any, line: ItemPatch & { month?: string; receipt?: any }, context: ResolverContext): Promise<ExpenditureRequest> {\n const spentDate = dayOf(line.spentDate)\n if (!spentDate) throw new Refusal('expenditure-line-day-missing', {}, 'every line needs its day')\n const month = monthOf(line.month) ?? spentDate.slice(0, 7)\n\n const mine = await tx.getRepository(ExpenditureRequest).find({\n where: { domain: { id: domain.id }, requester: { id: user.id }, kind: ExpenditureKind.REIMBURSEMENT, month } as any\n })\n const joinId = requestForLine(\n mine.map(one => ({ id: one.id, status: one.status as RequestStatus, month: one.month, updatedAt: one.updatedAt })),\n month\n )\n\n const { receipt, month: _month, ...fields } = line\n const request = await saveRequest(tx, domain, user, joinId ? { id: joinId } : { kind: ExpenditureKind.REIMBURSEMENT, month }, [{ ...fields, spentDate, cuFlag: '+' }], { taxInvoices: false })\n\n if (receipt) {\n const [latest] = await tx.getRepository(ExpenditureRequestItem).find({ where: { request: { id: request.id } } as any, order: { createdAt: 'DESC' } as any, take: 1 })\n if (latest) await attachReceipt(latest.id, receipt, context)\n }\n return request\n}\n\n/** Put a receipt on a line - replacing the one it had. Only the requester, only while editable. */\nexport async function replaceReceipt(tx: EntityManager, domain: any, user: any, itemId: string, file: any, context: ResolverContext): Promise<ExpenditureRequestItem> {\n const item = await tx.getRepository(ExpenditureRequestItem).findOne({ where: { id: itemId, domain: { id: domain.id } } as any, relations: ['request'] })\n if (!item?.request) throw new Refusal('expenditure-line-not-found', {}, 'a line was not found - reload and try again')\n const request = await ownRequest(tx, item.request.id, domain, user)\n if (!canEdit(request.status as RequestStatus)) throw lockedRequest(request.status)\n\n await replaceAttachment({ file, refType: RECEIPT_REF_TYPE, refBy: item.id, category: 'receipt' }, context)\n return item\n}\n\nasync function attachReceipt(itemId: string, file: any, context: ResolverContext) {\n await createAttachment(null, { attachment: { file, refType: RECEIPT_REF_TYPE, refBy: itemId, category: 'receipt' } } as any, context)\n}\n\n/** Approved requests with their lines and how far each is paid - what the payment queue and payments are made of. */\nexport async function approvedWithStates(tx: EntityManager, domain: { id: string }, ids?: string[]) {\n const requests = await tx.getRepository(ExpenditureRequest).find({\n where: { domain: { id: domain.id }, status: ExpenditureRequestStatus.APPROVED, ...(ids ? { id: In(ids) } : {}) } as any,\n relations: ['items', 'requester', 'counterparty', 'payeeAccount']\n })\n for (const request of requests) request.items = (request.items ?? []).filter(item => !item.deletedAt)\n const states = await paymentStatesOf(tx, domain, requests as any)\n return { requests, states }\n}\n\n/** Whether the account approvers saw is still the one on file (§`payeeAccountDrift`); `missing` when none was written. */\nexport async function driftOf(tx: EntityManager, request: ExpenditureRequest): Promise<string | undefined> {\n if (!request.payeeAccountNumber) return 'missing'\n if (request.kind !== ExpenditureKind.VENDOR) return undefined\n const current = request.payeeAccountId\n ? await tx.getRepository(CounterpartyBankAccount).findOne({ where: { id: request.payeeAccountId } as any, withDeleted: true })\n : null\n return payeeAccountDrift(request, current, accountKey)\n}\n\n/**\n * Put a part of a withdrawal on a request (ADR-0135 §2-5). A payable line that cites a tax invoice is paid on that\n * invoice; the rest on the request itself. A link the line already has to the same target is raised, not doubled.\n */\nasync function putOnLine(tx: EntityManager, domain: { id: string }, user: any, request: ExpenditureRequest, state: PaymentState, lineId: string, amount: number) {\n if (amount > state.outstanding + 0.005)\n throw new Refusal('expenditure-paid-over', { title: request.title }, `more is put on ${request.title} than it asks`)\n\n const existing = await tx.getRepository(Payment).find({ where: { domain: { id: domain.id }, transaction: { id: lineId } } as any })\n const patchFor = (targetType: string, targetId: string, put: number) => {\n const twin = existing.find(one => one.targetType === targetType && one.targetId === targetId)\n return twin ? { id: twin.id, cuFlag: 'M', amount: Number(twin.amount) + put } : { cuFlag: '+', transaction: { id: lineId }, targetType, targetId, amount: put }\n }\n\n let remaining = amount\n const patches: any[] = []\n const cited = (request.items ?? []).filter(item => isPayable(item) && item.taxInvoiceId)\n if (cited.length) {\n const onInvoices = await tx.getRepository(Payment).find({\n where: { domain: { id: domain.id }, targetType: TAX_INVOICE_TARGET, targetId: In(cited.map(item => item.taxInvoiceId)) } as any\n })\n for (const item of cited) {\n const paid = onInvoices.filter(one => one.targetId === item.taxInvoiceId).reduce((sum, one) => sum + paidOfTarget(one), 0)\n const put = Math.min(remaining, Math.max(0, Number(item.amount) - paid))\n if (put > 0) patches.push(patchFor(TAX_INVOICE_TARGET, item.taxInvoiceId!, put))\n remaining -= put\n }\n }\n const direct = Math.min(remaining, Math.max(0, state.settleable - state.settled))\n if (direct > 0) patches.push(patchFor(EXPENDITURE_TARGET, request.id, direct))\n remaining -= direct\n if (remaining > 0.005) throw new Refusal('expenditure-paid-over', { title: request.title }, `more is put on ${request.title} than it asks`)\n\n await savePayments(tx, domain, user, patches)\n}\n\nexport interface PaymentRecord {\n paidDate: string\n bankAccount?: { id: string } | null\n}\n\n/**\n * Pay approved requests - finance transferred the money at the bank and records it. Each request gets a withdrawal of\n * what it still asks, written as a person's line; the next bank statement import matches it, and then the payment is\n * reconciled (§`bank-reconcile`).\n */\nexport async function payRequests(tx: EntityManager, domain: any, user: any, ids: string[], record: PaymentRecord): Promise<ExpenditureRequest[]> {\n const paidDate = dayOf(record.paidDate)\n if (!paidDate) throw new Refusal('expenditure-paid-date-missing', {}, 'paidDate: the day the money went out')\n const bankAccount = await inDomain(tx, BankAccount, domain, record.bankAccount, 'bankAccount')\n\n const { requests, states } = await approvedWithStates(tx, domain, [...new Set(ids)])\n if (requests.length !== new Set(ids).size) {\n const found = await tx.getRepository(ExpenditureRequest).find({ where: { domain: { id: domain.id }, id: In(ids) } as any })\n const titles = found.filter(one => one.status !== ExpenditureRequestStatus.APPROVED).map(one => one.title).join(', ')\n if (titles) throw new Refusal('expenditure-not-approved', { title: titles }, `only an approved request is paid - ${titles}`)\n throw new Refusal('expenditure-not-found', {}, 'some requests were not found - reload and try again')\n }\n\n for (const request of requests) {\n const state = states.get(request.id)!\n if (!(state.outstanding > 0)) throw new Refusal('expenditure-paid-already', { title: request.title }, `${request.title} has nothing left to pay`)\n const payee = request.kind === ExpenditureKind.VENDOR ? request.counterparty?.name : request.requester?.name\n const [line] = await saveTransactions(tx, domain, user, [\n {\n cuFlag: '+',\n category: TransactionCategory.CONFIRMED,\n source: TransactionSource.MANUAL,\n type: CashFlowType.EXPENSE,\n transactionDate: paidDate,\n amount: state.outstanding,\n description: `지출 — ${request.title}`,\n counterpartyName: payee ?? undefined,\n ...(request.counterpartyId ? { counterparty: { id: request.counterpartyId } } : {}),\n ...(bankAccount ? { bankAccount: { id: bankAccount.id } } : { currency: request.currency })\n }\n ])\n await putOnLine(tx, domain, user, request, state, line.id, state.outstanding)\n }\n return requests\n}\n\n/**\n * Pay a request with a withdrawal already in the books - a bank statement brought it in first. The part put on the\n * request is what it still asks unless a smaller amount is given.\n */\nexport async function payWithLine(tx: EntityManager, domain: any, user: any, requestId: string, transactionId: string, amount?: number | null): Promise<ExpenditureRequest> {\n const { requests, states } = await approvedWithStates(tx, domain, [requestId])\n const [request] = requests\n if (!request) {\n const found = await tx.getRepository(ExpenditureRequest).findOne({ where: { domain: { id: domain.id }, id: requestId } as any })\n if (found) throw new Refusal('expenditure-not-approved', { title: found.title }, `only an approved request is paid - ${found.title}`)\n throw new Refusal('expenditure-not-found', {}, `expenditure request '${requestId}' was not found`)\n }\n const line = await tx.getRepository(Transaction).findOne({ where: { domain: { id: domain.id }, id: transactionId, category: TransactionCategory.CONFIRMED } as any })\n if (!line) throw new Refusal('expenditure-line-gone', {}, 'the bank line was not found - reload and try again')\n\n const state = states.get(request.id)!\n const put = amount === null || amount === undefined ? Math.min(state.outstanding, Number(line.amount)) : Number(amount)\n if (!(put > 0)) throw new Refusal('expenditure-paid-already', { title: request.title }, `${request.title} has nothing left to pay`)\n await putOnLine(tx, domain, user, request, state, line.id, put)\n return request\n}\n"]}
@@ -0,0 +1,20 @@
1
+ /** What the reader asks of the world - passed in so the rule is tested without a database. */
2
+ export interface ReceiptFacts {
3
+ /** The line's request: who wrote it, and the approval case it went up as. */
4
+ requestOf(itemId: string, domainId: string): Promise<{
5
+ requesterId?: string;
6
+ activityInstanceId?: string;
7
+ } | undefined>;
8
+ /** Whether the caller reads every request - finance (`accounting:query`). */
9
+ readsEveryRequest(context: any): Promise<boolean>;
10
+ /** Whether the caller takes part in the approval case. */
11
+ takesPart(activityInstanceId: string, context: any): Promise<boolean>;
12
+ }
13
+ /**
14
+ * Who may open a receipt by its path (ADR-0106 decision 2, ADR-0139): the employee who wrote the request, whoever
15
+ * decides it in the worklist, and finance, which reads every request. attachment-base has already checked the
16
+ * attachment is of the request's domain.
17
+ */
18
+ export declare function receiptReader(attachment: {
19
+ refBy?: string;
20
+ }, context: any, facts: ReceiptFacts): Promise<boolean>;
@@ -0,0 +1,43 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.receiptReader = receiptReader;
4
+ const attachment_base_1 = require("@things-factory/attachment-base");
5
+ const auth_base_1 = require("@things-factory/auth-base");
6
+ const shell_1 = require("@things-factory/shell");
7
+ const worklist_1 = require("@things-factory/worklist");
8
+ const expenditure_request_item_1 = require("./expenditure-request-item");
9
+ const expenditure_request_service_1 = require("./expenditure-request-service");
10
+ /**
11
+ * Who may open a receipt by its path (ADR-0106 decision 2, ADR-0139): the employee who wrote the request, whoever
12
+ * decides it in the worklist, and finance, which reads every request. attachment-base has already checked the
13
+ * attachment is of the request's domain.
14
+ */
15
+ async function receiptReader(attachment, context, facts) {
16
+ const { domain, user } = context?.state ?? {};
17
+ if (!domain || !user || !attachment.refBy)
18
+ return false;
19
+ const request = await facts.requestOf(attachment.refBy, domain.id);
20
+ if (!request)
21
+ return false;
22
+ if (request.requesterId === user.id)
23
+ return true;
24
+ if (await facts.readsEveryRequest(context))
25
+ return true;
26
+ return !!request.activityInstanceId && (await facts.takesPart(request.activityInstanceId, context));
27
+ }
28
+ const FACTS = {
29
+ async requestOf(itemId, domainId) {
30
+ const item = await (0, shell_1.getRepository)(expenditure_request_item_1.ExpenditureRequestItem).findOne({ where: { id: itemId, domain: { id: domainId } }, relations: ['request'] });
31
+ return item?.request ? { requesterId: item.request.requesterId, activityInstanceId: item.request.activityInstanceId } : undefined;
32
+ },
33
+ async readsEveryRequest(context) {
34
+ const { domain, user, unsafeIP, prohibitedPrivileges } = context.state;
35
+ return !!(await (0, auth_base_1.checkPermission)({ category: 'accounting', privilege: 'query', owner: true }, user, domain, unsafeIP, prohibitedPrivileges));
36
+ },
37
+ async takesPart(activityInstanceId, context) {
38
+ const instance = await (0, shell_1.getRepository)(worklist_1.ActivityInstance).findOne({ where: { id: activityInstanceId, domain: { id: context.state.domain.id } } });
39
+ return !!instance && (await (0, worklist_1.mayReadInstance)(instance, context));
40
+ }
41
+ };
42
+ (0, attachment_base_1.registerAttachmentReader)(expenditure_request_service_1.RECEIPT_REF_TYPE, (attachment, context) => receiptReader(attachment, context, FACTS));
43
+ //# sourceMappingURL=receipt-reader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"receipt-reader.js","sourceRoot":"","sources":["../../../server/service/expenditure-request/receipt-reader.ts"],"names":[],"mappings":";;AAuBA,sCAQC;AA/BD,qEAA0E;AAC1E,yDAA2D;AAC3D,iDAAqD;AACrD,uDAA4E;AAE5E,yEAAmE;AACnE,+EAAgE;AAYhE;;;;GAIG;AACI,KAAK,UAAU,aAAa,CAAC,UAA8B,EAAE,OAAY,EAAE,KAAmB;IACnG,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,OAAO,EAAE,KAAK,IAAI,EAAE,CAAA;IAC7C,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK;QAAE,OAAO,KAAK,CAAA;IACvD,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,SAAS,CAAC,UAAU,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE,CAAC,CAAA;IAClE,IAAI,CAAC,OAAO;QAAE,OAAO,KAAK,CAAA;IAC1B,IAAI,OAAO,CAAC,WAAW,KAAK,IAAI,CAAC,EAAE;QAAE,OAAO,IAAI,CAAA;IAChD,IAAI,MAAM,KAAK,CAAC,iBAAiB,CAAC,OAAO,CAAC;QAAE,OAAO,IAAI,CAAA;IACvD,OAAO,CAAC,CAAC,OAAO,CAAC,kBAAkB,IAAI,CAAC,MAAM,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,kBAAkB,EAAE,OAAO,CAAC,CAAC,CAAA;AACrG,CAAC;AAED,MAAM,KAAK,GAAiB;IAC1B,KAAK,CAAC,SAAS,CAAC,MAAM,EAAE,QAAQ;QAC9B,MAAM,IAAI,GAAG,MAAM,IAAA,qBAAa,EAAC,iDAAsB,CAAC,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAS,EAAE,SAAS,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,CAAA;QACpJ,OAAO,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,kBAAkB,EAAE,IAAI,CAAC,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAAC,CAAC,SAAS,CAAA;IACnI,CAAC;IACD,KAAK,CAAC,iBAAiB,CAAC,OAAO;QAC7B,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,oBAAoB,EAAE,GAAG,OAAO,CAAC,KAAK,CAAA;QACtE,OAAO,CAAC,CAAC,CAAC,MAAM,IAAA,2BAAe,EAAC,EAAE,QAAQ,EAAE,YAAY,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,oBAAoB,CAAC,CAAC,CAAA;IAC7I,CAAC;IACD,KAAK,CAAC,SAAS,CAAC,kBAAkB,EAAE,OAAO;QACzC,MAAM,QAAQ,GAAG,MAAM,IAAA,qBAAa,EAAC,2BAAgB,CAAC,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,kBAAkB,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,EAAE,EAAS,EAAE,CAAC,CAAA;QACrJ,OAAO,CAAC,CAAC,QAAQ,IAAI,CAAC,MAAM,IAAA,0BAAe,EAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAA;IACjE,CAAC;CACF,CAAA;AAED,IAAA,0CAAwB,EAAC,8CAAgB,EAAE,CAAC,UAAU,EAAE,OAAO,EAAE,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,CAAA","sourcesContent":["import { registerAttachmentReader } from '@things-factory/attachment-base'\nimport { checkPermission } from '@things-factory/auth-base'\nimport { getRepository } from '@things-factory/shell'\nimport { ActivityInstance, mayReadInstance } from '@things-factory/worklist'\n\nimport { ExpenditureRequestItem } from './expenditure-request-item'\nimport { RECEIPT_REF_TYPE } from './expenditure-request-service'\n\n/** What the reader asks of the world - passed in so the rule is tested without a database. */\nexport interface ReceiptFacts {\n /** The line's request: who wrote it, and the approval case it went up as. */\n requestOf(itemId: string, domainId: string): Promise<{ requesterId?: string; activityInstanceId?: string } | undefined>\n /** Whether the caller reads every request - finance (`accounting:query`). */\n readsEveryRequest(context: any): Promise<boolean>\n /** Whether the caller takes part in the approval case. */\n takesPart(activityInstanceId: string, context: any): Promise<boolean>\n}\n\n/**\n * Who may open a receipt by its path (ADR-0106 decision 2, ADR-0139): the employee who wrote the request, whoever\n * decides it in the worklist, and finance, which reads every request. attachment-base has already checked the\n * attachment is of the request's domain.\n */\nexport async function receiptReader(attachment: { refBy?: string }, context: any, facts: ReceiptFacts): Promise<boolean> {\n const { domain, user } = context?.state ?? {}\n if (!domain || !user || !attachment.refBy) return false\n const request = await facts.requestOf(attachment.refBy, domain.id)\n if (!request) return false\n if (request.requesterId === user.id) return true\n if (await facts.readsEveryRequest(context)) return true\n return !!request.activityInstanceId && (await facts.takesPart(request.activityInstanceId, context))\n}\n\nconst FACTS: ReceiptFacts = {\n async requestOf(itemId, domainId) {\n const item = await getRepository(ExpenditureRequestItem).findOne({ where: { id: itemId, domain: { id: domainId } } as any, relations: ['request'] })\n return item?.request ? { requesterId: item.request.requesterId, activityInstanceId: item.request.activityInstanceId } : undefined\n },\n async readsEveryRequest(context) {\n const { domain, user, unsafeIP, prohibitedPrivileges } = context.state\n return !!(await checkPermission({ category: 'accounting', privilege: 'query', owner: true }, user, domain, unsafeIP, prohibitedPrivileges))\n },\n async takesPart(activityInstanceId, context) {\n const instance = await getRepository(ActivityInstance).findOne({ where: { id: activityInstanceId, domain: { id: context.state.domain.id } } as any })\n return !!instance && (await mayReadInstance(instance, context))\n }\n}\n\nregisterAttachmentReader(RECEIPT_REF_TYPE, (attachment, context) => receiptReader(attachment, context, FACTS))\n"]}
@@ -122,7 +122,7 @@ let FinancialInstitutionMutation = class FinancialInstitutionMutation {
122
122
  exports.FinancialInstitutionMutation = FinancialInstitutionMutation;
123
123
  tslib_1.__decorate([
124
124
  (0, type_graphql_1.Directive)('@transaction'),
125
- (0, type_graphql_1.Directive)('@privilege(category: "accounting", privilege: "mutation", domainOwnerGranted: true)'),
125
+ (0, type_graphql_1.Directive)('@privilege(category: "accounting-master", privilege: "mutation", domainOwnerGranted: true)'),
126
126
  (0, type_graphql_1.Mutation)(returns => financial_institution_1.FinancialInstitution, { description: 'To create new FinancialInstitution' }),
127
127
  tslib_1.__param(0, (0, type_graphql_1.Arg)('financialInstitution')),
128
128
  tslib_1.__param(1, (0, type_graphql_1.Ctx)()),
@@ -132,7 +132,7 @@ tslib_1.__decorate([
132
132
  ], FinancialInstitutionMutation.prototype, "createFinancialInstitution", null);
133
133
  tslib_1.__decorate([
134
134
  (0, type_graphql_1.Directive)('@transaction'),
135
- (0, type_graphql_1.Directive)('@privilege(category: "accounting", privilege: "mutation", domainOwnerGranted: true)'),
135
+ (0, type_graphql_1.Directive)('@privilege(category: "accounting-master", privilege: "mutation", domainOwnerGranted: true)'),
136
136
  (0, type_graphql_1.Mutation)(returns => financial_institution_1.FinancialInstitution, { description: 'To modify FinancialInstitution information' }),
137
137
  tslib_1.__param(0, (0, type_graphql_1.Arg)('id')),
138
138
  tslib_1.__param(1, (0, type_graphql_1.Arg)('patch')),
@@ -143,7 +143,7 @@ tslib_1.__decorate([
143
143
  ], FinancialInstitutionMutation.prototype, "updateFinancialInstitution", null);
144
144
  tslib_1.__decorate([
145
145
  (0, type_graphql_1.Directive)('@transaction'),
146
- (0, type_graphql_1.Directive)('@privilege(category: "accounting", privilege: "mutation", domainOwnerGranted: true)'),
146
+ (0, type_graphql_1.Directive)('@privilege(category: "accounting-master", privilege: "mutation", domainOwnerGranted: true)'),
147
147
  (0, type_graphql_1.Mutation)(returns => [financial_institution_1.FinancialInstitution], { description: "To modify multiple FinancialInstitutions' information" }),
148
148
  tslib_1.__param(0, (0, type_graphql_1.Arg)('patches', type => [financial_institution_type_1.FinancialInstitutionPatch])),
149
149
  tslib_1.__param(1, (0, type_graphql_1.Ctx)()),
@@ -153,7 +153,7 @@ tslib_1.__decorate([
153
153
  ], FinancialInstitutionMutation.prototype, "updateMultipleFinancialInstitution", null);
154
154
  tslib_1.__decorate([
155
155
  (0, type_graphql_1.Directive)('@transaction'),
156
- (0, type_graphql_1.Directive)('@privilege(category: "accounting", privilege: "mutation", domainOwnerGranted: true)'),
156
+ (0, type_graphql_1.Directive)('@privilege(category: "accounting-master", privilege: "mutation", domainOwnerGranted: true)'),
157
157
  (0, type_graphql_1.Mutation)(returns => Boolean, { description: 'To delete FinancialInstitution' }),
158
158
  tslib_1.__param(0, (0, type_graphql_1.Arg)('id')),
159
159
  tslib_1.__param(1, (0, type_graphql_1.Ctx)()),
@@ -163,7 +163,7 @@ tslib_1.__decorate([
163
163
  ], FinancialInstitutionMutation.prototype, "deleteFinancialInstitution", null);
164
164
  tslib_1.__decorate([
165
165
  (0, type_graphql_1.Directive)('@transaction'),
166
- (0, type_graphql_1.Directive)('@privilege(category: "accounting", privilege: "mutation", domainOwnerGranted: true)'),
166
+ (0, type_graphql_1.Directive)('@privilege(category: "accounting-master", privilege: "mutation", domainOwnerGranted: true)'),
167
167
  (0, type_graphql_1.Mutation)(returns => Boolean, { description: 'To delete multiple FinancialInstitutions' }),
168
168
  tslib_1.__param(0, (0, type_graphql_1.Arg)('ids', type => [String])),
169
169
  tslib_1.__param(1, (0, type_graphql_1.Ctx)()),
@@ -173,7 +173,7 @@ tslib_1.__decorate([
173
173
  ], FinancialInstitutionMutation.prototype, "deleteFinancialInstitutions", null);
174
174
  tslib_1.__decorate([
175
175
  (0, type_graphql_1.Directive)('@transaction'),
176
- (0, type_graphql_1.Directive)('@privilege(category: "accounting", privilege: "mutation", domainOwnerGranted: true)'),
176
+ (0, type_graphql_1.Directive)('@privilege(category: "accounting-master", privilege: "mutation", domainOwnerGranted: true)'),
177
177
  (0, type_graphql_1.Mutation)(returns => Boolean, { description: 'To import multiple FinancialInstitutions' }),
178
178
  tslib_1.__param(0, (0, type_graphql_1.Arg)('financialInstitutions', type => [financial_institution_type_1.FinancialInstitutionPatch])),
179
179
  tslib_1.__param(1, (0, type_graphql_1.Ctx)()),
@@ -1 +1 @@
1
- {"version":3,"file":"financial-institution-mutation.js","sourceRoot":"","sources":["../../../server/service/financial-institution/financial-institution-mutation.ts"],"names":[],"mappings":"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","sourcesContent":["import { Resolver, Mutation, Arg, Ctx, Directive } from 'type-graphql'\nimport { In } from 'typeorm'\nimport { getRepository } from '@things-factory/shell'\n\nimport { createAttachment, deleteAttachmentsByRef, replaceAttachment } from '@things-factory/attachment-base'\nimport { FinancialInstitution } from './financial-institution'\nimport { NewFinancialInstitution, FinancialInstitutionPatch } from './financial-institution-type'\n\n@Resolver(FinancialInstitution)\nexport class FinancialInstitutionMutation {\n @Directive('@transaction')\n @Directive('@privilege(category: \"accounting\", privilege: \"mutation\", domainOwnerGranted: true)')\n @Mutation(returns => FinancialInstitution, { description: 'To create new FinancialInstitution' })\n async createFinancialInstitution(\n @Arg('financialInstitution') financialInstitution: NewFinancialInstitution,\n @Ctx() context: ResolverContext\n ): Promise<FinancialInstitution> {\n const { domain, user, tx } = context.state\n\n const result = await getRepository(FinancialInstitution, tx).save({\n ...financialInstitution,\n domain,\n creator: user,\n updater: user\n })\n\n if (financialInstitution.thumbnail) {\n await createAttachment(\n null,\n {\n attachment: {\n file: financialInstitution.thumbnail,\n refType: FinancialInstitution.name,\n refBy: result.id\n }\n },\n context\n )\n }\n\n return result\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"accounting\", privilege: \"mutation\", domainOwnerGranted: true)')\n @Mutation(returns => FinancialInstitution, { description: 'To modify FinancialInstitution information' })\n async updateFinancialInstitution(\n @Arg('id') id: string,\n @Arg('patch') patch: FinancialInstitutionPatch,\n @Ctx() context: ResolverContext\n ): Promise<FinancialInstitution> {\n const { domain, user, tx } = context.state\n\n const repository = getRepository(FinancialInstitution, tx)\n const financialInstitution = await repository.findOne({\n where: { domain: { id: domain.id }, id }\n })\n\n const result = await repository.save({\n ...financialInstitution,\n ...patch,\n updater: user\n })\n\n if (patch.thumbnail) {\n await replaceAttachment({ file: patch.thumbnail, refType: FinancialInstitution.name, refBy: result.id }, context)\n }\n\n return result\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"accounting\", privilege: \"mutation\", domainOwnerGranted: true)')\n @Mutation(returns => [FinancialInstitution], { description: \"To modify multiple FinancialInstitutions' information\" })\n async updateMultipleFinancialInstitution(\n @Arg('patches', type => [FinancialInstitutionPatch]) patches: FinancialInstitutionPatch[],\n @Ctx() context: ResolverContext\n ): Promise<FinancialInstitution[]> {\n const { domain, user, tx } = context.state\n\n let results = []\n const _createRecords = patches.filter((patch: any) => patch.cuFlag.toUpperCase() === '+')\n const _updateRecords = patches.filter((patch: any) => patch.cuFlag.toUpperCase() === 'M')\n const financialInstitutionRepo = getRepository(FinancialInstitution, tx)\n\n if (_createRecords.length > 0) {\n for (let i = 0; i < _createRecords.length; i++) {\n const newRecord = _createRecords[i]\n\n const result = await financialInstitutionRepo.save({\n ...newRecord,\n domain,\n creator: user,\n updater: user\n })\n\n if (newRecord.thumbnail) {\n await createAttachment(\n null,\n {\n attachment: {\n file: newRecord.thumbnail,\n refType: FinancialInstitution.name,\n refBy: result.id\n }\n },\n context\n )\n }\n\n results.push({ ...result, cuFlag: '+' })\n }\n }\n\n if (_updateRecords.length > 0) {\n for (let i = 0; i < _updateRecords.length; i++) {\n const updateRecord = _updateRecords[i]\n const financialInstitution = await financialInstitutionRepo.findOne({\n where: { domain: { id: domain.id }, id: updateRecord.id }\n })\n\n if (!financialInstitution) {\n throw new Error(`failed to find financialInstitution to update: ${updateRecord.id}`)\n }\n\n const result = await financialInstitutionRepo.save({\n ...financialInstitution,\n ...updateRecord,\n updater: user\n })\n\n if (updateRecord.thumbnail) {\n await replaceAttachment({ file: updateRecord.thumbnail, refType: FinancialInstitution.name, refBy: result.id }, context)\n }\n\n results.push({ ...result, cuFlag: 'M' })\n }\n }\n\n return results\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"accounting\", privilege: \"mutation\", domainOwnerGranted: true)')\n @Mutation(returns => Boolean, { description: 'To delete FinancialInstitution' })\n async deleteFinancialInstitution(@Arg('id') id: string, @Ctx() context: ResolverContext): Promise<boolean> {\n const { domain, tx } = context.state\n\n await getRepository(FinancialInstitution, tx).delete({ domain: { id: domain.id }, id })\n await deleteAttachmentsByRef(null, { refBys: [id] }, context)\n\n return true\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"accounting\", privilege: \"mutation\", domainOwnerGranted: true)')\n @Mutation(returns => Boolean, { description: 'To delete multiple FinancialInstitutions' })\n async deleteFinancialInstitutions(\n @Arg('ids', type => [String]) ids: string[],\n @Ctx() context: ResolverContext\n ): Promise<boolean> {\n const { domain, tx } = context.state\n\n await getRepository(FinancialInstitution, tx).delete({\n domain: { id: domain.id },\n id: In(ids)\n })\n\n await deleteAttachmentsByRef(null, { refBys: ids }, context)\n\n return true\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"accounting\", privilege: \"mutation\", domainOwnerGranted: true)')\n @Mutation(returns => Boolean, { description: 'To import multiple FinancialInstitutions' })\n async importFinancialInstitutions(\n @Arg('financialInstitutions', type => [FinancialInstitutionPatch])\n financialInstitutions: FinancialInstitutionPatch[],\n @Ctx() context: ResolverContext\n ): Promise<boolean> {\n const { domain, tx } = context.state\n\n await Promise.all(\n financialInstitutions.map(async (financialInstitution: FinancialInstitutionPatch) => {\n const createdFinancialInstitution: FinancialInstitution = await getRepository(FinancialInstitution, tx).save({\n domain,\n ...financialInstitution\n })\n })\n )\n\n return true\n }\n}\n"]}
1
+ {"version":3,"file":"financial-institution-mutation.js","sourceRoot":"","sources":["../../../server/service/financial-institution/financial-institution-mutation.ts"],"names":[],"mappings":"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","sourcesContent":["import { Resolver, Mutation, Arg, Ctx, Directive } from 'type-graphql'\nimport { In } from 'typeorm'\nimport { getRepository } from '@things-factory/shell'\n\nimport { createAttachment, deleteAttachmentsByRef, replaceAttachment } from '@things-factory/attachment-base'\nimport { FinancialInstitution } from './financial-institution'\nimport { NewFinancialInstitution, FinancialInstitutionPatch } from './financial-institution-type'\n\n@Resolver(FinancialInstitution)\nexport class FinancialInstitutionMutation {\n @Directive('@transaction')\n @Directive('@privilege(category: \"accounting-master\", privilege: \"mutation\", domainOwnerGranted: true)')\n @Mutation(returns => FinancialInstitution, { description: 'To create new FinancialInstitution' })\n async createFinancialInstitution(\n @Arg('financialInstitution') financialInstitution: NewFinancialInstitution,\n @Ctx() context: ResolverContext\n ): Promise<FinancialInstitution> {\n const { domain, user, tx } = context.state\n\n const result = await getRepository(FinancialInstitution, tx).save({\n ...financialInstitution,\n domain,\n creator: user,\n updater: user\n })\n\n if (financialInstitution.thumbnail) {\n await createAttachment(\n null,\n {\n attachment: {\n file: financialInstitution.thumbnail,\n refType: FinancialInstitution.name,\n refBy: result.id\n }\n },\n context\n )\n }\n\n return result\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"accounting-master\", privilege: \"mutation\", domainOwnerGranted: true)')\n @Mutation(returns => FinancialInstitution, { description: 'To modify FinancialInstitution information' })\n async updateFinancialInstitution(\n @Arg('id') id: string,\n @Arg('patch') patch: FinancialInstitutionPatch,\n @Ctx() context: ResolverContext\n ): Promise<FinancialInstitution> {\n const { domain, user, tx } = context.state\n\n const repository = getRepository(FinancialInstitution, tx)\n const financialInstitution = await repository.findOne({\n where: { domain: { id: domain.id }, id }\n })\n\n const result = await repository.save({\n ...financialInstitution,\n ...patch,\n updater: user\n })\n\n if (patch.thumbnail) {\n await replaceAttachment({ file: patch.thumbnail, refType: FinancialInstitution.name, refBy: result.id }, context)\n }\n\n return result\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"accounting-master\", privilege: \"mutation\", domainOwnerGranted: true)')\n @Mutation(returns => [FinancialInstitution], { description: \"To modify multiple FinancialInstitutions' information\" })\n async updateMultipleFinancialInstitution(\n @Arg('patches', type => [FinancialInstitutionPatch]) patches: FinancialInstitutionPatch[],\n @Ctx() context: ResolverContext\n ): Promise<FinancialInstitution[]> {\n const { domain, user, tx } = context.state\n\n let results = []\n const _createRecords = patches.filter((patch: any) => patch.cuFlag.toUpperCase() === '+')\n const _updateRecords = patches.filter((patch: any) => patch.cuFlag.toUpperCase() === 'M')\n const financialInstitutionRepo = getRepository(FinancialInstitution, tx)\n\n if (_createRecords.length > 0) {\n for (let i = 0; i < _createRecords.length; i++) {\n const newRecord = _createRecords[i]\n\n const result = await financialInstitutionRepo.save({\n ...newRecord,\n domain,\n creator: user,\n updater: user\n })\n\n if (newRecord.thumbnail) {\n await createAttachment(\n null,\n {\n attachment: {\n file: newRecord.thumbnail,\n refType: FinancialInstitution.name,\n refBy: result.id\n }\n },\n context\n )\n }\n\n results.push({ ...result, cuFlag: '+' })\n }\n }\n\n if (_updateRecords.length > 0) {\n for (let i = 0; i < _updateRecords.length; i++) {\n const updateRecord = _updateRecords[i]\n const financialInstitution = await financialInstitutionRepo.findOne({\n where: { domain: { id: domain.id }, id: updateRecord.id }\n })\n\n if (!financialInstitution) {\n throw new Error(`failed to find financialInstitution to update: ${updateRecord.id}`)\n }\n\n const result = await financialInstitutionRepo.save({\n ...financialInstitution,\n ...updateRecord,\n updater: user\n })\n\n if (updateRecord.thumbnail) {\n await replaceAttachment({ file: updateRecord.thumbnail, refType: FinancialInstitution.name, refBy: result.id }, context)\n }\n\n results.push({ ...result, cuFlag: 'M' })\n }\n }\n\n return results\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"accounting-master\", privilege: \"mutation\", domainOwnerGranted: true)')\n @Mutation(returns => Boolean, { description: 'To delete FinancialInstitution' })\n async deleteFinancialInstitution(@Arg('id') id: string, @Ctx() context: ResolverContext): Promise<boolean> {\n const { domain, tx } = context.state\n\n await getRepository(FinancialInstitution, tx).delete({ domain: { id: domain.id }, id })\n await deleteAttachmentsByRef(null, { refBys: [id] }, context)\n\n return true\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"accounting-master\", privilege: \"mutation\", domainOwnerGranted: true)')\n @Mutation(returns => Boolean, { description: 'To delete multiple FinancialInstitutions' })\n async deleteFinancialInstitutions(\n @Arg('ids', type => [String]) ids: string[],\n @Ctx() context: ResolverContext\n ): Promise<boolean> {\n const { domain, tx } = context.state\n\n await getRepository(FinancialInstitution, tx).delete({\n domain: { id: domain.id },\n id: In(ids)\n })\n\n await deleteAttachmentsByRef(null, { refBys: ids }, context)\n\n return true\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"accounting-master\", privilege: \"mutation\", domainOwnerGranted: true)')\n @Mutation(returns => Boolean, { description: 'To import multiple FinancialInstitutions' })\n async importFinancialInstitutions(\n @Arg('financialInstitutions', type => [FinancialInstitutionPatch])\n financialInstitutions: FinancialInstitutionPatch[],\n @Ctx() context: ResolverContext\n ): Promise<boolean> {\n const { domain, tx } = context.state\n\n await Promise.all(\n financialInstitutions.map(async (financialInstitution: FinancialInstitutionPatch) => {\n const createdFinancialInstitution: FinancialInstitution = await getRepository(FinancialInstitution, tx).save({\n domain,\n ...financialInstitution\n })\n })\n )\n\n return true\n }\n}\n"]}
@@ -54,7 +54,7 @@ let FinancialInstitutionQuery = class FinancialInstitutionQuery {
54
54
  };
55
55
  exports.FinancialInstitutionQuery = FinancialInstitutionQuery;
56
56
  tslib_1.__decorate([
57
- (0, type_graphql_1.Directive)('@privilege(category: "accounting", privilege: "query", domainOwnerGranted: true)'),
57
+ (0, type_graphql_1.Directive)('@privilege(category: "accounting-master", privilege: "query", domainOwnerGranted: true)'),
58
58
  (0, type_graphql_1.Query)(returns => financial_institution_1.FinancialInstitution, { nullable: true, description: 'To fetch a FinancialInstitution' }),
59
59
  tslib_1.__param(0, (0, type_graphql_1.Arg)('id')),
60
60
  tslib_1.__param(1, (0, type_graphql_1.Ctx)()),
@@ -63,7 +63,7 @@ tslib_1.__decorate([
63
63
  tslib_1.__metadata("design:returntype", Promise)
64
64
  ], FinancialInstitutionQuery.prototype, "financialInstitution", null);
65
65
  tslib_1.__decorate([
66
- (0, type_graphql_1.Directive)('@privilege(category: "accounting", privilege: "query", domainOwnerGranted: true)'),
66
+ (0, type_graphql_1.Directive)('@privilege(category: "accounting-master", privilege: "query", domainOwnerGranted: true)'),
67
67
  (0, type_graphql_1.Query)(returns => financial_institution_type_1.FinancialInstitutionList, { description: 'To fetch multiple FinancialInstitutions' }),
68
68
  tslib_1.__param(0, (0, type_graphql_1.Args)(type => shell_1.ListParam)),
69
69
  tslib_1.__param(1, (0, type_graphql_1.Ctx)()),
@@ -1 +1 @@
1
- {"version":3,"file":"financial-institution-query.js","sourceRoot":"","sources":["../../../server/service/financial-institution/financial-institution-query.ts"],"names":[],"mappings":"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","sourcesContent":["import { Resolver, Query, FieldResolver, Root, Args, Arg, Ctx, Directive } from 'type-graphql'\nimport { IsNull } from 'typeorm'\nimport { Attachment } from '@things-factory/attachment-base'\nimport { Domain, getQueryBuilderFromListParams, getRepository, ListParam } from '@things-factory/shell'\nimport { User } from '@things-factory/auth-base'\nimport { FinancialInstitution } from './financial-institution'\nimport { FinancialInstitutionList } from './financial-institution-type'\n\n@Resolver(FinancialInstitution)\nexport class FinancialInstitutionQuery {\n @Directive('@privilege(category: \"accounting\", privilege: \"query\", domainOwnerGranted: true)')\n @Query(returns => FinancialInstitution!, { nullable: true, description: 'To fetch a FinancialInstitution' })\n async financialInstitution(@Arg('id') id: string, @Ctx() context: ResolverContext): Promise<FinancialInstitution> {\n const { domain } = context.state\n\n /* The seeded institutions belong to no domain - every domain reads them beside its own. */\n return await getRepository(FinancialInstitution).findOne({\n where: [\n { domain: IsNull(), id },\n { domain: { id: domain.id }, id }\n ]\n })\n }\n\n @Directive('@privilege(category: \"accounting\", privilege: \"query\", domainOwnerGranted: true)')\n @Query(returns => FinancialInstitutionList, { description: 'To fetch multiple FinancialInstitutions' })\n async financialInstitutions(\n @Args(type => ListParam) params: ListParam,\n @Ctx() context: ResolverContext\n ): Promise<FinancialInstitutionList> {\n const { domain } = context.state\n\n /* The seeded institutions belong to no domain - every domain reads them beside its own. */\n const queryBuilder = getQueryBuilderFromListParams({\n params,\n alias: 'institution',\n repository: await getRepository(FinancialInstitution),\n searchables: ['name', 'description']\n }).andWhere('(institution.domain IS NULL OR institution.domain = :domain)', { domain: domain.id })\n\n const [items, total] = await queryBuilder.getManyAndCount()\n\n return { items, total }\n }\n\n @FieldResolver(type => String)\n async thumbnail(@Root() financialInstitution: FinancialInstitution): Promise<string | undefined> {\n const attachment: Attachment = await getRepository(Attachment).findOne({\n where: {\n domain: { id: financialInstitution.domainId },\n refType: FinancialInstitution.name,\n refBy: financialInstitution.id\n }\n })\n\n return attachment?.fullpath\n }\n\n @FieldResolver(type => Domain)\n async domain(@Root() financialInstitution: FinancialInstitution): Promise<Domain> {\n return (\n financialInstitution.domainId && (await getRepository(Domain).findOneBy({ id: financialInstitution.domainId }))\n )\n }\n\n @FieldResolver(type => User)\n async updater(@Root() financialInstitution: FinancialInstitution): Promise<User> {\n return (\n financialInstitution.updaterId && (await getRepository(User).findOneBy({ id: financialInstitution.updaterId }))\n )\n }\n\n @FieldResolver(type => User)\n async creator(@Root() financialInstitution: FinancialInstitution): Promise<User> {\n return (\n financialInstitution.creatorId && (await getRepository(User).findOneBy({ id: financialInstitution.creatorId }))\n )\n }\n}\n"]}
1
+ {"version":3,"file":"financial-institution-query.js","sourceRoot":"","sources":["../../../server/service/financial-institution/financial-institution-query.ts"],"names":[],"mappings":"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","sourcesContent":["import { Resolver, Query, FieldResolver, Root, Args, Arg, Ctx, Directive } from 'type-graphql'\nimport { IsNull } from 'typeorm'\nimport { Attachment } from '@things-factory/attachment-base'\nimport { Domain, getQueryBuilderFromListParams, getRepository, ListParam } from '@things-factory/shell'\nimport { User } from '@things-factory/auth-base'\nimport { FinancialInstitution } from './financial-institution'\nimport { FinancialInstitutionList } from './financial-institution-type'\n\n@Resolver(FinancialInstitution)\nexport class FinancialInstitutionQuery {\n @Directive('@privilege(category: \"accounting-master\", privilege: \"query\", domainOwnerGranted: true)')\n @Query(returns => FinancialInstitution!, { nullable: true, description: 'To fetch a FinancialInstitution' })\n async financialInstitution(@Arg('id') id: string, @Ctx() context: ResolverContext): Promise<FinancialInstitution> {\n const { domain } = context.state\n\n /* The seeded institutions belong to no domain - every domain reads them beside its own. */\n return await getRepository(FinancialInstitution).findOne({\n where: [\n { domain: IsNull(), id },\n { domain: { id: domain.id }, id }\n ]\n })\n }\n\n @Directive('@privilege(category: \"accounting-master\", privilege: \"query\", domainOwnerGranted: true)')\n @Query(returns => FinancialInstitutionList, { description: 'To fetch multiple FinancialInstitutions' })\n async financialInstitutions(\n @Args(type => ListParam) params: ListParam,\n @Ctx() context: ResolverContext\n ): Promise<FinancialInstitutionList> {\n const { domain } = context.state\n\n /* The seeded institutions belong to no domain - every domain reads them beside its own. */\n const queryBuilder = getQueryBuilderFromListParams({\n params,\n alias: 'institution',\n repository: await getRepository(FinancialInstitution),\n searchables: ['name', 'description']\n }).andWhere('(institution.domain IS NULL OR institution.domain = :domain)', { domain: domain.id })\n\n const [items, total] = await queryBuilder.getManyAndCount()\n\n return { items, total }\n }\n\n @FieldResolver(type => String)\n async thumbnail(@Root() financialInstitution: FinancialInstitution): Promise<string | undefined> {\n const attachment: Attachment = await getRepository(Attachment).findOne({\n where: {\n domain: { id: financialInstitution.domainId },\n refType: FinancialInstitution.name,\n refBy: financialInstitution.id\n }\n })\n\n return attachment?.fullpath\n }\n\n @FieldResolver(type => Domain)\n async domain(@Root() financialInstitution: FinancialInstitution): Promise<Domain> {\n return (\n financialInstitution.domainId && (await getRepository(Domain).findOneBy({ id: financialInstitution.domainId }))\n )\n }\n\n @FieldResolver(type => User)\n async updater(@Root() financialInstitution: FinancialInstitution): Promise<User> {\n return (\n financialInstitution.updaterId && (await getRepository(User).findOneBy({ id: financialInstitution.updaterId }))\n )\n }\n\n @FieldResolver(type => User)\n async creator(@Root() financialInstitution: FinancialInstitution): Promise<User> {\n return (\n financialInstitution.creatorId && (await getRepository(User).findOneBy({ id: financialInstitution.creatorId }))\n )\n }\n}\n"]}
@@ -92,7 +92,7 @@ let FiscalMonthMutation = class FiscalMonthMutation {
92
92
  exports.FiscalMonthMutation = FiscalMonthMutation;
93
93
  tslib_1.__decorate([
94
94
  (0, type_graphql_1.Directive)('@transaction'),
95
- (0, type_graphql_1.Directive)('@privilege(category: "accounting", privilege: "mutation", domainOwnerGranted: true)'),
95
+ (0, type_graphql_1.Directive)('@privilege(category: "accounting-master", privilege: "mutation", domainOwnerGranted: true)'),
96
96
  (0, type_graphql_1.Mutation)(returns => fiscal_month_1.FiscalMonth, { description: 'To create new FiscalMonth' }),
97
97
  tslib_1.__param(0, (0, type_graphql_1.Arg)('fiscalMonth')),
98
98
  tslib_1.__param(1, (0, type_graphql_1.Ctx)()),
@@ -102,7 +102,7 @@ tslib_1.__decorate([
102
102
  ], FiscalMonthMutation.prototype, "createFiscalMonth", null);
103
103
  tslib_1.__decorate([
104
104
  (0, type_graphql_1.Directive)('@transaction'),
105
- (0, type_graphql_1.Directive)('@privilege(category: "accounting", privilege: "mutation", domainOwnerGranted: true)'),
105
+ (0, type_graphql_1.Directive)('@privilege(category: "accounting-master", privilege: "mutation", domainOwnerGranted: true)'),
106
106
  (0, type_graphql_1.Mutation)(returns => fiscal_month_1.FiscalMonth, { description: 'To modify FiscalMonth information' }),
107
107
  tslib_1.__param(0, (0, type_graphql_1.Arg)('id')),
108
108
  tslib_1.__param(1, (0, type_graphql_1.Arg)('patch')),
@@ -113,7 +113,7 @@ tslib_1.__decorate([
113
113
  ], FiscalMonthMutation.prototype, "updateFiscalMonth", null);
114
114
  tslib_1.__decorate([
115
115
  (0, type_graphql_1.Directive)('@transaction'),
116
- (0, type_graphql_1.Directive)('@privilege(category: "accounting", privilege: "mutation", domainOwnerGranted: true)'),
116
+ (0, type_graphql_1.Directive)('@privilege(category: "accounting-master", privilege: "mutation", domainOwnerGranted: true)'),
117
117
  (0, type_graphql_1.Mutation)(returns => [fiscal_month_1.FiscalMonth], { description: "To modify multiple FiscalMonths' information" }),
118
118
  tslib_1.__param(0, (0, type_graphql_1.Arg)('patches', type => [fiscal_month_type_1.FiscalMonthPatch])),
119
119
  tslib_1.__param(1, (0, type_graphql_1.Ctx)()),
@@ -123,7 +123,7 @@ tslib_1.__decorate([
123
123
  ], FiscalMonthMutation.prototype, "updateMultipleFiscalMonth", null);
124
124
  tslib_1.__decorate([
125
125
  (0, type_graphql_1.Directive)('@transaction'),
126
- (0, type_graphql_1.Directive)('@privilege(category: "accounting", privilege: "mutation", domainOwnerGranted: true)'),
126
+ (0, type_graphql_1.Directive)('@privilege(category: "accounting-master", privilege: "mutation", domainOwnerGranted: true)'),
127
127
  (0, type_graphql_1.Mutation)(returns => Boolean, { description: 'To delete FiscalMonth' }),
128
128
  tslib_1.__param(0, (0, type_graphql_1.Arg)('id')),
129
129
  tslib_1.__param(1, (0, type_graphql_1.Ctx)()),
@@ -133,7 +133,7 @@ tslib_1.__decorate([
133
133
  ], FiscalMonthMutation.prototype, "deleteFiscalMonth", null);
134
134
  tslib_1.__decorate([
135
135
  (0, type_graphql_1.Directive)('@transaction'),
136
- (0, type_graphql_1.Directive)('@privilege(category: "accounting", privilege: "mutation", domainOwnerGranted: true)'),
136
+ (0, type_graphql_1.Directive)('@privilege(category: "accounting-master", privilege: "mutation", domainOwnerGranted: true)'),
137
137
  (0, type_graphql_1.Mutation)(returns => Boolean, { description: 'To delete multiple FiscalMonths' }),
138
138
  tslib_1.__param(0, (0, type_graphql_1.Arg)('ids', type => [String])),
139
139
  tslib_1.__param(1, (0, type_graphql_1.Ctx)()),
@@ -143,7 +143,7 @@ tslib_1.__decorate([
143
143
  ], FiscalMonthMutation.prototype, "deleteFiscalMonths", null);
144
144
  tslib_1.__decorate([
145
145
  (0, type_graphql_1.Directive)('@transaction'),
146
- (0, type_graphql_1.Directive)('@privilege(category: "accounting", privilege: "mutation", domainOwnerGranted: true)'),
146
+ (0, type_graphql_1.Directive)('@privilege(category: "accounting-master", privilege: "mutation", domainOwnerGranted: true)'),
147
147
  (0, type_graphql_1.Mutation)(returns => Boolean, { description: 'To import multiple FiscalMonths' }),
148
148
  tslib_1.__param(0, (0, type_graphql_1.Arg)('fiscalMonths', type => [fiscal_month_type_1.FiscalMonthPatch])),
149
149
  tslib_1.__param(1, (0, type_graphql_1.Ctx)()),