UNPKG

@accounter/server

Version:

123 lines (115 loc) 4.2 kB
import { GraphQLError } from 'graphql'; import type { Maybe, ResolverFn, ResolversParentTypes, ResolversTypes } from '@shared/gql-types'; import { BusinessesProvider } from '../providers/businesses.provider.js'; import { FinancialEntitiesProvider } from '../providers/financial-entities.provider.js'; import { TaxCategoriesProvider } from '../providers/tax-categories.provider.js'; import type { FinancialEntitiesModule } from '../types.js'; export const commonFinancialEntityFields: | FinancialEntitiesModule.LtdFinancialEntityResolvers | FinancialEntitiesModule.PersonalFinancialEntityResolvers = { id: DbBusiness => DbBusiness.id, }; export const commonTaxChargeFields: FinancialEntitiesModule.ChargeResolvers = { taxCategory: async (DbCharge, _, { injector }) => { if (!DbCharge.tax_category_id) { return null; } return injector .get(TaxCategoriesProvider) .taxCategoryByIDsLoader.load(DbCharge.tax_category_id) .then(taxCategory => taxCategory ?? null); }, }; export const commonChargeFields: FinancialEntitiesModule.ChargeResolvers = { counterparty: async (DbCharge, _, { injector }) => DbCharge.business_id ? injector .get(FinancialEntitiesProvider) .getFinancialEntityByIdLoader.load(DbCharge.business_id) .then(res => res ?? null) : null, owner: (DbCharge, _, { injector }) => injector .get(BusinessesProvider) .getBusinessByIdLoader.load(DbCharge.owner_id) .then(res => { if (!res) { throw new Error(`Unable to find financial entity for charge ${DbCharge.owner_id}`); } return res; }), }; export const commonTransactionFields: | FinancialEntitiesModule.ConversionTransactionResolvers | FinancialEntitiesModule.FeeTransactionResolvers | FinancialEntitiesModule.WireTransactionResolvers | FinancialEntitiesModule.CommonTransactionResolvers = { counterparty: (documentRoot, _, { injector }) => documentRoot.business_id ? injector .get(FinancialEntitiesProvider) .getFinancialEntityByIdLoader.load(documentRoot.business_id) .then(res => res ?? null) : null, }; export const commonDocumentsFields: FinancialEntitiesModule.DocumentResolvers = { creditor: (documentRoot, _, { injector }) => documentRoot.creditor_id ? injector .get(FinancialEntitiesProvider) .getFinancialEntityByIdLoader.load(documentRoot.creditor_id) .then(res => res ?? null) : null, debtor: (documentRoot, _, { injector }) => documentRoot.debtor_id ? injector .get(FinancialEntitiesProvider) .getFinancialEntityByIdLoader.load(documentRoot.debtor_id) .then(res => res ?? null) : null, }; export const ledgerCounterparty = ( account: 'CreditAccount1' | 'CreditAccount2' | 'DebitAccount1' | 'DebitAccount2', ): ResolverFn< Maybe<ResolversTypes['FinancialEntity']>, ResolversParentTypes['LedgerRecord'], GraphQLModules.Context, object > => { const resolverFn: ResolverFn< Maybe<ResolversTypes['FinancialEntity']>, ResolversParentTypes['LedgerRecord'], GraphQLModules.Context, object > = (DbLedgerRecord, _, { injector }) => { let financialEntityId: string | null = null; switch (account) { case 'CreditAccount1': financialEntityId = DbLedgerRecord.credit_entity1; break; case 'CreditAccount2': financialEntityId = DbLedgerRecord.credit_entity2; break; case 'DebitAccount1': financialEntityId = DbLedgerRecord.debit_entity1; break; case 'DebitAccount2': financialEntityId = DbLedgerRecord.debit_entity2; break; default: throw new Error(`Invalid account type: ${account}`); } return financialEntityId ? injector .get(FinancialEntitiesProvider) .getFinancialEntityByIdLoader.load(financialEntityId) .then(res => { if (!res) { throw new GraphQLError(`Financial entity ID="${financialEntityId}" not found`); } return res; }) : null; }; return resolverFn; };