@ripwords/myinvois-client 0.0.9 โ 0.1.0
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/bun.lock +89 -132
- package/dist/0X-C4IRh_fJ.d.ts +211 -0
- package/dist/0X-C4IRh_fJ.d.ts.map +1 -0
- package/dist/0X-Yw7mZEro.d.cts +211 -0
- package/dist/0X-Yw7mZEro.d.cts.map +1 -0
- package/dist/1X-Brnls9Jh.d.ts +112 -0
- package/dist/1X-Brnls9Jh.d.ts.map +1 -0
- package/dist/1X-BwpSoT3o.d.cts +20 -0
- package/dist/1X-BwpSoT3o.d.cts.map +1 -0
- package/dist/1X-C-_KHV-Q.d.ts +20 -0
- package/dist/1X-C-_KHV-Q.d.ts.map +1 -0
- package/dist/1X-D_aUVsuM.d.cts +112 -0
- package/dist/1X-D_aUVsuM.d.cts.map +1 -0
- package/dist/2X-Bb6elyzV.d.cts +40 -0
- package/dist/2X-Bb6elyzV.d.cts.map +1 -0
- package/dist/2X-DkS1BoE5.d.ts +40 -0
- package/dist/2X-DkS1BoE5.d.ts.map +1 -0
- package/dist/2X-UdQcQW24.d.ts +140 -0
- package/dist/2X-UdQcQW24.d.ts.map +1 -0
- package/dist/2X-hClUyw26.d.cts +140 -0
- package/dist/2X-hClUyw26.d.cts.map +1 -0
- package/dist/3X-C7VFD-n-.d.cts +21 -0
- package/dist/3X-C7VFD-n-.d.cts.map +1 -0
- package/dist/3X-CLMESDvz.d.cts +62 -0
- package/dist/3X-CLMESDvz.d.cts.map +1 -0
- package/dist/3X-DFI-4RQQ.d.ts +21 -0
- package/dist/3X-DFI-4RQQ.d.ts.map +1 -0
- package/dist/3X-DVDyspgb.d.ts +62 -0
- package/dist/3X-DVDyspgb.d.ts.map +1 -0
- package/dist/4X-CIJ2JJ2w.d.ts +31 -0
- package/dist/4X-CIJ2JJ2w.d.ts.map +1 -0
- package/dist/4X-CUR8jlaZ.d.ts +265 -0
- package/dist/4X-CUR8jlaZ.d.ts.map +1 -0
- package/dist/4X-CvScPJTf.d.cts +265 -0
- package/dist/4X-CvScPJTf.d.cts.map +1 -0
- package/dist/4X-DIfvpU6V.d.cts +31 -0
- package/dist/4X-DIfvpU6V.d.cts.map +1 -0
- package/dist/5X-BOUxhadJ.d.cts +22 -0
- package/dist/5X-BOUxhadJ.d.cts.map +1 -0
- package/dist/5X-C6db432h.d.ts +77 -0
- package/dist/5X-C6db432h.d.ts.map +1 -0
- package/dist/5X-COsZHUaQ.d.ts +22 -0
- package/dist/5X-COsZHUaQ.d.ts.map +1 -0
- package/dist/5X-CkLu7Vyd.d.cts +77 -0
- package/dist/5X-CkLu7Vyd.d.cts.map +1 -0
- package/dist/6X-C_fFIcJC.d.ts +105 -0
- package/dist/6X-C_fFIcJC.d.ts.map +1 -0
- package/dist/6X-ClZDKOTC.d.ts +16 -0
- package/dist/6X-ClZDKOTC.d.ts.map +1 -0
- package/dist/6X-DE7RJeV6.d.cts +16 -0
- package/dist/6X-DE7RJeV6.d.cts.map +1 -0
- package/dist/6X-Mf32k1d0.d.cts +105 -0
- package/dist/6X-Mf32k1d0.d.cts.map +1 -0
- package/dist/7X-BZyesooz.d.ts +16 -0
- package/dist/7X-BZyesooz.d.ts.map +1 -0
- package/dist/7X-Chtd6B66.d.cts +16 -0
- package/dist/7X-Chtd6B66.d.cts.map +1 -0
- package/dist/7X-DoCUcp-J.d.cts +71 -0
- package/dist/7X-DoCUcp-J.d.cts.map +1 -0
- package/dist/7X-kot_VccM.d.ts +71 -0
- package/dist/7X-kot_VccM.d.ts.map +1 -0
- package/dist/8X-Df4DOBOe.d.ts +110 -0
- package/dist/8X-Df4DOBOe.d.ts.map +1 -0
- package/dist/8X-DkuKAkHz.d.ts +19 -0
- package/dist/8X-DkuKAkHz.d.ts.map +1 -0
- package/dist/8X-DqZyMvyV.d.cts +19 -0
- package/dist/8X-DqZyMvyV.d.cts.map +1 -0
- package/dist/8X-Dr9RunRw.d.cts +110 -0
- package/dist/8X-Dr9RunRw.d.cts.map +1 -0
- package/dist/9X-BDgifncF.d.ts +15 -0
- package/dist/9X-BDgifncF.d.ts.map +1 -0
- package/dist/9X-BaoZtjWF.d.cts +98 -0
- package/dist/9X-BaoZtjWF.d.cts.map +1 -0
- package/dist/9X-BcAb6Uso.d.cts +15 -0
- package/dist/9X-BcAb6Uso.d.cts.map +1 -0
- package/dist/9X-BhBWlgxG.d.ts +98 -0
- package/dist/9X-BhBWlgxG.d.ts.map +1 -0
- package/dist/AX-BY72FohC.d.cts +111 -0
- package/dist/AX-BY72FohC.d.cts.map +1 -0
- package/dist/AX-D6XHWdrY.d.ts +111 -0
- package/dist/AX-D6XHWdrY.d.ts.map +1 -0
- package/dist/BX-CA0OmrUZ.d.cts +115 -0
- package/dist/BX-CA0OmrUZ.d.cts.map +1 -0
- package/dist/BX-D_0C8Qbd.d.ts +115 -0
- package/dist/BX-D_0C8Qbd.d.ts.map +1 -0
- package/dist/CX-HH4cSZRX.d.ts +128 -0
- package/dist/CX-HH4cSZRX.d.ts.map +1 -0
- package/dist/CX-glpQSL8x.d.cts +128 -0
- package/dist/CX-glpQSL8x.d.cts.map +1 -0
- package/dist/DX-DimL1MDM.d.cts +115 -0
- package/dist/DX-DimL1MDM.d.cts.map +1 -0
- package/dist/DX-Dx22ax_I.d.ts +115 -0
- package/dist/DX-Dx22ax_I.d.ts.map +1 -0
- package/dist/EX-BRWh1wFc.d.ts +107 -0
- package/dist/EX-BRWh1wFc.d.ts.map +1 -0
- package/dist/EX-Cx87Ruxl.d.cts +107 -0
- package/dist/EX-Cx87Ruxl.d.cts.map +1 -0
- package/dist/FX-D81UlxNN.d.cts +127 -0
- package/dist/FX-D81UlxNN.d.cts.map +1 -0
- package/dist/FX-RmjwAr40.d.ts +127 -0
- package/dist/FX-RmjwAr40.d.ts.map +1 -0
- package/dist/GX-9i7piP9G.d.cts +136 -0
- package/dist/GX-9i7piP9G.d.cts.map +1 -0
- package/dist/GX-CJyo7oDp.d.ts +136 -0
- package/dist/GX-CJyo7oDp.d.ts.map +1 -0
- package/dist/HX-20GVJAvl.d.cts +126 -0
- package/dist/HX-20GVJAvl.d.cts.map +1 -0
- package/dist/HX-XALBTdLA.d.ts +126 -0
- package/dist/HX-XALBTdLA.d.ts.map +1 -0
- package/dist/IX-6SZ55QKb.d.ts +23 -0
- package/dist/IX-6SZ55QKb.d.ts.map +1 -0
- package/dist/IX-D54NGPsc.d.cts +23 -0
- package/dist/IX-D54NGPsc.d.cts.map +1 -0
- package/dist/JX-C1RYcwQX.d.cts +104 -0
- package/dist/JX-C1RYcwQX.d.cts.map +1 -0
- package/dist/JX-hQ1XRmLp.d.ts +104 -0
- package/dist/JX-hQ1XRmLp.d.ts.map +1 -0
- package/dist/KX-BNwunEfn.d.ts +151 -0
- package/dist/KX-BNwunEfn.d.ts.map +1 -0
- package/dist/KX-gQHCIgtQ.d.cts +151 -0
- package/dist/KX-gQHCIgtQ.d.cts.map +1 -0
- package/dist/LX-CHYX3X3J.d.ts +123 -0
- package/dist/LX-CHYX3X3J.d.ts.map +1 -0
- package/dist/LX-CPurJGIh.d.cts +123 -0
- package/dist/LX-CPurJGIh.d.cts.map +1 -0
- package/dist/MX-BPGLWSUz.d.ts +153 -0
- package/dist/MX-BPGLWSUz.d.ts.map +1 -0
- package/dist/MX-BnyW5eHf.d.cts +153 -0
- package/dist/MX-BnyW5eHf.d.cts.map +1 -0
- package/dist/MyInvoisClient-BrNyMjS-.d.cts +178 -0
- package/dist/MyInvoisClient-BrNyMjS-.d.cts.map +1 -0
- package/dist/MyInvoisClient-CXu4pdl-.d.ts +178 -0
- package/dist/MyInvoisClient-CXu4pdl-.d.ts.map +1 -0
- package/dist/MyInvoisClient-Cnvb5iUC.js +299 -0
- package/dist/MyInvoisClient-Cnvb5iUC.js.map +1 -0
- package/dist/MyInvoisClient-DO1dJfQq.cjs +304 -0
- package/dist/MyInvoisClient-DO1dJfQq.cjs.map +1 -0
- package/dist/NX-B11fQuco.d.cts +122 -0
- package/dist/NX-B11fQuco.d.cts.map +1 -0
- package/dist/NX-RulN5Ml3.d.ts +122 -0
- package/dist/NX-RulN5Ml3.d.ts.map +1 -0
- package/dist/OX-DgKVSp7I.d.ts +26 -0
- package/dist/OX-DgKVSp7I.d.ts.map +1 -0
- package/dist/OX-T-ydRXQS.d.cts +26 -0
- package/dist/OX-T-ydRXQS.d.cts.map +1 -0
- package/dist/PX-DA4A2kEv.d.ts +121 -0
- package/dist/PX-DA4A2kEv.d.ts.map +1 -0
- package/dist/PX-p0n1SzvU.d.cts +121 -0
- package/dist/PX-p0n1SzvU.d.cts.map +1 -0
- package/dist/QX-CI1NccIB.d.cts +59 -0
- package/dist/QX-CI1NccIB.d.cts.map +1 -0
- package/dist/QX-DrFqsMEs.d.ts +59 -0
- package/dist/QX-DrFqsMEs.d.ts.map +1 -0
- package/dist/RX-Cm7vFcFN.d.ts +23 -0
- package/dist/RX-Cm7vFcFN.d.ts.map +1 -0
- package/dist/RX-DnNKol22.d.cts +23 -0
- package/dist/RX-DnNKol22.d.cts.map +1 -0
- package/dist/SX-BUjiWQYz.d.cts +40 -0
- package/dist/SX-BUjiWQYz.d.cts.map +1 -0
- package/dist/SX-CsPPTu-W.d.ts +40 -0
- package/dist/SX-CsPPTu-W.d.ts.map +1 -0
- package/dist/TX-DCY25MdR.d.ts +31 -0
- package/dist/TX-DCY25MdR.d.ts.map +1 -0
- package/dist/TX-DOEpsf05.d.cts +31 -0
- package/dist/TX-DOEpsf05.d.cts.map +1 -0
- package/dist/UX-DauyagHy.d.ts +18 -0
- package/dist/UX-DauyagHy.d.ts.map +1 -0
- package/dist/UX-DgUOnTFK.d.cts +18 -0
- package/dist/UX-DgUOnTFK.d.cts.map +1 -0
- package/dist/VX-DD4scgCe.d.ts +17 -0
- package/dist/VX-DD4scgCe.d.ts.map +1 -0
- package/dist/VX-kUX6LM-3.d.cts +17 -0
- package/dist/VX-kUX6LM-3.d.cts.map +1 -0
- package/dist/WX-CjkoppdY.d.ts +26 -0
- package/dist/WX-CjkoppdY.d.ts.map +1 -0
- package/dist/WX-DPfyPFFh.d.cts +26 -0
- package/dist/WX-DPfyPFFh.d.cts.map +1 -0
- package/dist/XX-C4C1gQZH.d.cts +828 -0
- package/dist/XX-C4C1gQZH.d.cts.map +1 -0
- package/dist/XX-sbsIUOnA.d.ts +828 -0
- package/dist/XX-sbsIUOnA.d.ts.map +1 -0
- package/dist/YX-BeT-LsiA.d.cts +20 -0
- package/dist/YX-BeT-LsiA.d.cts.map +1 -0
- package/dist/YX-DUdO8mRC.d.ts +20 -0
- package/dist/YX-DUdO8mRC.d.ts.map +1 -0
- package/dist/ZX-BuVTTq-D.d.cts +22 -0
- package/dist/ZX-BuVTTq-D.d.cts.map +1 -0
- package/dist/ZX-DwfcSA-D.d.ts +22 -0
- package/dist/ZX-DwfcSA-D.d.ts.map +1 -0
- package/dist/api/platform/platformLogin.d.ts +67 -0
- package/dist/api/platform/platformLogin.d.ts.map +1 -0
- package/dist/api/platform/platformLogin.js +3 -0
- package/dist/canonicalize-C_fNNpYr.cjs +80 -0
- package/dist/canonicalize-C_fNNpYr.cjs.map +1 -0
- package/dist/canonicalize-DNUrCGad.js +68 -0
- package/dist/canonicalize-DNUrCGad.js.map +1 -0
- package/dist/chunk-CUT6urMc.cjs +30 -0
- package/dist/classification-codes-B15PbWxz.d.cts +118 -0
- package/dist/classification-codes-B15PbWxz.d.cts.map +1 -0
- package/dist/classification-codes-C2X4xW5-.d.ts +118 -0
- package/dist/classification-codes-C2X4xW5-.d.ts.map +1 -0
- package/dist/country-code-DPeNFMMi.d.cts +543 -0
- package/dist/country-code-DPeNFMMi.d.cts.map +1 -0
- package/dist/country-code-DsI8Mbzx.d.ts +543 -0
- package/dist/country-code-DsI8Mbzx.d.ts.map +1 -0
- package/dist/currencies-DKuDflOO.d.ts +208 -0
- package/dist/currencies-DKuDflOO.d.ts.map +1 -0
- package/dist/currencies-S5g1gzBU.d.cts +208 -0
- package/dist/currencies-S5g1gzBU.d.cts.map +1 -0
- package/dist/e-invoice-BuwtFnlI.d.cts +44 -0
- package/dist/e-invoice-BuwtFnlI.d.cts.map +1 -0
- package/dist/e-invoice-C2TxhyrK.d.ts +44 -0
- package/dist/e-invoice-C2TxhyrK.d.ts.map +1 -0
- package/dist/getBaseUrl-CO7Jp27d.cjs +14 -0
- package/dist/getBaseUrl-CO7Jp27d.cjs.map +1 -0
- package/dist/getBaseUrl-Dx6RDC8I.js +8 -0
- package/dist/getBaseUrl-Dx6RDC8I.js.map +1 -0
- package/dist/hashCert-Bol7lIh2.js +62 -0
- package/dist/hashCert-Bol7lIh2.js.map +1 -0
- package/dist/hashCert-mlYEuYex.cjs +68 -0
- package/dist/hashCert-mlYEuYex.cjs.map +1 -0
- package/dist/hashSignedProperties-9vj5wlYR.js +83 -0
- package/dist/hashSignedProperties-9vj5wlYR.js.map +1 -0
- package/dist/hashSignedProperties-CU_ZqqmY.cjs +95 -0
- package/dist/hashSignedProperties-CU_ZqqmY.cjs.map +1 -0
- package/dist/index-B1DSs-wd.d.cts +16 -0
- package/dist/index-B1DSs-wd.d.cts.map +1 -0
- package/dist/index-CJNLQVjx.d.ts +1 -0
- package/dist/index-FTgB2nM6.d.ts +16 -0
- package/dist/index-FTgB2nM6.d.ts.map +1 -0
- package/dist/index-Wy1ONBjV.d.cts +1 -0
- package/dist/index.cjs +13 -97
- package/dist/index.d.ts +60 -5664
- package/dist/index.js +11 -93
- package/dist/index10.cjs +34 -0
- package/dist/index10.cjs.map +1 -0
- package/dist/index11.cjs +24 -0
- package/dist/index11.cjs.map +1 -0
- package/dist/index12.cjs +0 -0
- package/dist/index13.cjs +13 -0
- package/dist/index14.cjs +13 -0
- package/dist/index14.cjs.map +1 -0
- package/dist/index15.cjs +3 -0
- package/dist/index16.cjs +17 -0
- package/dist/index17.cjs +3 -0
- package/dist/index18.cjs +208 -0
- package/dist/index18.cjs.map +1 -0
- package/dist/index19.cjs +109 -0
- package/dist/index19.cjs.map +1 -0
- package/dist/index2.cjs +62 -0
- package/dist/index2.cjs.map +1 -0
- package/dist/index20.cjs +137 -0
- package/dist/index20.cjs.map +1 -0
- package/dist/index21.cjs +64 -0
- package/dist/index21.cjs.map +1 -0
- package/dist/index22.cjs +267 -0
- package/dist/index22.cjs.map +1 -0
- package/dist/index23.cjs +79 -0
- package/dist/index23.cjs.map +1 -0
- package/dist/index24.cjs +107 -0
- package/dist/index24.cjs.map +1 -0
- package/dist/index25.cjs +73 -0
- package/dist/index25.cjs.map +1 -0
- package/dist/index26.cjs +112 -0
- package/dist/index26.cjs.map +1 -0
- package/dist/index27.cjs +100 -0
- package/dist/index27.cjs.map +1 -0
- package/dist/index28.cjs +18 -0
- package/dist/index28.cjs.map +1 -0
- package/dist/index29.cjs +38 -0
- package/dist/index29.cjs.map +1 -0
- package/dist/index3.cjs +532 -0
- package/dist/index3.cjs.map +1 -0
- package/dist/index30.cjs +19 -0
- package/dist/index30.cjs.map +1 -0
- package/dist/index31.cjs +29 -0
- package/dist/index31.cjs.map +1 -0
- package/dist/index32.cjs +20 -0
- package/dist/index32.cjs.map +1 -0
- package/dist/index33.cjs +14 -0
- package/dist/index33.cjs.map +1 -0
- package/dist/index34.cjs +14 -0
- package/dist/index34.cjs.map +1 -0
- package/dist/index35.cjs +17 -0
- package/dist/index35.cjs.map +1 -0
- package/dist/index36.cjs +13 -0
- package/dist/index36.cjs.map +1 -0
- package/dist/index37.cjs +108 -0
- package/dist/index37.cjs.map +1 -0
- package/dist/index38.cjs +113 -0
- package/dist/index38.cjs.map +1 -0
- package/dist/index39.cjs +126 -0
- package/dist/index39.cjs.map +1 -0
- package/dist/index4.cjs +196 -0
- package/dist/index4.cjs.map +1 -0
- package/dist/index40.cjs +113 -0
- package/dist/index40.cjs.map +1 -0
- package/dist/index41.cjs +105 -0
- package/dist/index41.cjs.map +1 -0
- package/dist/index42.cjs +125 -0
- package/dist/index42.cjs.map +1 -0
- package/dist/index43.cjs +134 -0
- package/dist/index43.cjs.map +1 -0
- package/dist/index44.cjs +124 -0
- package/dist/index44.cjs.map +1 -0
- package/dist/index45.cjs +21 -0
- package/dist/index45.cjs.map +1 -0
- package/dist/index46.cjs +102 -0
- package/dist/index46.cjs.map +1 -0
- package/dist/index47.cjs +149 -0
- package/dist/index47.cjs.map +1 -0
- package/dist/index48.cjs +121 -0
- package/dist/index48.cjs.map +1 -0
- package/dist/index49.cjs +151 -0
- package/dist/index49.cjs.map +1 -0
- package/dist/index5.cjs +25 -0
- package/dist/index5.cjs.map +1 -0
- package/dist/index50.cjs +120 -0
- package/dist/index50.cjs.map +1 -0
- package/dist/index51.cjs +24 -0
- package/dist/index51.cjs.map +1 -0
- package/dist/index52.cjs +119 -0
- package/dist/index52.cjs.map +1 -0
- package/dist/index53.cjs +54 -0
- package/dist/index53.cjs.map +1 -0
- package/dist/index54.cjs +21 -0
- package/dist/index54.cjs.map +1 -0
- package/dist/index55.cjs +35 -0
- package/dist/index55.cjs.map +1 -0
- package/dist/index56.cjs +29 -0
- package/dist/index56.cjs.map +1 -0
- package/dist/index57.cjs +16 -0
- package/dist/index57.cjs.map +1 -0
- package/dist/index58.cjs +15 -0
- package/dist/index58.cjs.map +1 -0
- package/dist/index59.cjs +24 -0
- package/dist/index59.cjs.map +1 -0
- package/dist/index59.cts.map +1 -0
- package/dist/index6.cjs +0 -0
- package/dist/index60.cjs +419 -0
- package/dist/index60.cjs.map +1 -0
- package/dist/index61.cjs +15 -0
- package/dist/index61.cjs.map +1 -0
- package/dist/index62.cjs +16 -0
- package/dist/index62.cjs.map +1 -0
- package/dist/index62.cts.map +1 -0
- package/dist/index63.cjs +0 -0
- package/dist/index63.cts.map +1 -0
- package/dist/index64.cjs +0 -0
- package/dist/index64.cts.map +1 -0
- package/dist/index65.cjs +122 -0
- package/dist/index65.cjs.map +1 -0
- package/dist/index65.cts.map +1 -0
- package/dist/index66.cjs +229 -0
- package/dist/index66.cjs.map +1 -0
- package/dist/index66.cts.map +1 -0
- package/dist/index67.cjs +4 -0
- package/dist/index67.cts.map +1 -0
- package/dist/index68.cjs +3 -0
- package/dist/index68.cts.map +1 -0
- package/dist/index69.cjs +4 -0
- package/dist/index69.cts.map +1 -0
- package/dist/index7.cjs +0 -0
- package/dist/index70.cjs +3 -0
- package/dist/index70.cts.map +1 -0
- package/dist/index71.cjs +3 -0
- package/dist/index71.cts.map +1 -0
- package/dist/index72.cjs +3 -0
- package/dist/index72.cts.map +1 -0
- package/dist/index73.cjs +3 -0
- package/dist/index73.cts.map +1 -0
- package/dist/index8.cjs +25 -0
- package/dist/index8.cjs.map +1 -0
- package/dist/index9.cjs +0 -0
- package/dist/invoice-1_1-BJVcw-oE.d.ts +432 -0
- package/dist/invoice-1_1-BJVcw-oE.d.ts.map +1 -0
- package/dist/invoice-1_1-DWdNPRzr.d.cts +432 -0
- package/dist/invoice-1_1-DWdNPRzr.d.cts.map +1 -0
- package/dist/invoice1-1-8S-QQn7P.cjs +547 -0
- package/dist/invoice1-1-8S-QQn7P.cjs.map +1 -0
- package/dist/invoice1-1-CHuLpkFz.js +504 -0
- package/dist/invoice1-1-CHuLpkFz.js.map +1 -0
- package/dist/msic-codes-B_1W6lZF.d.cts +26 -0
- package/dist/msic-codes-B_1W6lZF.d.cts.map +1 -0
- package/dist/msic-codes-bs0lTfSZ.d.ts +26 -0
- package/dist/msic-codes-bs0lTfSZ.d.ts.map +1 -0
- package/dist/payment-modes-B8dNy3SM.d.ts +44 -0
- package/dist/payment-modes-B8dNy3SM.d.ts.map +1 -0
- package/dist/payment-modes-DHihrywe.d.cts +44 -0
- package/dist/payment-modes-DHihrywe.d.cts.map +1 -0
- package/dist/platformLogin-DsxWWUXr.js +31 -0
- package/dist/platformLogin-DsxWWUXr.js.map +1 -0
- package/dist/platformLogin-PGzMhw1X.cjs +37 -0
- package/dist/platformLogin-PGzMhw1X.cjs.map +1 -0
- package/dist/populateFinalDocument-BdyYzz5Y.cjs +96 -0
- package/dist/populateFinalDocument-BdyYzz5Y.cjs.map +1 -0
- package/dist/populateFinalDocument-BpLXmgLv.js +90 -0
- package/dist/populateFinalDocument-BpLXmgLv.js.map +1 -0
- package/dist/populateSignedProperties-BJMcBQ6S.cjs +58 -0
- package/dist/populateSignedProperties-BJMcBQ6S.cjs.map +1 -0
- package/dist/populateSignedProperties-BvGN-YZH.js +52 -0
- package/dist/populateSignedProperties-BvGN-YZH.js.map +1 -0
- package/dist/sign-B61Cy3gO.cjs +40 -0
- package/dist/sign-B61Cy3gO.cjs.map +1 -0
- package/dist/sign-DzHK7UhR.js +34 -0
- package/dist/sign-DzHK7UhR.js.map +1 -0
- package/dist/signatures-BKi9DP2K.d.cts +173 -0
- package/dist/signatures-BKi9DP2K.d.cts.map +1 -0
- package/dist/signatures-C9QPZTQd.d.ts +173 -0
- package/dist/signatures-C9QPZTQd.d.ts.map +1 -0
- package/dist/state-codes-CxG1S9YY.d.ts +62 -0
- package/dist/state-codes-CxG1S9YY.d.ts.map +1 -0
- package/dist/state-codes-DXSWtE6a.d.cts +62 -0
- package/dist/state-codes-DXSWtE6a.d.cts.map +1 -0
- package/dist/tax-types-CEpfSh5P.d.ts +42 -0
- package/dist/tax-types-CEpfSh5P.d.ts.map +1 -0
- package/dist/tax-types-CgwxONDS.d.cts +42 -0
- package/dist/tax-types-CgwxONDS.d.cts.map +1 -0
- package/dist/transform-BLz0S687.cjs +72 -0
- package/dist/transform-BLz0S687.cjs.map +1 -0
- package/dist/transform-D1q-U6Zj.js +66 -0
- package/dist/transform-D1q-U6Zj.js.map +1 -0
- package/dist/types/classification-codes.d.ts +2 -0
- package/dist/types/country-code.d.ts +2 -0
- package/dist/types/currencies.d.ts +2 -0
- package/dist/types/documents/index.d.ts +57 -0
- package/dist/types/documents/invoice-1_1.d.ts +56 -0
- package/dist/types/e-invoice.d.ts +2 -0
- package/dist/types/index.d.ts +59 -0
- package/dist/types/msic/0X.d.ts +2 -0
- package/dist/types/msic/1X.d.ts +2 -0
- package/dist/types/msic/2X.d.ts +2 -0
- package/dist/types/msic/3X.d.ts +2 -0
- package/dist/types/msic/4X.d.ts +2 -0
- package/dist/types/msic/5X.d.ts +2 -0
- package/dist/types/msic/6X.d.ts +2 -0
- package/dist/types/msic/7X.d.ts +2 -0
- package/dist/types/msic/8X.d.ts +2 -0
- package/dist/types/msic/9X.d.ts +2 -0
- package/dist/types/msic-codes.d.ts +12 -0
- package/dist/types/payment-modes.d.ts +2 -0
- package/dist/types/signatures.d.ts +2 -0
- package/dist/types/state-codes.d.ts +2 -0
- package/dist/types/tax-types.d.ts +2 -0
- package/dist/types/unit/1X.d.ts +2 -0
- package/dist/types/unit/2X.d.ts +2 -0
- package/dist/types/unit/3X.d.ts +2 -0
- package/dist/types/unit/4X.d.ts +2 -0
- package/dist/types/unit/5X.d.ts +2 -0
- package/dist/types/unit/6X.d.ts +2 -0
- package/dist/types/unit/7X.d.ts +2 -0
- package/dist/types/unit/8X.d.ts +2 -0
- package/dist/types/unit/9X.d.ts +2 -0
- package/dist/types/unit/AX.d.ts +2 -0
- package/dist/types/unit/BX.d.ts +2 -0
- package/dist/types/unit/CX.d.ts +2 -0
- package/dist/types/unit/DX.d.ts +2 -0
- package/dist/types/unit/EX.d.ts +2 -0
- package/dist/types/unit/FX.d.ts +2 -0
- package/dist/types/unit/GX.d.ts +2 -0
- package/dist/types/unit/HX.d.ts +2 -0
- package/dist/types/unit/IX.d.ts +2 -0
- package/dist/types/unit/JX.d.ts +2 -0
- package/dist/types/unit/KX.d.ts +2 -0
- package/dist/types/unit/LX.d.ts +2 -0
- package/dist/types/unit/MX.d.ts +2 -0
- package/dist/types/unit/NX.d.ts +2 -0
- package/dist/types/unit/OX.d.ts +2 -0
- package/dist/types/unit/PX.d.ts +2 -0
- package/dist/types/unit/QX.d.ts +2 -0
- package/dist/types/unit/RX.d.ts +2 -0
- package/dist/types/unit/SX.d.ts +2 -0
- package/dist/types/unit/TX.d.ts +2 -0
- package/dist/types/unit/UX.d.ts +2 -0
- package/dist/types/unit/VX.d.ts +2 -0
- package/dist/types/unit/WX.d.ts +2 -0
- package/dist/types/unit/XX.d.ts +2 -0
- package/dist/types/unit/YX.d.ts +2 -0
- package/dist/types/unit/ZX.d.ts +2 -0
- package/dist/types/unit-types.d.ts +37 -0
- package/dist/unit-types-1bF0KhIp.d.ts +56 -0
- package/dist/unit-types-1bF0KhIp.d.ts.map +1 -0
- package/dist/unit-types-CsrkvgfG.d.cts +56 -0
- package/dist/unit-types-CsrkvgfG.d.cts.map +1 -0
- package/dist/utils/MyInvoisClient.d.ts +60 -0
- package/dist/utils/MyInvoisClient.js +13 -0
- package/dist/utils/base64.d.ts +6 -0
- package/dist/utils/base64.d.ts.map +1 -0
- package/dist/utils/base64.js +11 -0
- package/dist/utils/base64.js.map +1 -0
- package/dist/utils/debug/debug-document-hash.d.ts +100 -0
- package/dist/utils/debug/debug-document-hash.d.ts.map +1 -0
- package/dist/utils/debug/debug-document-hash.js +120 -0
- package/dist/utils/debug/debug-document-hash.js.map +1 -0
- package/dist/utils/debug/debug-invoice-submission.d.ts +152 -0
- package/dist/utils/debug/debug-invoice-submission.d.ts.map +1 -0
- package/dist/utils/debug/debug-invoice-submission.js +226 -0
- package/dist/utils/debug/debug-invoice-submission.js.map +1 -0
- package/dist/utils/getBaseUrl.d.ts +5 -0
- package/dist/utils/getBaseUrl.d.ts.map +1 -0
- package/dist/utils/getBaseUrl.js +3 -0
- package/dist/utils/invoice1-1.d.ts +117 -0
- package/dist/utils/invoice1-1.d.ts.map +1 -0
- package/dist/utils/invoice1-1.js +10 -0
- package/dist/utils/signature/canonicalize.d.ts +26 -0
- package/dist/utils/signature/canonicalize.d.ts.map +1 -0
- package/dist/utils/signature/canonicalize.js +3 -0
- package/dist/utils/signature/hashCert.d.ts +15 -0
- package/dist/utils/signature/hashCert.d.ts.map +1 -0
- package/dist/utils/signature/hashCert.js +3 -0
- package/dist/utils/signature/hashSignedProperties.d.ts +25 -0
- package/dist/utils/signature/hashSignedProperties.d.ts.map +1 -0
- package/dist/utils/signature/hashSignedProperties.js +3 -0
- package/dist/utils/signature/populateFinalDocument.d.ts +23 -0
- package/dist/utils/signature/populateFinalDocument.d.ts.map +1 -0
- package/dist/utils/signature/populateFinalDocument.js +3 -0
- package/dist/utils/signature/populateSignedProperties.d.ts +23 -0
- package/dist/utils/signature/populateSignedProperties.d.ts.map +1 -0
- package/dist/utils/signature/populateSignedProperties.js +3 -0
- package/dist/utils/signature/sign.d.ts +16 -0
- package/dist/utils/signature/sign.d.ts.map +1 -0
- package/dist/utils/signature/sign.js +3 -0
- package/dist/utils/signature/transform.d.ts +16 -0
- package/dist/utils/signature/transform.d.ts.map +1 -0
- package/dist/utils/signature/transform.js +3 -0
- package/package.json +12 -5
- package/src/api/platform/{taxpayerLogin.ts โ platformLogin.ts} +8 -2
- package/src/types/documents/invoice-1_1.d.ts +90 -0
- package/src/types/index.d.ts +1 -0
- package/src/types/msic-codes.d.ts +1 -7
- package/src/utils/MyInvoisClient.ts +428 -11
- package/src/utils/base64.ts +7 -0
- package/src/utils/debug/debug-document-hash.ts +249 -0
- package/src/utils/debug/debug-invoice-submission.ts +355 -0
- package/src/utils/getBaseUrl.ts +1 -1
- package/src/utils/invoice1-1.ts +671 -0
- package/src/utils/signature/canonicalize.ts +104 -0
- package/src/utils/signature/hashCert.ts +115 -0
- package/src/utils/signature/hashSignedProperties.ts +155 -0
- package/src/utils/signature/populateFinalDocument.ts +187 -0
- package/src/utils/signature/populateSignedProperties.ts +87 -0
- package/src/utils/signature/sign.ts +51 -0
- package/src/utils/signature/transform.ts +99 -0
- package/test/MyInvoiClientWithRealData.test.ts +2 -1
- package/test/MyInvoisClient.test.ts +16 -8
- package/test/base64.test.ts +43 -0
- package/test/canonicalize.test.ts +110 -0
- package/test/hashCert.test.ts +95 -0
- package/test/hashSignedProperties.test.ts +140 -0
- package/test/populateFinalDocument.test.ts +218 -0
- package/test/populateSignedProperties.test.ts +155 -0
- package/test/sign.test.ts +70 -0
- package/test/signAndSubmitInvoice.test.ts +915 -0
- package/test/transform.test.ts +158 -0
- package/tsconfig.json +7 -1
- package/tsdown.config.ts +31 -0
- package/dist/index.cjs.map +0 -1
- package/rolldown.config.ts +0 -26
|
@@ -0,0 +1,915 @@
|
|
|
1
|
+
import { beforeEach, describe, expect, it, vi } from 'vitest'
|
|
2
|
+
import type { InvoiceV1_1 } from '../src/types'
|
|
3
|
+
import { MyInvoisClient } from '../src/utils/MyInvoisClient'
|
|
4
|
+
import {
|
|
5
|
+
encodeDocumentForSubmission,
|
|
6
|
+
extractCertificateInfo,
|
|
7
|
+
generateDocumentHash,
|
|
8
|
+
generateDocumentHashForSubmission,
|
|
9
|
+
generateSignedInvoiceXML,
|
|
10
|
+
} from '../src/utils/invoice1-1'
|
|
11
|
+
import type { SigningCredentials } from '../src/types'
|
|
12
|
+
import {
|
|
13
|
+
debugDocumentHash,
|
|
14
|
+
testSubmissionHashMethods,
|
|
15
|
+
} from '../src/utils/debug/debug-document-hash'
|
|
16
|
+
import {
|
|
17
|
+
debugSignedInvoiceXML,
|
|
18
|
+
testCanonicalizationAlgorithms,
|
|
19
|
+
validateXMLStructure,
|
|
20
|
+
} from '../src/utils/debug/debug-invoice-submission'
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Creates test signing credentials using a predefined test certificate
|
|
24
|
+
* This uses the same structure as the example XML you provided, but with test values
|
|
25
|
+
*/
|
|
26
|
+
function createTestSigningCredentials(): SigningCredentials {
|
|
27
|
+
// Test private key (THIS IS FOR TESTING ONLY - NEVER USE IN PRODUCTION)
|
|
28
|
+
const testPrivateKey = process.env.TEST_PRIVATE_KEY!
|
|
29
|
+
|
|
30
|
+
// Test certificate (THIS IS FOR TESTING ONLY)
|
|
31
|
+
const testCertificate = process.env.TEST_CERTIFICATE!
|
|
32
|
+
|
|
33
|
+
console.warn(`
|
|
34
|
+
โ ๏ธ WARNING: Using test credentials for development only!
|
|
35
|
+
These credentials will NOT work with the actual MyInvois API.
|
|
36
|
+
You must obtain official certificates from LHDNM for production use.
|
|
37
|
+
`)
|
|
38
|
+
|
|
39
|
+
const extractedCertificate = extractCertificateInfo(testCertificate)
|
|
40
|
+
|
|
41
|
+
return {
|
|
42
|
+
privateKeyPem: testPrivateKey,
|
|
43
|
+
certificatePem: testCertificate,
|
|
44
|
+
issuerName: extractedCertificate.issuerName,
|
|
45
|
+
serialNumber: extractedCertificate.serialNumber,
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
// Test data matching the InvoiceV1_1 interface
|
|
50
|
+
const createTestInvoiceData = (): InvoiceV1_1 => {
|
|
51
|
+
// Generate current date and time to avoid "too old" validation errors
|
|
52
|
+
const now = new Date()
|
|
53
|
+
const currentDate = now.toISOString().split('T')[0] // YYYY-MM-DD format
|
|
54
|
+
const currentTime = now.toISOString().split('T')[1].split('.')[0] + 'Z' // HH:MM:SSZ format (remove milliseconds)
|
|
55
|
+
|
|
56
|
+
console.log(
|
|
57
|
+
'๐
Using current date/time for invoice:',
|
|
58
|
+
currentDate,
|
|
59
|
+
currentTime,
|
|
60
|
+
)
|
|
61
|
+
|
|
62
|
+
return {
|
|
63
|
+
eInvoiceVersion: '1.1',
|
|
64
|
+
eInvoiceTypeCode: '01',
|
|
65
|
+
eInvoiceCodeOrNumber: 'XML-INV12345',
|
|
66
|
+
eInvoiceDate: currentDate,
|
|
67
|
+
eInvoiceTime: currentTime,
|
|
68
|
+
invoiceCurrencyCode: 'MYR',
|
|
69
|
+
|
|
70
|
+
supplier: {
|
|
71
|
+
name: 'Supplier Name',
|
|
72
|
+
tin: process.env.TIN_VALUE!,
|
|
73
|
+
registrationType: 'NRIC',
|
|
74
|
+
registrationNumber: process.env.NRIC_VALUE!,
|
|
75
|
+
sstRegistrationNumber: 'NA',
|
|
76
|
+
email: 'supplier@email.com',
|
|
77
|
+
contactNumber: '+60123456789',
|
|
78
|
+
industryClassificationCode: '46510',
|
|
79
|
+
address: {
|
|
80
|
+
addressLine0: 'Lot 66',
|
|
81
|
+
addressLine1: 'Bangunan Merdeka',
|
|
82
|
+
addressLine2: 'Persiaran Jaya',
|
|
83
|
+
postalZone: '50480',
|
|
84
|
+
cityName: 'Kuala Lumpur',
|
|
85
|
+
state: '14',
|
|
86
|
+
country: 'MYS',
|
|
87
|
+
},
|
|
88
|
+
},
|
|
89
|
+
|
|
90
|
+
buyer: {
|
|
91
|
+
name: 'Consolidated Buyers',
|
|
92
|
+
tin: 'EI00000000010',
|
|
93
|
+
registrationNumber: 'NA',
|
|
94
|
+
sstRegistrationNumber: 'NA',
|
|
95
|
+
email: 'NA',
|
|
96
|
+
contactNumber: 'NA',
|
|
97
|
+
address: {
|
|
98
|
+
addressLine0: 'NA',
|
|
99
|
+
addressLine1: 'NA',
|
|
100
|
+
addressLine2: 'NA',
|
|
101
|
+
cityName: 'Kuala Lumpur',
|
|
102
|
+
postalZone: '50000',
|
|
103
|
+
state: '14',
|
|
104
|
+
country: 'MYS',
|
|
105
|
+
},
|
|
106
|
+
},
|
|
107
|
+
|
|
108
|
+
invoiceLineItems: [
|
|
109
|
+
{
|
|
110
|
+
itemClassificationCode: '004',
|
|
111
|
+
itemDescription: 'Receipt 001 - 100',
|
|
112
|
+
unitPrice: 10000,
|
|
113
|
+
taxType: '01',
|
|
114
|
+
taxRate: 10.0,
|
|
115
|
+
taxAmount: 1000,
|
|
116
|
+
totalTaxableAmountPerLine: 10000,
|
|
117
|
+
totalAmountPerLine: 11000,
|
|
118
|
+
quantity: 1,
|
|
119
|
+
measurement: 'C62',
|
|
120
|
+
countryOfOrigin: 'MYS',
|
|
121
|
+
},
|
|
122
|
+
{
|
|
123
|
+
itemClassificationCode: '004',
|
|
124
|
+
itemDescription: 'Receipt 101 - 200',
|
|
125
|
+
unitPrice: 20000,
|
|
126
|
+
taxType: '01',
|
|
127
|
+
taxRate: 10.0,
|
|
128
|
+
taxAmount: 2000,
|
|
129
|
+
totalTaxableAmountPerLine: 20000,
|
|
130
|
+
totalAmountPerLine: 22000,
|
|
131
|
+
quantity: 1,
|
|
132
|
+
measurement: 'C62',
|
|
133
|
+
countryOfOrigin: 'MYS',
|
|
134
|
+
},
|
|
135
|
+
],
|
|
136
|
+
|
|
137
|
+
legalMonetaryTotal: {
|
|
138
|
+
taxExclusiveAmount: 30000,
|
|
139
|
+
taxInclusiveAmount: 33000,
|
|
140
|
+
allowanceTotalAmount: 0,
|
|
141
|
+
chargeTotalAmount: 0,
|
|
142
|
+
payableRoundingAmount: 0,
|
|
143
|
+
payableAmount: 33000,
|
|
144
|
+
},
|
|
145
|
+
|
|
146
|
+
taxTotal: {
|
|
147
|
+
taxAmount: 3000,
|
|
148
|
+
taxSubtotals: [
|
|
149
|
+
{
|
|
150
|
+
taxableAmount: 30000,
|
|
151
|
+
taxAmount: 3000,
|
|
152
|
+
taxCategory: {
|
|
153
|
+
taxTypeCode: '01',
|
|
154
|
+
taxRate: 10.0,
|
|
155
|
+
},
|
|
156
|
+
},
|
|
157
|
+
],
|
|
158
|
+
},
|
|
159
|
+
|
|
160
|
+
paymentMeans: [
|
|
161
|
+
{
|
|
162
|
+
paymentMeansCode: '01',
|
|
163
|
+
payeeFinancialAccountID: '1234567890',
|
|
164
|
+
},
|
|
165
|
+
],
|
|
166
|
+
|
|
167
|
+
issuerDigitalSignature: {
|
|
168
|
+
Id: 'DocSig',
|
|
169
|
+
'ds:SignedInfo': {
|
|
170
|
+
'ds:CanonicalizationMethod': {
|
|
171
|
+
Algorithm: 'http://www.w3.org/2006/12/xml-c14n11',
|
|
172
|
+
},
|
|
173
|
+
'ds:SignatureMethod': {
|
|
174
|
+
Algorithm: 'http://www.w3.org/2001/04/xmldsig-more#rsa-sha256',
|
|
175
|
+
},
|
|
176
|
+
'ds:Reference': [
|
|
177
|
+
{
|
|
178
|
+
Id: 'id-doc-signed-data',
|
|
179
|
+
URI: '',
|
|
180
|
+
'ds:DigestMethod': {
|
|
181
|
+
Algorithm: 'http://www.w3.org/2001/04/xmlenc#sha256',
|
|
182
|
+
},
|
|
183
|
+
'ds:DigestValue': '',
|
|
184
|
+
},
|
|
185
|
+
{
|
|
186
|
+
URI: '#id-xades-signed-props',
|
|
187
|
+
'ds:DigestMethod': {
|
|
188
|
+
Algorithm: 'http://www.w3.org/2001/04/xmlenc#sha256',
|
|
189
|
+
},
|
|
190
|
+
'ds:DigestValue': '',
|
|
191
|
+
},
|
|
192
|
+
],
|
|
193
|
+
},
|
|
194
|
+
'ds:SignatureValue': '',
|
|
195
|
+
'ds:KeyInfo': {
|
|
196
|
+
'ds:X509Data': {
|
|
197
|
+
'ds:X509Certificate': '',
|
|
198
|
+
},
|
|
199
|
+
},
|
|
200
|
+
'ds:Object': {
|
|
201
|
+
'xades:QualifyingProperties': {
|
|
202
|
+
Target: 'signature',
|
|
203
|
+
'xades:SignedProperties': {
|
|
204
|
+
Target: 'signature',
|
|
205
|
+
Id: 'id-xades-signed-props',
|
|
206
|
+
'xades:SignedSignatureProperties': {
|
|
207
|
+
'xades:SigningTime': '',
|
|
208
|
+
'xades:SigningCertificate': {
|
|
209
|
+
'xades:Cert': {
|
|
210
|
+
'xades:CertDigest': {
|
|
211
|
+
'ds:DigestMethod': {
|
|
212
|
+
Algorithm: 'http://www.w3.org/2001/04/xmlenc#sha256',
|
|
213
|
+
},
|
|
214
|
+
'ds:DigestValue': '',
|
|
215
|
+
},
|
|
216
|
+
'xades:IssuerSerial': {
|
|
217
|
+
'ds:X509IssuerName': '',
|
|
218
|
+
'ds:X509SerialNumber': '',
|
|
219
|
+
},
|
|
220
|
+
},
|
|
221
|
+
},
|
|
222
|
+
},
|
|
223
|
+
},
|
|
224
|
+
},
|
|
225
|
+
},
|
|
226
|
+
},
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
describe('Sign and Submit Invoice', () => {
|
|
231
|
+
beforeEach(() => {
|
|
232
|
+
vi.clearAllMocks()
|
|
233
|
+
})
|
|
234
|
+
|
|
235
|
+
describe('Invoice Signing', () => {
|
|
236
|
+
it('should generate a signed invoice XML with test credentials', async () => {
|
|
237
|
+
// Skip if no test credentials available
|
|
238
|
+
if (!process.env.CERTIFICATE || !process.env.PRIVATE_KEY) {
|
|
239
|
+
expect
|
|
240
|
+
.soft(
|
|
241
|
+
false,
|
|
242
|
+
'Skipping test: Missing CERTIFICATE or PRIVATE_KEY environment variables',
|
|
243
|
+
)
|
|
244
|
+
.toBe(true)
|
|
245
|
+
return
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
const invoiceData = createTestInvoiceData()
|
|
249
|
+
const signingCredentials = createTestSigningCredentials()
|
|
250
|
+
|
|
251
|
+
const signedXML = await generateSignedInvoiceXML(
|
|
252
|
+
invoiceData,
|
|
253
|
+
signingCredentials,
|
|
254
|
+
)
|
|
255
|
+
|
|
256
|
+
// Verify the XML contains expected elements
|
|
257
|
+
expect(signedXML).toContain(
|
|
258
|
+
'<Invoice xmlns="urn:oasis:names:specification:ubl:schema:xsd:Invoice-2"',
|
|
259
|
+
)
|
|
260
|
+
expect(signedXML).toContain('<ds:SignatureValue>')
|
|
261
|
+
expect(signedXML).toContain('<ds:X509Certificate>')
|
|
262
|
+
expect(signedXML).toContain('<xades:SigningTime>')
|
|
263
|
+
expect(signedXML).toContain(invoiceData.eInvoiceCodeOrNumber)
|
|
264
|
+
expect(signedXML).toContain(invoiceData.supplier.name)
|
|
265
|
+
expect(signedXML).toContain(invoiceData.buyer.name)
|
|
266
|
+
|
|
267
|
+
// Verify signature elements are populated (not empty)
|
|
268
|
+
expect(signedXML).not.toContain('<ds:SignatureValue></ds:SignatureValue>')
|
|
269
|
+
expect(signedXML).not.toContain(
|
|
270
|
+
'<ds:X509Certificate></ds:X509Certificate>',
|
|
271
|
+
)
|
|
272
|
+
})
|
|
273
|
+
|
|
274
|
+
it('should generate document hash for submission', async () => {
|
|
275
|
+
if (!process.env.CERTIFICATE || !process.env.PRIVATE_KEY) {
|
|
276
|
+
expect
|
|
277
|
+
.soft(
|
|
278
|
+
false,
|
|
279
|
+
'Skipping test: Missing CERTIFICATE or PRIVATE_KEY environment variables',
|
|
280
|
+
)
|
|
281
|
+
.toBe(true)
|
|
282
|
+
return
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
const invoiceData = createTestInvoiceData()
|
|
286
|
+
const signingCredentials = createTestSigningCredentials()
|
|
287
|
+
|
|
288
|
+
const signedXML = await generateSignedInvoiceXML(
|
|
289
|
+
invoiceData,
|
|
290
|
+
signingCredentials,
|
|
291
|
+
)
|
|
292
|
+
|
|
293
|
+
const documentHash = generateDocumentHash(signedXML)
|
|
294
|
+
const base64Document = encodeDocumentForSubmission(signedXML)
|
|
295
|
+
|
|
296
|
+
// Test the alternative hash method
|
|
297
|
+
console.log('\n๐ง TESTING ALTERNATIVE HASH METHOD:')
|
|
298
|
+
try {
|
|
299
|
+
const canonicalizedHash =
|
|
300
|
+
await generateDocumentHashForSubmission(signedXML)
|
|
301
|
+
console.log(`Current hash: ${documentHash}`)
|
|
302
|
+
console.log(`Canonicalized hash: ${canonicalizedHash}`)
|
|
303
|
+
console.log(
|
|
304
|
+
`Methods are equal: ${documentHash === canonicalizedHash ? 'โ
' : 'โ'}`,
|
|
305
|
+
)
|
|
306
|
+
} catch (error) {
|
|
307
|
+
console.log('โ Error testing canonicalized hash:', error)
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
// Verify hash is a valid hex string
|
|
311
|
+
expect(documentHash).toMatch(/^[a-f0-9]{64}$/)
|
|
312
|
+
|
|
313
|
+
// Verify base64 encoding
|
|
314
|
+
expect(() => Buffer.from(base64Document, 'base64')).not.toThrow()
|
|
315
|
+
|
|
316
|
+
// CRITICAL TEST: Verify the hash is calculated from the same minified XML that gets encoded
|
|
317
|
+
// This ensures consistency between documentHash and document (base64) values
|
|
318
|
+
const minifiedXML = signedXML
|
|
319
|
+
.replace(/>\s+</g, '><')
|
|
320
|
+
.replace(/\s+/g, ' ')
|
|
321
|
+
.replace(/>\s/g, '>')
|
|
322
|
+
.replace(/\s</g, '<')
|
|
323
|
+
.trim()
|
|
324
|
+
|
|
325
|
+
// Calculate hash of minified XML manually to verify our generateDocumentHash function
|
|
326
|
+
const crypto = require('crypto')
|
|
327
|
+
const expectedHash = crypto
|
|
328
|
+
.createHash('sha256')
|
|
329
|
+
.update(minifiedXML, 'utf8')
|
|
330
|
+
.digest('hex')
|
|
331
|
+
|
|
332
|
+
// The documentHash should match the hash of the minified XML
|
|
333
|
+
expect(documentHash).toEqual(expectedHash)
|
|
334
|
+
|
|
335
|
+
// The base64Document should decode to the same minified XML
|
|
336
|
+
const decodedDocument = Buffer.from(base64Document, 'base64').toString(
|
|
337
|
+
'utf8',
|
|
338
|
+
)
|
|
339
|
+
expect(decodedDocument).toEqual(minifiedXML)
|
|
340
|
+
})
|
|
341
|
+
|
|
342
|
+
it('should validate signing credentials properly', () => {
|
|
343
|
+
if (!process.env.CERTIFICATE || !process.env.PRIVATE_KEY) {
|
|
344
|
+
expect
|
|
345
|
+
.soft(
|
|
346
|
+
false,
|
|
347
|
+
'Skipping test: Missing CERTIFICATE or PRIVATE_KEY environment variables',
|
|
348
|
+
)
|
|
349
|
+
.toBe(true)
|
|
350
|
+
return
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
expect(() => createTestSigningCredentials()).not.toThrow()
|
|
354
|
+
|
|
355
|
+
const credentials = createTestSigningCredentials()
|
|
356
|
+
expect(credentials.privateKeyPem).toBeDefined()
|
|
357
|
+
expect(credentials.certificatePem).toBeDefined()
|
|
358
|
+
expect(credentials.issuerName).toBeDefined()
|
|
359
|
+
expect(credentials.serialNumber).toBeDefined()
|
|
360
|
+
})
|
|
361
|
+
})
|
|
362
|
+
|
|
363
|
+
describe('Real API Integration (Optional)', () => {
|
|
364
|
+
it('should submit to real MyInvois API if credentials are provided', async () => {
|
|
365
|
+
// Skip if no real API credentials
|
|
366
|
+
if (
|
|
367
|
+
!process.env.CLIENT_ID ||
|
|
368
|
+
!process.env.CLIENT_SECRET ||
|
|
369
|
+
!process.env.CERTIFICATE ||
|
|
370
|
+
!process.env.PRIVATE_KEY
|
|
371
|
+
) {
|
|
372
|
+
expect
|
|
373
|
+
.soft(
|
|
374
|
+
false,
|
|
375
|
+
'Skipping real API test: Missing required environment variables (CLIENT_ID, CLIENT_SECRET, CERTIFICATE, PRIVATE_KEY)',
|
|
376
|
+
)
|
|
377
|
+
.toBe(true)
|
|
378
|
+
return
|
|
379
|
+
}
|
|
380
|
+
|
|
381
|
+
const invoiceData = createTestInvoiceData()
|
|
382
|
+
const signingCredentials = createTestSigningCredentials()
|
|
383
|
+
|
|
384
|
+
const signedXML = await generateSignedInvoiceXML(
|
|
385
|
+
invoiceData,
|
|
386
|
+
signingCredentials,
|
|
387
|
+
)
|
|
388
|
+
const documentHash = generateDocumentHash(signedXML)
|
|
389
|
+
const base64Document = encodeDocumentForSubmission(signedXML)
|
|
390
|
+
|
|
391
|
+
// Note: This test will only run if you have real credentials
|
|
392
|
+
// and would actually submit to the MyInvois sandbox API
|
|
393
|
+
console.log('Generated signed XML length:', signedXML.length)
|
|
394
|
+
console.log('Document hash:', documentHash)
|
|
395
|
+
console.log('Base64 document length:', base64Document.length)
|
|
396
|
+
|
|
397
|
+
// For safety, we'll just validate the data format without actual submission
|
|
398
|
+
expect(signedXML).toContain('<Invoice xmlns=')
|
|
399
|
+
expect(documentHash).toMatch(/^[a-f0-9]{64}$/)
|
|
400
|
+
expect(base64Document.length).toBeGreaterThan(0)
|
|
401
|
+
}, 30000) // Longer timeout for potential API calls
|
|
402
|
+
})
|
|
403
|
+
|
|
404
|
+
describe('Edge Cases and Error Handling', () => {
|
|
405
|
+
it('should handle missing required invoice fields', async () => {
|
|
406
|
+
const incompleteInvoice = {
|
|
407
|
+
eInvoiceVersion: '1.1',
|
|
408
|
+
eInvoiceTypeCode: '01',
|
|
409
|
+
// Missing required fields
|
|
410
|
+
} as any
|
|
411
|
+
|
|
412
|
+
// This should fail during XML generation
|
|
413
|
+
await expect(
|
|
414
|
+
generateSignedInvoiceXML(
|
|
415
|
+
incompleteInvoice,
|
|
416
|
+
createTestSigningCredentials(),
|
|
417
|
+
),
|
|
418
|
+
).rejects.toThrow()
|
|
419
|
+
})
|
|
420
|
+
|
|
421
|
+
it('should handle invalid signing credentials', async () => {
|
|
422
|
+
const invoiceData = createTestInvoiceData()
|
|
423
|
+
const invalidCredentials = {
|
|
424
|
+
privateKeyPem: 'invalid-private-key',
|
|
425
|
+
certificatePem: 'invalid-certificate',
|
|
426
|
+
issuerName: 'invalid-issuer',
|
|
427
|
+
serialNumber: 'invalid-serial',
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
await expect(
|
|
431
|
+
generateSignedInvoiceXML(invoiceData, invalidCredentials),
|
|
432
|
+
).rejects.toThrow()
|
|
433
|
+
})
|
|
434
|
+
|
|
435
|
+
it('should validate document size limits', async () => {
|
|
436
|
+
if (!process.env.CERTIFICATE || !process.env.PRIVATE_KEY) {
|
|
437
|
+
expect
|
|
438
|
+
.soft(
|
|
439
|
+
false,
|
|
440
|
+
'Skipping test: Missing CERTIFICATE or PRIVATE_KEY environment variables',
|
|
441
|
+
)
|
|
442
|
+
.toBe(true)
|
|
443
|
+
return
|
|
444
|
+
}
|
|
445
|
+
|
|
446
|
+
const invoiceData = createTestInvoiceData()
|
|
447
|
+
const signingCredentials = createTestSigningCredentials()
|
|
448
|
+
|
|
449
|
+
const signedXML = await generateSignedInvoiceXML(
|
|
450
|
+
invoiceData,
|
|
451
|
+
signingCredentials,
|
|
452
|
+
)
|
|
453
|
+
const sizeInBytes = Buffer.from(signedXML, 'utf8').length
|
|
454
|
+
|
|
455
|
+
// Verify document is under MyInvois limits (300KB per document)
|
|
456
|
+
expect(sizeInBytes).toBeLessThan(300 * 1024)
|
|
457
|
+
|
|
458
|
+
console.log(
|
|
459
|
+
`Generated document size: ${sizeInBytes} bytes (${(sizeInBytes / 1024).toFixed(2)} KB)`,
|
|
460
|
+
)
|
|
461
|
+
})
|
|
462
|
+
})
|
|
463
|
+
|
|
464
|
+
describe('Debugging Invalid Structure Issues', () => {
|
|
465
|
+
it('should debug and validate XML structure comprehensively', async () => {
|
|
466
|
+
if (!process.env.CERTIFICATE || !process.env.PRIVATE_KEY) {
|
|
467
|
+
expect
|
|
468
|
+
.soft(
|
|
469
|
+
false,
|
|
470
|
+
'Skipping test: Missing CERTIFICATE or PRIVATE_KEY environment variables',
|
|
471
|
+
)
|
|
472
|
+
.toBe(true)
|
|
473
|
+
return
|
|
474
|
+
}
|
|
475
|
+
|
|
476
|
+
const invoiceData = createTestInvoiceData()
|
|
477
|
+
const signingCredentials = createTestSigningCredentials()
|
|
478
|
+
|
|
479
|
+
console.log('\n๐ DEBUGGING XML STRUCTURE ISSUES')
|
|
480
|
+
console.log('=====================================')
|
|
481
|
+
|
|
482
|
+
// Run comprehensive debugging
|
|
483
|
+
const debugResults = await debugSignedInvoiceXML(
|
|
484
|
+
invoiceData,
|
|
485
|
+
signingCredentials,
|
|
486
|
+
)
|
|
487
|
+
|
|
488
|
+
console.log('\n๐ VALIDATION RESULTS:')
|
|
489
|
+
console.log(
|
|
490
|
+
'XML Structure Valid:',
|
|
491
|
+
debugResults.validationResults.xmlStructure.valid,
|
|
492
|
+
)
|
|
493
|
+
console.log(
|
|
494
|
+
'Signature Elements Valid:',
|
|
495
|
+
debugResults.validationResults.signatureElements.valid,
|
|
496
|
+
)
|
|
497
|
+
console.log(
|
|
498
|
+
'Digest Values Valid:',
|
|
499
|
+
debugResults.validationResults.digestValues.valid,
|
|
500
|
+
)
|
|
501
|
+
console.log(
|
|
502
|
+
'Certificate Info Valid:',
|
|
503
|
+
debugResults.validationResults.certificateInfo.valid,
|
|
504
|
+
)
|
|
505
|
+
|
|
506
|
+
if (debugResults.validationResults.xmlStructure.errors.length > 0) {
|
|
507
|
+
console.log('\nโ XML Structure Errors:')
|
|
508
|
+
debugResults.validationResults.xmlStructure.errors.forEach(error =>
|
|
509
|
+
console.log(` - ${error}`),
|
|
510
|
+
)
|
|
511
|
+
}
|
|
512
|
+
|
|
513
|
+
if (debugResults.validationResults.signatureElements.errors.length > 0) {
|
|
514
|
+
console.log('\nโ Signature Element Errors:')
|
|
515
|
+
debugResults.validationResults.signatureElements.errors.forEach(error =>
|
|
516
|
+
console.log(` - ${error}`),
|
|
517
|
+
)
|
|
518
|
+
}
|
|
519
|
+
|
|
520
|
+
if (debugResults.validationResults.digestValues.errors.length > 0) {
|
|
521
|
+
console.log('\nโ Digest Value Errors:')
|
|
522
|
+
debugResults.validationResults.digestValues.errors.forEach(error =>
|
|
523
|
+
console.log(` - ${error}`),
|
|
524
|
+
)
|
|
525
|
+
}
|
|
526
|
+
|
|
527
|
+
if (debugResults.validationResults.certificateInfo.errors.length > 0) {
|
|
528
|
+
console.log('\nโ Certificate Info Errors:')
|
|
529
|
+
debugResults.validationResults.certificateInfo.errors.forEach(error =>
|
|
530
|
+
console.log(` - ${error}`),
|
|
531
|
+
)
|
|
532
|
+
}
|
|
533
|
+
|
|
534
|
+
console.log('\n๐ STEP-BY-STEP RESULTS:')
|
|
535
|
+
Object.entries(debugResults.stepByStepResults).forEach(
|
|
536
|
+
([step, result]) => {
|
|
537
|
+
const status = result.success ? 'โ
' : 'โ'
|
|
538
|
+
console.log(
|
|
539
|
+
`${status} ${step}: ${result.success ? 'SUCCESS' : `FAILED - ${result.error}`}`,
|
|
540
|
+
)
|
|
541
|
+
},
|
|
542
|
+
)
|
|
543
|
+
|
|
544
|
+
if (debugResults.validationResults.canonicalizationTest) {
|
|
545
|
+
console.log('\n๐ง CANONICALIZATION TEST:')
|
|
546
|
+
console.log(
|
|
547
|
+
'Exclusive C14N Success:',
|
|
548
|
+
debugResults.validationResults.canonicalizationTest.exclusiveC14N
|
|
549
|
+
?.success,
|
|
550
|
+
)
|
|
551
|
+
console.log(
|
|
552
|
+
'C14N 1.1 Fallback Success:',
|
|
553
|
+
debugResults.validationResults.canonicalizationTest.c14n11Fallback
|
|
554
|
+
?.success,
|
|
555
|
+
)
|
|
556
|
+
console.log(
|
|
557
|
+
'Results Equal:',
|
|
558
|
+
debugResults.validationResults.canonicalizationTest.areEqual,
|
|
559
|
+
)
|
|
560
|
+
}
|
|
561
|
+
|
|
562
|
+
if (debugResults.signedXML) {
|
|
563
|
+
// Additional XML structure validation
|
|
564
|
+
const xmlValidation = validateXMLStructure(debugResults.signedXML)
|
|
565
|
+
console.log('\n๐ XML VALIDATION:')
|
|
566
|
+
console.log('Overall Valid:', xmlValidation.isValid)
|
|
567
|
+
|
|
568
|
+
if (xmlValidation.errors.length > 0) {
|
|
569
|
+
console.log('Errors:')
|
|
570
|
+
xmlValidation.errors.forEach(error => console.log(` - ${error}`))
|
|
571
|
+
}
|
|
572
|
+
|
|
573
|
+
if (xmlValidation.warnings.length > 0) {
|
|
574
|
+
console.log('Warnings:')
|
|
575
|
+
xmlValidation.warnings.forEach(warning =>
|
|
576
|
+
console.log(` - ${warning}`),
|
|
577
|
+
)
|
|
578
|
+
}
|
|
579
|
+
|
|
580
|
+
// Check document size
|
|
581
|
+
const sizeInBytes = Buffer.from(debugResults.signedXML, 'utf8').length
|
|
582
|
+
console.log(
|
|
583
|
+
`\n๐ Document Size: ${sizeInBytes} bytes (${(sizeInBytes / 1024).toFixed(2)} KB)`,
|
|
584
|
+
)
|
|
585
|
+
|
|
586
|
+
// Sample of generated XML for manual inspection
|
|
587
|
+
console.log('\n๐ XML SAMPLE (first 500 chars):')
|
|
588
|
+
console.log(debugResults.signedXML.substring(0, 500) + '...')
|
|
589
|
+
|
|
590
|
+
// Check for common MyInvois issues
|
|
591
|
+
console.log('\n๐ฏ MYINVOIS SPECIFIC CHECKS:')
|
|
592
|
+
const commonIssues: string[] = []
|
|
593
|
+
|
|
594
|
+
// Check for proper namespace declarations
|
|
595
|
+
if (
|
|
596
|
+
!debugResults.signedXML.includes(
|
|
597
|
+
'xmlns:ext="urn:oasis:names:specification:ubl:schema:xsd:CommonExtensionComponents-2"',
|
|
598
|
+
)
|
|
599
|
+
) {
|
|
600
|
+
commonIssues.push('Missing ext namespace declaration')
|
|
601
|
+
}
|
|
602
|
+
|
|
603
|
+
// Check for proper signature target
|
|
604
|
+
if (!debugResults.signedXML.includes('Target="signature"')) {
|
|
605
|
+
commonIssues.push('Missing or incorrect signature target')
|
|
606
|
+
}
|
|
607
|
+
|
|
608
|
+
// Check for proper digest algorithms
|
|
609
|
+
if (
|
|
610
|
+
!debugResults.signedXML.includes(
|
|
611
|
+
'Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"',
|
|
612
|
+
)
|
|
613
|
+
) {
|
|
614
|
+
commonIssues.push('Missing or incorrect SHA256 digest algorithm')
|
|
615
|
+
}
|
|
616
|
+
|
|
617
|
+
// Check for RSA-SHA256 signature method
|
|
618
|
+
if (
|
|
619
|
+
!debugResults.signedXML.includes(
|
|
620
|
+
'Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"',
|
|
621
|
+
)
|
|
622
|
+
) {
|
|
623
|
+
commonIssues.push(
|
|
624
|
+
'Missing or incorrect RSA-SHA256 signature algorithm',
|
|
625
|
+
)
|
|
626
|
+
}
|
|
627
|
+
|
|
628
|
+
// Check for proper C14N algorithm in XML
|
|
629
|
+
if (
|
|
630
|
+
!debugResults.signedXML.includes(
|
|
631
|
+
'Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"',
|
|
632
|
+
)
|
|
633
|
+
) {
|
|
634
|
+
commonIssues.push(
|
|
635
|
+
'XML declares different canonicalization algorithm than expected',
|
|
636
|
+
)
|
|
637
|
+
}
|
|
638
|
+
|
|
639
|
+
if (commonIssues.length > 0) {
|
|
640
|
+
console.log('โ Common MyInvois Issues Found:')
|
|
641
|
+
commonIssues.forEach(issue => console.log(` - ${issue}`))
|
|
642
|
+
} else {
|
|
643
|
+
console.log('โ
No common MyInvois issues detected')
|
|
644
|
+
}
|
|
645
|
+
}
|
|
646
|
+
|
|
647
|
+
// This test helps with debugging but doesn't fail based on the results
|
|
648
|
+
// The actual validation should be done by reviewing the console output
|
|
649
|
+
expect(debugResults).toBeDefined()
|
|
650
|
+
}, 30000)
|
|
651
|
+
|
|
652
|
+
it('should test canonicalization algorithms specifically', async () => {
|
|
653
|
+
if (!process.env.CERTIFICATE || !process.env.PRIVATE_KEY) {
|
|
654
|
+
expect.soft(false, 'Skipping test: Missing credentials').toBe(true)
|
|
655
|
+
return
|
|
656
|
+
}
|
|
657
|
+
|
|
658
|
+
const invoiceData = createTestInvoiceData()
|
|
659
|
+
const signingCredentials = createTestSigningCredentials()
|
|
660
|
+
|
|
661
|
+
console.log('\n๐ง CANONICALIZATION ALGORITHM TESTING')
|
|
662
|
+
console.log('=====================================')
|
|
663
|
+
|
|
664
|
+
// Generate a signed XML first to get the template
|
|
665
|
+
const signedXML = await generateSignedInvoiceXML(
|
|
666
|
+
invoiceData,
|
|
667
|
+
signingCredentials,
|
|
668
|
+
)
|
|
669
|
+
const testResults = await testCanonicalizationAlgorithms(signedXML)
|
|
670
|
+
|
|
671
|
+
console.log('Exclusive C14N Success:', testResults.exclusiveC14N.success)
|
|
672
|
+
if (!testResults.exclusiveC14N.success) {
|
|
673
|
+
console.log('Exclusive C14N Error:', testResults.exclusiveC14N.error)
|
|
674
|
+
} else {
|
|
675
|
+
console.log('Exclusive C14N Digest:', testResults.exclusiveC14N.digest)
|
|
676
|
+
}
|
|
677
|
+
|
|
678
|
+
console.log(
|
|
679
|
+
'C14N 1.1 Fallback Success:',
|
|
680
|
+
testResults.c14n11Fallback.success,
|
|
681
|
+
)
|
|
682
|
+
if (!testResults.c14n11Fallback.success) {
|
|
683
|
+
console.log(
|
|
684
|
+
'C14N 1.1 Fallback Error:',
|
|
685
|
+
testResults.c14n11Fallback.error,
|
|
686
|
+
)
|
|
687
|
+
} else {
|
|
688
|
+
console.log(
|
|
689
|
+
'C14N 1.1 Fallback Digest:',
|
|
690
|
+
testResults.c14n11Fallback.digest,
|
|
691
|
+
)
|
|
692
|
+
}
|
|
693
|
+
|
|
694
|
+
console.log('Algorithms produce same result:', testResults.areEqual)
|
|
695
|
+
|
|
696
|
+
if (
|
|
697
|
+
!testResults.areEqual &&
|
|
698
|
+
testResults.exclusiveC14N.success &&
|
|
699
|
+
testResults.c14n11Fallback.success
|
|
700
|
+
) {
|
|
701
|
+
console.log(
|
|
702
|
+
'\nโ ๏ธ WARNING: Different canonicalization algorithms produce different results!',
|
|
703
|
+
)
|
|
704
|
+
console.log('This may be the cause of MyInvois validation failures.')
|
|
705
|
+
console.log('Exclusive C14N digest:', testResults.exclusiveC14N.digest)
|
|
706
|
+
console.log('C14N 1.1 digest:', testResults.c14n11Fallback.digest)
|
|
707
|
+
}
|
|
708
|
+
|
|
709
|
+
expect(testResults).toBeDefined()
|
|
710
|
+
})
|
|
711
|
+
|
|
712
|
+
it('should debug document hash calculation methods', async () => {
|
|
713
|
+
if (!process.env.CERTIFICATE || !process.env.PRIVATE_KEY) {
|
|
714
|
+
expect.soft(false, 'Skipping test: Missing credentials').toBe(true)
|
|
715
|
+
return
|
|
716
|
+
}
|
|
717
|
+
|
|
718
|
+
const invoiceData = createTestInvoiceData()
|
|
719
|
+
const signingCredentials = createTestSigningCredentials()
|
|
720
|
+
|
|
721
|
+
console.log('\n๐ง DOCUMENT HASH DEBUGGING')
|
|
722
|
+
console.log('===========================')
|
|
723
|
+
|
|
724
|
+
// Then debug the actual hash calculation
|
|
725
|
+
const debugResults = await debugDocumentHash(
|
|
726
|
+
invoiceData,
|
|
727
|
+
signingCredentials,
|
|
728
|
+
)
|
|
729
|
+
|
|
730
|
+
console.log('\n๐ HASH ANALYSIS RESULTS:')
|
|
731
|
+
console.log(
|
|
732
|
+
`Submission Hash: ${debugResults.documentHashes.submissionHash}`,
|
|
733
|
+
)
|
|
734
|
+
console.log(
|
|
735
|
+
`Signature Doc Digest: ${debugResults.documentHashes.signatureDocDigest}`,
|
|
736
|
+
)
|
|
737
|
+
console.log(
|
|
738
|
+
`Raw Document Hash: ${debugResults.documentHashes.rawDocumentHash}`,
|
|
739
|
+
)
|
|
740
|
+
console.log(
|
|
741
|
+
`Minified Hash: ${debugResults.documentHashes.minifiedDocumentHash}`,
|
|
742
|
+
)
|
|
743
|
+
console.log(
|
|
744
|
+
`Transformed Hash: ${debugResults.documentHashes.transformedDocumentHash}`,
|
|
745
|
+
)
|
|
746
|
+
|
|
747
|
+
console.log('\n๐ EQUALITY CHECKS:')
|
|
748
|
+
Object.entries(debugResults.areEqual).forEach(([comparison, isEqual]) => {
|
|
749
|
+
console.log(`${comparison}: ${isEqual ? 'โ
' : 'โ'}`)
|
|
750
|
+
})
|
|
751
|
+
|
|
752
|
+
if (debugResults.recommendations.length > 0) {
|
|
753
|
+
console.log('\n๐ก RECOMMENDATIONS:')
|
|
754
|
+
debugResults.recommendations.forEach(rec => console.log(` ${rec}`))
|
|
755
|
+
}
|
|
756
|
+
|
|
757
|
+
// Test different submission hash methods
|
|
758
|
+
const methodResults = await testSubmissionHashMethods(
|
|
759
|
+
invoiceData,
|
|
760
|
+
signingCredentials,
|
|
761
|
+
)
|
|
762
|
+
|
|
763
|
+
console.log('\n๐งช HASH METHOD COMPARISON:')
|
|
764
|
+
Object.entries(methodResults.methods).forEach(([method, hash]) => {
|
|
765
|
+
console.log(`${method}: ${hash}`)
|
|
766
|
+
})
|
|
767
|
+
|
|
768
|
+
if (methodResults.recommendations.length > 0) {
|
|
769
|
+
console.log('\n๐ง METHOD RECOMMENDATIONS:')
|
|
770
|
+
methodResults.recommendations.forEach(rec => console.log(` ${rec}`))
|
|
771
|
+
}
|
|
772
|
+
|
|
773
|
+
// Key findings
|
|
774
|
+
console.log('\n๐ฏ KEY FINDINGS:')
|
|
775
|
+
if (!debugResults.areEqual.submissionVsSignature) {
|
|
776
|
+
console.log('โ CRITICAL: Submission hash โ Signature digest')
|
|
777
|
+
console.log(
|
|
778
|
+
' This is likely why MyInvois rejects "Document hash is not valid"',
|
|
779
|
+
)
|
|
780
|
+
console.log(' MyInvois probably expects these to match exactly')
|
|
781
|
+
}
|
|
782
|
+
|
|
783
|
+
if (debugResults.areEqual.submissionVsTransformed) {
|
|
784
|
+
console.log('โ
Submission hash matches transformed document hash')
|
|
785
|
+
console.log(
|
|
786
|
+
' This suggests the current approach is on the right track',
|
|
787
|
+
)
|
|
788
|
+
}
|
|
789
|
+
|
|
790
|
+
// Practical fix suggestions
|
|
791
|
+
console.log('\n๐ง IMMEDIATE FIXES TO TRY:')
|
|
792
|
+
console.log(
|
|
793
|
+
'1. Use signature digest as documentHash in submission payload',
|
|
794
|
+
)
|
|
795
|
+
console.log(
|
|
796
|
+
'2. Ensure both signature and submission use same canonicalization',
|
|
797
|
+
)
|
|
798
|
+
console.log(
|
|
799
|
+
'3. Use minified XML for hash calculation if sizes differ significantly',
|
|
800
|
+
)
|
|
801
|
+
|
|
802
|
+
expect(debugResults).toBeDefined()
|
|
803
|
+
expect(methodResults).toBeDefined()
|
|
804
|
+
}, 30000)
|
|
805
|
+
})
|
|
806
|
+
})
|
|
807
|
+
|
|
808
|
+
describe('Real API Submission with Self-Signed Certificate', () => {
|
|
809
|
+
it('should attempt a real submission to MyInvois API using self-signed cert and API keys', async () => {
|
|
810
|
+
if (!process.env.CLIENT_ID || !process.env.CLIENT_SECRET) {
|
|
811
|
+
console.warn(
|
|
812
|
+
'Skipping real API test: Missing CLIENT_ID or CLIENT_SECRET environment variables',
|
|
813
|
+
)
|
|
814
|
+
expect
|
|
815
|
+
.soft(
|
|
816
|
+
false,
|
|
817
|
+
'Skipping real API test: Missing CLIENT_ID or CLIENT_SECRET environment variables',
|
|
818
|
+
)
|
|
819
|
+
.toBe(true)
|
|
820
|
+
return
|
|
821
|
+
}
|
|
822
|
+
|
|
823
|
+
const privateKeyPem = process.env.PRIVATE_KEY
|
|
824
|
+
const certificatePem = process.env.CERTIFICATE
|
|
825
|
+
|
|
826
|
+
if (!privateKeyPem || !certificatePem) {
|
|
827
|
+
console.warn(
|
|
828
|
+
'Skipping real API test: Missing PRIVATE_KEY or CERTIFICATE environment variables',
|
|
829
|
+
)
|
|
830
|
+
expect
|
|
831
|
+
.soft(
|
|
832
|
+
false,
|
|
833
|
+
'Skipping real API test: Missing PRIVATE_KEY or CERTIFICATE environment variables',
|
|
834
|
+
)
|
|
835
|
+
.toBe(true)
|
|
836
|
+
return
|
|
837
|
+
}
|
|
838
|
+
|
|
839
|
+
const invoiceData = createTestInvoiceData()
|
|
840
|
+
|
|
841
|
+
const client = new MyInvoisClient(
|
|
842
|
+
process.env.CLIENT_ID!,
|
|
843
|
+
process.env.CLIENT_SECRET!,
|
|
844
|
+
'sandbox',
|
|
845
|
+
undefined,
|
|
846
|
+
true,
|
|
847
|
+
)
|
|
848
|
+
|
|
849
|
+
// 2. Submit Document
|
|
850
|
+
try {
|
|
851
|
+
const { data: submissionResponse, status } = await client.submitDocument([
|
|
852
|
+
invoiceData,
|
|
853
|
+
])
|
|
854
|
+
console.log('Real Submission API Response Status:', status)
|
|
855
|
+
console.log('Real Submission API Response Body:', submissionResponse)
|
|
856
|
+
|
|
857
|
+
console.log(
|
|
858
|
+
'Real Submission Successful. SubmissionUid:',
|
|
859
|
+
submissionResponse.submissionUid,
|
|
860
|
+
)
|
|
861
|
+
if (
|
|
862
|
+
submissionResponse.acceptedDocuments &&
|
|
863
|
+
submissionResponse.acceptedDocuments.length > 0
|
|
864
|
+
) {
|
|
865
|
+
console.log(
|
|
866
|
+
'Accepted Document UUID:',
|
|
867
|
+
submissionResponse.acceptedDocuments[0].invoiceCodeNumber,
|
|
868
|
+
)
|
|
869
|
+
}
|
|
870
|
+
if (
|
|
871
|
+
submissionResponse.rejectedDocuments &&
|
|
872
|
+
submissionResponse.rejectedDocuments.length > 0
|
|
873
|
+
) {
|
|
874
|
+
console.warn(
|
|
875
|
+
'Rejected Documents:',
|
|
876
|
+
submissionResponse.rejectedDocuments,
|
|
877
|
+
)
|
|
878
|
+
|
|
879
|
+
console.warn(
|
|
880
|
+
'Rejected Document Details: ',
|
|
881
|
+
submissionResponse.rejectedDocuments.flatMap(
|
|
882
|
+
doc => doc.error?.details,
|
|
883
|
+
),
|
|
884
|
+
)
|
|
885
|
+
}
|
|
886
|
+
|
|
887
|
+
expect(status).toBe(202) // MyInvois typically returns 202 Accepted
|
|
888
|
+
expect(submissionResponse.submissionUid).toBeDefined()
|
|
889
|
+
expect(submissionResponse.submissionUid).not.toBeNull()
|
|
890
|
+
|
|
891
|
+
const submission = await client.getSubmissionStatus(
|
|
892
|
+
submissionResponse.submissionUid,
|
|
893
|
+
)
|
|
894
|
+
console.log('Submission:', submission)
|
|
895
|
+
expect(submission).toBeDefined()
|
|
896
|
+
expect(submission.status).oneOf(['Validated', 'Invalid'])
|
|
897
|
+
} catch (error: any) {
|
|
898
|
+
console.error('Error during real document submission:', error)
|
|
899
|
+
|
|
900
|
+
// Check if this is a TIN mismatch error
|
|
901
|
+
const errorMessage = error.message || error.toString()
|
|
902
|
+
if (
|
|
903
|
+
errorMessage.includes(
|
|
904
|
+
'authenticated TIN and documents TIN is not matching',
|
|
905
|
+
)
|
|
906
|
+
) {
|
|
907
|
+
console.log('\nโ TIN MISMATCH ERROR DETECTED!')
|
|
908
|
+
console.log('=====================================')
|
|
909
|
+
}
|
|
910
|
+
|
|
911
|
+
expect.soft(false, 'Error during real document submission.').toBe(true)
|
|
912
|
+
throw error
|
|
913
|
+
}
|
|
914
|
+
}, 45000) // Increased timeout for real API calls
|
|
915
|
+
})
|