UNPKG

@accounter/server

Version:

61 lines (52 loc) 2.07 kB
import { GraphQLError } from 'graphql'; import { storeInitialGeneratedRecords } from '@modules/ledger/helpers/ledgrer-storage.helper.js'; import { generateMiscExpensesLedger } from '@modules/ledger/helpers/misc-expenses-ledger.helper.js'; import { MiscExpensesProvider } from '@modules/misc-expenses/providers/misc-expenses.provider.js'; import { Maybe, ResolverFn, ResolversParentTypes, ResolversTypes } from '@shared/gql-types'; import type { LedgerProto } from '@shared/types'; import { ledgerProtoToRecordsConverter } from '../../../helpers/utils.helper.js'; export const generateLedgerRecordsForBalance: ResolverFn< Maybe<ResolversTypes['GeneratedLedgerRecords']>, ResolversParentTypes['Charge'], GraphQLModules.Context, { insertLedgerRecordsIfNotExists: boolean } > = async (charge, { insertLedgerRecordsIfNotExists }, context) => { try { const { injector } = context; // validate balance record exists const miscExpenses = await injector .get(MiscExpensesProvider) .getExpensesByChargeIdLoader.load(charge.id); if (!miscExpenses?.length) { throw new GraphQLError('Balance charge must include balance records'); } const ledgerEntries: LedgerProto[] = []; // generate ledger from misc expenses const expensesLedgerPromise = generateMiscExpensesLedger(charge, context).then(entries => { entries.map(entry => { entry.ownerId = charge.owner_id; ledgerEntries.push(entry); }); }); await Promise.all([expensesLedgerPromise]); if (insertLedgerRecordsIfNotExists) { await storeInitialGeneratedRecords(charge, ledgerEntries, context); } return { records: ledgerProtoToRecordsConverter(ledgerEntries), charge, balance: { isBalanced: true, unbalancedEntities: [], balanceSum: 0, financialEntities: [], }, errors: [], }; } catch (e) { return { __typename: 'CommonError', message: `Failed to generate ledger records for charge ID="${charge.id}"\n${e}`, }; } };