UNPKG

@accounter/server

Version:

153 lines (146 loc) 4.81 kB
import { Resolvers } from '@shared/gql-types'; import { hasFinancialEntitiesCoreProperties } from '../helpers/financial-entities.helper.js'; 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, IUpdateTaxCategoryParams } from '../types.js'; import { commonDocumentsFields, commonTransactionFields, ledgerCounterparty } from './common.js'; export const financialEntitiesResolvers: FinancialEntitiesModule.Resolvers & Pick<Resolvers, 'FinancialEntity'> = { Query: { financialEntity: async (_, { id }, { injector }) => { const dbFe = await injector .get(FinancialEntitiesProvider) .getFinancialEntityByIdLoader.load(id); if (!dbFe) { throw new Error(`Financial entity ID="${id}" not found`); } return dbFe; }, allFinancialEntities: async (_, { page, limit }, { injector }) => { const financialEntities = await injector .get(FinancialEntitiesProvider) .getAllFinancialEntities(); page ??= 1; let pageFinancialEntities = financialEntities.sort((a, b) => a.name.toLowerCase() > b.name.toLowerCase() ? 1 : -1, ); // handle pagination if (limit) { pageFinancialEntities = financialEntities.slice(page * limit - limit, page * limit); } return { __typename: 'PaginatedFinancialEntities', nodes: pageFinancialEntities, pageInfo: { totalPages: limit ? Math.ceil(financialEntities.length / limit) : 1, currentPage: page + 1, pageSize: limit, }, }; }, }, Mutation: { updateTaxCategory: async (_, { taxCategoryId, fields }, { injector }) => { if (hasFinancialEntitiesCoreProperties(fields)) { await injector .get(FinancialEntitiesProvider) .updateFinancialEntity({ ...fields, financialEntityId: taxCategoryId }); } const adjustedFields: IUpdateTaxCategoryParams = { hashavshevetName: fields.hashavshevetName, taxCategoryId, }; try { if (fields.hashavshevetName) { await injector .get(TaxCategoriesProvider) .updateTaxCategory(adjustedFields) .catch((e: Error) => { console.error(e); throw new Error(`Update core tax category fields error`); }); } const updatedTaxCategory = await injector .get(TaxCategoriesProvider) .taxCategoryByIDsLoader.load(taxCategoryId); if (!updatedTaxCategory) { throw new Error(`Updated tax category not found`); } return updatedTaxCategory; } catch (e) { return { __typename: 'CommonError', message: `Failed to update tax category ID="${taxCategoryId}": ${(e as Error).message}`, }; } }, }, FinancialEntity: { __resolveType: async (parent, { injector }) => { if (!parent) { return null; } switch (parent.type) { case 'business': { if (!('country' in parent)) { const business = await injector .get(BusinessesProvider) .getBusinessByIdLoader.load(parent.id); if (business) { Object.assign(parent, business); } } return 'LtdFinancialEntity'; } case 'tax_category': if (!('hashavshevet_name' in parent)) { const texCategory = await injector .get(TaxCategoriesProvider) .taxCategoryByIDsLoader.load(parent.id); if (texCategory) { Object.assign(parent, texCategory); } } return 'TaxCategory'; } throw new Error(`Unknown financial entity type: ${parent}`); }, }, WireTransaction: { ...commonTransactionFields, }, FeeTransaction: { ...commonTransactionFields, }, ConversionTransaction: { ...commonTransactionFields, }, CommonTransaction: { ...commonTransactionFields, }, Invoice: { ...commonDocumentsFields, }, InvoiceReceipt: { ...commonDocumentsFields, }, CreditInvoice: { ...commonDocumentsFields, }, Proforma: { ...commonDocumentsFields, }, Unprocessed: { ...commonDocumentsFields, }, Receipt: { ...commonDocumentsFields, }, LedgerRecord: { creditAccount1: ledgerCounterparty('CreditAccount1'), creditAccount2: ledgerCounterparty('CreditAccount2'), debitAccount1: ledgerCounterparty('DebitAccount1'), debitAccount2: ledgerCounterparty('DebitAccount2'), }, };