@accounter/server 0.0.9-alpha-20251211132246-b18259e59cbca0d25dd94d8260a61b55a2f3b458 → 0.0.9-alpha-20251211161610-5ba6aa4ba27b2cc52460d8b17757dad51478bc4a

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 (22) hide show
  1. package/CHANGELOG.md +5 -5
  2. package/dist/green-invoice-graphql/src/mesh-artifacts/index.d.ts +1 -1
  3. package/dist/server/src/modules/charges/helpers/common.helper.js +19 -13
  4. package/dist/server/src/modules/charges/helpers/common.helper.js.map +1 -1
  5. package/dist/server/src/modules/charges/resolvers/charge-suggestions/charge-suggestions.resolver.js +561 -545
  6. package/dist/server/src/modules/charges/resolvers/charge-suggestions/charge-suggestions.resolver.js.map +1 -1
  7. package/dist/server/src/modules/charges/resolvers/charges.resolver.js +179 -140
  8. package/dist/server/src/modules/charges/resolvers/charges.resolver.js.map +1 -1
  9. package/dist/server/src/modules/charges/resolvers/common.js +45 -26
  10. package/dist/server/src/modules/charges/resolvers/common.js.map +1 -1
  11. package/dist/server/src/modules/charges/resolvers/financial-charges.resolver.js +31 -25
  12. package/dist/server/src/modules/charges/resolvers/financial-charges.resolver.js.map +1 -1
  13. package/dist/server/src/shared/errors.d.ts +1 -0
  14. package/dist/server/src/shared/errors.js +7 -0
  15. package/dist/server/src/shared/errors.js.map +1 -1
  16. package/package.json +1 -1
  17. package/src/modules/charges/helpers/common.helper.ts +24 -19
  18. package/src/modules/charges/resolvers/charge-suggestions/charge-suggestions.resolver.ts +588 -574
  19. package/src/modules/charges/resolvers/charges.resolver.ts +192 -157
  20. package/src/modules/charges/resolvers/common.ts +48 -31
  21. package/src/modules/charges/resolvers/financial-charges.resolver.ts +31 -27
  22. package/src/shared/errors.ts +8 -0
@@ -2,6 +2,7 @@ import { GraphQLError } from 'graphql';
2
2
  import type { Resolvers } from '../../../__generated__/types.js';
3
3
  import { EMPTY_UUID } from '../../../shared/constants.js';
4
4
  import { ChargeSortByField, ChargeTypeEnum } from '../../../shared/enums.js';
5
+ import { errorSimplifier } from '../../../shared/errors.js';
5
6
  import { BusinessTripsProvider } from '../../business-trips/providers/business-trips.provider.js';
6
7
  import { isInvoice, isReceipt } from '../../documents/helpers/common.helper.js';
7
8
  import { DocumentsProvider } from '../../documents/providers/documents.provider.js';
@@ -38,38 +39,60 @@ import type {
38
39
  } from '../types.js';
39
40
  import { commonChargeFields, commonDocumentsFields } from './common.js';
40
41
 
42
+ async function chargeTypeChecker(
43
+ chargeType: ChargeTypeEnum,
44
+ charge: IGetChargesByIdsResult,
45
+ context: GraphQLModules.Context,
46
+ ) {
47
+ try {
48
+ return (await getChargeType(charge, context)) === chargeType;
49
+ } catch (error) {
50
+ throw errorSimplifier('Failed to determine charge type', error);
51
+ }
52
+ }
53
+
41
54
  export const chargesResolvers: ChargesModule.Resolvers &
42
55
  Pick<Resolvers, 'UpdateChargeResult' | 'MergeChargeResult' | 'BatchUpdateChargesResult'> = {
43
56
  Query: {
44
57
  charge: async (_, { chargeId }, { injector }) => {
45
- const charge = await injector.get(ChargesProvider).getChargeByIdLoader.load(chargeId);
46
- if (!charge) {
47
- throw new GraphQLError(`Charge ID="${chargeId}" not found`);
58
+ try {
59
+ const charge = await injector.get(ChargesProvider).getChargeByIdLoader.load(chargeId);
60
+ if (!charge) {
61
+ throw new GraphQLError(`Charge ID="${chargeId}" not found`);
62
+ }
63
+ return charge;
64
+ } catch (error) {
65
+ throw errorSimplifier('Failed to fetch charge by ID', error);
48
66
  }
49
- return charge;
50
67
  },
51
68
  chargesByIDs: async (_, { chargeIDs }, { injector }) => {
52
69
  if (chargeIDs.length === 0) {
53
70
  return [];
54
71
  }
55
72
 
56
- const dbCharges = await injector.get(ChargesProvider).getChargeByIdLoader.loadMany(chargeIDs);
57
- if (!dbCharges) {
58
- if (chargeIDs.length === 1) {
59
- throw new GraphQLError(`Charge ID="${chargeIDs[0]}" not found`);
60
- } else {
61
- throw new GraphQLError(`Couldn't find any charges`);
73
+ try {
74
+ const dbCharges = await injector
75
+ .get(ChargesProvider)
76
+ .getChargeByIdLoader.loadMany(chargeIDs);
77
+ if (!dbCharges) {
78
+ if (chargeIDs.length === 1) {
79
+ throw new GraphQLError(`Charge ID="${chargeIDs[0]}" not found`);
80
+ } else {
81
+ throw new GraphQLError(`Couldn't find any charges`);
82
+ }
62
83
  }
63
- }
64
84
 
65
- const charges = chargeIDs.map(id => {
66
- const charge = dbCharges.find(charge => charge && 'id' in charge && charge.id === id);
67
- if (!charge) {
68
- throw new GraphQLError(`Charge ID="${id}" not found`);
69
- }
70
- return charge as ChargeRequiredWrapper<IGetChargesByIdsResult>;
71
- });
72
- return charges;
85
+ const charges = chargeIDs.map(id => {
86
+ const charge = dbCharges.find(charge => charge && 'id' in charge && charge.id === id);
87
+ if (!charge) {
88
+ throw new GraphQLError(`Charge ID="${id}" not found`);
89
+ }
90
+ return charge as ChargeRequiredWrapper<IGetChargesByIdsResult>;
91
+ });
92
+ return charges;
93
+ } catch (error) {
94
+ throw errorSimplifier('Failed to fetch charges by IDs', error);
95
+ }
73
96
  },
74
97
  allCharges: async (_, { filters, page, limit }, { injector }) => {
75
98
  // handle sort column
@@ -105,13 +128,8 @@ export const chargesResolvers: ChargesModule.Resolvers &
105
128
  tags: filters?.byTags,
106
129
  accountantStatuses: filters?.accountantStatus as accountant_statusArray | undefined,
107
130
  })
108
- .catch(e => {
109
- const message = 'Error fetching charges';
110
- console.error(`${message}: ${e}`);
111
- if (e instanceof GraphQLError) {
112
- throw e;
113
- }
114
- throw new GraphQLError(message);
131
+ .catch(error => {
132
+ throw errorSimplifier('Error fetching charges', error);
115
133
  });
116
134
 
117
135
  const pageCharges = charges.slice(page * limit, (page + 1) * limit);
@@ -126,121 +144,125 @@ export const chargesResolvers: ChargesModule.Resolvers &
126
144
  };
127
145
  },
128
146
  chargesWithMissingRequiredInfo: async (_, { page, limit }, { injector, adminContext }) => {
129
- const chargeIds = new Set<string>();
130
- // get by transactions
131
- const getByTransactionsPromise = injector
132
- .get(TransactionsProvider)
133
- .getTransactionsByMissingRequiredInfo()
134
- .then(transactions => {
135
- transactions.map(transaction => {
136
- if (transaction.charge_id) {
137
- chargeIds.add(transaction.charge_id);
138
- }
147
+ try {
148
+ const chargeIds = new Set<string>();
149
+ // get by transactions
150
+ const getByTransactionsPromise = injector
151
+ .get(TransactionsProvider)
152
+ .getTransactionsByMissingRequiredInfo()
153
+ .then(transactions => {
154
+ transactions.map(transaction => {
155
+ if (transaction.charge_id) {
156
+ chargeIds.add(transaction.charge_id);
157
+ }
158
+ });
139
159
  });
140
- });
141
160
 
142
- // get by documents
143
- const getByDocumentsPromise = injector
144
- .get(DocumentsProvider)
145
- .getDocumentsByMissingRequiredInfo()
146
- .then(documents => {
147
- documents.map(document => {
148
- if (document.charge_id) {
149
- chargeIds.add(document.charge_id);
150
- }
161
+ // get by documents
162
+ const getByDocumentsPromise = injector
163
+ .get(DocumentsProvider)
164
+ .getDocumentsByMissingRequiredInfo()
165
+ .then(documents => {
166
+ documents.map(document => {
167
+ if (document.charge_id) {
168
+ chargeIds.add(document.charge_id);
169
+ }
170
+ });
151
171
  });
152
- });
153
172
 
154
- // get by charge
155
- const getByChargesPromise = injector
156
- .get(ChargesProvider)
157
- .getChargesByMissingRequiredInfo()
158
- .then(charges => {
159
- charges.map(charge => {
160
- if (charge.id) {
161
- chargeIds.add(charge.id);
162
- }
173
+ // get by charge
174
+ const getByChargesPromise = injector
175
+ .get(ChargesProvider)
176
+ .getChargesByMissingRequiredInfo()
177
+ .then(charges => {
178
+ charges.map(charge => {
179
+ if (charge.id) {
180
+ chargeIds.add(charge.id);
181
+ }
182
+ });
163
183
  });
164
- });
165
184
 
166
- await Promise.all([getByTransactionsPromise, getByDocumentsPromise, getByChargesPromise]);
185
+ await Promise.all([getByTransactionsPromise, getByDocumentsPromise, getByChargesPromise]);
186
+
187
+ const charges = await Promise.all(
188
+ Array.from(chargeIds).map(async id => {
189
+ const [
190
+ charge,
191
+ { transactionsMinDebitDate, transactionsMinEventDate },
192
+ { ledgerMinInvoiceDate, ledgerMinValueDate },
193
+ { documentsMinDate },
194
+ ] = await Promise.all([
195
+ injector
196
+ .get(ChargesProvider)
197
+ .getChargeByIdLoader.load(id)
198
+ .then(charge => {
199
+ if (!charge) {
200
+ throw new GraphQLError(`Charge ID="${id}" not found`);
201
+ }
202
+ return charge;
203
+ })
204
+ .catch(e => {
205
+ const message = `Error loading charge ID="${id}"`;
206
+ console.error(`${message}: ${e}`);
207
+ throw new GraphQLError(message);
208
+ }),
209
+ getChargeTransactionsMeta(id, injector),
210
+ getChargeLedgerMeta(id, injector),
211
+ getChargeDocumentsMeta(id, injector),
212
+ ]);
213
+ return {
214
+ ...charge,
215
+ transactionsMinDebitDate,
216
+ transactionsMinEventDate,
217
+ ledgerMinInvoiceDate,
218
+ ledgerMinValueDate,
219
+ documentsMinDate,
220
+ };
221
+ }),
222
+ );
167
223
 
168
- const charges = await Promise.all(
169
- Array.from(chargeIds).map(async id => {
170
- const [
171
- charge,
172
- { transactionsMinDebitDate, transactionsMinEventDate },
173
- { ledgerMinInvoiceDate, ledgerMinValueDate },
174
- { documentsMinDate },
175
- ] = await Promise.all([
176
- injector
177
- .get(ChargesProvider)
178
- .getChargeByIdLoader.load(id)
179
- .then(charge => {
180
- if (!charge) {
181
- throw new GraphQLError(`Charge ID="${id}" not found`);
182
- }
183
- return charge;
184
- })
185
- .catch(e => {
186
- const message = `Error loading charge ID="${id}"`;
187
- console.error(`${message}: ${e}`);
188
- throw new GraphQLError(message);
189
- }),
190
- getChargeTransactionsMeta(id, injector),
191
- getChargeLedgerMeta(id, injector),
192
- getChargeDocumentsMeta(id, injector),
193
- ]);
194
- return {
195
- ...charge,
196
- transactionsMinDebitDate,
197
- transactionsMinEventDate,
198
- ledgerMinInvoiceDate,
199
- ledgerMinValueDate,
200
- documentsMinDate,
201
- };
202
- }),
203
- );
204
-
205
- const pageCharges = charges
206
- .filter(charge => charge.owner_id === adminContext.defaultAdminBusinessId)
207
- .sort((chargeA, chargeB) => {
208
- const dateA =
209
- (
210
- chargeA.documentsMinDate ||
211
- chargeA.transactionsMinDebitDate ||
212
- chargeA.transactionsMinEventDate ||
213
- chargeA.ledgerMinValueDate ||
214
- chargeA.ledgerMinInvoiceDate
215
- )?.getTime() ?? 0;
216
- const dateB =
217
- (
218
- chargeB.documentsMinDate ||
219
- chargeB.transactionsMinDebitDate ||
220
- chargeB.transactionsMinEventDate ||
221
- chargeB.ledgerMinValueDate ||
222
- chargeB.ledgerMinInvoiceDate
223
- )?.getTime() ?? 0;
224
-
225
- if (dateA > dateB) {
226
- return -1;
227
- }
228
- if (dateA < dateB) {
229
- return 1;
230
- }
224
+ const pageCharges = charges
225
+ .filter(charge => charge.owner_id === adminContext.defaultAdminBusinessId)
226
+ .sort((chargeA, chargeB) => {
227
+ const dateA =
228
+ (
229
+ chargeA.documentsMinDate ||
230
+ chargeA.transactionsMinDebitDate ||
231
+ chargeA.transactionsMinEventDate ||
232
+ chargeA.ledgerMinValueDate ||
233
+ chargeA.ledgerMinInvoiceDate
234
+ )?.getTime() ?? 0;
235
+ const dateB =
236
+ (
237
+ chargeB.documentsMinDate ||
238
+ chargeB.transactionsMinDebitDate ||
239
+ chargeB.transactionsMinEventDate ||
240
+ chargeB.ledgerMinValueDate ||
241
+ chargeB.ledgerMinInvoiceDate
242
+ )?.getTime() ?? 0;
243
+
244
+ if (dateA > dateB) {
245
+ return -1;
246
+ }
247
+ if (dateA < dateB) {
248
+ return 1;
249
+ }
231
250
 
232
- return chargeA.id.localeCompare(chargeB.id);
233
- })
234
- .slice(page * limit - limit, page * limit);
251
+ return chargeA.id.localeCompare(chargeB.id);
252
+ })
253
+ .slice(page * limit - limit, page * limit);
235
254
 
236
- return {
237
- __typename: 'PaginatedCharges',
238
- nodes: pageCharges,
239
- pageInfo: {
240
- totalPages: Math.ceil(charges.length / limit),
241
- totalRecords: charges.length,
242
- },
243
- };
255
+ return {
256
+ __typename: 'PaginatedCharges',
257
+ nodes: pageCharges,
258
+ pageInfo: {
259
+ totalPages: Math.ceil(charges.length / limit),
260
+ totalRecords: charges.length,
261
+ },
262
+ };
263
+ } catch (error) {
264
+ throw errorSimplifier('Failed to fetch charges with missing required info', error);
265
+ }
244
266
  },
245
267
  },
246
268
  Mutation: {
@@ -368,6 +390,8 @@ export const chargesResolvers: ChargesModule.Resolvers &
368
390
  let message = 'Error updating charges';
369
391
  if (e instanceof GraphQLError) {
370
392
  message = e.message;
393
+ } else {
394
+ console.error(e);
371
395
  }
372
396
  return {
373
397
  __typename: 'CommonError',
@@ -461,6 +485,8 @@ export const chargesResolvers: ChargesModule.Resolvers &
461
485
  let message = 'Error updating charges';
462
486
  if (e instanceof GraphQLError) {
463
487
  message = e.message;
488
+ } else {
489
+ console.error(e);
464
490
  }
465
491
  return {
466
492
  __typename: 'CommonError',
@@ -506,6 +532,8 @@ export const chargesResolvers: ChargesModule.Resolvers &
506
532
  } catch (e) {
507
533
  if (e instanceof GraphQLError) {
508
534
  throw e;
535
+ } else {
536
+ console.error(e);
509
537
  }
510
538
  return {
511
539
  __typename: 'CommonError',
@@ -535,6 +563,8 @@ export const chargesResolvers: ChargesModule.Resolvers &
535
563
  } catch (e) {
536
564
  if (e instanceof GraphQLError) {
537
565
  throw e;
566
+ } else {
567
+ console.error(e);
538
568
  }
539
569
  console.error(e);
540
570
  throw new GraphQLError(`Error deleting charge ID="${chargeId}"`);
@@ -564,52 +594,52 @@ export const chargesResolvers: ChargesModule.Resolvers &
564
594
  },
565
595
  CommonCharge: {
566
596
  __isTypeOf: async (DbCharge, context) =>
567
- (await getChargeType(DbCharge, context)) === ChargeTypeEnum.Common,
597
+ chargeTypeChecker(ChargeTypeEnum.Common, DbCharge, context),
568
598
  ...commonChargeFields,
569
599
  },
570
600
  ConversionCharge: {
571
601
  __isTypeOf: async (DbCharge, context) =>
572
- (await getChargeType(DbCharge, context)) === ChargeTypeEnum.Conversion,
602
+ chargeTypeChecker(ChargeTypeEnum.Conversion, DbCharge, context),
573
603
  ...commonChargeFields,
574
604
  },
575
605
  SalaryCharge: {
576
606
  __isTypeOf: async (DbCharge, context) =>
577
- (await getChargeType(DbCharge, context)) === ChargeTypeEnum.Salary,
607
+ chargeTypeChecker(ChargeTypeEnum.Salary, DbCharge, context),
578
608
  ...commonChargeFields,
579
609
  },
580
610
  InternalTransferCharge: {
581
611
  __isTypeOf: async (DbCharge, context) =>
582
- (await getChargeType(DbCharge, context)) === ChargeTypeEnum.InternalTransfer,
612
+ chargeTypeChecker(ChargeTypeEnum.InternalTransfer, DbCharge, context),
583
613
  ...commonChargeFields,
584
614
  },
585
615
  DividendCharge: {
586
616
  __isTypeOf: async (DbCharge, context) =>
587
- (await getChargeType(DbCharge, context)) === ChargeTypeEnum.Dividend,
617
+ chargeTypeChecker(ChargeTypeEnum.Dividend, DbCharge, context),
588
618
  ...commonChargeFields,
589
619
  },
590
620
  BusinessTripCharge: {
591
621
  __isTypeOf: async (DbCharge, context) =>
592
- (await getChargeType(DbCharge, context)) === ChargeTypeEnum.BusinessTrip,
622
+ chargeTypeChecker(ChargeTypeEnum.BusinessTrip, DbCharge, context),
593
623
  ...commonChargeFields,
594
624
  },
595
625
  MonthlyVatCharge: {
596
626
  __isTypeOf: async (DbCharge, context) =>
597
- (await getChargeType(DbCharge, context)) === ChargeTypeEnum.MonthlyVat,
627
+ chargeTypeChecker(ChargeTypeEnum.MonthlyVat, DbCharge, context),
598
628
  ...commonChargeFields,
599
629
  },
600
630
  BankDepositCharge: {
601
631
  __isTypeOf: async (DbCharge, context) =>
602
- (await getChargeType(DbCharge, context)) === ChargeTypeEnum.BankDeposit,
632
+ chargeTypeChecker(ChargeTypeEnum.BankDeposit, DbCharge, context),
603
633
  ...commonChargeFields,
604
634
  },
605
635
  ForeignSecuritiesCharge: {
606
636
  __isTypeOf: async (DbCharge, context) =>
607
- (await getChargeType(DbCharge, context)) === ChargeTypeEnum.ForeignSecurities,
637
+ chargeTypeChecker(ChargeTypeEnum.ForeignSecurities, DbCharge, context),
608
638
  ...commonChargeFields,
609
639
  },
610
640
  CreditcardBankCharge: {
611
641
  __isTypeOf: async (DbCharge, context) =>
612
- (await getChargeType(DbCharge, context)) === ChargeTypeEnum.CreditcardBankCharge,
642
+ chargeTypeChecker(ChargeTypeEnum.CreditcardBankCharge, DbCharge, context),
613
643
  ...commonChargeFields,
614
644
  },
615
645
  Invoice: {
@@ -643,9 +673,7 @@ export const chargesResolvers: ChargesModule.Resolvers &
643
673
  .getDocumentsByChargeIdLoader.load(DbCharge.id)
644
674
  .then(docs => docs.filter(doc => isInvoice(doc.type)).length);
645
675
  } catch (err) {
646
- const message = 'Error loading invoices';
647
- console.error(`${message}: ${err}`);
648
- throw new GraphQLError(message);
676
+ throw errorSimplifier('Error loading invoices', err);
649
677
  }
650
678
  },
651
679
  receiptsCount: async (DbCharge, _, { injector }) => {
@@ -655,9 +683,7 @@ export const chargesResolvers: ChargesModule.Resolvers &
655
683
  .getDocumentsByChargeIdLoader.load(DbCharge.id)
656
684
  .then(docs => docs.filter(doc => isReceipt(doc.type)).length);
657
685
  } catch (err) {
658
- const message = 'Error loading receipts';
659
- console.error(`${message}: ${err}`);
660
- throw new GraphQLError(message);
686
+ throw errorSimplifier('Error loading receipts', err);
661
687
  }
662
688
  },
663
689
  documentsCount: async (DbCharge, _, { injector }) => {
@@ -667,26 +693,33 @@ export const chargesResolvers: ChargesModule.Resolvers &
667
693
  .getDocumentsByChargeIdLoader.load(DbCharge.id)
668
694
  .then(docs => docs.length);
669
695
  } catch (err) {
670
- const message = 'Error loading documents';
671
- console.error(`${message}: ${err}`);
672
- throw new GraphQLError(message);
696
+ throw errorSimplifier('Error loading documents', err);
673
697
  }
674
698
  },
675
699
  openDocuments: async (DbCharge, _, { injector }) =>
676
700
  injector
677
701
  .get(IssuedDocumentsProvider)
678
702
  .getIssuedDocumentsStatusByChargeIdLoader.load(DbCharge.id)
703
+ .catch(error => {
704
+ throw errorSimplifier('Error loading open documents status', error);
705
+ })
679
706
  .then(res => res?.open_docs_flag ?? false),
680
707
  transactionsCount: async (DbCharge, _, { injector }) => {
681
708
  const transactions = await injector
682
709
  .get(TransactionsProvider)
683
- .transactionsByChargeIDLoader.load(DbCharge.id);
710
+ .transactionsByChargeIDLoader.load(DbCharge.id)
711
+ .catch(error => {
712
+ throw errorSimplifier('Error loading transactions', error);
713
+ });
684
714
  return transactions.length;
685
715
  },
686
716
  ledgerCount: async (DbCharge, _, { injector }) =>
687
717
  injector
688
718
  .get(LedgerProvider)
689
719
  .getLedgerRecordsByChargesIdLoader.load(DbCharge.id)
720
+ .catch(error => {
721
+ throw errorSimplifier('Error loading ledger records', error);
722
+ })
690
723
  .then(records => records.length),
691
724
  invalidLedger: async (DbCharge, _, context, info) => {
692
725
  try {
@@ -737,14 +770,16 @@ export const chargesResolvers: ChargesModule.Resolvers &
737
770
  .getExpensesByChargeIdLoader.load(DbCharge.id)
738
771
  .then(res => res.length);
739
772
  } catch (err) {
740
- const message = 'Error loading misc expenses';
741
- console.error(`${message}: ${err}`);
742
- throw new GraphQLError(message);
773
+ throw errorSimplifier('Error loading misc expenses', err);
743
774
  }
744
775
  },
745
776
  optionalBusinesses: async (DbCharge, _, { injector }) => {
746
- const { allBusinessIds } = await getChargeBusinesses(DbCharge.id, injector);
747
- return allBusinessIds.length > 1 ? allBusinessIds : [];
777
+ try {
778
+ const { allBusinessIds } = await getChargeBusinesses(DbCharge.id, injector);
779
+ return allBusinessIds.length > 1 ? allBusinessIds : [];
780
+ } catch (error) {
781
+ throw errorSimplifier('Failed to fetch optional businesses', error);
782
+ }
748
783
  },
749
784
  isSalary: DbCharge => DbCharge.type === 'PAYROLL',
750
785
  },
@@ -1,4 +1,4 @@
1
- import { GraphQLError } from 'graphql';
1
+ import { errorSimplifier } from '../../../shared/errors.js';
2
2
  import { dateToTimelessDateString, formatFinancialAmount } from '../../../shared/helpers/index.js';
3
3
  import { DepreciationProvider } from '../../depreciation/providers/depreciation.provider.js';
4
4
  import {
@@ -14,16 +14,22 @@ import type { ChargesModule } from '../types.js';
14
14
  export const commonChargeFields: ChargesModule.ChargeResolvers = {
15
15
  id: DbCharge => DbCharge.id,
16
16
  vat: async (dbCharge, _, { injector }) => {
17
- const { documentsVatAmount, documentsCurrency } = await getChargeDocumentsMeta(
18
- dbCharge.id,
19
- injector,
20
- );
21
- return documentsVatAmount != null && documentsCurrency
22
- ? formatFinancialAmount(documentsVatAmount, documentsCurrency)
23
- : null;
17
+ try {
18
+ const { documentsVatAmount, documentsCurrency } = await getChargeDocumentsMeta(
19
+ dbCharge.id,
20
+ injector,
21
+ );
22
+ return documentsVatAmount != null && documentsCurrency
23
+ ? formatFinancialAmount(documentsVatAmount, documentsCurrency)
24
+ : null;
25
+ } catch (error) {
26
+ throw errorSimplifier('Failed to fetch VAT amount', error);
27
+ }
24
28
  },
25
29
  totalAmount: async (dbCharge, _, { adminContext: { defaultLocalCurrency }, injector }) =>
26
- calculateTotalAmount(dbCharge.id, injector, defaultLocalCurrency),
30
+ calculateTotalAmount(dbCharge.id, injector, defaultLocalCurrency).catch(error => {
31
+ throw errorSimplifier('Failed to fetch total amount', error);
32
+ }),
27
33
  property: async (dbCharge, _, { injector }) => {
28
34
  try {
29
35
  const depreciation = await injector
@@ -31,9 +37,7 @@ export const commonChargeFields: ChargesModule.ChargeResolvers = {
31
37
  .getDepreciationRecordsByChargeIdLoader.load(dbCharge.id);
32
38
  return depreciation.length > 0;
33
39
  } catch (error) {
34
- const message = `Failed to fetch depreciation records`;
35
- console.error(`${message} for charge ID=${dbCharge.id}: `, error);
36
- throw new GraphQLError(message);
40
+ throw errorSimplifier('Failed to fetch depreciation records', error);
37
41
  }
38
42
  },
39
43
  conversion: DbCharge => DbCharge.type === 'CONVERSION',
@@ -44,30 +48,39 @@ export const commonChargeFields: ChargesModule.ChargeResolvers = {
44
48
  getChargeTransactionsMeta(DbCharge.id, injector)
45
49
  .then(({ transactionsMinEventDate }) => transactionsMinEventDate)
46
50
  .catch(error => {
47
- console.error('Failed to fetch charge transactions meta:', error);
48
- throw new GraphQLError('Failed to fetch min event date');
51
+ throw errorSimplifier('Failed to fetch charge transactions meta', error);
49
52
  }),
50
53
  minDebitDate: async (DbCharge, _, { injector }) =>
51
54
  getChargeTransactionsMeta(DbCharge.id, injector)
52
55
  .then(({ transactionsMinDebitDate }) => transactionsMinDebitDate)
53
56
  .catch(error => {
54
- console.error('Failed to fetch charge transactions meta:', error);
55
- throw new GraphQLError('Failed to fetch min debit date');
57
+ throw errorSimplifier('Failed to fetch min debit date', error);
56
58
  }),
57
59
  minDocumentsDate: async (DbCharge, _, { injector }) =>
58
- getChargeDocumentsMeta(DbCharge.id, injector).then(docsMeta => docsMeta.documentsMinDate),
59
- validationData: (DbCharge, _, context) => validateCharge(DbCharge, context),
60
+ getChargeDocumentsMeta(DbCharge.id, injector)
61
+ .then(docsMeta => docsMeta.documentsMinDate)
62
+ .catch(error => {
63
+ throw errorSimplifier('Failed to fetch min documents date', error);
64
+ }),
65
+ validationData: (DbCharge, _, context) =>
66
+ validateCharge(DbCharge, context).catch(error => {
67
+ throw errorSimplifier('Failed to fetch validation data', error);
68
+ }),
60
69
  metadata: DbCharge => DbCharge,
61
70
  yearsOfRelevance: async (DbCharge, _, { injector }) => {
62
- const spreadRecords = await injector
63
- .get(ChargeSpreadProvider)
64
- .getChargeSpreadByChargeIdLoader.load(DbCharge.id);
65
- return (
66
- spreadRecords?.map(record => ({
67
- year: dateToTimelessDateString(record.year_of_relevance),
68
- amount: record.amount ? Number(record.amount) : null,
69
- })) ?? null
70
- );
71
+ try {
72
+ const spreadRecords = await injector
73
+ .get(ChargeSpreadProvider)
74
+ .getChargeSpreadByChargeIdLoader.load(DbCharge.id);
75
+ return (
76
+ spreadRecords?.map(record => ({
77
+ year: dateToTimelessDateString(record.year_of_relevance),
78
+ amount: record.amount ? Number(record.amount) : null,
79
+ })) ?? null
80
+ );
81
+ } catch (error) {
82
+ throw errorSimplifier('Failed to fetch charge spread records', error);
83
+ }
71
84
  },
72
85
  optionalVAT: DbCharge => DbCharge.optional_vat,
73
86
  optionalDocuments: DbCharge => DbCharge.documents_optional_flag,
@@ -78,9 +91,13 @@ export const commonDocumentsFields: ChargesModule.DocumentResolvers = {
78
91
  if (!documentRoot.charge_id) {
79
92
  return null;
80
93
  }
81
- const charge = await injector
82
- .get(ChargesProvider)
83
- .getChargeByIdLoader.load(documentRoot.charge_id);
84
- return charge ?? null;
94
+ try {
95
+ const charge = await injector
96
+ .get(ChargesProvider)
97
+ .getChargeByIdLoader.load(documentRoot.charge_id);
98
+ return charge ?? null;
99
+ } catch (error) {
100
+ throw errorSimplifier('Failed to fetch charge for document', error);
101
+ }
85
102
  },
86
103
  };