@things-factory/accounting 10.1.205 → 10.1.208

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 (50) hide show
  1. package/dist-client/tsconfig.tsbuildinfo +1 -1
  2. package/dist-server/activities/activity-expenditure.js +5 -2
  3. package/dist-server/activities/activity-expenditure.js.map +1 -1
  4. package/dist-server/service/account/account-mutation.js +5 -7
  5. package/dist-server/service/account/account-mutation.js.map +1 -1
  6. package/dist-server/service/account/account-service.d.ts +5 -0
  7. package/dist-server/service/account/account-service.js +17 -0
  8. package/dist-server/service/account/account-service.js.map +1 -0
  9. package/dist-server/service/bank-account/bank-account-service.d.ts +4 -1
  10. package/dist-server/service/bank-account/bank-account-service.js +5 -1
  11. package/dist-server/service/bank-account/bank-account-service.js.map +1 -1
  12. package/dist-server/service/expenditure-request/expenditure-request-item.d.ts +4 -3
  13. package/dist-server/service/expenditure-request/expenditure-request-item.js +6 -5
  14. package/dist-server/service/expenditure-request/expenditure-request-item.js.map +1 -1
  15. package/dist-server/service/expenditure-request/expenditure-request-mutation.d.ts +1 -1
  16. package/dist-server/service/expenditure-request/expenditure-request-mutation.js +8 -7
  17. package/dist-server/service/expenditure-request/expenditure-request-mutation.js.map +1 -1
  18. package/dist-server/service/expenditure-request/expenditure-request-query.d.ts +9 -2
  19. package/dist-server/service/expenditure-request/expenditure-request-query.js +28 -6
  20. package/dist-server/service/expenditure-request/expenditure-request-query.js.map +1 -1
  21. package/dist-server/service/expenditure-request/expenditure-request-service.d.ts +12 -4
  22. package/dist-server/service/expenditure-request/expenditure-request-service.js +30 -9
  23. package/dist-server/service/expenditure-request/expenditure-request-service.js.map +1 -1
  24. package/dist-server/service/expenditure-request/expenditure-request-type.d.ts +1 -1
  25. package/dist-server/service/expenditure-request/expenditure-request-type.js +3 -3
  26. package/dist-server/service/expenditure-request/expenditure-request-type.js.map +1 -1
  27. package/dist-server/service/expenditure-request/index.d.ts +2 -2
  28. package/dist-server/service/expenditure-request/receipt-reader.d.ts +18 -9
  29. package/dist-server/service/expenditure-request/receipt-reader.js +19 -10
  30. package/dist-server/service/expenditure-request/receipt-reader.js.map +1 -1
  31. package/dist-server/service/financial-statement/index.d.ts +1 -1
  32. package/dist-server/service/index.d.ts +2 -1
  33. package/dist-server/service/index.js +1 -0
  34. package/dist-server/service/index.js.map +1 -1
  35. package/dist-server/service/payment/index.js +3 -0
  36. package/dist-server/service/payment/index.js.map +1 -1
  37. package/dist-server/service/recurring-cash-item/recurring-cash-item-service.d.ts +4 -1
  38. package/dist-server/service/recurring-cash-item/recurring-cash-item-service.js +5 -1
  39. package/dist-server/service/recurring-cash-item/recurring-cash-item-service.js.map +1 -1
  40. package/dist-server/service/transaction/transaction-service.d.ts +3 -2
  41. package/dist-server/service/transaction/transaction-service.js +4 -4
  42. package/dist-server/service/transaction/transaction-service.js.map +1 -1
  43. package/dist-server/tsconfig.tsbuildinfo +1 -1
  44. package/package.json +10 -10
  45. package/translations/en.json +8 -1
  46. package/translations/es.json +8 -1
  47. package/translations/ja.json +7 -0
  48. package/translations/ko.json +9 -2
  49. package/translations/ms.json +7 -0
  50. package/translations/zh.json +7 -0
@@ -1 +1 @@
1
- {"version":3,"file":"expenditure-request-query.js","sourceRoot":"","sources":["../../../server/service/expenditure-request/expenditure-request-query.ts"],"names":[],"mappings":"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","sourcesContent":["import { Arg, Args, Ctx, Directive, FieldResolver, Int, Query, Resolver, Root, UseMiddleware } from 'type-graphql'\nimport { Like } from 'typeorm'\n\nimport { Domain, getQueryBuilderFromListParams, getRepository, ListParam, SpeakRefusals } from '@things-factory/shell'\nimport { User } from '@things-factory/auth-base'\nimport { Attachment } from '@things-factory/attachment-base'\nimport { accountTailOf, Counterparty, CounterpartyBankAccount } from '@things-factory/biz-base'\nimport { Department } from '@things-factory/organization'\nimport { TaxInvoice } from '@things-factory/tax-invoice'\n\nimport { Account } from '../account/account'\nimport { ExpenditureKind, ExpenditureRequest, ExpenditureRequestStatus } from './expenditure-request'\nimport { ExpenditureRequestItem } from './expenditure-request-item'\nimport { paymentStatesOf, ExpenditurePaymentState } from './expenditure-payment-state'\nimport { monthlySummary, statusCounts, type RequestStatus } from './expenditure-request-rules'\nimport { approvedWithStates, driftOf, RECEIPT_REF_TYPE } from './expenditure-request-service'\nimport { ExpenditurePayment, ExpenditureQueue, ExpenditureQueueRow, ExpenditureRequestList, ExpenditureSummary } from './expenditure-request-type'\n\nconst byId = async <T>(entity: new () => T, id: string | null | undefined, withDeleted = false): Promise<T | null> =>\n id ? ((await getRepository(entity).findOne({ where: { id } as any, withDeleted })) as T | null) : null\n\nasync function summaryOf(domain: { id: string }, year: number, month: number | undefined, requesterId?: string): Promise<ExpenditureSummary> {\n const period = month ? `${year}-${String(month).padStart(2, '0')}` : `${year}-%`\n const requests = await getRepository(ExpenditureRequest).find({\n where: {\n domain: { id: domain.id },\n kind: ExpenditureKind.REIMBURSEMENT,\n month: month ? period : Like(period),\n ...(requesterId ? { requester: { id: requesterId } } : {})\n } as any,\n relations: ['requester', 'items', 'items.account']\n })\n const shaped = requests.map(one => ({\n month: one.month,\n requesterId: one.requesterId ?? one.requester?.id,\n requesterName: one.requester?.name ?? null,\n status: one.status as RequestStatus,\n /* Summed by 계정과목; a line not yet filed counts under the category written on it. */\n items: (one.items ?? []).filter(item => !item.deletedAt).map(item => ({ ...item, category: item.account?.name ?? item.category }))\n }))\n\n const rows = monthlySummary(shaped)\n const approved = requests.filter(one => one.status === ExpenditureRequestStatus.APPROVED)\n approved.forEach(one => (one.items = (one.items ?? []).filter(item => !item.deletedAt)))\n const states = await paymentStatesOf(getRepository(ExpenditureRequest).manager, domain, approved as any)\n\n return {\n rows,\n statuses: Object.entries(statusCounts(shaped)).map(([status, count]) => ({ status, count })),\n approvedTotal: rows.reduce((sum, one) => sum + one.total, 0),\n unpaid: [...states.values()].reduce((sum, one) => sum + one.outstanding, 0)\n }\n}\n\n@UseMiddleware(SpeakRefusals)\n@Resolver(ExpenditureRequest)\nexport class ExpenditureRequestQuery {\n /** The last four digits of the account paid into - what the requester and the approvers see (ADR-0139). */\n @FieldResolver(type => String, { nullable: true, description: \"The last four digits of the account paid into\" })\n payeeAccountTail(@Root() request: ExpenditureRequest): string | undefined {\n return accountTailOf(request.payeeAccountNumber)\n }\n\n /** The caller's own requests - what an employee sees. */\n @Directive('@privilege(category: \"accounting-self\", privilege: \"query\", domainOwnerGranted: true)')\n @Query(returns => ExpenditureRequestList, { description: \"The caller's own expenditure requests\" })\n async myExpenditureRequests(@Args(type => ListParam) params: ListParam, @Ctx() context: ResolverContext): Promise<ExpenditureRequestList> {\n const { domain, user } = context.state\n const queryBuilder = getQueryBuilderFromListParams({ domain, params, repository: getRepository(ExpenditureRequest), searchables: ['title', 'notes'], alias: 'request' })\n queryBuilder.andWhere('request.requester = :requester', { requester: user.id })\n queryBuilder.addOrderBy('request.createdAt', 'DESC')\n const [items, total] = await queryBuilder.getManyAndCount()\n return { items, total }\n }\n\n /** One of the caller's own requests, with its lines. */\n @Directive('@privilege(category: \"accounting-self\", privilege: \"query\", domainOwnerGranted: true)')\n @Query(returns => ExpenditureRequest, { nullable: true, description: \"One of the caller's own expenditure requests\" })\n async myExpenditureRequest(@Arg('id') id: string, @Ctx() context: ResolverContext): Promise<ExpenditureRequest | null> {\n const { domain, user } = context.state\n return await getRepository(ExpenditureRequest).findOne({ where: { id, domain: { id: domain.id }, requester: { id: user.id } } as any })\n }\n\n /** Every request of the domain - what finance sees. */\n /*\n * Every request, one by one - who spent what, the receipts, the queue to pay - is the paying seat's: `expenditure`\n * (the user, 2026-10-18). The month's summary stays `accounting`, which the executives read.\n */\n @Directive('@privilege(category: \"expenditure\", privilege: \"query\", domainOwnerGranted: true)')\n @Query(returns => ExpenditureRequestList, { description: 'Every expenditure request of the domain' })\n async expenditureRequests(@Args(type => ListParam) params: ListParam, @Ctx() context: ResolverContext): Promise<ExpenditureRequestList> {\n const { domain } = context.state\n const queryBuilder = getQueryBuilderFromListParams({ domain, params, repository: getRepository(ExpenditureRequest), searchables: ['title', 'notes'], alias: 'request' })\n queryBuilder.addOrderBy('request.createdAt', 'DESC')\n const [items, total] = await queryBuilder.getManyAndCount()\n return { items, total }\n }\n\n @Directive('@privilege(category: \"expenditure\", privilege: \"query\", domainOwnerGranted: true)')\n @Query(returns => ExpenditureRequest, { nullable: true, description: 'One expenditure request of the domain' })\n async expenditureRequest(@Arg('id') id: string, @Ctx() context: ResolverContext): Promise<ExpenditureRequest | null> {\n return await getRepository(ExpenditureRequest).findOne({ where: { id, domain: { id: context.state.domain.id } } as any })\n }\n\n /**\n * The payment queue (지급 대기) - approved requests still to pay, by the day they are to be paid, and the paid ones\n * whose bank line no statement has matched yet.\n */\n @Directive('@privilege(category: \"expenditure\", privilege: \"query\", domainOwnerGranted: true)')\n @Query(returns => ExpenditureQueue, { description: 'Approved requests still to pay, and paid ones not yet matched to the bank' })\n async expenditureQueue(@Ctx() context: ResolverContext): Promise<ExpenditureQueue> {\n const { domain } = context.state\n const manager = getRepository(ExpenditureRequest).manager\n const { requests, states } = await approvedWithStates(manager, domain)\n\n const rows: ExpenditureQueueRow[] = []\n for (const request of requests) {\n const payment = states.get(request.id)!\n if (payment.state === ExpenditurePaymentState.NOTHING_TO_PAY) continue\n rows.push({\n request,\n payment,\n payeeName: (request.kind === ExpenditureKind.VENDOR ? request.counterparty?.name : request.requester?.name) ?? undefined,\n payeeAccountDrift: payment.outstanding > 0 ? await driftOf(manager, request) : undefined\n })\n }\n const due = (row: ExpenditureQueueRow) => row.request.dueDate ?? '9999-12-31'\n const waiting = rows\n .filter(row => row.payment.outstanding > 0)\n .sort((a, b) => due(a).localeCompare(due(b)) || String(a.request.decidedAt ?? '').localeCompare(String(b.request.decidedAt ?? '')))\n const unreconciled = rows.filter(row => row.payment.outstanding <= 0 && !row.payment.reconciled)\n return { waiting, unreconciled }\n }\n\n @Directive('@privilege(category: \"accounting\", privilege: \"query\", domainOwnerGranted: true)')\n @Query(returns => ExpenditureSummary, { description: 'Approved reimbursements per month, requester and category, with requests per status' })\n async expenditureSummary(\n @Arg('year', type => Int) year: number,\n @Arg('month', type => Int, { nullable: true }) month: number,\n @Ctx() context: ResolverContext\n ): Promise<ExpenditureSummary> {\n return await summaryOf(context.state.domain, year, month || undefined)\n }\n\n @Directive('@privilege(category: \"accounting-self\", privilege: \"query\", domainOwnerGranted: true)')\n @Query(returns => ExpenditureSummary, { description: \"The caller's own monthly summary of reimbursements\" })\n async myExpenditureSummary(\n @Arg('year', type => Int) year: number,\n @Arg('month', type => Int, { nullable: true }) month: number,\n @Ctx() context: ResolverContext\n ): Promise<ExpenditureSummary> {\n return await summaryOf(context.state.domain, year, month || undefined, context.state.user.id)\n }\n\n /** How far it is paid - read from its payments (ADR-0135 §2-4). */\n @FieldResolver(type => ExpenditurePayment, { nullable: true })\n async payment(@Root() request: ExpenditureRequest): Promise<ExpenditurePayment | null> {\n if (request.status !== ExpenditureRequestStatus.APPROVED) return null\n const items = await getRepository(ExpenditureRequestItem).find({ where: { request: { id: request.id } } as any })\n const states = await paymentStatesOf(getRepository(ExpenditureRequest).manager, { id: request.domainId! }, [{ id: request.id, items }])\n return states.get(request.id) ?? null\n }\n\n @FieldResolver(type => [ExpenditureRequestItem])\n async items(@Root() request: ExpenditureRequest): Promise<ExpenditureRequestItem[]> {\n if (request.items) return request.items.filter(item => !item.deletedAt)\n return await getRepository(ExpenditureRequestItem).find({ where: { request: { id: request.id } } as any, order: { spentDate: 'ASC', createdAt: 'ASC' } as any })\n }\n\n @FieldResolver(type => User, { nullable: true })\n async requester(@Root() request: ExpenditureRequest): Promise<User | null> {\n return request.requester ?? (await byId(User, request.requesterId))\n }\n\n @FieldResolver(type => Department, { nullable: true })\n async department(@Root() request: ExpenditureRequest): Promise<Department | null> {\n return request.department ?? (await byId(Department, request.departmentId))\n }\n\n @FieldResolver(type => Counterparty, { nullable: true })\n async counterparty(@Root() request: ExpenditureRequest): Promise<Counterparty | null> {\n return request.counterparty ?? (await byId(Counterparty, request.counterpartyId, true))\n }\n\n @FieldResolver(type => CounterpartyBankAccount, { nullable: true })\n async payeeAccount(@Root() request: ExpenditureRequest): Promise<CounterpartyBankAccount | null> {\n return request.payeeAccount ?? (await byId(CounterpartyBankAccount, request.payeeAccountId, true))\n }\n\n @FieldResolver(type => User, { nullable: true })\n async decidedBy(@Root() request: ExpenditureRequest): Promise<User | null> {\n return request.decidedBy ?? (await byId(User, request.decidedById))\n }\n\n @FieldResolver(type => Domain)\n async domain(@Root() request: ExpenditureRequest): Promise<Domain> {\n return await getRepository(Domain).findOneBy({ id: request.domainId })\n }\n\n @FieldResolver(type => User, { nullable: true })\n async creator(@Root() request: ExpenditureRequest): Promise<User | null> {\n return await byId(User, request.creatorId)\n }\n\n @FieldResolver(type => User, { nullable: true })\n async updater(@Root() request: ExpenditureRequest): Promise<User | null> {\n return await byId(User, request.updaterId)\n }\n}\n\n@Resolver(ExpenditureRequestItem)\nexport class ExpenditureRequestItemQuery {\n @FieldResolver(type => ExpenditureRequest, { nullable: true })\n async request(@Root() item: ExpenditureRequestItem): Promise<ExpenditureRequest | null> {\n return item.request ?? (await byId(ExpenditureRequest, item.requestId))\n }\n\n @FieldResolver(type => Account, { nullable: true })\n async account(@Root() item: ExpenditureRequestItem): Promise<Account | null> {\n return item.account ?? (await byId(Account, item.accountId))\n }\n\n @FieldResolver(type => TaxInvoice, { nullable: true })\n async taxInvoice(@Root() item: ExpenditureRequestItem): Promise<TaxInvoice | null> {\n return item.taxInvoice ?? (await byId(TaxInvoice, item.taxInvoiceId, true))\n }\n\n /** Where the receipt is, or null - so an approver can see what was spent. */\n @FieldResolver(type => String, { nullable: true })\n async receiptUrl(@Root() item: ExpenditureRequestItem): Promise<string | null> {\n const attachment = await getRepository(Attachment).findOne({ where: { refType: RECEIPT_REF_TYPE, refBy: item.id }, order: { createdAt: 'DESC' } as any })\n return attachment?.fullpath ?? null\n }\n\n @FieldResolver(type => Domain)\n async domain(@Root() item: ExpenditureRequestItem): Promise<Domain> {\n return await getRepository(Domain).findOneBy({ id: item.domainId })\n }\n\n @FieldResolver(type => User, { nullable: true })\n async creator(@Root() item: ExpenditureRequestItem): Promise<User | null> {\n return await byId(User, item.creatorId)\n }\n\n @FieldResolver(type => User, { nullable: true })\n async updater(@Root() item: ExpenditureRequestItem): Promise<User | null> {\n return await byId(User, item.updaterId)\n }\n}\n"]}
1
+ {"version":3,"file":"expenditure-request-query.js","sourceRoot":"","sources":["../../../server/service/expenditure-request/expenditure-request-query.ts"],"names":[],"mappings":"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","sourcesContent":["import { Arg, Args, Ctx, Directive, FieldResolver, Int, Query, Resolver, Root, UseMiddleware } from 'type-graphql'\nimport { Like } from 'typeorm'\n\nimport { Domain, getQueryBuilderFromListParams, getRepository, ListParam, SpeakRefusals } from '@things-factory/shell'\nimport { privilegeRejection, User } from '@things-factory/auth-base'\nimport { Attachment } from '@things-factory/attachment-base'\nimport { accountTailOf, Counterparty, CounterpartyBankAccount } from '@things-factory/biz-base'\nimport { Department } from '@things-factory/organization'\nimport { TaxInvoice } from '@things-factory/tax-invoice'\n\nimport { Account } from '../account/account'\nimport { ExpenditureKind, ExpenditureRequest, ExpenditureRequestStatus } from './expenditure-request'\nimport { ExpenditureRequestItem } from './expenditure-request-item'\nimport { paymentStatesOf, ExpenditurePaymentState } from './expenditure-payment-state'\nimport { monthlySummary, statusCounts, type RequestStatus } from './expenditure-request-rules'\nimport { approvedWithStates, driftOf, RECEIPT_REF_TYPE } from './expenditure-request-service'\nimport { mayReadRequest, REQUEST_READ_FACTS } from './receipt-reader'\nimport { ExpenditurePayment, ExpenditureQueue, ExpenditureQueueRow, ExpenditureRequestList, ExpenditureSummary } from './expenditure-request-type'\n\nconst byId = async <T>(entity: new () => T, id: string | null | undefined, withDeleted = false): Promise<T | null> =>\n id ? ((await getRepository(entity).findOne({ where: { id } as any, withDeleted })) as T | null) : null\n\nasync function summaryOf(domain: { id: string }, year: number, month: number | undefined, requesterId?: string): Promise<ExpenditureSummary> {\n const period = month ? `${year}-${String(month).padStart(2, '0')}` : `${year}-%`\n const requests = await getRepository(ExpenditureRequest).find({\n where: {\n domain: { id: domain.id },\n kind: ExpenditureKind.REIMBURSEMENT,\n month: month ? period : Like(period),\n ...(requesterId ? { requester: { id: requesterId } } : {})\n } as any,\n relations: ['requester', 'items', 'items.account']\n })\n const shaped = requests.map(one => ({\n month: one.month,\n requesterId: one.requesterId ?? one.requester?.id,\n requesterName: one.requester?.name ?? null,\n status: one.status as RequestStatus,\n /* Summed by 계정과목; a line not yet filed counts under the category written on it. */\n items: (one.items ?? []).filter(item => !item.deletedAt).map(item => ({ ...item, category: item.account?.name ?? item.category }))\n }))\n\n const rows = monthlySummary(shaped)\n const approved = requests.filter(one => one.status === ExpenditureRequestStatus.APPROVED)\n approved.forEach(one => (one.items = (one.items ?? []).filter(item => !item.deletedAt)))\n const states = await paymentStatesOf(getRepository(ExpenditureRequest).manager, domain, approved as any)\n\n return {\n rows,\n statuses: Object.entries(statusCounts(shaped)).map(([status, count]) => ({ status, count })),\n approvedTotal: rows.reduce((sum, one) => sum + one.total, 0),\n unpaid: [...states.values()].reduce((sum, one) => sum + one.outstanding, 0)\n }\n}\n\n@UseMiddleware(SpeakRefusals)\n@Resolver(ExpenditureRequest)\nexport class ExpenditureRequestQuery {\n /** The last four digits of the account paid into - what the requester and the approvers see (ADR-0139). */\n @FieldResolver(type => String, { nullable: true, description: \"The last four digits of the account paid into\" })\n payeeAccountTail(@Root() request: ExpenditureRequest): string | undefined {\n return accountTailOf(request.payeeAccountNumber)\n }\n\n /** The caller's own requests - what an employee sees. */\n @Directive('@privilege(category: \"accounting-self\", privilege: \"query\", domainOwnerGranted: true)')\n @Query(returns => ExpenditureRequestList, { description: \"The caller's own expenditure requests\" })\n async myExpenditureRequests(@Args(type => ListParam) params: ListParam, @Ctx() context: ResolverContext): Promise<ExpenditureRequestList> {\n const { domain, user } = context.state\n const queryBuilder = getQueryBuilderFromListParams({ domain, params, repository: getRepository(ExpenditureRequest), searchables: ['title', 'notes'], alias: 'request' })\n queryBuilder.andWhere('request.requester = :requester', { requester: user.id })\n queryBuilder.addOrderBy('request.createdAt', 'DESC')\n const [items, total] = await queryBuilder.getManyAndCount()\n return { items, total }\n }\n\n /** One of the caller's own requests, with its lines. */\n @Directive('@privilege(category: \"accounting-self\", privilege: \"query\", domainOwnerGranted: true)')\n @Query(returns => ExpenditureRequest, { nullable: true, description: \"One of the caller's own expenditure requests\" })\n async myExpenditureRequest(@Arg('id') id: string, @Ctx() context: ResolverContext): Promise<ExpenditureRequest | null> {\n const { domain, user } = context.state\n return await getRepository(ExpenditureRequest).findOne({ where: { id, domain: { id: domain.id }, requester: { id: user.id } } as any })\n }\n\n /** Every request of the domain - what finance sees. */\n /*\n * Every request, one by one - who spent what, the receipts, the queue to pay - is the paying seat's: `expenditure`\n * (the user, 2026-10-18). The month's summary stays `accounting`, which the executives read.\n */\n @Directive('@privilege(category: \"expenditure\", privilege: \"query\", domainOwnerGranted: true)')\n @Query(returns => ExpenditureRequestList, { description: 'Every expenditure request of the domain' })\n async expenditureRequests(@Args(type => ListParam) params: ListParam, @Ctx() context: ResolverContext): Promise<ExpenditureRequestList> {\n const { domain } = context.state\n const queryBuilder = getQueryBuilderFromListParams({ domain, params, repository: getRepository(ExpenditureRequest), searchables: ['title', 'notes'], alias: 'request' })\n queryBuilder.addOrderBy('request.createdAt', 'DESC')\n const [items, total] = await queryBuilder.getManyAndCount()\n return { items, total }\n }\n\n @Directive('@privilege(category: \"expenditure\", privilege: \"query\", domainOwnerGranted: true)')\n @Query(returns => ExpenditureRequest, { nullable: true, description: 'One expenditure request of the domain' })\n async expenditureRequest(@Arg('id') id: string, @Ctx() context: ResolverContext): Promise<ExpenditureRequest | null> {\n return await getRepository(ExpenditureRequest).findOne({ where: { id, domain: { id: context.state.domain.id } } as any })\n }\n\n /**\n * One request as its approvers read it - the lines and their files. Open to whoever may open those files: its writer,\n * whoever takes part in its approval, and the paying seat (§`receipt-reader.ts`). The approval card links to it.\n * Anyone else is refused as the paying seat's door refuses them, so the 360 says 「볼 수 없음」, not 「없음」.\n */\n @Directive('@privilege(category: \"accounting-self\", privilege: \"query\", domainOwnerGranted: true)')\n @Query(returns => ExpenditureRequest, { nullable: true, description: 'One expenditure request, for its writer, its approvers and the paying seat' })\n async expenditureRequestForReview(@Arg('id') id: string, @Ctx() context: ResolverContext): Promise<ExpenditureRequest | null> {\n const request = await getRepository(ExpenditureRequest).findOne({ where: { id, domain: { id: context.state.domain.id } } as any })\n if (!request) return null\n if (!(await mayReadRequest(request, context, REQUEST_READ_FACTS))) throw privilegeRejection(context, 'expenditure', 'query', 'role', 'query')\n return request\n }\n\n /**\n * The payment queue (지급 대기) - approved requests still to pay, by the day they are to be paid, and the paid ones\n * whose bank line no statement has matched yet.\n */\n @Directive('@privilege(category: \"expenditure\", privilege: \"query\", domainOwnerGranted: true)')\n @Query(returns => ExpenditureQueue, { description: 'Approved requests still to pay, and paid ones not yet matched to the bank' })\n async expenditureQueue(@Ctx() context: ResolverContext): Promise<ExpenditureQueue> {\n const { domain } = context.state\n const manager = getRepository(ExpenditureRequest).manager\n const { requests, states } = await approvedWithStates(manager, domain)\n\n const rows: ExpenditureQueueRow[] = []\n for (const request of requests) {\n const payment = states.get(request.id)!\n if (payment.state === ExpenditurePaymentState.NOTHING_TO_PAY) continue\n rows.push({\n request,\n payment,\n payeeName: (request.kind === ExpenditureKind.VENDOR ? request.counterparty?.name : request.requester?.name) ?? undefined,\n payeeAccountDrift: payment.outstanding > 0 ? await driftOf(manager, request) : undefined\n })\n }\n const due = (row: ExpenditureQueueRow) => row.request.dueDate ?? '9999-12-31'\n const waiting = rows\n .filter(row => row.payment.outstanding > 0)\n .sort((a, b) => due(a).localeCompare(due(b)) || String(a.request.decidedAt ?? '').localeCompare(String(b.request.decidedAt ?? '')))\n const unreconciled = rows.filter(row => row.payment.outstanding <= 0 && !row.payment.reconciled)\n return { waiting, unreconciled }\n }\n\n @Directive('@privilege(category: \"accounting\", privilege: \"query\", domainOwnerGranted: true)')\n @Query(returns => ExpenditureSummary, { description: 'Approved reimbursements per month, requester and category, with requests per status' })\n async expenditureSummary(\n @Arg('year', type => Int) year: number,\n @Arg('month', type => Int, { nullable: true }) month: number,\n @Ctx() context: ResolverContext\n ): Promise<ExpenditureSummary> {\n return await summaryOf(context.state.domain, year, month || undefined)\n }\n\n @Directive('@privilege(category: \"accounting-self\", privilege: \"query\", domainOwnerGranted: true)')\n @Query(returns => ExpenditureSummary, { description: \"The caller's own monthly summary of reimbursements\" })\n async myExpenditureSummary(\n @Arg('year', type => Int) year: number,\n @Arg('month', type => Int, { nullable: true }) month: number,\n @Ctx() context: ResolverContext\n ): Promise<ExpenditureSummary> {\n return await summaryOf(context.state.domain, year, month || undefined, context.state.user.id)\n }\n\n /** How far it is paid - read from its payments (ADR-0135 §2-4). */\n @FieldResolver(type => ExpenditurePayment, { nullable: true })\n async payment(@Root() request: ExpenditureRequest): Promise<ExpenditurePayment | null> {\n if (request.status !== ExpenditureRequestStatus.APPROVED) return null\n const items = await getRepository(ExpenditureRequestItem).find({ where: { request: { id: request.id } } as any })\n const states = await paymentStatesOf(getRepository(ExpenditureRequest).manager, { id: request.domainId! }, [{ id: request.id, items }])\n return states.get(request.id) ?? null\n }\n\n @FieldResolver(type => [ExpenditureRequestItem])\n async items(@Root() request: ExpenditureRequest): Promise<ExpenditureRequestItem[]> {\n if (request.items) return request.items.filter(item => !item.deletedAt)\n return await getRepository(ExpenditureRequestItem).find({ where: { request: { id: request.id } } as any, order: { spentDate: 'ASC', createdAt: 'ASC' } as any })\n }\n\n @FieldResolver(type => User, { nullable: true })\n async requester(@Root() request: ExpenditureRequest): Promise<User | null> {\n return request.requester ?? (await byId(User, request.requesterId))\n }\n\n @FieldResolver(type => Department, { nullable: true })\n async department(@Root() request: ExpenditureRequest): Promise<Department | null> {\n return request.department ?? (await byId(Department, request.departmentId))\n }\n\n @FieldResolver(type => Counterparty, { nullable: true })\n async counterparty(@Root() request: ExpenditureRequest): Promise<Counterparty | null> {\n return request.counterparty ?? (await byId(Counterparty, request.counterpartyId, true))\n }\n\n @FieldResolver(type => CounterpartyBankAccount, { nullable: true })\n async payeeAccount(@Root() request: ExpenditureRequest): Promise<CounterpartyBankAccount | null> {\n return request.payeeAccount ?? (await byId(CounterpartyBankAccount, request.payeeAccountId, true))\n }\n\n @FieldResolver(type => User, { nullable: true })\n async decidedBy(@Root() request: ExpenditureRequest): Promise<User | null> {\n return request.decidedBy ?? (await byId(User, request.decidedById))\n }\n\n @FieldResolver(type => Domain)\n async domain(@Root() request: ExpenditureRequest): Promise<Domain> {\n return await getRepository(Domain).findOneBy({ id: request.domainId })\n }\n\n @FieldResolver(type => User, { nullable: true })\n async creator(@Root() request: ExpenditureRequest): Promise<User | null> {\n return await byId(User, request.creatorId)\n }\n\n @FieldResolver(type => User, { nullable: true })\n async updater(@Root() request: ExpenditureRequest): Promise<User | null> {\n return await byId(User, request.updaterId)\n }\n}\n\n@Resolver(ExpenditureRequestItem)\nexport class ExpenditureRequestItemQuery {\n @FieldResolver(type => ExpenditureRequest, { nullable: true })\n async request(@Root() item: ExpenditureRequestItem): Promise<ExpenditureRequest | null> {\n return item.request ?? (await byId(ExpenditureRequest, item.requestId))\n }\n\n @FieldResolver(type => Account, { nullable: true })\n async account(@Root() item: ExpenditureRequestItem): Promise<Account | null> {\n return item.account ?? (await byId(Account, item.accountId))\n }\n\n @FieldResolver(type => TaxInvoice, { nullable: true })\n async taxInvoice(@Root() item: ExpenditureRequestItem): Promise<TaxInvoice | null> {\n return item.taxInvoice ?? (await byId(TaxInvoice, item.taxInvoiceId, true))\n }\n\n /** The line's receipts and papers - so an approver sees what was spent. */\n @FieldResolver(type => [Attachment])\n async files(@Root() item: ExpenditureRequestItem): Promise<Attachment[]> {\n return await getRepository(Attachment).find({ where: { domain: { id: item.domainId }, refType: RECEIPT_REF_TYPE, refBy: item.id } as any, order: { createdAt: 'ASC' } as any })\n }\n\n @FieldResolver(type => Domain)\n async domain(@Root() item: ExpenditureRequestItem): Promise<Domain> {\n return await getRepository(Domain).findOneBy({ id: item.domainId })\n }\n\n @FieldResolver(type => User, { nullable: true })\n async creator(@Root() item: ExpenditureRequestItem): Promise<User | null> {\n return await byId(User, item.creatorId)\n }\n\n @FieldResolver(type => User, { nullable: true })\n async updater(@Root() item: ExpenditureRequestItem): Promise<User | null> {\n return await byId(User, item.updaterId)\n }\n}\n"]}
@@ -64,14 +64,22 @@ export declare function withdrawRequest(tx: EntityManager, domain: any, user: an
64
64
  export declare function deleteRequest(tx: EntityManager, domain: any, user: any, id: string): Promise<boolean>;
65
65
  /**
66
66
  * Add one line from the phone. It joins the caller's editable reimbursement of that month (§`requestForLine`), or
67
- * starts one. The receipt photo is attached to the line.
67
+ * starts one. The receipt photos and files picked with it are attached to the line.
68
68
  */
69
69
  export declare function addLine(tx: EntityManager, domain: any, user: any, line: ItemPatch & {
70
70
  month?: string;
71
- receipt?: any;
71
+ files?: any[];
72
72
  }, context: ResolverContext): Promise<ExpenditureRequest>;
73
- /** Put a receipt on a line - replacing the one it had. Only the requester, only while editable. */
74
- export declare function replaceReceipt(tx: EntityManager, domain: any, user: any, itemId: string, file: any, context: ResolverContext): Promise<ExpenditureRequestItem>;
73
+ /** A line of the caller's own request, while the request can still be changed. */
74
+ export declare function editableLine(tx: EntityManager, domain: any, user: any, itemId: string): Promise<ExpenditureRequestItem>;
75
+ /**
76
+ * Attach files to a line and take others off it, in one go - only the requester, only while editable. A file taken
77
+ * off is deleted: what approvers judge is what the line has when it is submitted.
78
+ */
79
+ export declare function saveLineFiles(tx: EntityManager, domain: any, user: any, itemId: string, change: {
80
+ attach?: any[];
81
+ remove?: string[];
82
+ }, context: ResolverContext): Promise<ExpenditureRequestItem>;
75
83
  /** Approved requests with their lines and how far each is paid - what the payment queue and payments are made of. */
76
84
  export declare function approvedWithStates(tx: EntityManager, domain: {
77
85
  id: string;
@@ -7,7 +7,8 @@ exports.submitRequest = submitRequest;
7
7
  exports.withdrawRequest = withdrawRequest;
8
8
  exports.deleteRequest = deleteRequest;
9
9
  exports.addLine = addLine;
10
- exports.replaceReceipt = replaceReceipt;
10
+ exports.editableLine = editableLine;
11
+ exports.saveLineFiles = saveLineFiles;
11
12
  exports.approvedWithStates = approvedWithStates;
12
13
  exports.driftOf = driftOf;
13
14
  exports.payRequests = payRequests;
@@ -292,6 +293,8 @@ async function submitRequest(tx, domain, user, id, context) {
292
293
  paidTo: vendor
293
294
  ? { __typename: 'Counterparty', id: request.counterpartyId, name: payee }
294
295
  : { __typename: 'User', id: user.id, name: who },
296
+ /* The request itself, as a reference: the approval card opens it - the lines and their receipts and papers. */
297
+ request: { __typename: 'ExpenditureRequest', id: request.id, name: request.title },
295
298
  headline: vendor
296
299
  ? `${payee} · ${request.title} ${won(totals.payable)}${request.dueDate ? ` — ${request.dueDate} 지급` : ''}`
297
300
  : `${who} · ${request.month} 경비 ${won(totals.total)} (${totals.count}건)`,
@@ -339,7 +342,7 @@ async function deleteRequest(tx, domain, user, id) {
339
342
  }
340
343
  /**
341
344
  * Add one line from the phone. It joins the caller's editable reimbursement of that month (§`requestForLine`), or
342
- * starts one. The receipt photo is attached to the line.
345
+ * starts one. The receipt photos and files picked with it are attached to the line.
343
346
  */
344
347
  async function addLine(tx, domain, user, line, context) {
345
348
  const spentDate = (0, expenditure_request_rules_1.dayOf)(line.spentDate);
@@ -350,27 +353,45 @@ async function addLine(tx, domain, user, line, context) {
350
353
  where: { domain: { id: domain.id }, requester: { id: user.id }, kind: expenditure_request_1.ExpenditureKind.REIMBURSEMENT, month }
351
354
  });
352
355
  const joinId = (0, expenditure_request_rules_1.requestForLine)(mine.map(one => ({ id: one.id, status: one.status, month: one.month, updatedAt: one.updatedAt })), month);
353
- const { receipt, month: _month, ...fields } = line;
356
+ const { files, month: _month, ...fields } = line;
354
357
  const request = await saveRequest(tx, domain, user, joinId ? { id: joinId } : { kind: expenditure_request_1.ExpenditureKind.REIMBURSEMENT, month }, [{ ...fields, spentDate, cuFlag: '+' }], { taxInvoices: false });
355
- if (receipt) {
358
+ if (files?.length) {
356
359
  const [latest] = await tx.getRepository(expenditure_request_item_1.ExpenditureRequestItem).find({ where: { request: { id: request.id } }, order: { createdAt: 'DESC' }, take: 1 });
357
360
  if (latest)
358
- await attachReceipt(latest.id, receipt, context);
361
+ for (const file of files)
362
+ await attachFile(latest.id, file, context);
359
363
  }
360
364
  return request;
361
365
  }
362
- /** Put a receipt on a line - replacing the one it had. Only the requester, only while editable. */
363
- async function replaceReceipt(tx, domain, user, itemId, file, context) {
366
+ /** A line of the caller's own request, while the request can still be changed. */
367
+ async function editableLine(tx, domain, user, itemId) {
364
368
  const item = await tx.getRepository(expenditure_request_item_1.ExpenditureRequestItem).findOne({ where: { id: itemId, domain: { id: domain.id } }, relations: ['request'] });
365
369
  if (!item?.request)
366
370
  throw new shell_1.Refusal('expenditure-line-not-found', {}, 'a line was not found - reload and try again');
367
371
  const request = await ownRequest(tx, item.request.id, domain, user);
368
372
  if (!(0, expenditure_request_rules_1.canEdit)(request.status))
369
373
  throw (0, exports.lockedRequest)(request.status);
370
- await (0, attachment_base_1.replaceAttachment)({ file, refType: exports.RECEIPT_REF_TYPE, refBy: item.id, category: 'receipt' }, context);
371
374
  return item;
372
375
  }
373
- async function attachReceipt(itemId, file, context) {
376
+ /**
377
+ * Attach files to a line and take others off it, in one go - only the requester, only while editable. A file taken
378
+ * off is deleted: what approvers judge is what the line has when it is submitted.
379
+ */
380
+ async function saveLineFiles(tx, domain, user, itemId, change, context) {
381
+ const item = await editableLine(tx, domain, user, itemId);
382
+ const remove = [...new Set(change.remove ?? [])];
383
+ if (remove.length) {
384
+ const onLine = await tx.getRepository(attachment_base_1.Attachment).find({ where: { domain: { id: domain.id }, refType: exports.RECEIPT_REF_TYPE, refBy: item.id, id: (0, typeorm_1.In)(remove) } });
385
+ if (onLine.length !== remove.length)
386
+ throw new shell_1.Refusal('expenditure-file-not-on-line', {}, 'a file is not on this line - reload and try again');
387
+ for (const one of onLine)
388
+ await (0, attachment_base_1.deleteAttachment)(null, { id: one.id }, context);
389
+ }
390
+ for (const file of change.attach ?? [])
391
+ await attachFile(item.id, file, context);
392
+ return item;
393
+ }
394
+ async function attachFile(itemId, file, context) {
374
395
  await (0, attachment_base_1.createAttachment)(null, { attachment: { file, refType: exports.RECEIPT_REF_TYPE, refBy: itemId, category: 'receipt' } }, context);
375
396
  }
376
397
  /** Approved requests with their lines and how far each is paid - what the payment queue and payments are made of. */
@@ -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. */\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"]}
1
+ {"version":3,"file":"expenditure-request-service.js","sourceRoot":"","sources":["../../../server/service/expenditure-request/expenditure-request-service.ts"],"names":[],"mappings":"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","sourcesContent":["import { EntityManager, In } from 'typeorm'\n\nimport { Refusal } from '@things-factory/shell'\nimport { accountKey, Counterparty, CounterpartyBankAccount } from '@things-factory/biz-base'\nimport { Employee } from '@things-factory/organization'\nimport { Category, TaxInvoice } from '@things-factory/tax-invoice'\nimport { abort, activityNamed, approvalLineRefusal, approvalLineStanding, issue } from '@things-factory/worklist'\nimport { Attachment, createAttachment, deleteAttachment } from '@things-factory/attachment-base'\n\nimport { activityOfKind } from '../../activities/expenditure-activity-names'\nimport { Account } from '../account/account'\nimport { accountMatcher } from '../account/account-match'\nimport { BankAccount } from '../bank-account/bank-account'\nimport { CashFlowType } from '../cash-flow-type'\nimport { Payment } from '../payment/payment'\nimport { TAX_INVOICE_TARGET } from '../payment/document-targets'\nimport { paidOfTarget } from '../payment/payment-currency'\nimport { savePayments } from '../payment/payment-service'\nimport { Transaction, TransactionCategory, TransactionSource } from '../transaction/transaction'\nimport { saveTransactions } from '../transaction/transaction-service'\nimport { ExpenditureKind, ExpenditureRequest, ExpenditureRequestStatus } from './expenditure-request'\nimport { ExpenditurePaymentMethod, ExpenditureRequestItem } from './expenditure-request-item'\nimport { EXPENDITURE_TARGET, paymentStatesOf, type PaymentState } from './expenditure-payment-state'\nimport {\n canEdit,\n dayOf,\n isPayable,\n monthOf,\n payeeAccountDrift,\n requestForLine,\n submitRefusal,\n totalsOf,\n type RequestKind,\n type RequestStatus\n} from './expenditure-request-rules'\n\nexport const RECEIPT_REF_TYPE = 'ExpenditureRequestItem'\n\nconst won = (value: number) => `${Math.round(value || 0).toLocaleString()}원`\nconst KINDS = Object.values(ExpenditureKind) as string[]\nconst METHODS = Object.values(ExpenditurePaymentMethod) as string[]\n\nexport interface RequestHead {\n id?: string\n kind?: string\n title?: string\n month?: string\n dueDate?: string\n counterparty?: { id: string } | null\n payeeAccount?: { id: string } | null\n notes?: string\n}\n\nexport interface ItemPatch {\n id?: string\n cuFlag?: string\n spentDate?: string\n category?: string\n account?: { id: string } | null\n merchant?: string\n description?: string\n amount?: number\n vatAmount?: number\n paymentMethod?: string\n taxInvoice?: { id: string } | null\n}\n\n/** A request somebody is judging (or that is decided) - it changes only after it is withdrawn. */\nexport const lockedRequest = (status: string) =>\n new Refusal('expenditure-locked', { status: String(status).toLowerCase() }, `a ${String(status).toLowerCase()} request cannot be changed - withdraw it first`)\n\n/** The request of this domain, refusing one that is not the caller's own. */\nexport async function ownRequest(tx: EntityManager, id: string, domain: { id: string }, user: { id: string }): Promise<ExpenditureRequest> {\n const request = await tx.getRepository(ExpenditureRequest).findOne({ where: { id, domain: { id: domain.id } } as any, relations: ['requester'] })\n if (!request) throw new Refusal('expenditure-not-found', {}, `expenditure request '${id}' was not found`)\n if (request.requester?.id !== user.id) throw new Refusal('expenditure-not-yours', {}, 'only the requester can change this request')\n return request\n}\n\nasync function employeeOf(tx: EntityManager, domain: { id: string }, user: { id: string }) {\n return await tx.getRepository(Employee).findOne({ where: { domain: { id: domain.id }, user: { id: user.id } } as any, relations: ['department'] })\n}\n\nasync function linesOf(tx: EntityManager, requestId: string): Promise<ExpenditureRequestItem[]> {\n return await tx.getRepository(ExpenditureRequestItem).find({ where: { request: { id: requestId } } as any, order: { spentDate: 'ASC', createdAt: 'ASC' } as any })\n}\n\nasync function refreshTotals(tx: EntityManager, request: ExpenditureRequest): Promise<ExpenditureRequest> {\n const totals = totalsOf(await linesOf(tx, request.id))\n request.totalAmount = totals.total\n request.payableAmount = totals.payable\n return await tx.getRepository(ExpenditureRequest).save(request)\n}\n\nasync function inDomain<T>(tx: EntityManager, entity: new () => T, domain: { id: string }, ref: { id: string } | null | undefined, field: string): Promise<T | null> {\n if (!ref?.id) return null\n const row = await tx.getRepository(entity).findOne({ where: { domain: { id: domain.id }, id: ref.id } as any })\n if (!row) throw new Refusal('expenditure-reference-not-found', { field }, `${field} was not found - reload and try again`)\n return row\n}\n\n/** The counterparty and the account of it a counterparty payment names - the account must be that counterparty's. */\nasync function payeeOf(tx: EntityManager, domain: { id: string }, head: RequestHead, current?: ExpenditureRequest) {\n const counterparty = 'counterparty' in head ? await inDomain(tx, Counterparty, domain, head.counterparty, 'counterparty') : undefined\n const account = 'payeeAccount' in head ? await inDomain(tx, CounterpartyBankAccount, domain, head.payeeAccount, 'payeeAccount') : undefined\n const counterpartyId = counterparty === undefined ? current?.counterpartyId : counterparty?.id\n if (account && account.counterpartyId !== counterpartyId)\n throw new Refusal('expenditure-account-not-of-payee', {}, \"the account is not the counterparty's - choose one of its accounts\")\n return { counterparty, account }\n}\n\n/** Apply line patches to a request - checks each line's references and the tax invoice it cites. */\n/**\n * What the caller may cite. A tax invoice is the tax-invoice ledger's (ADR-0139): `accounting-self` writes the\n * caller's own request, and does not open someone else's ledger by naming a row of it.\n */\nexport interface Citing {\n taxInvoices: boolean\n}\n\nasync function saveItems(tx: EntityManager, domain: { id: string }, user: any, request: ExpenditureRequest, patches: ItemPatch[], citing: Citing) {\n const repo = tx.getRepository(ExpenditureRequestItem)\n\n const deletes = patches.filter(one => one.cuFlag === '-' && one.id).map(one => one.id!)\n if (deletes.length) {\n const own = await repo.find({ where: { request: { id: request.id }, id: In(deletes) } as any })\n if (own.length !== new Set(deletes).size) throw new Refusal('expenditure-line-not-found', {}, 'a line was not found - reload and try again')\n await repo.softDelete({ id: In(deletes) })\n }\n\n const writes = patches.filter(one => one.cuFlag !== '-')\n const accounts = writes.some(one => !('account' in one) && (one.category || one.description))\n ? await tx.getRepository(Account).find({ where: { domain: { id: domain.id }, active: true } as any })\n : []\n const match = accountMatcher(accounts)\n\n for (const patch of writes) {\n const isNew = !patch.id || patch.cuFlag === '+'\n const current = isNew ? undefined : await repo.findOne({ where: { request: { id: request.id }, id: patch.id } as any })\n if (!isNew && !current) throw new Refusal('expenditure-line-not-found', {}, 'a line was not found - reload and try again')\n\n const row: Record<string, any> = {}\n if ('spentDate' in patch) {\n row.spentDate = patch.spentDate ? dayOf(patch.spentDate) : null\n if (patch.spentDate && !row.spentDate) throw new Refusal('expenditure-line-day-invalid', { value: String(patch.spentDate) }, `'${patch.spentDate}' is not a day (use YYYY-MM-DD)`)\n }\n for (const field of ['category', 'merchant', 'description'] as const) if (field in patch) row[field] = patch[field]?.trim() || null\n if ('amount' in patch) row.amount = Number(patch.amount) || 0\n if ('vatAmount' in patch) row.vatAmount = patch.vatAmount === null || patch.vatAmount === undefined ? null : Number(patch.vatAmount)\n if ('paymentMethod' in patch && patch.paymentMethod) {\n if (!METHODS.includes(patch.paymentMethod)) throw new Refusal('expenditure-line-method-invalid', { value: patch.paymentMethod }, `'${patch.paymentMethod}' is not a way to pay`)\n row.paymentMethod = patch.paymentMethod\n } else if (isNew) row.paymentMethod = request.kind === ExpenditureKind.VENDOR ? ExpenditurePaymentMethod.TRANSFER : ExpenditurePaymentMethod.PERSONAL_CARD\n\n if ('account' in patch) row.account = await inDomain(tx, Account, domain, patch.account, 'account')\n else {\n /* A line that names no account is given the one its words mean, by its category then its description (§`accountMatcher`). */\n const words = [patch.category ?? current?.category, patch.description ?? current?.description]\n const found = (isNew || 'category' in patch || 'description' in patch) && accounts.length ? match(words, CashFlowType.EXPENSE) : undefined\n if (found) row.account = found\n }\n\n if ('taxInvoice' in patch) {\n if (patch.taxInvoice?.id && !citing.taxInvoices)\n throw new Refusal('expenditure-invoice-not-readable', {}, 'citing a tax invoice needs the tax-invoice ledger')\n const invoice = await inDomain(tx, TaxInvoice, domain, patch.taxInvoice, 'taxInvoice')\n if (invoice) {\n if (request.kind !== ExpenditureKind.VENDOR) throw new Refusal('expenditure-invoice-on-reimbursement', {}, 'a reimbursement cites receipts, not tax invoices')\n if (invoice.category !== Category.IMPORT) throw new Refusal('expenditure-invoice-not-purchase', {}, 'cite a purchase tax invoice')\n const elsewhere = await repo.find({ where: { domain: { id: domain.id }, taxInvoice: { id: invoice.id } } as any, relations: ['request'] })\n if (elsewhere.some(one => one.id !== current?.id && one.request && !one.request.deletedAt))\n throw new Refusal('expenditure-invoice-cited-twice', { issueDate: invoice.issueDate }, 'another request already pays this tax invoice')\n if (!('amount' in patch) || !(row.amount > 0)) row.amount = Number(invoice.totalAmount)\n if (!('spentDate' in patch)) row.spentDate = invoice.issueDate\n }\n row.taxInvoice = invoice\n }\n\n /* What a line says of its money holds whenever it is written, not only when it is submitted. */\n const amount = 'amount' in row ? row.amount : Number(current?.amount ?? 0)\n if ('amount' in row && !(row.amount > 0)) throw new Refusal('expenditure-line-amount-missing', {}, 'every line needs an amount above zero')\n const vat = 'vatAmount' in row ? row.vatAmount : current?.vatAmount\n if (vat && amount && Number(vat) > amount) throw new Refusal('expenditure-line-vat-over-amount', {}, 'the VAT is more than the amount')\n\n /* A line that cites an invoice asks no more than the invoice - whichever of the two changed. */\n const citedId = 'taxInvoice' in patch ? row.taxInvoice?.id : current?.taxInvoiceId\n if (citedId && ('amount' in row || 'taxInvoice' in patch)) {\n const invoice = row.taxInvoice ?? (await tx.getRepository(TaxInvoice).findOne({ where: { id: citedId } as any, withDeleted: true }))\n if (invoice && amount > Number(invoice.totalAmount) + 0.005)\n throw new Refusal('expenditure-line-over-invoice', { total: won(Number(invoice.totalAmount)) }, 'a line asks more than the tax invoice it cites')\n }\n\n await repo.save({ ...(current ?? { domain, request, creator: user, amount: 0 }), ...row, updater: user } as any)\n }\n}\n\n/**\n * Save a request and its lines in one go - the head, then the lines. A new request belongs to the caller; an existing\n * one only to its requester, and only while it is editable.\n */\nexport async function saveRequest(tx: EntityManager, domain: any, user: any, head: RequestHead, items: ItemPatch[], citing: Citing): Promise<ExpenditureRequest> {\n const repo = tx.getRepository(ExpenditureRequest)\n\n let request: ExpenditureRequest\n if (head.id) {\n request = await ownRequest(tx, head.id, domain, user)\n if (!canEdit(request.status as RequestStatus)) throw lockedRequest(request.status)\n if (head.kind && head.kind !== request.kind) throw new Refusal('expenditure-kind-fixed', {}, 'a request keeps the kind it was written as')\n } else {\n if (!head.kind || !KINDS.includes(head.kind)) throw new Refusal('expenditure-kind-missing', {}, 'say whether it pays a counterparty or pays an employee back')\n const employee = await employeeOf(tx, domain, user)\n request = repo.create({\n domain,\n kind: head.kind as ExpenditureKind,\n requester: user,\n department: employee?.department ?? null,\n status: ExpenditureRequestStatus.DRAFT,\n currency: 'KRW',\n totalAmount: 0,\n payableAmount: 0,\n creator: user\n } as any) as unknown as ExpenditureRequest\n }\n\n const reimbursement = request.kind === ExpenditureKind.REIMBURSEMENT\n if ('month' in head || (!head.id && reimbursement)) {\n const month = monthOf(head.month)\n if (reimbursement && !month) throw new Refusal('expenditure-month-invalid', { value: String(head.month ?? '') }, `month: '${head.month ?? ''}' is not a month (use YYYY-MM)`)\n if (head.month && !month) throw new Refusal('expenditure-month-invalid', { value: String(head.month) }, `month: '${head.month}' is not a month (use YYYY-MM)`)\n request.month = month ?? null\n }\n if ('dueDate' in head) {\n request.dueDate = head.dueDate ? dayOf(head.dueDate) ?? null : null\n if (head.dueDate && !request.dueDate) throw new Refusal('expenditure-due-date-invalid', { value: String(head.dueDate) }, `'${head.dueDate}' is not a day (use YYYY-MM-DD)`)\n }\n if (reimbursement && ('counterparty' in head || 'payeeAccount' in head)) throw new Refusal('expenditure-reimbursement-pays-requester', {}, 'a reimbursement pays the employee who wrote it')\n const { counterparty, account } = await payeeOf(tx, domain, head, head.id ? request : undefined)\n if (counterparty !== undefined) request.counterparty = counterparty\n if (account !== undefined) request.payeeAccount = account\n /* A changed counterparty drops the account chosen of the former one. */\n if (counterparty !== undefined && account === undefined && request.payeeAccountId) {\n const kept = await tx.getRepository(CounterpartyBankAccount).findOne({ where: { id: request.payeeAccountId } as any })\n if (kept?.counterpartyId !== counterparty?.id) request.payeeAccount = null\n }\n\n if (head.title?.trim()) request.title = head.title.trim()\n else if (!request.title) request.title = reimbursement ? `${request.month} 경비` : `${counterparty?.name ?? ''} 지급`.trim()\n if (head.notes !== undefined) request.notes = head.notes\n request.updater = user\n request = await repo.save(request)\n\n if (items?.length) await saveItems(tx, domain, user, request, items, citing)\n return await refreshTotals(tx, request)\n}\n\n/** The payee's account as approvers will see it - written on the request when it is submitted (ADR-0135 §5). */\nasync function payeeSnapshot(tx: EntityManager, domain: { id: string }, request: ExpenditureRequest, user: any) {\n if (request.kind === ExpenditureKind.VENDOR) {\n const account = await tx.getRepository(CounterpartyBankAccount).findOne({ where: { domain: { id: domain.id }, id: request.payeeAccountId } as any })\n if (!account || account.counterpartyId !== request.counterpartyId)\n throw new Refusal('expenditure-payee-account-missing', {}, \"choose the counterparty's account to pay into\")\n return { payeeBankName: account.bankName ?? null, payeeAccountNumber: account.accountNumber, payeeHolderName: account.holderName ?? null }\n }\n const employee = await employeeOf(tx, domain, user)\n return {\n payeeBankName: employee?.bankName ?? null,\n payeeAccountNumber: employee?.bankAccount ? accountKey(employee.bankAccount) || null : null,\n payeeHolderName: user.name ?? null\n }\n}\n\n/** Put a request up for approval. The approval carries what the approver needs to judge it. */\nexport async function submitRequest(tx: EntityManager, domain: any, user: any, id: string, context: ResolverContext): Promise<ExpenditureRequest> {\n const request = await ownRequest(tx, id, domain, user)\n const items = await linesOf(tx, request.id)\n\n const refusal = submitRefusal(\n {\n kind: request.kind as RequestKind,\n status: request.status as RequestStatus,\n month: request.month,\n dueDate: request.dueDate,\n counterpartyId: request.counterpartyId,\n payeeAccountId: request.payeeAccountId\n },\n items\n )\n if (refusal) throw refusal\n Object.assign(request, await payeeSnapshot(tx, domain, request, user))\n\n const form = activityOfKind(request.kind)\n const carrier = await activityNamed(form, context)\n if (!carrier) throw new Refusal('expenditure-approval-not-installed', { form }, `the approval '${form}' is not installed in this domain`)\n const line = await approvalLineStanding(carrier, context)\n if (line.refusal) throw approvalLineRefusal(line.refusal)\n\n const totals = totalsOf(items)\n const who = user.name || user.email || ''\n const vendor = request.kind === ExpenditureKind.VENDOR\n const payee = vendor ? (await tx.getRepository(Counterparty).findOne({ where: { id: request.counterpartyId } as any }))?.name ?? '' : who\n const account = [request.payeeBankName, request.payeeAccountNumber, request.payeeHolderName].filter(Boolean).join(' ')\n\n const instance = await issue(\n {\n name: vendor ? `지출결의 ${payee} ${request.title}` : `경비 청구 ${who} ${request.month}`,\n description: `${won(totals.total)} · ${totals.count}건${totals.payable !== totals.total ? ` (지급할 금액 ${won(totals.payable)})` : ''}`,\n activityId: carrier.id,\n approvalLine: carrier.approvalLine,\n input: {\n requestId: request.id,\n month: request.month ?? request.dueDate?.slice(0, 7) ?? '',\n requester: who,\n payee,\n /*\n * Who is paid, as a reference: the approval screens draw a value with a __typename as a link to\n * its 360 (worklist decision-content) - the counterparty for a vendor payment, the employee for\n * a claim. `payee` and `requester` stay as the words the search keys find.\n */\n paidTo: vendor\n ? { __typename: 'Counterparty', id: request.counterpartyId, name: payee }\n : { __typename: 'User', id: user.id, name: who },\n /* The request itself, as a reference: the approval card opens it - the lines and their receipts and papers. */\n request: { __typename: 'ExpenditureRequest', id: request.id, name: request.title },\n headline: vendor\n ? `${payee} · ${request.title} ${won(totals.payable)}${request.dueDate ? ` — ${request.dueDate} 지급` : ''}`\n : `${who} · ${request.month} 경비 ${won(totals.total)} (${totals.count}건)`,\n total: totals.total,\n payable: totals.payable,\n account,\n lines: items.map(item =>\n `${item.spentDate ?? ''} ${item.category ?? ''} ${item.merchant ?? ''} ${won(item.amount)}${item.paymentMethod === ExpenditurePaymentMethod.CORPORATE_CARD ? ' (법인카드)' : ''}${item.taxInvoiceId ? ' (세금계산서)' : ''} — ${item.description ?? ''}`\n .replace(/\\s+/g, ' ')\n .trim()\n ),\n consequence:\n totals.payable > 0\n ? `승인하면 ${won(totals.payable)}을 ${payee}에게 지급할 대상이 됩니다${account ? ` (${account})` : ''}`\n : '법인카드 사용분만 있어 지급할 금액은 없습니다'\n },\n threadsMin: 1,\n threadsMax: 1,\n requireApproval: true\n } as any,\n context\n )\n\n request.status = ExpenditureRequestStatus.SUBMITTED\n request.activityInstanceId = instance.id\n request.submittedAt = new Date()\n request.decidedAt = null\n request.decidedBy = null\n request.updater = user\n return await tx.getRepository(ExpenditureRequest).save(request)\n}\n\n/** Take a request back from its approvers. worklist's abort does not call the activity back, so the request is set here. */\nexport async function withdrawRequest(tx: EntityManager, domain: any, user: any, id: string, context: ResolverContext): Promise<ExpenditureRequest> {\n const request = await ownRequest(tx, id, domain, user)\n if (request.status !== ExpenditureRequestStatus.SUBMITTED)\n throw new Refusal('expenditure-not-submitted', { status: String(request.status).toLowerCase() }, 'only a request waiting on approvers can be withdrawn')\n\n if (request.activityInstanceId) await abort({ id: request.activityInstanceId, reason: '작성자가 회수함' }, context)\n\n request.status = ExpenditureRequestStatus.WITHDRAWN\n request.updater = user\n return await tx.getRepository(ExpenditureRequest).save(request)\n}\n\n/** Delete one of the caller's requests that nobody is judging - with its lines. */\nexport async function deleteRequest(tx: EntityManager, domain: any, user: any, id: string): Promise<boolean> {\n const request = await ownRequest(tx, id, domain, user)\n if (!canEdit(request.status as RequestStatus))\n throw new Refusal('expenditure-cannot-delete', { status: request.status.toLowerCase() }, `a ${request.status.toLowerCase()} request cannot be deleted`)\n await tx.getRepository(ExpenditureRequestItem).softDelete({ request: { id } } as any)\n await tx.getRepository(ExpenditureRequest).softDelete({ id })\n return true\n}\n\n/**\n * Add one line from the phone. It joins the caller's editable reimbursement of that month (§`requestForLine`), or\n * starts one. The receipt photos and files picked with it are attached to the line.\n */\nexport async function addLine(tx: EntityManager, domain: any, user: any, line: ItemPatch & { month?: string; files?: any[] }, context: ResolverContext): Promise<ExpenditureRequest> {\n const spentDate = dayOf(line.spentDate)\n if (!spentDate) throw new Refusal('expenditure-line-day-missing', {}, 'every line needs its day')\n const month = monthOf(line.month) ?? spentDate.slice(0, 7)\n\n const mine = await tx.getRepository(ExpenditureRequest).find({\n where: { domain: { id: domain.id }, requester: { id: user.id }, kind: ExpenditureKind.REIMBURSEMENT, month } as any\n })\n const joinId = requestForLine(\n mine.map(one => ({ id: one.id, status: one.status as RequestStatus, month: one.month, updatedAt: one.updatedAt })),\n month\n )\n\n const { files, month: _month, ...fields } = line\n const request = await saveRequest(tx, domain, user, joinId ? { id: joinId } : { kind: ExpenditureKind.REIMBURSEMENT, month }, [{ ...fields, spentDate, cuFlag: '+' }], { taxInvoices: false })\n\n if (files?.length) {\n const [latest] = await tx.getRepository(ExpenditureRequestItem).find({ where: { request: { id: request.id } } as any, order: { createdAt: 'DESC' } as any, take: 1 })\n if (latest) for (const file of files) await attachFile(latest.id, file, context)\n }\n return request\n}\n\n/** A line of the caller's own request, while the request can still be changed. */\nexport async function editableLine(tx: EntityManager, domain: any, user: any, itemId: string): Promise<ExpenditureRequestItem> {\n const item = await tx.getRepository(ExpenditureRequestItem).findOne({ where: { id: itemId, domain: { id: domain.id } } as any, relations: ['request'] })\n if (!item?.request) throw new Refusal('expenditure-line-not-found', {}, 'a line was not found - reload and try again')\n const request = await ownRequest(tx, item.request.id, domain, user)\n if (!canEdit(request.status as RequestStatus)) throw lockedRequest(request.status)\n return item\n}\n\n/**\n * Attach files to a line and take others off it, in one go - only the requester, only while editable. A file taken\n * off is deleted: what approvers judge is what the line has when it is submitted.\n */\nexport async function saveLineFiles(\n tx: EntityManager,\n domain: any,\n user: any,\n itemId: string,\n change: { attach?: any[]; remove?: string[] },\n context: ResolverContext\n): Promise<ExpenditureRequestItem> {\n const item = await editableLine(tx, domain, user, itemId)\n\n const remove = [...new Set(change.remove ?? [])]\n if (remove.length) {\n const onLine = await tx.getRepository(Attachment).find({ where: { domain: { id: domain.id }, refType: RECEIPT_REF_TYPE, refBy: item.id, id: In(remove) } as any })\n if (onLine.length !== remove.length) throw new Refusal('expenditure-file-not-on-line', {}, 'a file is not on this line - reload and try again')\n for (const one of onLine) await deleteAttachment(null, { id: one.id }, context)\n }\n for (const file of change.attach ?? []) await attachFile(item.id, file, context)\n return item\n}\n\nasync function attachFile(itemId: string, file: any, context: ResolverContext) {\n await createAttachment(null, { attachment: { file, refType: RECEIPT_REF_TYPE, refBy: itemId, category: 'receipt' } } as any, context)\n}\n\n/** Approved requests with their lines and how far each is paid - what the payment queue and payments are made of. */\nexport async function approvedWithStates(tx: EntityManager, domain: { id: string }, ids?: string[]) {\n const requests = await tx.getRepository(ExpenditureRequest).find({\n where: { domain: { id: domain.id }, status: ExpenditureRequestStatus.APPROVED, ...(ids ? { id: In(ids) } : {}) } as any,\n relations: ['items', 'requester', 'counterparty', 'payeeAccount']\n })\n for (const request of requests) request.items = (request.items ?? []).filter(item => !item.deletedAt)\n const states = await paymentStatesOf(tx, domain, requests as any)\n return { requests, states }\n}\n\n/** Whether the account approvers saw is still the one on file (§`payeeAccountDrift`); `missing` when none was written. */\nexport async function driftOf(tx: EntityManager, request: ExpenditureRequest): Promise<string | undefined> {\n if (!request.payeeAccountNumber) return 'missing'\n if (request.kind !== ExpenditureKind.VENDOR) return undefined\n const current = request.payeeAccountId\n ? await tx.getRepository(CounterpartyBankAccount).findOne({ where: { id: request.payeeAccountId } as any, withDeleted: true })\n : null\n return payeeAccountDrift(request, current, accountKey)\n}\n\n/**\n * Put a part of a withdrawal on a request (ADR-0135 §2-5). A payable line that cites a tax invoice is paid on that\n * invoice; the rest on the request itself. A link the line already has to the same target is raised, not doubled.\n */\nasync function putOnLine(tx: EntityManager, domain: { id: string }, user: any, request: ExpenditureRequest, state: PaymentState, lineId: string, amount: number) {\n if (amount > state.outstanding + 0.005)\n throw new Refusal('expenditure-paid-over', { title: request.title }, `more is put on ${request.title} than it asks`)\n\n const existing = await tx.getRepository(Payment).find({ where: { domain: { id: domain.id }, transaction: { id: lineId } } as any })\n const patchFor = (targetType: string, targetId: string, put: number) => {\n const twin = existing.find(one => one.targetType === targetType && one.targetId === targetId)\n return twin ? { id: twin.id, cuFlag: 'M', amount: Number(twin.amount) + put } : { cuFlag: '+', transaction: { id: lineId }, targetType, targetId, amount: put }\n }\n\n let remaining = amount\n const patches: any[] = []\n const cited = (request.items ?? []).filter(item => isPayable(item) && item.taxInvoiceId)\n if (cited.length) {\n const onInvoices = await tx.getRepository(Payment).find({\n where: { domain: { id: domain.id }, targetType: TAX_INVOICE_TARGET, targetId: In(cited.map(item => item.taxInvoiceId)) } as any\n })\n for (const item of cited) {\n const paid = onInvoices.filter(one => one.targetId === item.taxInvoiceId).reduce((sum, one) => sum + paidOfTarget(one), 0)\n const put = Math.min(remaining, Math.max(0, Number(item.amount) - paid))\n if (put > 0) patches.push(patchFor(TAX_INVOICE_TARGET, item.taxInvoiceId!, put))\n remaining -= put\n }\n }\n const direct = Math.min(remaining, Math.max(0, state.settleable - state.settled))\n if (direct > 0) patches.push(patchFor(EXPENDITURE_TARGET, request.id, direct))\n remaining -= direct\n if (remaining > 0.005) throw new Refusal('expenditure-paid-over', { title: request.title }, `more is put on ${request.title} than it asks`)\n\n await savePayments(tx, domain, user, patches)\n}\n\nexport interface PaymentRecord {\n paidDate: string\n bankAccount?: { id: string } | null\n}\n\n/**\n * Pay approved requests - finance transferred the money at the bank and records it. Each request gets a withdrawal of\n * what it still asks, written as a person's line; the next bank statement import matches it, and then the payment is\n * reconciled (§`bank-reconcile`).\n */\nexport async function payRequests(tx: EntityManager, domain: any, user: any, ids: string[], record: PaymentRecord): Promise<ExpenditureRequest[]> {\n const paidDate = dayOf(record.paidDate)\n if (!paidDate) throw new Refusal('expenditure-paid-date-missing', {}, 'paidDate: the day the money went out')\n const bankAccount = await inDomain(tx, BankAccount, domain, record.bankAccount, 'bankAccount')\n\n const { requests, states } = await approvedWithStates(tx, domain, [...new Set(ids)])\n if (requests.length !== new Set(ids).size) {\n const found = await tx.getRepository(ExpenditureRequest).find({ where: { domain: { id: domain.id }, id: In(ids) } as any })\n const titles = found.filter(one => one.status !== ExpenditureRequestStatus.APPROVED).map(one => one.title).join(', ')\n if (titles) throw new Refusal('expenditure-not-approved', { title: titles }, `only an approved request is paid - ${titles}`)\n throw new Refusal('expenditure-not-found', {}, 'some requests were not found - reload and try again')\n }\n\n for (const request of requests) {\n const state = states.get(request.id)!\n if (!(state.outstanding > 0)) throw new Refusal('expenditure-paid-already', { title: request.title }, `${request.title} has nothing left to pay`)\n const payee = request.kind === ExpenditureKind.VENDOR ? request.counterparty?.name : request.requester?.name\n const [line] = await saveTransactions(tx, domain, user, [\n {\n cuFlag: '+',\n category: TransactionCategory.CONFIRMED,\n source: TransactionSource.MANUAL,\n type: CashFlowType.EXPENSE,\n transactionDate: paidDate,\n amount: state.outstanding,\n description: `지출 — ${request.title}`,\n counterpartyName: payee ?? undefined,\n ...(request.counterpartyId ? { counterparty: { id: request.counterpartyId } } : {}),\n ...(bankAccount ? { bankAccount: { id: bankAccount.id } } : { currency: request.currency })\n }\n ])\n await putOnLine(tx, domain, user, request, state, line.id, state.outstanding)\n }\n return requests\n}\n\n/**\n * Pay a request with a withdrawal already in the books - a bank statement brought it in first. The part put on the\n * request is what it still asks unless a smaller amount is given.\n */\nexport async function payWithLine(tx: EntityManager, domain: any, user: any, requestId: string, transactionId: string, amount?: number | null): Promise<ExpenditureRequest> {\n const { requests, states } = await approvedWithStates(tx, domain, [requestId])\n const [request] = requests\n if (!request) {\n const found = await tx.getRepository(ExpenditureRequest).findOne({ where: { domain: { id: domain.id }, id: requestId } as any })\n if (found) throw new Refusal('expenditure-not-approved', { title: found.title }, `only an approved request is paid - ${found.title}`)\n throw new Refusal('expenditure-not-found', {}, `expenditure request '${requestId}' was not found`)\n }\n const line = await tx.getRepository(Transaction).findOne({ where: { domain: { id: domain.id }, id: transactionId, category: TransactionCategory.CONFIRMED } as any })\n if (!line) throw new Refusal('expenditure-line-gone', {}, 'the bank line was not found - reload and try again')\n\n const state = states.get(request.id)!\n const put = amount === null || amount === undefined ? Math.min(state.outstanding, Number(line.amount)) : Number(amount)\n if (!(put > 0)) throw new Refusal('expenditure-paid-already', { title: request.title }, `${request.title} has nothing left to pay`)\n await putOnLine(tx, domain, user, request, state, line.id, put)\n return request\n}\n"]}
@@ -36,7 +36,7 @@ export declare class NewExpenditureLine {
36
36
  description?: string;
37
37
  vatAmount?: number;
38
38
  paymentMethod?: ExpenditurePaymentMethod;
39
- receipt?: FileUpload;
39
+ files?: FileUpload[];
40
40
  }
41
41
  export declare class ExpenditurePaymentInput {
42
42
  paidDate: string;
@@ -136,9 +136,9 @@ tslib_1.__decorate([
136
136
  tslib_1.__metadata("design:type", String)
137
137
  ], NewExpenditureLine.prototype, "paymentMethod", void 0);
138
138
  tslib_1.__decorate([
139
- (0, type_graphql_1.Field)(type => GraphQLUpload_js_1.default, { nullable: true, description: 'Photo of the receipt' }),
140
- tslib_1.__metadata("design:type", Object)
141
- ], NewExpenditureLine.prototype, "receipt", void 0);
139
+ (0, type_graphql_1.Field)(type => [GraphQLUpload_js_1.default], { nullable: true, description: 'Receipt photos and files the line is proven by' }),
140
+ tslib_1.__metadata("design:type", Array)
141
+ ], NewExpenditureLine.prototype, "files", void 0);
142
142
  exports.NewExpenditureLine = NewExpenditureLine = tslib_1.__decorate([
143
143
  (0, type_graphql_1.InputType)({ description: 'One expense added on the go - it joins the month’s editable reimbursement' })
144
144
  ], NewExpenditureLine);