@silexpert/core 2.0.108 → 2.0.110

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 (69) hide show
  1. package/dist/api/resources/FinancialProjection.d.ts +8 -0
  2. package/dist/api/resources/FinancialProjection.d.ts.map +1 -0
  3. package/dist/api/resources/FinancialProjection.js +14 -0
  4. package/dist/api/resources/FinancialProjection.js.map +1 -0
  5. package/dist/api/resources/Mandat.d.ts +2 -1
  6. package/dist/api/resources/Mandat.d.ts.map +1 -1
  7. package/dist/api/resources/Mandat.js +2 -2
  8. package/dist/api/resources/Mandat.js.map +1 -1
  9. package/dist/api/resources.d.ts +2 -0
  10. package/dist/api/resources.d.ts.map +1 -1
  11. package/dist/api/resources.js +2 -0
  12. package/dist/api/resources.js.map +1 -1
  13. package/dist/index.d.ts +1 -0
  14. package/dist/index.d.ts.map +1 -1
  15. package/dist/index.js +1 -0
  16. package/dist/index.js.map +1 -1
  17. package/dist/types/Enum/SocietyApproval.js +2 -2
  18. package/dist/types/Enum/SocietyApproval.js.map +1 -1
  19. package/dist/types/Interface/api/acd/DeduplicateAccounts.d.ts +5 -0
  20. package/dist/types/Interface/api/acd/DeduplicateAccounts.d.ts.map +1 -0
  21. package/dist/types/Interface/api/acd/DeduplicateAccounts.js +34 -0
  22. package/dist/types/Interface/api/acd/DeduplicateAccounts.js.map +1 -0
  23. package/dist/types/Interface/api/acd/Vat.d.ts +6 -0
  24. package/dist/types/Interface/api/acd/Vat.d.ts.map +1 -1
  25. package/dist/types/Interface/api/acd/Vat.js.map +1 -1
  26. package/dist/types/Interface/api/commercialManagement/Create.d.ts.map +1 -1
  27. package/dist/types/Interface/api/commercialManagement/Create.js +3 -1
  28. package/dist/types/Interface/api/commercialManagement/Create.js.map +1 -1
  29. package/dist/types/Interface/api/kyc/Create.d.ts +4 -0
  30. package/dist/types/Interface/api/kyc/Create.d.ts.map +1 -1
  31. package/dist/types/Interface/api/kyc/Create.js +16 -0
  32. package/dist/types/Interface/api/kyc/Create.js.map +1 -1
  33. package/dist/types/Interface/models/ISocietyFinancialProjection.d.ts +12 -0
  34. package/dist/types/Interface/models/ISocietyFinancialProjection.d.ts.map +1 -0
  35. package/dist/types/Interface/models/ISocietyFinancialProjection.js +13 -0
  36. package/dist/types/Interface/models/ISocietyFinancialProjection.js.map +1 -0
  37. package/dist/types/index.d.ts +2 -0
  38. package/dist/types/index.d.ts.map +1 -1
  39. package/dist/types/index.js +2 -0
  40. package/dist/types/index.js.map +1 -1
  41. package/dist/utils/acdVat.d.ts +3 -3
  42. package/dist/utils/acdVat.d.ts.map +1 -1
  43. package/dist/utils/acdVat.js +55 -3
  44. package/dist/utils/acdVat.js.map +1 -1
  45. package/dist/utils/commercialManagement/document.d.ts.map +1 -1
  46. package/dist/utils/commercialManagement/document.js +13 -0
  47. package/dist/utils/commercialManagement/document.js.map +1 -1
  48. package/dist/utils/tests/acdVat.spec.js +33 -0
  49. package/dist/utils/tests/acdVat.spec.js.map +1 -1
  50. package/dist/utils/tests/document.spec.d.ts +2 -0
  51. package/dist/utils/tests/document.spec.d.ts.map +1 -0
  52. package/dist/utils/tests/document.spec.js +71 -0
  53. package/dist/utils/tests/document.spec.js.map +1 -0
  54. package/package.json +1 -1
  55. package/ts/api/resources/FinancialProjection.ts +18 -0
  56. package/ts/api/resources/Mandat.ts +3 -2
  57. package/ts/api/resources.ts +2 -0
  58. package/ts/index.ts +1 -0
  59. package/ts/types/Enum/SocietyApproval.ts +2 -2
  60. package/ts/types/Interface/api/acd/DeduplicateAccounts.ts +29 -0
  61. package/ts/types/Interface/api/acd/Vat.ts +7 -0
  62. package/ts/types/Interface/api/commercialManagement/Create.ts +3 -1
  63. package/ts/types/Interface/api/kyc/Create.ts +12 -0
  64. package/ts/types/Interface/models/ISocietyFinancialProjection.ts +12 -0
  65. package/ts/types/index.ts +2 -0
  66. package/ts/utils/acdVat.ts +82 -5
  67. package/ts/utils/commercialManagement/document.ts +13 -0
  68. package/ts/utils/tests/acdVat.spec.ts +41 -0
  69. package/ts/utils/tests/document.spec.ts +75 -0
@@ -1,4 +1,4 @@
1
- import { AcdVatCode } from '../types/Interface/api/acd/Vat.js';
2
- export declare function idVatToAcdVatCode(idVat?: number | null): AcdVatCode | null;
3
- export declare function acdVatCodeToIdVat(acdVatCode?: AcdVatCode | null): number | null;
1
+ import { AcdVatCode, type AcdVatAccount } from '../types/Interface/api/acd/Vat.js';
2
+ export declare function idVatToAcdVatCode(idVat?: number | null, acdVatAccounts?: Array<Pick<AcdVatAccount, 'code' | 'rate'>> | null): AcdVatCode | string | null;
3
+ export declare function acdVatCodeToIdVat(acdVatCode?: AcdVatCode | string | null, acdVatAccounts?: Array<Pick<AcdVatAccount, 'code' | 'rate'>> | null): number | null;
4
4
  //# sourceMappingURL=acdVat.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"acdVat.d.ts","sourceRoot":"","sources":["../../ts/utils/acdVat.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,mCAAmC,CAAC;AAE/D,wBAAgB,iBAAiB,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,UAAU,GAAG,IAAI,CAiC1E;AAED,wBAAgB,iBAAiB,CAAC,UAAU,CAAC,EAAE,UAAU,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI,CAwB/E"}
1
+ {"version":3,"file":"acdVat.d.ts","sourceRoot":"","sources":["../../ts/utils/acdVat.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,KAAK,aAAa,EAAE,MAAM,mCAAmC,CAAC;AAEnF,wBAAgB,iBAAiB,CAC/B,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,EACrB,cAAc,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,CAAC,CAAC,GAAG,IAAI,GAClE,UAAU,GAAG,MAAM,GAAG,IAAI,CA8D5B;AAED,wBAAgB,iBAAiB,CAC/B,UAAU,CAAC,EAAE,UAAU,GAAG,MAAM,GAAG,IAAI,EACvC,cAAc,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,CAAC,CAAC,GAAG,IAAI,GAClE,MAAM,GAAG,IAAI,CAkEf"}
@@ -1,13 +1,35 @@
1
1
  import { Vat } from '../types/Enum/Vat.js';
2
2
  import { AcdVatCode } from '../types/Interface/api/acd/Vat.js';
3
- export function idVatToAcdVatCode(idVat) {
3
+ export function idVatToAcdVatCode(idVat, acdVatAccounts) {
4
4
  if (!idVat) {
5
5
  return null;
6
6
  }
7
- const vat = Object.values(Vat).find((currentVat) => currentVat.id === idVat);
7
+ const vatList = Object.values(Vat);
8
+ const vat = vatList.find((currentVat) => currentVat.id === idVat);
8
9
  if (!vat) {
9
10
  return AcdVatCode.NON_AFFECTE;
10
11
  }
12
+ if (acdVatAccounts && acdVatAccounts.length > 0) {
13
+ if (vat.isVatIntracom) {
14
+ const intracomEntry = acdVatAccounts.find((vatAccount) => vatAccount.code === AcdVatCode.INTRACOM);
15
+ if (intracomEntry) {
16
+ return intracomEntry.code;
17
+ }
18
+ return AcdVatCode.INTRACOM;
19
+ }
20
+ if (vat.isVatImportation) {
21
+ const autolEntry = acdVatAccounts.find((vatAccount) => vatAccount.code === AcdVatCode.AUTOL);
22
+ if (autolEntry) {
23
+ return autolEntry.code;
24
+ }
25
+ return AcdVatCode.AUTOL;
26
+ }
27
+ const matchingRateEntry = acdVatAccounts.find((vatAccount) => vatAccount.rate === vat.value &&
28
+ ![AcdVatCode.INTRACOM, AcdVatCode.AUTOL, AcdVatCode.NON_AFFECTE].includes(vatAccount.code));
29
+ if (matchingRateEntry) {
30
+ return matchingRateEntry.code;
31
+ }
32
+ }
11
33
  if (vat.isVatIntracom) {
12
34
  return AcdVatCode.INTRACOM;
13
35
  }
@@ -29,7 +51,36 @@ export function idVatToAcdVatCode(idVat) {
29
51
  return AcdVatCode.NON_AFFECTE;
30
52
  }
31
53
  }
32
- export function acdVatCodeToIdVat(acdVatCode) {
54
+ export function acdVatCodeToIdVat(acdVatCode, acdVatAccounts) {
55
+ if (!acdVatCode) {
56
+ return null;
57
+ }
58
+ const vatList = Object.values(Vat);
59
+ if (acdVatAccounts && acdVatAccounts.length > 0) {
60
+ const matchingVat = acdVatAccounts.find((vatAccount) => vatAccount.code === acdVatCode);
61
+ if (matchingVat && typeof matchingVat.rate === 'number') {
62
+ const rate = matchingVat.rate;
63
+ if (acdVatCode === AcdVatCode.INTRACOM) {
64
+ const intracomVat = vatList.find((v) => v.isVatIntracom && v.value === rate);
65
+ return intracomVat ? Number(intracomVat.id) : Number(Vat.INTRACOM_WITHOUT_TAXE.id);
66
+ }
67
+ if (acdVatCode === AcdVatCode.AUTOL) {
68
+ const autolVat = vatList.find((v) => v.isVatImportation && v.value === rate);
69
+ return autolVat ? Number(autolVat.id) : Number(Vat.IMPORTATION_WITHOUT_TAXE.id);
70
+ }
71
+ if (acdVatCode === AcdVatCode.NON_AFFECTE) {
72
+ return null;
73
+ }
74
+ const standardVat = vatList.find((v) => !v.isVatIntracom &&
75
+ !v.isVatImportation &&
76
+ v.id !== Vat.MARGE.id &&
77
+ v.id !== Vat.MANUAL.id &&
78
+ v.value === rate);
79
+ if (standardVat) {
80
+ return Number(standardVat.id);
81
+ }
82
+ }
83
+ }
33
84
  switch (acdVatCode) {
34
85
  case AcdVatCode.NORMAL:
35
86
  return Vat.TX_20.id;
@@ -51,6 +102,7 @@ export function acdVatCodeToIdVat(acdVatCode) {
51
102
  case AcdVatCode.SPECIAL:
52
103
  case null:
53
104
  case undefined:
105
+ default:
54
106
  return null;
55
107
  }
56
108
  }
@@ -1 +1 @@
1
- {"version":3,"file":"acdVat.js","sourceRoot":"","sources":["../../ts/utils/acdVat.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,sBAAsB,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,mCAAmC,CAAC;AAE/D,MAAM,UAAU,iBAAiB,CAAC,KAAqB;IACrD,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,CAAC,EAAE,KAAK,KAAK,CAAC,CAAC;IAE7E,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,OAAO,UAAU,CAAC,WAAW,CAAC;IAChC,CAAC;IAED,IAAI,GAAG,CAAC,aAAa,EAAE,CAAC;QACtB,OAAO,UAAU,CAAC,QAAQ,CAAC;IAC7B,CAAC;IAED,IAAI,GAAG,CAAC,gBAAgB,EAAE,CAAC;QACzB,OAAO,UAAU,CAAC,KAAK,CAAC;IAC1B,CAAC;IAED,QAAQ,GAAG,CAAC,KAAK,EAAE,CAAC;QAClB,KAAK,GAAG;YACN,OAAO,UAAU,CAAC,UAAU,CAAC;QAC/B,KAAK,GAAG;YACN,OAAO,UAAU,CAAC,UAAU,CAAC;QAC/B,KAAK,EAAE;YACL,OAAO,UAAU,CAAC,SAAS,CAAC;QAC9B,KAAK,EAAE;YACL,OAAO,UAAU,CAAC,MAAM,CAAC;QAC3B,KAAK,CAAC;YACJ,OAAO,IAAI,CAAC;QACd;YACE,OAAO,UAAU,CAAC,WAAW,CAAC;IAClC,CAAC;AACH,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,UAA8B;IAC9D,QAAQ,UAAU,EAAE,CAAC;QACnB,KAAK,UAAU,CAAC,MAAM;YACpB,OAAO,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;QACtB,KAAK,UAAU,CAAC,SAAS;YACvB,OAAO,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;QACtB,KAAK,UAAU,CAAC,UAAU;YACxB,OAAO,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;QACvB,KAAK,UAAU,CAAC,UAAU;YACxB,OAAO,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;QACvB,KAAK,UAAU,CAAC,QAAQ;YACtB,gGAAgG;YAChG,OAAO,GAAG,CAAC,qBAAqB,CAAC,EAAE,CAAC;QACtC,KAAK,UAAU,CAAC,KAAK;YACnB,mGAAmG;YACnG,OAAO,GAAG,CAAC,wBAAwB,CAAC,EAAE,CAAC;QACzC,KAAK,UAAU,CAAC,WAAW,CAAC;QAC5B,KAAK,UAAU,CAAC,GAAG,CAAC;QACpB,KAAK,UAAU,CAAC,kBAAkB,CAAC;QACnC,KAAK,UAAU,CAAC,OAAO,CAAC;QACxB,KAAK,IAAI,CAAC;QACV,KAAK,SAAS;YACZ,OAAO,IAAI,CAAC;IAChB,CAAC;AACH,CAAC","sourcesContent":["import { Vat } from '../types/Enum/Vat.js';\nimport { AcdVatCode } from '../types/Interface/api/acd/Vat.js';\n\nexport function idVatToAcdVatCode(idVat?: number | null): AcdVatCode | null {\n if (!idVat) {\n return null;\n }\n\n const vat = Object.values(Vat).find((currentVat) => currentVat.id === idVat);\n\n if (!vat) {\n return AcdVatCode.NON_AFFECTE;\n }\n\n if (vat.isVatIntracom) {\n return AcdVatCode.INTRACOM;\n }\n\n if (vat.isVatImportation) {\n return AcdVatCode.AUTOL;\n }\n\n switch (vat.value) {\n case 2.1:\n return AcdVatCode.REDUIT_2_1;\n case 5.5:\n return AcdVatCode.REDUIT_5_5;\n case 10:\n return AcdVatCode.REDUIT_10;\n case 20:\n return AcdVatCode.NORMAL;\n case 0:\n return null;\n default:\n return AcdVatCode.NON_AFFECTE;\n }\n}\n\nexport function acdVatCodeToIdVat(acdVatCode?: AcdVatCode | null): number | null {\n switch (acdVatCode) {\n case AcdVatCode.NORMAL:\n return Vat.TX_20.id;\n case AcdVatCode.REDUIT_10:\n return Vat.TX_10.id;\n case AcdVatCode.REDUIT_5_5:\n return Vat.TX_5_5.id;\n case AcdVatCode.REDUIT_2_1:\n return Vat.TX_2_1.id;\n case AcdVatCode.INTRACOM:\n // L'information de taux est perdue dans le code ACD, on retombe sur l'intracom a 0% par defaut.\n return Vat.INTRACOM_WITHOUT_TAXE.id;\n case AcdVatCode.AUTOL:\n // L'information de taux est perdue dans le code ACD, on retombe sur l'importation a 0% par defaut.\n return Vat.IMPORTATION_WITHOUT_TAXE.id;\n case AcdVatCode.NON_AFFECTE:\n case AcdVatCode.ONI:\n case AcdVatCode.SUR_IMMOBILISATION:\n case AcdVatCode.SPECIAL:\n case null:\n case undefined:\n return null;\n }\n}\n"]}
1
+ {"version":3,"file":"acdVat.js","sourceRoot":"","sources":["../../ts/utils/acdVat.ts"],"names":[],"mappings":"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","sourcesContent":["import { Vat, type VatType } from '../types/Enum/Vat.js';\nimport { AcdVatCode, type AcdVatAccount } from '../types/Interface/api/acd/Vat.js';\n\nexport function idVatToAcdVatCode(\n idVat?: number | null,\n acdVatAccounts?: Array<Pick<AcdVatAccount, 'code' | 'rate'>> | null,\n): AcdVatCode | string | null {\n if (!idVat) {\n return null;\n }\n\n const vatList = Object.values(Vat) as VatType[];\n const vat = vatList.find((currentVat) => currentVat.id === idVat);\n\n if (!vat) {\n return AcdVatCode.NON_AFFECTE;\n }\n\n if (acdVatAccounts && acdVatAccounts.length > 0) {\n if (vat.isVatIntracom) {\n const intracomEntry = acdVatAccounts.find((vatAccount) => vatAccount.code === AcdVatCode.INTRACOM);\n if (intracomEntry) {\n return intracomEntry.code as AcdVatCode;\n }\n return AcdVatCode.INTRACOM;\n }\n\n if (vat.isVatImportation) {\n const autolEntry = acdVatAccounts.find((vatAccount) => vatAccount.code === AcdVatCode.AUTOL);\n if (autolEntry) {\n return autolEntry.code as AcdVatCode;\n }\n return AcdVatCode.AUTOL;\n }\n\n const matchingRateEntry = acdVatAccounts.find(\n (vatAccount) =>\n vatAccount.rate === vat.value &&\n ![AcdVatCode.INTRACOM, AcdVatCode.AUTOL, AcdVatCode.NON_AFFECTE].includes(vatAccount.code as AcdVatCode),\n );\n\n if (matchingRateEntry) {\n return matchingRateEntry.code as AcdVatCode;\n }\n }\n\n if (vat.isVatIntracom) {\n return AcdVatCode.INTRACOM;\n }\n\n if (vat.isVatImportation) {\n return AcdVatCode.AUTOL;\n }\n\n switch (vat.value) {\n case 2.1:\n return AcdVatCode.REDUIT_2_1;\n case 5.5:\n return AcdVatCode.REDUIT_5_5;\n case 10:\n return AcdVatCode.REDUIT_10;\n case 20:\n return AcdVatCode.NORMAL;\n case 0:\n return null;\n default:\n return AcdVatCode.NON_AFFECTE;\n }\n}\n\nexport function acdVatCodeToIdVat(\n acdVatCode?: AcdVatCode | string | null,\n acdVatAccounts?: Array<Pick<AcdVatAccount, 'code' | 'rate'>> | null,\n): number | null {\n if (!acdVatCode) {\n return null;\n }\n\n const vatList = Object.values(Vat) as VatType[];\n\n if (acdVatAccounts && acdVatAccounts.length > 0) {\n const matchingVat = acdVatAccounts.find((vatAccount) => vatAccount.code === acdVatCode);\n\n if (matchingVat && typeof matchingVat.rate === 'number') {\n const rate = matchingVat.rate;\n\n if (acdVatCode === AcdVatCode.INTRACOM) {\n const intracomVat = vatList.find((v) => v.isVatIntracom && v.value === rate);\n return intracomVat ? Number(intracomVat.id) : Number(Vat.INTRACOM_WITHOUT_TAXE.id);\n }\n\n if (acdVatCode === AcdVatCode.AUTOL) {\n const autolVat = vatList.find((v) => v.isVatImportation && v.value === rate);\n return autolVat ? Number(autolVat.id) : Number(Vat.IMPORTATION_WITHOUT_TAXE.id);\n }\n\n if (acdVatCode === AcdVatCode.NON_AFFECTE) {\n return null;\n }\n\n const standardVat = vatList.find(\n (v) =>\n !v.isVatIntracom &&\n !v.isVatImportation &&\n v.id !== Vat.MARGE.id &&\n v.id !== Vat.MANUAL.id &&\n v.value === rate,\n );\n\n if (standardVat) {\n return Number(standardVat.id);\n }\n }\n }\n\n switch (acdVatCode) {\n case AcdVatCode.NORMAL:\n return Vat.TX_20.id;\n case AcdVatCode.REDUIT_10:\n return Vat.TX_10.id;\n case AcdVatCode.REDUIT_5_5:\n return Vat.TX_5_5.id;\n case AcdVatCode.REDUIT_2_1:\n return Vat.TX_2_1.id;\n case AcdVatCode.INTRACOM:\n // L'information de taux est perdue dans le code ACD, on retombe sur l'intracom a 0% par defaut.\n return Vat.INTRACOM_WITHOUT_TAXE.id;\n case AcdVatCode.AUTOL:\n // L'information de taux est perdue dans le code ACD, on retombe sur l'importation a 0% par defaut.\n return Vat.IMPORTATION_WITHOUT_TAXE.id;\n case AcdVatCode.NON_AFFECTE:\n case AcdVatCode.ONI:\n case AcdVatCode.SUR_IMMOBILISATION:\n case AcdVatCode.SPECIAL:\n case null:\n case undefined:\n default:\n return null;\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"document.d.ts","sourceRoot":"","sources":["../../../ts/utils/commercialManagement/document.ts"],"names":[],"mappings":"AACA,OAAO,EACL,8BAA8B,EAG/B,MAAM,wDAAwD,CAAC;AAQhE,OAAO,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAO1E,OAAO,EACL,qBAAqB,EACrB,gBAAgB,EAChB,qBAAqB,EACrB,0BAA0B,EAC3B,MAAM,sBAAsB,CAAC;AAK9B,OAAO,oBAAoB,CAAC;AAa5B,wBAAgB,0BAA0B,CACxC,qBAAqB,EAAE,mBAAmB,EAC1C,OAAO,EAAE,qBAAqB,GAAG,qBAAqB,EACtD,mBAAmB,UAAQ,EAC3B,OAAO,GAAE,MAAM,GAAG,SAAqB,GACtC,8BAA8B,CAuIhC;AAED,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,gBAAgB,EACxB,mBAAmB,UAAQ,EAC3B,OAAO,GAAE,MAAM,GAAG,SAAqB,GACtC,0BAA0B,CA4B5B;AASD;;GAEG;AACH,wBAAgB,kCAAkC,CAAC,OAAO,EAAE,qBAAqB,GAAG,qBAAqB,GAAG;IAC1G,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB,CAkIA"}
1
+ {"version":3,"file":"document.d.ts","sourceRoot":"","sources":["../../../ts/utils/commercialManagement/document.ts"],"names":[],"mappings":"AACA,OAAO,EACL,8BAA8B,EAG/B,MAAM,wDAAwD,CAAC;AAQhE,OAAO,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAO1E,OAAO,EACL,qBAAqB,EACrB,gBAAgB,EAChB,qBAAqB,EACrB,0BAA0B,EAC3B,MAAM,sBAAsB,CAAC;AAK9B,OAAO,oBAAoB,CAAC;AAa5B,wBAAgB,0BAA0B,CACxC,qBAAqB,EAAE,mBAAmB,EAC1C,OAAO,EAAE,qBAAqB,GAAG,qBAAqB,EACtD,mBAAmB,UAAQ,EAC3B,OAAO,GAAE,MAAM,GAAG,SAAqB,GACtC,8BAA8B,CAoJhC;AAED,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,gBAAgB,EACxB,mBAAmB,UAAQ,EAC3B,OAAO,GAAE,MAAM,GAAG,SAAqB,GACtC,0BAA0B,CA4B5B;AASD;;GAEG;AACH,wBAAgB,kCAAkC,CAAC,OAAO,EAAE,qBAAqB,GAAG,qBAAqB,GAAG;IAC1G,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB,CAkIA"}
@@ -46,6 +46,19 @@ export function generateCommercialDocument(idEstimateInvoiceType, payload, shoul
46
46
  paymentLink: payload.paymentLink ?? '#',
47
47
  idEstimateInvoiceType,
48
48
  title: payload.title ?? null,
49
+ // EJS `with` blocks throw a ReferenceError when a variable key is entirely absent from the data object, so seller
50
+ // identity/address fields must always be defined even when the payload omits them.
51
+ name: payload.name ?? null,
52
+ number: payload.number ?? null,
53
+ street: payload.street ?? null,
54
+ zipCode: payload.zipCode ?? null,
55
+ city: payload.city ?? null,
56
+ legalForm: payload.legalForm ?? null,
57
+ capital: payload.capital ?? null,
58
+ siren: payload.siren ?? null,
59
+ rcs: payload.rcs ?? null,
60
+ vatCode: payload.vatCode ?? null,
61
+ nafCode: payload.nafCode ?? null,
49
62
  penalties: payload.penalties
50
63
  ? (internationalizationConsistency(locale, payload.penalties, 'penalties') ?? payload.penalties)
51
64
  : null,
@@ -1 +1 @@
1
- {"version":3,"file":"document.js","sourceRoot":"","sources":["../../../ts/utils/commercialManagement/document.ts"],"names":[],"mappings":"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","sourcesContent":["import dayjs from 'dayjs';\nimport {\n ReadCommercialDocumentTemplate,\n ReadDocumentEditing,\n ReadVatEditing,\n} from '../../types/Interface/api/commercialManagement/Read.js';\nimport {\n AccountingCategoryList,\n CommercialVatMentionList,\n FontIds,\n fontList,\n InvoiceLanguage,\n} from '../../types/Enum/CommercialManagement.js';\nimport { EstimateInvoiceType } from '../../types/Enum/EstimateInvoice.js';\nimport { Vat } from '../../types/Enum/Vat.js';\nimport { integerToFormattedAmountString, integerToFormattedAmountObject } from '../amount.js';\nimport { CommercialDocumentCommonHTML, CommercialDocumentMailHTML } from './templates/common.js';\nimport { bodyTemplate } from './templates/body.js';\nimport { productToReadProductEditing } from './product.js';\nimport { getById, vatToReadVatEditing } from './vat.js';\nimport {\n CreateInvoiceDocument,\n CreateMailHeader,\n CreatePreSaleDocument,\n ReadCommercialMailTemplate,\n} from '../../types/index.js';\nimport { thirdPartyToReadThirdPartyEditing } from './thirdParty.js';\nimport { getBrandConfig } from '../brands.js';\nimport { internationalizationChoices, internationalizationConsistency } from './internationalization/choices.js';\nimport ejs from 'ejs';\nimport 'dayjs/locale/fr.js';\nimport { orderBy, groupBy, sumBy, round, uniq } from 'lodash-es';\nimport sanitize from 'sanitize-html';\n\ntype brandColorType = {\n primary: string;\n primary50: string;\n primary100: string;\n primary300: string;\n primary500: string;\n primary700: string;\n};\n\nexport function generateCommercialDocument(\n idEstimateInvoiceType: EstimateInvoiceType,\n payload: CreateInvoiceDocument | CreatePreSaleDocument,\n shouldHideBrandName = false,\n nodeEnv: string | undefined = undefined,\n): ReadCommercialDocumentTemplate {\n const products = orderBy(payload.products.map((product) => productToReadProductEditing(product), 'reorder'));\n const vats = orderBy(\n Object.values(groupBy(products, 'vatFormatted')).map((v) => vatToReadVatEditing(v), 'value'),\n ).filter((v) => v.id !== Vat.MARGE.id);\n\n const thirdParty = thirdPartyToReadThirdPartyEditing(payload.thirdParty);\n\n let forcedVats: ReadVatEditing[] | undefined = undefined;\n\n if (payload.advanceProducts?.length) {\n const advanceVats = Object.values(groupBy(payload.advanceProducts, 'vatFormatted'))\n .map((v) => vatToReadVatEditing(v), 'value')\n .filter((v) => v.id !== Vat.MARGE.id);\n\n forcedVats = vats.map((v) => {\n const base = v.base - (advanceVats.find((a) => a.id === v.id)?.base ?? 0);\n const toPay = v.toPay - (advanceVats.find((a) => a.id === v.id)?.toPay ?? 0);\n return {\n ...v,\n baseFormatted: integerToFormattedAmountString(base),\n amountFormatted: integerToFormattedAmountString(toPay),\n };\n });\n }\n\n const totalVats = sumBy(vats, (v) => round(v.amount));\n const totalTaxExcluded = sumBy(products, (p) => round(p.totalTaxExcluded));\n\n const totalTaxIncluded = totalTaxExcluded + totalVats;\n\n const locale = payload.language ?? InvoiceLanguage.FR;\n const languageOption = internationalizationChoices[locale];\n\n const accountingCategory = AccountingCategoryList.find((a) => a.id === payload.accountingCategory)?.label ?? null;\n\n const recoveryCost = payload.recoveryCost;\n const data: ReadDocumentEditing & { brandColors: brandColorType; brandName: string; shouldHideBrandName: boolean } = {\n ...payload,\n thirdParty,\n paymentLink: payload.paymentLink ?? '#',\n idEstimateInvoiceType,\n title: payload.title ?? null,\n penalties: payload.penalties\n ? (internationalizationConsistency(locale, payload.penalties, 'penalties') ?? payload.penalties)\n : null,\n termsOfPayment: payload.termsOfPayment\n ? (internationalizationConsistency(locale, payload.termsOfPayment, 'termsOfPayment') ?? payload.termsOfPayment)\n : null,\n recoveryCost: recoveryCost\n ? (internationalizationConsistency(locale, recoveryCost, 'recoveryCost') ?? recoveryCost)\n : null,\n discount: payload.discount\n ? (internationalizationConsistency(locale, payload.discount, 'discount') ?? payload.discount)\n : null,\n vatMention: payload.vatMention\n ? (internationalizationConsistency(locale, payload.vatMention, 'vatMention') ?? payload.vatMention)\n : null,\n phoneContact: payload.settings?.phoneContact ?? null,\n products,\n vats,\n totalTaxExcluded: totalTaxExcluded,\n totalTaxIncluded: round(totalTaxIncluded),\n totalTaxAndDiscountIncluded: round(totalTaxIncluded),\n generalDiscountFormatted: payload.generalDiscount2\n ? integerToFormattedAmountString(payload.generalDiscount2)\n : null,\n depositFormatted: payload.deposit ? integerToFormattedAmountString(payload.deposit) : null,\n totalTaxExcludedFormatted: integerToFormattedAmountString(totalTaxExcluded),\n totalTaxIncludedFormatted: integerToFormattedAmountString(totalTaxIncluded),\n totalTaxAndDiscountIncludedFormatted: integerToFormattedAmountString(\n totalTaxIncluded - (payload.generalDiscount2 ?? 0) - (payload.deposit ?? 0),\n ),\n totalVatAmountFormatted: integerToFormattedAmountString(totalVats),\n font: {\n id: payload.settings?.idFont ?? FontIds.CIRCULAR_STD,\n name: fontList.find((f) => f.id === payload.settings?.idFont)?.name ?? fontList[0].name,\n url: fontList.find((f) => f.id === payload.settings?.idFont)?.link ?? fontList[0].link,\n },\n capitalFormatted: payload.capital\n ? `${payload.capital}`\n .split('')\n .reduceRight((acc, char, i, { length }) => `${char}${(length - (i + 1)) % 3 === 0 ? ' ' : ''}${acc}`, '')\n .trim()\n : null,\n dueDateFormatted: payload.dueDate ? dayjs(payload.dueDate).format('DD/MM/YYYY') : null,\n expirationDateFormatted: payload.expirationDate ? dayjs(payload.expirationDate).format('DD/MM/YYYY') : null,\n emissionDateFormatted: payload.emissionDate ? dayjs(payload.emissionDate).format('DD/MM/YYYY') : null,\n shouldDisplayDiscountColumn: !!products.find((p) => p.discount2 && p.discount2 > 0),\n // @ts-ignore\n marginVats: uniq(products.filter((p) => p.marginVatFormatted !== null).map((p) => p.marginVatFormatted)),\n accountingCategoryFormatted: accountingCategory\n ? (internationalizationConsistency(locale, accountingCategory, 'accountingCategory') ?? null)\n : null,\n // @ts-ignore\n brandColors: getBrandConfig({ objectWaited: 'colors', nodeEnv }) as brandColorType,\n brandName: `${getBrandConfig({ objectWaited: 'name', nodeEnv }) as unknown as string}`,\n shouldHideBrandName,\n addressComplement: payload.addressComplement ?? null,\n paymentType: payload.paymentType\n ? (internationalizationConsistency(locale, payload.paymentType, 'paymentType') ?? payload.paymentType)\n : null,\n languageTemplate: languageOption,\n };\n\n const commonTemplate = new CommercialDocumentCommonHTML();\n const documentFreeText = [EstimateInvoiceType.DEVIS, EstimateInvoiceType.BON].includes(idEstimateInvoiceType)\n ? payload?.settings?.freeEstimateText\n : payload?.settings?.freeInvoiceText;\n\n return {\n header: ejs.render(commonTemplate.header, data),\n body: ejs.render(bodyTemplate, {\n ...data,\n comment:\n data.comment && typeof data.comment === 'string'\n ? sanitize(data.comment?.replace(/\\n/g, '<br/>'), { allowedTags: ['b', 'i', 'em', 'br', 'strong'] })\n : null,\n products: data.products.map((p) => ({\n ...p,\n comment:\n p.comment && typeof p.comment === 'string'\n ? sanitize(p.comment?.replace(/\\n/g, '<br/>'), { allowedTags: ['b', 'i', 'em', 'br', 'strong'] })\n : null,\n // @ts-expect-error\n unitFormatted: internationalizationConsistency(locale, p.unitFormatted, 'unit'),\n })),\n vats: forcedVats ?? vats,\n }),\n footer: ejs.render(commonTemplate.footer, {\n ...data,\n freeText: documentFreeText ?? null,\n }),\n data,\n };\n}\n\nexport function generateMailHeader(\n params: CreateMailHeader,\n shouldHideBrandName = false,\n nodeEnv: string | undefined = undefined,\n): ReadCommercialMailTemplate {\n const locale = params.payload.language ?? InvoiceLanguage.FR;\n const languageOption = internationalizationChoices[locale];\n dayjs.locale('fr');\n const data = {\n ...params.payload,\n totalTaxExcludedFormatted: integerToFormattedAmountObject(params.payload.totalTaxExcluded),\n totalTaxIncludedFormatted: integerToFormattedAmountObject(params.payload.totalTaxIncluded),\n totalVatFormatted: integerToFormattedAmountObject(\n params.payload.totalTaxIncluded - params.payload.totalTaxExcluded,\n ),\n dueDateFormatted: params.payload.dueDate ? dayjs(params.payload.dueDate).format('DD MMMM YYYY') : null,\n hasVat: params.hasVat,\n hostS3: params.hostS3,\n logoUrl: params.logoUrl,\n companyName: params.companyName,\n fileUrl: params.fileUrl,\n // @ts-ignore\n brandColors: getBrandConfig({ objectWaited: 'colors', nodeEnv }) as brandColorType,\n shouldHideBrandName,\n languageMail: languageOption,\n };\n\n const mailTemplate = new CommercialDocumentMailHTML();\n\n return {\n header: ejs.render(mailTemplate.header, data),\n };\n}\n\nfunction isMissing(value: unknown): boolean {\n if (value === null || value === undefined) return true;\n if (typeof value === 'string') return value.trim().length === 0;\n if (Array.isArray(value)) return value.length === 0;\n return false;\n}\n\n/**\n * @description Si cette fonction est modifiée, penser à check si la fonction `checkErrors` de `emission.service.ts` du core doit être modifiée aussi\n */\nexport function checkCommercialDocumentInformation(payload: CreateInvoiceDocument | CreatePreSaleDocument): {\n valid: boolean;\n errors?: string[];\n} {\n const errors: string[] = [];\n\n const products = orderBy(payload.products.map((product) => productToReadProductEditing(product), 'reorder'));\n const vats = orderBy(\n Object.values(groupBy(products, 'vatFormatted')).map((v) => vatToReadVatEditing(v), 'value'),\n ).filter((v) => v.id !== Vat.MARGE.id);\n\n const totalVats = sumBy(vats, (v) => round(v.amount));\n const totalTaxExcluded = sumBy(products, (p) => round(p.totalTaxExcluded));\n const totalTaxIncluded = round(totalTaxExcluded + totalVats);\n\n const requiredData: Array<{ value: unknown; error: string }> = [\n // Invoice\n { value: payload.reference, error: 'Le numéro de facture est obligatoire.' },\n { value: payload.idEstimateInvoiceType, error: 'Le type de document est obligatoire.' },\n { value: payload.emissionDate, error: 'La date d’émission est obligatoire.' },\n // Items\n ...products.flatMap((product, index) => {\n const productLabel = product.itemSaleName?.trim() ? `\"${product.itemSaleName}\"` : `à la ligne ${index + 1}`;\n\n return [\n {\n value: product.itemSaleName,\n error: `Le nom de l'article ${productLabel} est obligatoire.`,\n },\n {\n value: product.priceTaxExcluded,\n error: `Le prix net de l'article ${productLabel} est obligatoire.`,\n },\n {\n value: product.quantity,\n error: `La quantité de l'article ${productLabel} est obligatoire.`,\n },\n {\n value: product.unit,\n error: `Le code EN 16931 de l'article ${productLabel} est obligatoire.`,\n },\n {\n value: product.idVat,\n error: `Le type de TVA de l'article ${productLabel} est obligatoire.`,\n },\n {\n value: product.totalTaxExcluded,\n error: `Le montant net de l'article ${productLabel} est obligatoire.`,\n },\n ];\n }),\n // Seller\n { value: payload.name, error: 'Le nom du vendeur est obligatoire.' },\n { value: payload.siren, error: 'Le SIREN du vendeur est obligatoire.' },\n {\n value: payload.zipCode,\n error: 'Le code postal du vendeur est obligatoire.',\n },\n {\n value: payload.street,\n error: 'L’adresse du vendeur est obligatoire.',\n },\n {\n value: payload.city,\n error: 'La ville du vendeur est obligatoire.',\n },\n {\n value: payload.idCountry,\n error: 'Le pays du vendeur est obligatoire.',\n },\n // {\n // value: payload.settings?.mailContact,\n // error: 'L’email du vendeur est obligatoire.',\n // },\n // Customer\n {\n value: payload.thirdParty.company ?? payload.thirdParty.fullname ?? 'NA',\n error: 'Le nom de l’acheteur est obligatoire.',\n },\n {\n value: payload.thirdParty?.idCountry,\n error: 'Le pays de l’acheteur est obligatoire.',\n },\n // {\n // value: payload.thirdParty?.email,\n // error: 'L’email de l’acheteur est obligatoire.',\n // },\n // Vats\n ...vats.flatMap((vat, index) => [\n {\n value: vat.amount,\n error: `Le montant de TVA à la ligne ${index + 1} est obligatoire.`,\n },\n {\n value: vat.base,\n error: `La base d’imposition de la TVA à la ligne ${index + 1} est obligatoire.`,\n },\n {\n value: vat.value,\n error: `Le type de TVA à la ligne ${index + 1} est obligatoire.`,\n },\n ]),\n // Totals\n { value: totalTaxExcluded, error: 'Le montant total hors taxe est obligatoire.' },\n {\n value: totalTaxExcluded,\n error: 'La somme du montant net des lignes est obligatoire.',\n },\n { value: totalVats, error: 'Le montant total de TVA est obligatoire.' },\n {\n value: totalTaxIncluded,\n error: 'Le montant total TTC est obligatoire.',\n },\n ];\n\n // Check des mentions de tva\n const vatType = CommercialVatMentionList.find((v) => v.value === payload.vatMention)?.taxType ?? 'standard';\n\n // Si le type de tva est margin, autoliquidation, export ou exempt,\n // aucun produit ne doit avoir de tva > 0\n if (['margin', 'autoliquidation', 'export', 'exempt'].includes(vatType)) {\n for (const product of products) {\n if (getById(product.idVat)?.value !== 0) {\n errors.push(\n `L'article \"${product.itemSaleName}\" a une TVA non nulle alors que la mention légale de TVA est définie comme \"${vatType}\".`,\n );\n }\n }\n }\n\n errors.push(...requiredData.filter((data) => isMissing(data.value)).map((data) => data.error));\n\n return { valid: errors.length === 0, errors: errors.length > 0 ? errors : undefined };\n}\n"]}
1
+ {"version":3,"file":"document.js","sourceRoot":"","sources":["../../../ts/utils/commercialManagement/document.ts"],"names":[],"mappings":"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","sourcesContent":["import dayjs from 'dayjs';\nimport {\n ReadCommercialDocumentTemplate,\n ReadDocumentEditing,\n ReadVatEditing,\n} from '../../types/Interface/api/commercialManagement/Read.js';\nimport {\n AccountingCategoryList,\n CommercialVatMentionList,\n FontIds,\n fontList,\n InvoiceLanguage,\n} from '../../types/Enum/CommercialManagement.js';\nimport { EstimateInvoiceType } from '../../types/Enum/EstimateInvoice.js';\nimport { Vat } from '../../types/Enum/Vat.js';\nimport { integerToFormattedAmountString, integerToFormattedAmountObject } from '../amount.js';\nimport { CommercialDocumentCommonHTML, CommercialDocumentMailHTML } from './templates/common.js';\nimport { bodyTemplate } from './templates/body.js';\nimport { productToReadProductEditing } from './product.js';\nimport { getById, vatToReadVatEditing } from './vat.js';\nimport {\n CreateInvoiceDocument,\n CreateMailHeader,\n CreatePreSaleDocument,\n ReadCommercialMailTemplate,\n} from '../../types/index.js';\nimport { thirdPartyToReadThirdPartyEditing } from './thirdParty.js';\nimport { getBrandConfig } from '../brands.js';\nimport { internationalizationChoices, internationalizationConsistency } from './internationalization/choices.js';\nimport ejs from 'ejs';\nimport 'dayjs/locale/fr.js';\nimport { orderBy, groupBy, sumBy, round, uniq } from 'lodash-es';\nimport sanitize from 'sanitize-html';\n\ntype brandColorType = {\n primary: string;\n primary50: string;\n primary100: string;\n primary300: string;\n primary500: string;\n primary700: string;\n};\n\nexport function generateCommercialDocument(\n idEstimateInvoiceType: EstimateInvoiceType,\n payload: CreateInvoiceDocument | CreatePreSaleDocument,\n shouldHideBrandName = false,\n nodeEnv: string | undefined = undefined,\n): ReadCommercialDocumentTemplate {\n const products = orderBy(payload.products.map((product) => productToReadProductEditing(product), 'reorder'));\n const vats = orderBy(\n Object.values(groupBy(products, 'vatFormatted')).map((v) => vatToReadVatEditing(v), 'value'),\n ).filter((v) => v.id !== Vat.MARGE.id);\n\n const thirdParty = thirdPartyToReadThirdPartyEditing(payload.thirdParty);\n\n let forcedVats: ReadVatEditing[] | undefined = undefined;\n\n if (payload.advanceProducts?.length) {\n const advanceVats = Object.values(groupBy(payload.advanceProducts, 'vatFormatted'))\n .map((v) => vatToReadVatEditing(v), 'value')\n .filter((v) => v.id !== Vat.MARGE.id);\n\n forcedVats = vats.map((v) => {\n const base = v.base - (advanceVats.find((a) => a.id === v.id)?.base ?? 0);\n const toPay = v.toPay - (advanceVats.find((a) => a.id === v.id)?.toPay ?? 0);\n return {\n ...v,\n baseFormatted: integerToFormattedAmountString(base),\n amountFormatted: integerToFormattedAmountString(toPay),\n };\n });\n }\n\n const totalVats = sumBy(vats, (v) => round(v.amount));\n const totalTaxExcluded = sumBy(products, (p) => round(p.totalTaxExcluded));\n\n const totalTaxIncluded = totalTaxExcluded + totalVats;\n\n const locale = payload.language ?? InvoiceLanguage.FR;\n const languageOption = internationalizationChoices[locale];\n\n const accountingCategory = AccountingCategoryList.find((a) => a.id === payload.accountingCategory)?.label ?? null;\n\n const recoveryCost = payload.recoveryCost;\n const data: ReadDocumentEditing & { brandColors: brandColorType; brandName: string; shouldHideBrandName: boolean } = {\n ...payload,\n thirdParty,\n paymentLink: payload.paymentLink ?? '#',\n idEstimateInvoiceType,\n title: payload.title ?? null,\n // EJS `with` blocks throw a ReferenceError when a variable key is entirely absent from the data object, so seller\n // identity/address fields must always be defined even when the payload omits them.\n name: payload.name ?? null,\n number: payload.number ?? null,\n street: payload.street ?? null,\n zipCode: payload.zipCode ?? null,\n city: payload.city ?? null,\n legalForm: payload.legalForm ?? null,\n capital: payload.capital ?? null,\n siren: payload.siren ?? null,\n rcs: payload.rcs ?? null,\n vatCode: payload.vatCode ?? null,\n nafCode: payload.nafCode ?? null,\n penalties: payload.penalties\n ? (internationalizationConsistency(locale, payload.penalties, 'penalties') ?? payload.penalties)\n : null,\n termsOfPayment: payload.termsOfPayment\n ? (internationalizationConsistency(locale, payload.termsOfPayment, 'termsOfPayment') ?? payload.termsOfPayment)\n : null,\n recoveryCost: recoveryCost\n ? (internationalizationConsistency(locale, recoveryCost, 'recoveryCost') ?? recoveryCost)\n : null,\n discount: payload.discount\n ? (internationalizationConsistency(locale, payload.discount, 'discount') ?? payload.discount)\n : null,\n vatMention: payload.vatMention\n ? (internationalizationConsistency(locale, payload.vatMention, 'vatMention') ?? payload.vatMention)\n : null,\n phoneContact: payload.settings?.phoneContact ?? null,\n products,\n vats,\n totalTaxExcluded: totalTaxExcluded,\n totalTaxIncluded: round(totalTaxIncluded),\n totalTaxAndDiscountIncluded: round(totalTaxIncluded),\n generalDiscountFormatted: payload.generalDiscount2\n ? integerToFormattedAmountString(payload.generalDiscount2)\n : null,\n depositFormatted: payload.deposit ? integerToFormattedAmountString(payload.deposit) : null,\n totalTaxExcludedFormatted: integerToFormattedAmountString(totalTaxExcluded),\n totalTaxIncludedFormatted: integerToFormattedAmountString(totalTaxIncluded),\n totalTaxAndDiscountIncludedFormatted: integerToFormattedAmountString(\n totalTaxIncluded - (payload.generalDiscount2 ?? 0) - (payload.deposit ?? 0),\n ),\n totalVatAmountFormatted: integerToFormattedAmountString(totalVats),\n font: {\n id: payload.settings?.idFont ?? FontIds.CIRCULAR_STD,\n name: fontList.find((f) => f.id === payload.settings?.idFont)?.name ?? fontList[0].name,\n url: fontList.find((f) => f.id === payload.settings?.idFont)?.link ?? fontList[0].link,\n },\n capitalFormatted: payload.capital\n ? `${payload.capital}`\n .split('')\n .reduceRight((acc, char, i, { length }) => `${char}${(length - (i + 1)) % 3 === 0 ? ' ' : ''}${acc}`, '')\n .trim()\n : null,\n dueDateFormatted: payload.dueDate ? dayjs(payload.dueDate).format('DD/MM/YYYY') : null,\n expirationDateFormatted: payload.expirationDate ? dayjs(payload.expirationDate).format('DD/MM/YYYY') : null,\n emissionDateFormatted: payload.emissionDate ? dayjs(payload.emissionDate).format('DD/MM/YYYY') : null,\n shouldDisplayDiscountColumn: !!products.find((p) => p.discount2 && p.discount2 > 0),\n // @ts-ignore\n marginVats: uniq(products.filter((p) => p.marginVatFormatted !== null).map((p) => p.marginVatFormatted)),\n accountingCategoryFormatted: accountingCategory\n ? (internationalizationConsistency(locale, accountingCategory, 'accountingCategory') ?? null)\n : null,\n // @ts-ignore\n brandColors: getBrandConfig({ objectWaited: 'colors', nodeEnv }) as brandColorType,\n brandName: `${getBrandConfig({ objectWaited: 'name', nodeEnv }) as unknown as string}`,\n shouldHideBrandName,\n addressComplement: payload.addressComplement ?? null,\n paymentType: payload.paymentType\n ? (internationalizationConsistency(locale, payload.paymentType, 'paymentType') ?? payload.paymentType)\n : null,\n languageTemplate: languageOption,\n };\n\n const commonTemplate = new CommercialDocumentCommonHTML();\n const documentFreeText = [EstimateInvoiceType.DEVIS, EstimateInvoiceType.BON].includes(idEstimateInvoiceType)\n ? payload?.settings?.freeEstimateText\n : payload?.settings?.freeInvoiceText;\n\n return {\n header: ejs.render(commonTemplate.header, data),\n body: ejs.render(bodyTemplate, {\n ...data,\n comment:\n data.comment && typeof data.comment === 'string'\n ? sanitize(data.comment?.replace(/\\n/g, '<br/>'), { allowedTags: ['b', 'i', 'em', 'br', 'strong'] })\n : null,\n products: data.products.map((p) => ({\n ...p,\n comment:\n p.comment && typeof p.comment === 'string'\n ? sanitize(p.comment?.replace(/\\n/g, '<br/>'), { allowedTags: ['b', 'i', 'em', 'br', 'strong'] })\n : null,\n // @ts-expect-error\n unitFormatted: internationalizationConsistency(locale, p.unitFormatted, 'unit'),\n })),\n vats: forcedVats ?? vats,\n }),\n footer: ejs.render(commonTemplate.footer, {\n ...data,\n freeText: documentFreeText ?? null,\n }),\n data,\n };\n}\n\nexport function generateMailHeader(\n params: CreateMailHeader,\n shouldHideBrandName = false,\n nodeEnv: string | undefined = undefined,\n): ReadCommercialMailTemplate {\n const locale = params.payload.language ?? InvoiceLanguage.FR;\n const languageOption = internationalizationChoices[locale];\n dayjs.locale('fr');\n const data = {\n ...params.payload,\n totalTaxExcludedFormatted: integerToFormattedAmountObject(params.payload.totalTaxExcluded),\n totalTaxIncludedFormatted: integerToFormattedAmountObject(params.payload.totalTaxIncluded),\n totalVatFormatted: integerToFormattedAmountObject(\n params.payload.totalTaxIncluded - params.payload.totalTaxExcluded,\n ),\n dueDateFormatted: params.payload.dueDate ? dayjs(params.payload.dueDate).format('DD MMMM YYYY') : null,\n hasVat: params.hasVat,\n hostS3: params.hostS3,\n logoUrl: params.logoUrl,\n companyName: params.companyName,\n fileUrl: params.fileUrl,\n // @ts-ignore\n brandColors: getBrandConfig({ objectWaited: 'colors', nodeEnv }) as brandColorType,\n shouldHideBrandName,\n languageMail: languageOption,\n };\n\n const mailTemplate = new CommercialDocumentMailHTML();\n\n return {\n header: ejs.render(mailTemplate.header, data),\n };\n}\n\nfunction isMissing(value: unknown): boolean {\n if (value === null || value === undefined) return true;\n if (typeof value === 'string') return value.trim().length === 0;\n if (Array.isArray(value)) return value.length === 0;\n return false;\n}\n\n/**\n * @description Si cette fonction est modifiée, penser à check si la fonction `checkErrors` de `emission.service.ts` du core doit être modifiée aussi\n */\nexport function checkCommercialDocumentInformation(payload: CreateInvoiceDocument | CreatePreSaleDocument): {\n valid: boolean;\n errors?: string[];\n} {\n const errors: string[] = [];\n\n const products = orderBy(payload.products.map((product) => productToReadProductEditing(product), 'reorder'));\n const vats = orderBy(\n Object.values(groupBy(products, 'vatFormatted')).map((v) => vatToReadVatEditing(v), 'value'),\n ).filter((v) => v.id !== Vat.MARGE.id);\n\n const totalVats = sumBy(vats, (v) => round(v.amount));\n const totalTaxExcluded = sumBy(products, (p) => round(p.totalTaxExcluded));\n const totalTaxIncluded = round(totalTaxExcluded + totalVats);\n\n const requiredData: Array<{ value: unknown; error: string }> = [\n // Invoice\n { value: payload.reference, error: 'Le numéro de facture est obligatoire.' },\n { value: payload.idEstimateInvoiceType, error: 'Le type de document est obligatoire.' },\n { value: payload.emissionDate, error: 'La date d’émission est obligatoire.' },\n // Items\n ...products.flatMap((product, index) => {\n const productLabel = product.itemSaleName?.trim() ? `\"${product.itemSaleName}\"` : `à la ligne ${index + 1}`;\n\n return [\n {\n value: product.itemSaleName,\n error: `Le nom de l'article ${productLabel} est obligatoire.`,\n },\n {\n value: product.priceTaxExcluded,\n error: `Le prix net de l'article ${productLabel} est obligatoire.`,\n },\n {\n value: product.quantity,\n error: `La quantité de l'article ${productLabel} est obligatoire.`,\n },\n {\n value: product.unit,\n error: `Le code EN 16931 de l'article ${productLabel} est obligatoire.`,\n },\n {\n value: product.idVat,\n error: `Le type de TVA de l'article ${productLabel} est obligatoire.`,\n },\n {\n value: product.totalTaxExcluded,\n error: `Le montant net de l'article ${productLabel} est obligatoire.`,\n },\n ];\n }),\n // Seller\n { value: payload.name, error: 'Le nom du vendeur est obligatoire.' },\n { value: payload.siren, error: 'Le SIREN du vendeur est obligatoire.' },\n {\n value: payload.zipCode,\n error: 'Le code postal du vendeur est obligatoire.',\n },\n {\n value: payload.street,\n error: 'L’adresse du vendeur est obligatoire.',\n },\n {\n value: payload.city,\n error: 'La ville du vendeur est obligatoire.',\n },\n {\n value: payload.idCountry,\n error: 'Le pays du vendeur est obligatoire.',\n },\n // {\n // value: payload.settings?.mailContact,\n // error: 'L’email du vendeur est obligatoire.',\n // },\n // Customer\n {\n value: payload.thirdParty.company ?? payload.thirdParty.fullname ?? 'NA',\n error: 'Le nom de l’acheteur est obligatoire.',\n },\n {\n value: payload.thirdParty?.idCountry,\n error: 'Le pays de l’acheteur est obligatoire.',\n },\n // {\n // value: payload.thirdParty?.email,\n // error: 'L’email de l’acheteur est obligatoire.',\n // },\n // Vats\n ...vats.flatMap((vat, index) => [\n {\n value: vat.amount,\n error: `Le montant de TVA à la ligne ${index + 1} est obligatoire.`,\n },\n {\n value: vat.base,\n error: `La base d’imposition de la TVA à la ligne ${index + 1} est obligatoire.`,\n },\n {\n value: vat.value,\n error: `Le type de TVA à la ligne ${index + 1} est obligatoire.`,\n },\n ]),\n // Totals\n { value: totalTaxExcluded, error: 'Le montant total hors taxe est obligatoire.' },\n {\n value: totalTaxExcluded,\n error: 'La somme du montant net des lignes est obligatoire.',\n },\n { value: totalVats, error: 'Le montant total de TVA est obligatoire.' },\n {\n value: totalTaxIncluded,\n error: 'Le montant total TTC est obligatoire.',\n },\n ];\n\n // Check des mentions de tva\n const vatType = CommercialVatMentionList.find((v) => v.value === payload.vatMention)?.taxType ?? 'standard';\n\n // Si le type de tva est margin, autoliquidation, export ou exempt,\n // aucun produit ne doit avoir de tva > 0\n if (['margin', 'autoliquidation', 'export', 'exempt'].includes(vatType)) {\n for (const product of products) {\n if (getById(product.idVat)?.value !== 0) {\n errors.push(\n `L'article \"${product.itemSaleName}\" a une TVA non nulle alors que la mention légale de TVA est définie comme \"${vatType}\".`,\n );\n }\n }\n }\n\n errors.push(...requiredData.filter((data) => isMissing(data.value)).map((data) => data.error));\n\n return { valid: errors.length === 0, errors: errors.length > 0 ? errors : undefined };\n}\n"]}
@@ -21,5 +21,38 @@ describe('acdVat utils', () => {
21
21
  expect(acdVatCodeToIdVat(AcdVatCode.AUTOL)).toBe(Vat.IMPORTATION_WITHOUT_TAXE.id);
22
22
  expect(acdVatCodeToIdVat(AcdVatCode.NON_AFFECTE)).toBeNull();
23
23
  });
24
+ test('should map ACD VAT codes with custom society VAT rates (e.g. DOM-TOM)', () => {
25
+ const domTomVatAccounts = [
26
+ { code: 'NON_AFFECTE', rate: 0 },
27
+ { code: 'TN', rate: 8.5 },
28
+ { code: 'TR1', rate: 2.1 },
29
+ ];
30
+ expect(acdVatCodeToIdVat('TN', domTomVatAccounts)).toBe(Vat.TX_8_5.id);
31
+ expect(acdVatCodeToIdVat('TR1', domTomVatAccounts)).toBe(Vat.TX_2_1.id);
32
+ expect(acdVatCodeToIdVat('NON_AFFECTE', domTomVatAccounts)).toBeNull();
33
+ expect(idVatToAcdVatCode(Vat.TX_8_5.id, domTomVatAccounts)).toBe('TN');
34
+ expect(idVatToAcdVatCode(Vat.TX_2_1.id, domTomVatAccounts)).toBe('TR1');
35
+ expect(idVatToAcdVatCode(Vat.WITHOUT_TAXE.id, domTomVatAccounts)).toBeNull();
36
+ });
37
+ test('should correctly handle 0% VAT codes (e.g. exoneration, intracom 0%, importation 0%)', () => {
38
+ const vatAccountsWithZeroRates = [
39
+ { code: 'NON_AFFECTE', rate: 0 },
40
+ { code: 'EXO', rate: 0 },
41
+ { code: 'INTRACOM', rate: 0 },
42
+ { code: 'AUTOL', rate: 0 },
43
+ { code: 'TN', rate: 20 },
44
+ ];
45
+ // Non affecté returns null
46
+ expect(acdVatCodeToIdVat('NON_AFFECTE', vatAccountsWithZeroRates)).toBeNull();
47
+ // Custom 0% code (e.g. EXO) maps to WITHOUT_TAXE
48
+ expect(acdVatCodeToIdVat('EXO', vatAccountsWithZeroRates)).toBe(Vat.WITHOUT_TAXE.id);
49
+ expect(idVatToAcdVatCode(Vat.WITHOUT_TAXE.id, vatAccountsWithZeroRates)).toBe('EXO');
50
+ // Intracom at 0%
51
+ expect(acdVatCodeToIdVat('INTRACOM', vatAccountsWithZeroRates)).toBe(Vat.INTRACOM_WITHOUT_TAXE.id);
52
+ expect(idVatToAcdVatCode(Vat.INTRACOM_WITHOUT_TAXE.id, vatAccountsWithZeroRates)).toBe(AcdVatCode.INTRACOM);
53
+ // Importation at 0%
54
+ expect(acdVatCodeToIdVat('AUTOL', vatAccountsWithZeroRates)).toBe(Vat.IMPORTATION_WITHOUT_TAXE.id);
55
+ expect(idVatToAcdVatCode(Vat.IMPORTATION_WITHOUT_TAXE.id, vatAccountsWithZeroRates)).toBe(AcdVatCode.AUTOL);
56
+ });
24
57
  });
25
58
  //# sourceMappingURL=acdVat.spec.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"acdVat.spec.js","sourceRoot":"","sources":["../../../ts/utils/tests/acdVat.spec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAChD,OAAO,EAAE,GAAG,EAAE,MAAM,yBAAyB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,sCAAsC,CAAC;AAClE,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAEpE,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;IAC5B,IAAI,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACxD,MAAM,CAAC,iBAAiB,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QAChE,MAAM,CAAC,iBAAiB,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;QACnE,MAAM,CAAC,iBAAiB,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;QACrE,MAAM,CAAC,iBAAiB,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;QACrE,MAAM,CAAC,iBAAiB,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;QAC3E,MAAM,CAAC,iBAAiB,CAAC,GAAG,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;QAC3E,MAAM,CAAC,iBAAiB,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;IAC5D,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,mDAAmD,EAAE,GAAG,EAAE;QAC7D,MAAM,CAAC,iBAAiB,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAChE,MAAM,CAAC,iBAAiB,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACnE,MAAM,CAAC,iBAAiB,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACrE,MAAM,CAAC,iBAAiB,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACrE,MAAM,CAAC,iBAAiB,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,qBAAqB,CAAC,EAAE,CAAC,CAAC;QAClF,MAAM,CAAC,iBAAiB,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,wBAAwB,CAAC,EAAE,CAAC,CAAC;QAClF,MAAM,CAAC,iBAAiB,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;IAC/D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["import { describe, expect, test } from 'vitest';\nimport { Vat } from '../../types/Enum/Vat.js';\nimport { AcdVatCode } from '../../types/Interface/api/acd/Vat.js';\nimport { acdVatCodeToIdVat, idVatToAcdVatCode } from '../acdVat.js';\n\ndescribe('acdVat utils', () => {\n test('should map internal VAT ids to ACD VAT codes', () => {\n expect(idVatToAcdVatCode(Vat.TX_20.id)).toBe(AcdVatCode.NORMAL);\n expect(idVatToAcdVatCode(Vat.TX_10.id)).toBe(AcdVatCode.REDUIT_10);\n expect(idVatToAcdVatCode(Vat.TX_5_5.id)).toBe(AcdVatCode.REDUIT_5_5);\n expect(idVatToAcdVatCode(Vat.TX_2_1.id)).toBe(AcdVatCode.REDUIT_2_1);\n expect(idVatToAcdVatCode(Vat.INTRACOM_TX_20.id)).toBe(AcdVatCode.INTRACOM);\n expect(idVatToAcdVatCode(Vat.IMPORTATION_TX_20.id)).toBe(AcdVatCode.AUTOL);\n expect(idVatToAcdVatCode(Vat.WITHOUT_TAXE.id)).toBeNull();\n });\n\n test('should map ACD VAT codes back to internal VAT ids', () => {\n expect(acdVatCodeToIdVat(AcdVatCode.NORMAL)).toBe(Vat.TX_20.id);\n expect(acdVatCodeToIdVat(AcdVatCode.REDUIT_10)).toBe(Vat.TX_10.id);\n expect(acdVatCodeToIdVat(AcdVatCode.REDUIT_5_5)).toBe(Vat.TX_5_5.id);\n expect(acdVatCodeToIdVat(AcdVatCode.REDUIT_2_1)).toBe(Vat.TX_2_1.id);\n expect(acdVatCodeToIdVat(AcdVatCode.INTRACOM)).toBe(Vat.INTRACOM_WITHOUT_TAXE.id);\n expect(acdVatCodeToIdVat(AcdVatCode.AUTOL)).toBe(Vat.IMPORTATION_WITHOUT_TAXE.id);\n expect(acdVatCodeToIdVat(AcdVatCode.NON_AFFECTE)).toBeNull();\n });\n});\n"]}
1
+ {"version":3,"file":"acdVat.spec.js","sourceRoot":"","sources":["../../../ts/utils/tests/acdVat.spec.ts"],"names":[],"mappings":"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","sourcesContent":["import { describe, expect, test } from 'vitest';\nimport { Vat } from '../../types/Enum/Vat.js';\nimport { AcdVatCode } from '../../types/Interface/api/acd/Vat.js';\nimport { acdVatCodeToIdVat, idVatToAcdVatCode } from '../acdVat.js';\n\ndescribe('acdVat utils', () => {\n test('should map internal VAT ids to ACD VAT codes', () => {\n expect(idVatToAcdVatCode(Vat.TX_20.id)).toBe(AcdVatCode.NORMAL);\n expect(idVatToAcdVatCode(Vat.TX_10.id)).toBe(AcdVatCode.REDUIT_10);\n expect(idVatToAcdVatCode(Vat.TX_5_5.id)).toBe(AcdVatCode.REDUIT_5_5);\n expect(idVatToAcdVatCode(Vat.TX_2_1.id)).toBe(AcdVatCode.REDUIT_2_1);\n expect(idVatToAcdVatCode(Vat.INTRACOM_TX_20.id)).toBe(AcdVatCode.INTRACOM);\n expect(idVatToAcdVatCode(Vat.IMPORTATION_TX_20.id)).toBe(AcdVatCode.AUTOL);\n expect(idVatToAcdVatCode(Vat.WITHOUT_TAXE.id)).toBeNull();\n });\n\n test('should map ACD VAT codes back to internal VAT ids', () => {\n expect(acdVatCodeToIdVat(AcdVatCode.NORMAL)).toBe(Vat.TX_20.id);\n expect(acdVatCodeToIdVat(AcdVatCode.REDUIT_10)).toBe(Vat.TX_10.id);\n expect(acdVatCodeToIdVat(AcdVatCode.REDUIT_5_5)).toBe(Vat.TX_5_5.id);\n expect(acdVatCodeToIdVat(AcdVatCode.REDUIT_2_1)).toBe(Vat.TX_2_1.id);\n expect(acdVatCodeToIdVat(AcdVatCode.INTRACOM)).toBe(Vat.INTRACOM_WITHOUT_TAXE.id);\n expect(acdVatCodeToIdVat(AcdVatCode.AUTOL)).toBe(Vat.IMPORTATION_WITHOUT_TAXE.id);\n expect(acdVatCodeToIdVat(AcdVatCode.NON_AFFECTE)).toBeNull();\n });\n\n test('should map ACD VAT codes with custom society VAT rates (e.g. DOM-TOM)', () => {\n const domTomVatAccounts = [\n { code: 'NON_AFFECTE', rate: 0 },\n { code: 'TN', rate: 8.5 },\n { code: 'TR1', rate: 2.1 },\n ];\n\n expect(acdVatCodeToIdVat('TN', domTomVatAccounts)).toBe(Vat.TX_8_5.id);\n expect(acdVatCodeToIdVat('TR1', domTomVatAccounts)).toBe(Vat.TX_2_1.id);\n expect(acdVatCodeToIdVat('NON_AFFECTE', domTomVatAccounts)).toBeNull();\n\n expect(idVatToAcdVatCode(Vat.TX_8_5.id, domTomVatAccounts)).toBe('TN');\n expect(idVatToAcdVatCode(Vat.TX_2_1.id, domTomVatAccounts)).toBe('TR1');\n expect(idVatToAcdVatCode(Vat.WITHOUT_TAXE.id, domTomVatAccounts)).toBeNull();\n });\n\n test('should correctly handle 0% VAT codes (e.g. exoneration, intracom 0%, importation 0%)', () => {\n const vatAccountsWithZeroRates = [\n { code: 'NON_AFFECTE', rate: 0 },\n { code: 'EXO', rate: 0 },\n { code: 'INTRACOM', rate: 0 },\n { code: 'AUTOL', rate: 0 },\n { code: 'TN', rate: 20 },\n ];\n\n // Non affecté returns null\n expect(acdVatCodeToIdVat('NON_AFFECTE', vatAccountsWithZeroRates)).toBeNull();\n\n // Custom 0% code (e.g. EXO) maps to WITHOUT_TAXE\n expect(acdVatCodeToIdVat('EXO', vatAccountsWithZeroRates)).toBe(Vat.WITHOUT_TAXE.id);\n expect(idVatToAcdVatCode(Vat.WITHOUT_TAXE.id, vatAccountsWithZeroRates)).toBe('EXO');\n\n // Intracom at 0%\n expect(acdVatCodeToIdVat('INTRACOM', vatAccountsWithZeroRates)).toBe(Vat.INTRACOM_WITHOUT_TAXE.id);\n expect(idVatToAcdVatCode(Vat.INTRACOM_WITHOUT_TAXE.id, vatAccountsWithZeroRates)).toBe(AcdVatCode.INTRACOM);\n\n // Importation at 0%\n expect(acdVatCodeToIdVat('AUTOL', vatAccountsWithZeroRates)).toBe(Vat.IMPORTATION_WITHOUT_TAXE.id);\n expect(idVatToAcdVatCode(Vat.IMPORTATION_WITHOUT_TAXE.id, vatAccountsWithZeroRates)).toBe(AcdVatCode.AUTOL);\n });\n});\n"]}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=document.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"document.spec.d.ts","sourceRoot":"","sources":["../../../ts/utils/tests/document.spec.ts"],"names":[],"mappings":""}
@@ -0,0 +1,71 @@
1
+ import { describe, expect, test } from 'vitest';
2
+ import { generateCommercialDocument } from '../commercialManagement/document.js';
3
+ import { EstimateInvoiceType } from '../../types/Enum/EstimateInvoice.js';
4
+ // Payload reproducing a real-world case where the seller address fields (`name`, `street`,
5
+ // `number`, `zipCode`, `city`) are entirely absent from the object, not just `null`.
6
+ // Since EJS `with` blocks throw a ReferenceError for keys missing from the data object,
7
+ // this used to crash `generateCommercialDocument` instead of falling back gracefully.
8
+ const payloadWithoutSellerAddress = {
9
+ penalties: '3 fois le taux légal',
10
+ discount: 'Aucun escompte en cas de paiement anticipé',
11
+ accountingCategory: 2,
12
+ recoveryCost: '40€',
13
+ vatMention: 'TVA: Non concerné',
14
+ expirationDate: null,
15
+ shouldPayTaxAfterDebit: false,
16
+ isStripeAllowed: false,
17
+ vatCode: null,
18
+ paymentType: '',
19
+ reference: '202609/94',
20
+ capital: 0,
21
+ isDraft: false,
22
+ cgv: '<p><br></p>',
23
+ logoUrl: null,
24
+ disableVat: false,
25
+ nafCode: null,
26
+ legalForm: null,
27
+ siren: null,
28
+ products: [
29
+ {
30
+ id: 16979,
31
+ idVat: 4,
32
+ unit: 2,
33
+ itemSaleName: "main d'oeuvre extèrieur",
34
+ priceTaxExcluded: 7000,
35
+ quantity: 1,
36
+ discountType: 1,
37
+ discount2: 0,
38
+ comment: 'Déblocage NORIA, dépose NORIA.',
39
+ reorder: 1,
40
+ },
41
+ ],
42
+ termsOfPayment: 'Exigible sous 30 jours',
43
+ dueDate: '2026-10-22',
44
+ settings: {},
45
+ language: 'fr',
46
+ idSaleDocumentTemplate: 14,
47
+ emissionDate: '2026-09-22',
48
+ thirdParty: {
49
+ id: 156708,
50
+ company: 'S.A.S EMBRUSCALLES',
51
+ idCountry: 66,
52
+ },
53
+ comment: null,
54
+ generalDiscount2: 0,
55
+ title: 'NORIA BLOQUER',
56
+ deposit: 0,
57
+ transmissionType: 'none',
58
+ idEstimateInvoiceType: EstimateInvoiceType.FACTURE,
59
+ idCountry: 66,
60
+ // Seller address fields are intentionally omitted here: `name`, `number`, `street`, `zipCode`, `city`.
61
+ };
62
+ describe('generateCommercialDocument', () => {
63
+ test('should not throw when seller address fields are missing from the payload', () => {
64
+ expect(() => generateCommercialDocument(EstimateInvoiceType.FACTURE, payloadWithoutSellerAddress)).not.toThrow();
65
+ });
66
+ test('should render an empty seller block when address fields are missing', () => {
67
+ const result = generateCommercialDocument(EstimateInvoiceType.FACTURE, payloadWithoutSellerAddress);
68
+ expect(result.body).not.toContain('<p>undefined</p>');
69
+ });
70
+ });
71
+ //# sourceMappingURL=document.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"document.spec.js","sourceRoot":"","sources":["../../../ts/utils/tests/document.spec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAChD,OAAO,EAAE,0BAA0B,EAAE,MAAM,qCAAqC,CAAC;AACjF,OAAO,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAG1E,2FAA2F;AAC3F,qFAAqF;AACrF,wFAAwF;AACxF,sFAAsF;AACtF,MAAM,2BAA2B,GAAG;IAClC,SAAS,EAAE,sBAAsB;IACjC,QAAQ,EAAE,4CAA4C;IACtD,kBAAkB,EAAE,CAAC;IACrB,YAAY,EAAE,KAAK;IACnB,UAAU,EAAE,mBAAmB;IAC/B,cAAc,EAAE,IAAI;IACpB,sBAAsB,EAAE,KAAK;IAC7B,eAAe,EAAE,KAAK;IACtB,OAAO,EAAE,IAAI;IACb,WAAW,EAAE,EAAE;IACf,SAAS,EAAE,WAAW;IACtB,OAAO,EAAE,CAAC;IACV,OAAO,EAAE,KAAK;IACd,GAAG,EAAE,aAAa;IAClB,OAAO,EAAE,IAAI;IACb,UAAU,EAAE,KAAK;IACjB,OAAO,EAAE,IAAI;IACb,SAAS,EAAE,IAAI;IACf,KAAK,EAAE,IAAI;IACX,QAAQ,EAAE;QACR;YACE,EAAE,EAAE,KAAK;YACT,KAAK,EAAE,CAAC;YACR,IAAI,EAAE,CAAC;YACP,YAAY,EAAE,yBAAyB;YACvC,gBAAgB,EAAE,IAAI;YACtB,QAAQ,EAAE,CAAC;YACX,YAAY,EAAE,CAAC;YACf,SAAS,EAAE,CAAC;YACZ,OAAO,EAAE,gCAAgC;YACzC,OAAO,EAAE,CAAC;SACX;KACF;IACD,cAAc,EAAE,wBAAwB;IACxC,OAAO,EAAE,YAAY;IACrB,QAAQ,EAAE,EAAE;IACZ,QAAQ,EAAE,IAAI;IACd,sBAAsB,EAAE,EAAE;IAC1B,YAAY,EAAE,YAAY;IAC1B,UAAU,EAAE;QACV,EAAE,EAAE,MAAM;QACV,OAAO,EAAE,oBAAoB;QAC7B,SAAS,EAAE,EAAE;KACd;IACD,OAAO,EAAE,IAAI;IACb,gBAAgB,EAAE,CAAC;IACnB,KAAK,EAAE,eAAe;IACtB,OAAO,EAAE,CAAC;IACV,gBAAgB,EAAE,MAAM;IACxB,qBAAqB,EAAE,mBAAmB,CAAC,OAAO;IAClD,SAAS,EAAE,EAAE;IACb,uGAAuG;CACpE,CAAC;AAEtC,QAAQ,CAAC,4BAA4B,EAAE,GAAG,EAAE;IAC1C,IAAI,CAAC,0EAA0E,EAAE,GAAG,EAAE;QACpF,MAAM,CAAC,GAAG,EAAE,CAAC,0BAA0B,CAAC,mBAAmB,CAAC,OAAO,EAAE,2BAA2B,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;IACnH,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,qEAAqE,EAAE,GAAG,EAAE;QAC/E,MAAM,MAAM,GAAG,0BAA0B,CAAC,mBAAmB,CAAC,OAAO,EAAE,2BAA2B,CAAC,CAAC;QAEpG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["import { describe, expect, test } from 'vitest';\nimport { generateCommercialDocument } from '../commercialManagement/document.js';\nimport { EstimateInvoiceType } from '../../types/Enum/EstimateInvoice.js';\nimport { CreateInvoiceDocument } from '../../types/Interface/api/commercialManagement/Create.js';\n\n// Payload reproducing a real-world case where the seller address fields (`name`, `street`,\n// `number`, `zipCode`, `city`) are entirely absent from the object, not just `null`.\n// Since EJS `with` blocks throw a ReferenceError for keys missing from the data object,\n// this used to crash `generateCommercialDocument` instead of falling back gracefully.\nconst payloadWithoutSellerAddress = {\n penalties: '3 fois le taux légal',\n discount: 'Aucun escompte en cas de paiement anticipé',\n accountingCategory: 2,\n recoveryCost: '40€',\n vatMention: 'TVA: Non concerné',\n expirationDate: null,\n shouldPayTaxAfterDebit: false,\n isStripeAllowed: false,\n vatCode: null,\n paymentType: '',\n reference: '202609/94',\n capital: 0,\n isDraft: false,\n cgv: '<p><br></p>',\n logoUrl: null,\n disableVat: false,\n nafCode: null,\n legalForm: null,\n siren: null,\n products: [\n {\n id: 16979,\n idVat: 4,\n unit: 2,\n itemSaleName: \"main d'oeuvre extèrieur\",\n priceTaxExcluded: 7000,\n quantity: 1,\n discountType: 1,\n discount2: 0,\n comment: 'Déblocage NORIA, dépose NORIA.',\n reorder: 1,\n },\n ],\n termsOfPayment: 'Exigible sous 30 jours',\n dueDate: '2026-10-22',\n settings: {},\n language: 'fr',\n idSaleDocumentTemplate: 14,\n emissionDate: '2026-09-22',\n thirdParty: {\n id: 156708,\n company: 'S.A.S EMBRUSCALLES',\n idCountry: 66,\n },\n comment: null,\n generalDiscount2: 0,\n title: 'NORIA BLOQUER',\n deposit: 0,\n transmissionType: 'none',\n idEstimateInvoiceType: EstimateInvoiceType.FACTURE,\n idCountry: 66,\n // Seller address fields are intentionally omitted here: `name`, `number`, `street`, `zipCode`, `city`.\n} as unknown as CreateInvoiceDocument;\n\ndescribe('generateCommercialDocument', () => {\n test('should not throw when seller address fields are missing from the payload', () => {\n expect(() => generateCommercialDocument(EstimateInvoiceType.FACTURE, payloadWithoutSellerAddress)).not.toThrow();\n });\n\n test('should render an empty seller block when address fields are missing', () => {\n const result = generateCommercialDocument(EstimateInvoiceType.FACTURE, payloadWithoutSellerAddress);\n\n expect(result.body).not.toContain('<p>undefined</p>');\n });\n});\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@silexpert/core",
3
- "version": "2.0.108",
3
+ "version": "2.0.110",
4
4
  "description": "Silex Core perform HTTP Request and object binding. Silex core helps developers to retrieve and return formatted object",
5
5
  "keywords": [
6
6
  "accounting",
@@ -0,0 +1,18 @@
1
+ import { Resource } from '../Resource.js';
2
+ import { ISocietyFinancialProjection } from '../../types/index.js';
3
+
4
+ const ROUTE = 'statistics/financial-projection';
5
+
6
+ export class FinancialProjection extends Resource {
7
+ getSocietyProjections(idSociety: number): Promise<ISocietyFinancialProjection[]> {
8
+ return this.axios.$get(`${ROUTE}/${idSociety}`);
9
+ }
10
+
11
+ processSociety(idSociety: number): Promise<ISocietyFinancialProjection[]> {
12
+ return this.axios.$post(`${ROUTE}/process/${idSociety}`);
13
+ }
14
+
15
+ processAll(): Promise<boolean> {
16
+ return this.axios.$post(`${ROUTE}/process-all`);
17
+ }
18
+ }
@@ -1,11 +1,12 @@
1
1
  import { Resource } from '../Resource.js';
2
+ import type { SignMandatBody } from '@silexpert/core';
2
3
 
3
4
  export class Mandat extends Resource {
4
5
  getStatus(idSociety: number): Promise<{ isSigned: boolean; isPending: boolean }> {
5
6
  return this.axios.$get(`societies/${idSociety}/mandat/status`);
6
7
  }
7
8
 
8
- sign(idSociety: number): Promise<{ signUrl: string }> {
9
- return this.axios.$post(`societies/${idSociety}/mandat/sign`);
9
+ sign(idSociety: number, body: SignMandatBody): Promise<{ signUrl: string }> {
10
+ return this.axios.$post(`societies/${idSociety}/mandat/sign`, body);
10
11
  }
11
12
  }
@@ -191,6 +191,7 @@ import { Acd } from './resources/Acd.js';
191
191
  import { UsersHistory } from './resources/UsersHistory.js';
192
192
  import { Zendesk } from './resources/zendesk/Zendesk.js';
193
193
  import { Formalism } from './resources/Formalism.js';
194
+ import { FinancialProjection } from './resources/FinancialProjection.js';
194
195
  import { ZendeskTicket } from './resources/zendesk/Ticket.js';
195
196
  import { Vialink } from './resources/Vialink.js';
196
197
  import { KycMandate } from './resources/KycMandate.js';
@@ -393,6 +394,7 @@ export const resources = {
393
394
  acd: Acd,
394
395
  zendesk: Zendesk,
395
396
  formalism: Formalism,
397
+ financialProjection: FinancialProjection,
396
398
  zendeskTicket: ZendeskTicket,
397
399
  vialink: Vialink,
398
400
  kycMandate: KycMandate,
package/ts/index.ts CHANGED
@@ -1,3 +1,4 @@
1
+ import 'reflect-metadata';
1
2
  export * from './utils/index.js';
2
3
  export * from './utils/commercialManagement/product.js';
3
4
  export * from './utils/commercialManagement/vat.js';
@@ -48,8 +48,8 @@ export type AdditionalMention = {
48
48
  export const AdditionalMentions: AdditionalMention[] = [
49
49
  {
50
50
  id: AdditionalMentionType.EXECUTIVE_REMUNERATION,
51
- label: 'Rémunération de la gérance',
52
- applicableTo: [LegalFormTypeEnum.EURL, LegalFormTypeEnum.SARL],
51
+ label: 'Rémunération de la gérance/présidence',
52
+ applicableTo: [LegalFormTypeEnum.EURL, LegalFormTypeEnum.SARL, LegalFormTypeEnum.SASU],
53
53
  },
54
54
  {
55
55
  id: AdditionalMentionType.TAKEOVER_OF_COMMITMENTS,
@@ -0,0 +1,29 @@
1
+ import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger';
2
+ import {
3
+ ArrayMaxSize,
4
+ ArrayMinSize,
5
+ ArrayUnique,
6
+ IsArray,
7
+ IsBoolean,
8
+ IsInt,
9
+ IsOptional,
10
+ IsPositive,
11
+ } from 'class-validator';
12
+ import { ToBoolean } from '../../../../utils/transforms/boolean.transform.js';
13
+
14
+ export class DeduplicateAcdAccounts {
15
+ @ApiProperty({ type: [Number], minItems: 1 })
16
+ @IsArray()
17
+ @ArrayMinSize(1)
18
+ @ArrayMaxSize(20)
19
+ @ArrayUnique()
20
+ @IsInt({ each: true })
21
+ @IsPositive({ each: true })
22
+ idSocieties: number[];
23
+
24
+ @ApiPropertyOptional({ default: true })
25
+ @IsOptional()
26
+ @IsBoolean()
27
+ @ToBoolean()
28
+ isDryRun?: boolean;
29
+ }
@@ -11,6 +11,13 @@ export enum AcdVatCode {
11
11
  SPECIAL = 'TS',
12
12
  }
13
13
 
14
+ export type AcdVatAccount = {
15
+ code: string;
16
+ deductible?: string;
17
+ collected?: string;
18
+ rate?: number;
19
+ };
20
+
14
21
  export type AcdCompte = {
15
22
  Code: string | null;
16
23
  Categ: string | null;
@@ -459,7 +459,9 @@ export class CommercialDocumentInputs {
459
459
  title: string | null;
460
460
 
461
461
  @ApiProperty({ description: 'Commercial name of seller' })
462
- @IsString()
462
+ @IsString({
463
+ message: 'Le nom commercial du vendeur est requis',
464
+ })
463
465
  name: string;
464
466
 
465
467
  @ApiProperty({ description: 'Commercial number address of seller' })
@@ -78,6 +78,18 @@ export class FinishProcess {
78
78
  bypassDocumentSent?: boolean;
79
79
  }
80
80
 
81
+ export class SignMandatBody {
82
+ @ApiPropertyOptional()
83
+ @IsString()
84
+ @IsOptional()
85
+ phoneNumber?: string;
86
+
87
+ @ApiPropertyOptional()
88
+ @IsString()
89
+ @IsOptional()
90
+ phoneNumberPrefix?: string;
91
+ }
92
+
81
93
  export type FinishProcessMetadata = {
82
94
  FOLDER?: string;
83
95
  PARTICIPANT?: string;