@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.
- package/CHANGELOG.md +5 -5
- package/dist/green-invoice-graphql/src/mesh-artifacts/index.d.ts +1 -1
- package/dist/server/src/modules/charges/helpers/common.helper.js +19 -13
- package/dist/server/src/modules/charges/helpers/common.helper.js.map +1 -1
- package/dist/server/src/modules/charges/resolvers/charge-suggestions/charge-suggestions.resolver.js +561 -545
- package/dist/server/src/modules/charges/resolvers/charge-suggestions/charge-suggestions.resolver.js.map +1 -1
- package/dist/server/src/modules/charges/resolvers/charges.resolver.js +179 -140
- package/dist/server/src/modules/charges/resolvers/charges.resolver.js.map +1 -1
- package/dist/server/src/modules/charges/resolvers/common.js +45 -26
- package/dist/server/src/modules/charges/resolvers/common.js.map +1 -1
- package/dist/server/src/modules/charges/resolvers/financial-charges.resolver.js +31 -25
- package/dist/server/src/modules/charges/resolvers/financial-charges.resolver.js.map +1 -1
- package/dist/server/src/shared/errors.d.ts +1 -0
- package/dist/server/src/shared/errors.js +7 -0
- package/dist/server/src/shared/errors.js.map +1 -1
- package/package.json +1 -1
- package/src/modules/charges/helpers/common.helper.ts +24 -19
- package/src/modules/charges/resolvers/charge-suggestions/charge-suggestions.resolver.ts +588 -574
- package/src/modules/charges/resolvers/charges.resolver.ts +192 -157
- package/src/modules/charges/resolvers/common.ts +48 -31
- package/src/modules/charges/resolvers/financial-charges.resolver.ts +31 -27
- 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
|
-
|
|
46
|
-
|
|
47
|
-
|
|
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
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
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
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
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(
|
|
109
|
-
|
|
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
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
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
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
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
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
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
|
-
|
|
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
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
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
|
-
|
|
233
|
-
|
|
234
|
-
|
|
251
|
+
return chargeA.id.localeCompare(chargeB.id);
|
|
252
|
+
})
|
|
253
|
+
.slice(page * limit - limit, page * limit);
|
|
235
254
|
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
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
|
-
(
|
|
597
|
+
chargeTypeChecker(ChargeTypeEnum.Common, DbCharge, context),
|
|
568
598
|
...commonChargeFields,
|
|
569
599
|
},
|
|
570
600
|
ConversionCharge: {
|
|
571
601
|
__isTypeOf: async (DbCharge, context) =>
|
|
572
|
-
(
|
|
602
|
+
chargeTypeChecker(ChargeTypeEnum.Conversion, DbCharge, context),
|
|
573
603
|
...commonChargeFields,
|
|
574
604
|
},
|
|
575
605
|
SalaryCharge: {
|
|
576
606
|
__isTypeOf: async (DbCharge, context) =>
|
|
577
|
-
(
|
|
607
|
+
chargeTypeChecker(ChargeTypeEnum.Salary, DbCharge, context),
|
|
578
608
|
...commonChargeFields,
|
|
579
609
|
},
|
|
580
610
|
InternalTransferCharge: {
|
|
581
611
|
__isTypeOf: async (DbCharge, context) =>
|
|
582
|
-
(
|
|
612
|
+
chargeTypeChecker(ChargeTypeEnum.InternalTransfer, DbCharge, context),
|
|
583
613
|
...commonChargeFields,
|
|
584
614
|
},
|
|
585
615
|
DividendCharge: {
|
|
586
616
|
__isTypeOf: async (DbCharge, context) =>
|
|
587
|
-
(
|
|
617
|
+
chargeTypeChecker(ChargeTypeEnum.Dividend, DbCharge, context),
|
|
588
618
|
...commonChargeFields,
|
|
589
619
|
},
|
|
590
620
|
BusinessTripCharge: {
|
|
591
621
|
__isTypeOf: async (DbCharge, context) =>
|
|
592
|
-
(
|
|
622
|
+
chargeTypeChecker(ChargeTypeEnum.BusinessTrip, DbCharge, context),
|
|
593
623
|
...commonChargeFields,
|
|
594
624
|
},
|
|
595
625
|
MonthlyVatCharge: {
|
|
596
626
|
__isTypeOf: async (DbCharge, context) =>
|
|
597
|
-
(
|
|
627
|
+
chargeTypeChecker(ChargeTypeEnum.MonthlyVat, DbCharge, context),
|
|
598
628
|
...commonChargeFields,
|
|
599
629
|
},
|
|
600
630
|
BankDepositCharge: {
|
|
601
631
|
__isTypeOf: async (DbCharge, context) =>
|
|
602
|
-
(
|
|
632
|
+
chargeTypeChecker(ChargeTypeEnum.BankDeposit, DbCharge, context),
|
|
603
633
|
...commonChargeFields,
|
|
604
634
|
},
|
|
605
635
|
ForeignSecuritiesCharge: {
|
|
606
636
|
__isTypeOf: async (DbCharge, context) =>
|
|
607
|
-
(
|
|
637
|
+
chargeTypeChecker(ChargeTypeEnum.ForeignSecurities, DbCharge, context),
|
|
608
638
|
...commonChargeFields,
|
|
609
639
|
},
|
|
610
640
|
CreditcardBankCharge: {
|
|
611
641
|
__isTypeOf: async (DbCharge, context) =>
|
|
612
|
-
(
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
747
|
-
|
|
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 {
|
|
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
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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)
|
|
59
|
-
|
|
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
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
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
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
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
|
};
|