@accounter/server
Version:
Accounter GraphQL server
64 lines (56 loc) • 2.09 kB
text/typescript
import { GraphQLError } from 'graphql';
import type {
Maybe,
ResolverFn,
ResolversParentTypes,
ResolversTypes,
} from '../../../../../__generated__/types.js';
import type { LedgerProto } from '../../../../../shared/types/index.js';
import { MiscExpensesProvider } from '../../../../misc-expenses/providers/misc-expenses.provider.js';
import { storeInitialGeneratedRecords } from '../../../helpers/ledgrer-storage.helper.js';
import { generateMiscExpensesLedger } from '../../../helpers/misc-expenses-ledger.helper.js';
import { ledgerProtoToRecordsConverter } from '../../../helpers/utils.helper.js';
export const generateLedgerRecordsForBalance: ResolverFn<
Maybe<ResolversTypes['GeneratedLedgerRecords']>,
ResolversParentTypes['Charge'],
GraphQLModules.Context,
{ insertLedgerRecordsIfNotExists: boolean }
> = async (charge, { insertLedgerRecordsIfNotExists }, { injector }) => {
try {
// 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, injector).then(entries => {
entries.map(entry => {
entry.ownerId = charge.owner_id;
ledgerEntries.push(entry);
});
});
await Promise.all([expensesLedgerPromise]);
if (insertLedgerRecordsIfNotExists) {
await storeInitialGeneratedRecords(charge.id, ledgerEntries, injector);
}
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}`,
};
}
};