@accounter/server 0.0.9-alpha-20260104175259-0cfdb3799f7d10fb1cc55d2927f207878d58a147 → 0.0.9-alpha-20260104192330-5023f4398b22d4c0c52b68b62c7a290e03de417e

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 CHANGED
@@ -1,6 +1,6 @@
1
1
  # @accounter/server
2
2
 
3
- ## 0.0.9-alpha-20260104175259-0cfdb3799f7d10fb1cc55d2927f207878d58a147
3
+ ## 0.0.9-alpha-20260104192330-5023f4398b22d4c0c52b68b62c7a290e03de417e
4
4
 
5
5
  ### Patch Changes
6
6
 
@@ -609,10 +609,10 @@
609
609
  [`1c209c8`](https://github.com/Urigo/accounter-fullstack/commit/1c209c8a6045bef747039bbff3780812c6b8678f),
610
610
  [`bc3ab26`](https://github.com/Urigo/accounter-fullstack/commit/bc3ab260704b677363561ef1c9403eac704a29aa),
611
611
  [`c7d6f21`](https://github.com/Urigo/accounter-fullstack/commit/c7d6f21ed62658159b1323334501daca03c8d3e5)]:
612
- - @accounter/green-invoice-graphql@0.8.3-alpha-20260104175259-0cfdb3799f7d10fb1cc55d2927f207878d58a147
613
- - @accounter/pcn874-generator@0.6.4-alpha-20260104175259-0cfdb3799f7d10fb1cc55d2927f207878d58a147
614
- - @accounter/shaam-uniform-format-generator@0.2.3-alpha-20260104175259-0cfdb3799f7d10fb1cc55d2927f207878d58a147
615
- - @accounter/shaam6111-generator@0.1.5-alpha-20260104175259-0cfdb3799f7d10fb1cc55d2927f207878d58a147
612
+ - @accounter/green-invoice-graphql@0.8.3-alpha-20260104192330-5023f4398b22d4c0c52b68b62c7a290e03de417e
613
+ - @accounter/pcn874-generator@0.6.4-alpha-20260104192330-5023f4398b22d4c0c52b68b62c7a290e03de417e
614
+ - @accounter/shaam-uniform-format-generator@0.2.3-alpha-20260104192330-5023f4398b22d4c0c52b68b62c7a290e03de417e
615
+ - @accounter/shaam6111-generator@0.1.5-alpha-20260104192330-5023f4398b22d4c0c52b68b62c7a290e03de417e
616
616
 
617
617
  ## 0.0.8
618
618
 
@@ -1,14 +1,4 @@
1
- import { DocumentType } from '../../../shared/enums.js';
2
- /**
3
- * Accounting document types that count toward matched/unmatched status
4
- */
5
- const ACCOUNTING_DOC_TYPES = [
6
- DocumentType.Invoice,
7
- DocumentType.CreditInvoice,
8
- DocumentType.Receipt,
9
- DocumentType.InvoiceReceipt,
10
- DocumentType.Proforma,
11
- ];
1
+ import { isAccountingDocument } from '../../documents/helpers/common.helper.js';
12
2
  /**
13
3
  * Validate a charge is properly formed for matching
14
4
  * @throws Error with descriptive message if invalid
@@ -25,7 +15,8 @@ export function validateChargeForMatching(charge) {
25
15
  }
26
16
  // Check if charge has data
27
17
  const hasTransactions = charge.transactions && charge.transactions.length > 0;
28
- const hasDocuments = charge.documents && charge.documents.length > 0;
18
+ const hasDocuments = charge.documents &&
19
+ charge.documents.filter(doc => isAccountingDocument(doc.type, true)).length > 0;
29
20
  if (!hasTransactions && !hasDocuments) {
30
21
  throw new Error(`Charge ${charge.id} has no transactions or documents - cannot be matched`);
31
22
  }
@@ -35,7 +26,7 @@ export function validateChargeForMatching(charge) {
35
26
  */
36
27
  export function isChargeMatched(charge) {
37
28
  const hasTransactions = charge.transactions && charge.transactions.length > 0;
38
- const hasAccountingDocs = charge.documents?.some(doc => ACCOUNTING_DOC_TYPES.includes(doc.type));
29
+ const hasAccountingDocs = charge.documents?.some(doc => isAccountingDocument(doc.type, true));
39
30
  return !!hasTransactions && !!hasAccountingDocs;
40
31
  }
41
32
  /**
@@ -43,7 +34,7 @@ export function isChargeMatched(charge) {
43
34
  */
44
35
  export function hasOnlyTransactions(charge) {
45
36
  const hasTransactions = charge.transactions && charge.transactions.length > 0;
46
- const hasAccountingDocs = charge.documents?.some(doc => ACCOUNTING_DOC_TYPES.includes(doc.type));
37
+ const hasAccountingDocs = charge.documents?.some(doc => isAccountingDocument(doc.type, true));
47
38
  return !!hasTransactions && !hasAccountingDocs;
48
39
  }
49
40
  /**
@@ -51,7 +42,7 @@ export function hasOnlyTransactions(charge) {
51
42
  */
52
43
  export function hasOnlyDocuments(charge) {
53
44
  const hasTransactions = charge.transactions && charge.transactions.length > 0;
54
- const hasAccountingDocs = charge.documents?.some(doc => ACCOUNTING_DOC_TYPES.includes(doc.type));
45
+ const hasAccountingDocs = charge.documents?.some(doc => isAccountingDocument(doc.type, true));
55
46
  return !hasTransactions && !!hasAccountingDocs;
56
47
  }
57
48
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"charge-validator.helper.js","sourceRoot":"","sources":["../../../../../../src/modules/charges-matcher/helpers/charge-validator.helper.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAaxD;;GAEG;AACH,MAAM,oBAAoB,GAAmB;IAC3C,YAAY,CAAC,OAAO;IACpB,YAAY,CAAC,aAAa;IAC1B,YAAY,CAAC,OAAO;IACpB,YAAY,CAAC,cAAc;IAC3B,YAAY,CAAC,QAAQ;CACtB,CAAC;AAEF;;;GAGG;AACH,MAAM,UAAU,yBAAyB,CAAC,MAAc;IACtD,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC;IACxC,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;IAC5C,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;QACrB,MAAM,IAAI,KAAK,CAAC,UAAU,MAAM,CAAC,EAAE,wBAAwB,CAAC,CAAC;IAC/D,CAAC;IAED,2BAA2B;IAC3B,MAAM,eAAe,GAAG,MAAM,CAAC,YAAY,IAAI,MAAM,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC;IAC9E,MAAM,YAAY,GAAG,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC;IAErE,IAAI,CAAC,eAAe,IAAI,CAAC,YAAY,EAAE,CAAC;QACtC,MAAM,IAAI,KAAK,CAAC,UAAU,MAAM,CAAC,EAAE,uDAAuD,CAAC,CAAC;IAC9F,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,MAAc;IAC5C,MAAM,eAAe,GAAG,MAAM,CAAC,YAAY,IAAI,MAAM,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC;IAE9E,MAAM,iBAAiB,GAAG,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,CACrD,oBAAoB,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAoB,CAAC,CACxD,CAAC;IAEF,OAAO,CAAC,CAAC,eAAe,IAAI,CAAC,CAAC,iBAAiB,CAAC;AAClD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,MAAc;IAChD,MAAM,eAAe,GAAG,MAAM,CAAC,YAAY,IAAI,MAAM,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC;IAE9E,MAAM,iBAAiB,GAAG,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,CACrD,oBAAoB,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAoB,CAAC,CACxD,CAAC;IAEF,OAAO,CAAC,CAAC,eAAe,IAAI,CAAC,iBAAiB,CAAC;AACjD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,MAAc;IAC7C,MAAM,eAAe,GAAG,MAAM,CAAC,YAAY,IAAI,MAAM,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC;IAE9E,MAAM,iBAAiB,GAAG,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,CACrD,oBAAoB,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAoB,CAAC,CACxD,CAAC;IAEF,OAAO,CAAC,eAAe,IAAI,CAAC,CAAC,iBAAiB,CAAC;AACjD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,yBAAyB,CAAC,MAAc;IACtD,yBAAyB,CAAC,MAAM,CAAC,CAAC;IAElC,IAAI,eAAe,CAAC,MAAM,CAAC,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CACb,UAAU,MAAM,CAAC,EAAE,sEAAsE,CAC1F,CAAC;IACJ,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"charge-validator.helper.js","sourceRoot":"","sources":["../../../../../../src/modules/charges-matcher/helpers/charge-validator.helper.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,0CAA0C,CAAC;AAahF;;;GAGG;AACH,MAAM,UAAU,yBAAyB,CAAC,MAAc;IACtD,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC;IACxC,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;IAC5C,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;QACrB,MAAM,IAAI,KAAK,CAAC,UAAU,MAAM,CAAC,EAAE,wBAAwB,CAAC,CAAC;IAC/D,CAAC;IAED,2BAA2B;IAC3B,MAAM,eAAe,GAAG,MAAM,CAAC,YAAY,IAAI,MAAM,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC;IAC9E,MAAM,YAAY,GAChB,MAAM,CAAC,SAAS;QAChB,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,oBAAoB,CAAC,GAAG,CAAC,IAAoB,EAAE,IAAI,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;IAElG,IAAI,CAAC,eAAe,IAAI,CAAC,YAAY,EAAE,CAAC;QACtC,MAAM,IAAI,KAAK,CAAC,UAAU,MAAM,CAAC,EAAE,uDAAuD,CAAC,CAAC;IAC9F,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,MAAc;IAC5C,MAAM,eAAe,GAAG,MAAM,CAAC,YAAY,IAAI,MAAM,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC;IAE9E,MAAM,iBAAiB,GAAG,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,CACrD,oBAAoB,CAAC,GAAG,CAAC,IAAoB,EAAE,IAAI,CAAC,CACrD,CAAC;IAEF,OAAO,CAAC,CAAC,eAAe,IAAI,CAAC,CAAC,iBAAiB,CAAC;AAClD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,MAAc;IAChD,MAAM,eAAe,GAAG,MAAM,CAAC,YAAY,IAAI,MAAM,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC;IAE9E,MAAM,iBAAiB,GAAG,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,CACrD,oBAAoB,CAAC,GAAG,CAAC,IAAoB,EAAE,IAAI,CAAC,CACrD,CAAC;IAEF,OAAO,CAAC,CAAC,eAAe,IAAI,CAAC,iBAAiB,CAAC;AACjD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,MAAc;IAC7C,MAAM,eAAe,GAAG,MAAM,CAAC,YAAY,IAAI,MAAM,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC;IAE9E,MAAM,iBAAiB,GAAG,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,CACrD,oBAAoB,CAAC,GAAG,CAAC,IAAoB,EAAE,IAAI,CAAC,CACrD,CAAC;IAEF,OAAO,CAAC,eAAe,IAAI,CAAC,CAAC,iBAAiB,CAAC;AACjD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,yBAAyB,CAAC,MAAc;IACtD,yBAAyB,CAAC,MAAM,CAAC,CAAC;IAElC,IAAI,eAAe,CAAC,MAAM,CAAC,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CACb,UAAU,MAAM,CAAC,EAAE,sEAAsE,CAC1F,CAAC;IACJ,CAAC;AACH,CAAC"}
@@ -6,6 +6,7 @@
6
6
  * amount normalization, currency validation, date selection, and description concatenation.
7
7
  */
8
8
  import { DocumentType } from '../../../shared/enums.js';
9
+ import { isAccountingDocument } from '../../documents/helpers/common.helper.js';
9
10
  import { normalizeDocumentAmount } from '../helpers/document-amount.helper.js';
10
11
  import { extractDocumentBusiness } from '../helpers/document-business.helper.js';
11
12
  /**
@@ -58,17 +59,18 @@ function isReceiptType(type) {
58
59
  * // Returns aggregated with normalized amounts summed
59
60
  */
60
61
  export function aggregateDocuments(documents, adminBusinessId) {
62
+ const accountingDocuments = documents.filter(doc => isAccountingDocument(doc.type, true));
61
63
  // Validate non-empty input
62
- if (!documents || documents.length === 0) {
64
+ if (!accountingDocuments || accountingDocuments.length === 0) {
63
65
  throw new Error('Cannot aggregate documents: array is empty');
64
66
  }
65
67
  // Apply type priority filtering
66
- const hasInvoices = documents.some(d => isInvoiceType(d.type));
67
- const hasReceipts = documents.some(d => isReceiptType(d.type));
68
- let filteredDocuments = documents;
68
+ const hasInvoices = accountingDocuments.some(d => isInvoiceType(d.type));
69
+ const hasReceipts = accountingDocuments.some(d => isReceiptType(d.type));
70
+ let filteredDocuments = accountingDocuments;
69
71
  if (hasInvoices && hasReceipts) {
70
72
  // If both invoices and receipts exist, use only invoices
71
- filteredDocuments = documents.filter(d => isInvoiceType(d.type));
73
+ filteredDocuments = accountingDocuments.filter(d => isInvoiceType(d.type));
72
74
  }
73
75
  // Validate we still have documents after filtering
74
76
  if (filteredDocuments.length === 0) {
@@ -1 +1 @@
1
- {"version":3,"file":"document-aggregator.js","sourceRoot":"","sources":["../../../../../../src/modules/charges-matcher/providers/document-aggregator.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"document-aggregator.js","sourceRoot":"","sources":["../../../../../../src/modules/charges-matcher/providers/document-aggregator.ts"],"names":[],"mappings":"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"}
@@ -2,4 +2,5 @@ import { DocumentType } from '../../../shared/enums.js';
2
2
  import { document_type } from '../types.js';
3
3
  export declare function isInvoice(type: document_type): boolean;
4
4
  export declare function isReceipt(type: document_type): boolean;
5
+ export declare function isAccountingDocument(type: document_type, includeProforma?: boolean): boolean;
5
6
  export declare function getDocumentNameFromType(documentType: DocumentType): string;
@@ -7,6 +7,13 @@ export function isInvoice(type) {
7
7
  export function isReceipt(type) {
8
8
  return type === DocumentType.Receipt || type === DocumentType.InvoiceReceipt;
9
9
  }
10
+ export function isAccountingDocument(type, includeProforma = false) {
11
+ return (type === DocumentType.Invoice ||
12
+ type === DocumentType.CreditInvoice ||
13
+ type === DocumentType.Receipt ||
14
+ type === DocumentType.InvoiceReceipt ||
15
+ (includeProforma && type === DocumentType.Proforma));
16
+ }
10
17
  export function getDocumentNameFromType(documentType) {
11
18
  switch (documentType) {
12
19
  case DocumentType.Invoice:
@@ -1 +1 @@
1
- {"version":3,"file":"common.helper.js","sourceRoot":"","sources":["../../../../../../src/modules/documents/helpers/common.helper.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAGxD,MAAM,UAAU,SAAS,CAAC,IAAmB;IAC3C,OAAO,CACL,IAAI,KAAK,YAAY,CAAC,OAAO;QAC7B,IAAI,KAAK,YAAY,CAAC,aAAa;QACnC,IAAI,KAAK,YAAY,CAAC,cAAc,CACrC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,IAAmB;IAC3C,OAAO,IAAI,KAAK,YAAY,CAAC,OAAO,IAAI,IAAI,KAAK,YAAY,CAAC,cAAc,CAAC;AAC/E,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,YAA0B;IAChE,QAAQ,YAAY,EAAE,CAAC;QACrB,KAAK,YAAY,CAAC,OAAO;YACvB,OAAO,aAAa,CAAC;QACvB,KAAK,YAAY,CAAC,QAAQ;YACxB,OAAO,kBAAkB,CAAC;QAC5B,KAAK,YAAY,CAAC,cAAc;YAC9B,OAAO,mBAAmB,CAAC;QAC7B,KAAK,YAAY,CAAC,aAAa;YAC7B,OAAO,aAAa,CAAC;QACvB,KAAK,YAAY,CAAC,OAAO;YACvB,OAAO,SAAS,CAAC;QACnB,KAAK,YAAY,CAAC,KAAK;YACrB,OAAO,eAAe,CAAC;QACzB,KAAK,YAAY,CAAC,WAAW;YAC3B,OAAO,sBAAsB,CAAC;QAChC;YACE,MAAM,IAAI,KAAK,CAAC,8BAA8B,YAAY,EAAE,CAAC,CAAC;IAClE,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"common.helper.js","sourceRoot":"","sources":["../../../../../../src/modules/documents/helpers/common.helper.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAGxD,MAAM,UAAU,SAAS,CAAC,IAAmB;IAC3C,OAAO,CACL,IAAI,KAAK,YAAY,CAAC,OAAO;QAC7B,IAAI,KAAK,YAAY,CAAC,aAAa;QACnC,IAAI,KAAK,YAAY,CAAC,cAAc,CACrC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,IAAmB;IAC3C,OAAO,IAAI,KAAK,YAAY,CAAC,OAAO,IAAI,IAAI,KAAK,YAAY,CAAC,cAAc,CAAC;AAC/E,CAAC;AAED,MAAM,UAAU,oBAAoB,CAClC,IAAmB,EACnB,kBAA2B,KAAK;IAEhC,OAAO,CACL,IAAI,KAAK,YAAY,CAAC,OAAO;QAC7B,IAAI,KAAK,YAAY,CAAC,aAAa;QACnC,IAAI,KAAK,YAAY,CAAC,OAAO;QAC7B,IAAI,KAAK,YAAY,CAAC,cAAc;QACpC,CAAC,eAAe,IAAI,IAAI,KAAK,YAAY,CAAC,QAAQ,CAAC,CACpD,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,YAA0B;IAChE,QAAQ,YAAY,EAAE,CAAC;QACrB,KAAK,YAAY,CAAC,OAAO;YACvB,OAAO,aAAa,CAAC;QACvB,KAAK,YAAY,CAAC,QAAQ;YACxB,OAAO,kBAAkB,CAAC;QAC5B,KAAK,YAAY,CAAC,cAAc;YAC9B,OAAO,mBAAmB,CAAC;QAC7B,KAAK,YAAY,CAAC,aAAa;YAC7B,OAAO,aAAa,CAAC;QACvB,KAAK,YAAY,CAAC,OAAO;YACvB,OAAO,SAAS,CAAC;QACnB,KAAK,YAAY,CAAC,KAAK;YACrB,OAAO,eAAe,CAAC;QACzB,KAAK,YAAY,CAAC,WAAW;YAC3B,OAAO,sBAAsB,CAAC;QAChC;YACE,MAAM,IAAI,KAAK,CAAC,8BAA8B,YAAY,EAAE,CAAC,CAAC;IAClE,CAAC;AACH,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@accounter/server",
3
- "version": "0.0.9-alpha-20260104175259-0cfdb3799f7d10fb1cc55d2927f207878d58a147",
3
+ "version": "0.0.9-alpha-20260104192330-5023f4398b22d4c0c52b68b62c7a290e03de417e",
4
4
  "type": "module",
5
5
  "description": "",
6
6
  "license": "MIT",
@@ -1,4 +1,5 @@
1
1
  import { DocumentType } from '../../../shared/enums.js';
2
+ import { isAccountingDocument } from '../../documents/helpers/common.helper.js';
2
3
  import type { Document, Transaction } from '../types.js';
3
4
 
4
5
  /**
@@ -11,17 +12,6 @@ interface Charge {
11
12
  documents?: Document[];
12
13
  }
13
14
 
14
- /**
15
- * Accounting document types that count toward matched/unmatched status
16
- */
17
- const ACCOUNTING_DOC_TYPES: DocumentType[] = [
18
- DocumentType.Invoice,
19
- DocumentType.CreditInvoice,
20
- DocumentType.Receipt,
21
- DocumentType.InvoiceReceipt,
22
- DocumentType.Proforma,
23
- ];
24
-
25
15
  /**
26
16
  * Validate a charge is properly formed for matching
27
17
  * @throws Error with descriptive message if invalid
@@ -41,7 +31,9 @@ export function validateChargeForMatching(charge: Charge): void {
41
31
 
42
32
  // Check if charge has data
43
33
  const hasTransactions = charge.transactions && charge.transactions.length > 0;
44
- const hasDocuments = charge.documents && charge.documents.length > 0;
34
+ const hasDocuments =
35
+ charge.documents &&
36
+ charge.documents.filter(doc => isAccountingDocument(doc.type as DocumentType, true)).length > 0;
45
37
 
46
38
  if (!hasTransactions && !hasDocuments) {
47
39
  throw new Error(`Charge ${charge.id} has no transactions or documents - cannot be matched`);
@@ -55,7 +47,7 @@ export function isChargeMatched(charge: Charge): boolean {
55
47
  const hasTransactions = charge.transactions && charge.transactions.length > 0;
56
48
 
57
49
  const hasAccountingDocs = charge.documents?.some(doc =>
58
- ACCOUNTING_DOC_TYPES.includes(doc.type as DocumentType),
50
+ isAccountingDocument(doc.type as DocumentType, true),
59
51
  );
60
52
 
61
53
  return !!hasTransactions && !!hasAccountingDocs;
@@ -68,7 +60,7 @@ export function hasOnlyTransactions(charge: Charge): boolean {
68
60
  const hasTransactions = charge.transactions && charge.transactions.length > 0;
69
61
 
70
62
  const hasAccountingDocs = charge.documents?.some(doc =>
71
- ACCOUNTING_DOC_TYPES.includes(doc.type as DocumentType),
63
+ isAccountingDocument(doc.type as DocumentType, true),
72
64
  );
73
65
 
74
66
  return !!hasTransactions && !hasAccountingDocs;
@@ -81,7 +73,7 @@ export function hasOnlyDocuments(charge: Charge): boolean {
81
73
  const hasTransactions = charge.transactions && charge.transactions.length > 0;
82
74
 
83
75
  const hasAccountingDocs = charge.documents?.some(doc =>
84
- ACCOUNTING_DOC_TYPES.includes(doc.type as DocumentType),
76
+ isAccountingDocument(doc.type as DocumentType, true),
85
77
  );
86
78
 
87
79
  return !hasTransactions && !!hasAccountingDocs;
@@ -7,6 +7,7 @@
7
7
  */
8
8
 
9
9
  import { DocumentType } from '../../../shared/enums.js';
10
+ import { isAccountingDocument } from '../../documents/helpers/common.helper.js';
10
11
  import { currency, document_type } from '../../documents/types.js';
11
12
  import { normalizeDocumentAmount } from '../helpers/document-amount.helper.js';
12
13
  import { extractDocumentBusiness } from '../helpers/document-business.helper.js';
@@ -87,19 +88,20 @@ export function aggregateDocuments(
87
88
  documents: Document[],
88
89
  adminBusinessId: string,
89
90
  ): Omit<AggregatedDocument, 'businessIsCreditor'> {
91
+ const accountingDocuments = documents.filter(doc => isAccountingDocument(doc.type, true));
90
92
  // Validate non-empty input
91
- if (!documents || documents.length === 0) {
93
+ if (!accountingDocuments || accountingDocuments.length === 0) {
92
94
  throw new Error('Cannot aggregate documents: array is empty');
93
95
  }
94
96
 
95
97
  // Apply type priority filtering
96
- const hasInvoices = documents.some(d => isInvoiceType(d.type as DocumentType));
97
- const hasReceipts = documents.some(d => isReceiptType(d.type as DocumentType));
98
+ const hasInvoices = accountingDocuments.some(d => isInvoiceType(d.type as DocumentType));
99
+ const hasReceipts = accountingDocuments.some(d => isReceiptType(d.type as DocumentType));
98
100
 
99
- let filteredDocuments = documents;
101
+ let filteredDocuments = accountingDocuments;
100
102
  if (hasInvoices && hasReceipts) {
101
103
  // If both invoices and receipts exist, use only invoices
102
- filteredDocuments = documents.filter(d => isInvoiceType(d.type as DocumentType));
104
+ filteredDocuments = accountingDocuments.filter(d => isInvoiceType(d.type as DocumentType));
103
105
  }
104
106
 
105
107
  // Validate we still have documents after filtering
@@ -13,6 +13,19 @@ export function isReceipt(type: document_type): boolean {
13
13
  return type === DocumentType.Receipt || type === DocumentType.InvoiceReceipt;
14
14
  }
15
15
 
16
+ export function isAccountingDocument(
17
+ type: document_type,
18
+ includeProforma: boolean = false,
19
+ ): boolean {
20
+ return (
21
+ type === DocumentType.Invoice ||
22
+ type === DocumentType.CreditInvoice ||
23
+ type === DocumentType.Receipt ||
24
+ type === DocumentType.InvoiceReceipt ||
25
+ (includeProforma && type === DocumentType.Proforma)
26
+ );
27
+ }
28
+
16
29
  export function getDocumentNameFromType(documentType: DocumentType): string {
17
30
  switch (documentType) {
18
31
  case DocumentType.Invoice: