@ripwords/myinvois-client 0.0.10 → 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 -103
- package/dist/index.d.ts +60 -5666
- package/dist/index.js +11 -99
- 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/platformLogin.ts +6 -1
- package/src/types/documents/invoice-1_1.d.ts +90 -0
- package/src/types/msic-codes.d.ts +1 -7
- package/src/utils/MyInvoisClient.ts +421 -8
- 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,671 @@
|
|
|
1
|
+
import * as crypto from 'crypto'
|
|
2
|
+
import type { InvoiceV1_1 } from '../types/documents/invoice-1_1.d.ts'
|
|
3
|
+
import { DOMParserImpl, XMLSerializerImpl } from 'xmldom-ts'
|
|
4
|
+
import { canonicalizeAndHashDocumentWithC14N11Fallback } from './signature/canonicalize'
|
|
5
|
+
import { hashCertificate } from './signature/hashCert'
|
|
6
|
+
import { hashSignedPropertiesWithC14N11Fallback } from './signature/hashSignedProperties'
|
|
7
|
+
import {
|
|
8
|
+
populateFinalDocument,
|
|
9
|
+
type FinalDocumentData,
|
|
10
|
+
} from './signature/populateFinalDocument'
|
|
11
|
+
import {
|
|
12
|
+
populateSignedProperties,
|
|
13
|
+
type SignedPropertiesData,
|
|
14
|
+
} from './signature/populateSignedProperties'
|
|
15
|
+
import { signDocumentDigest } from './signature/sign'
|
|
16
|
+
import { transformXmlInvoice } from './signature/transform'
|
|
17
|
+
import type { SigningCredentials } from '../types/documents/invoice-1_1.d.ts'
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Escapes XML special characters
|
|
21
|
+
*/
|
|
22
|
+
const escapeXml = (text: string): string => {
|
|
23
|
+
return text
|
|
24
|
+
.replace(/&/g, '&')
|
|
25
|
+
.replace(/</g, '<')
|
|
26
|
+
.replace(/>/g, '>')
|
|
27
|
+
.replace(/"/g, '"')
|
|
28
|
+
.replace(/'/g, ''')
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Minifies XML by removing unnecessary whitespace and line breaks
|
|
33
|
+
* As recommended by MyInvois documentation for Submit Documents API
|
|
34
|
+
*/
|
|
35
|
+
const minifyXML = (xmlString: string): string => {
|
|
36
|
+
return xmlString
|
|
37
|
+
.replace(/>\s+</g, '><') // Remove whitespace between tags
|
|
38
|
+
.replace(/\s+/g, ' ') // Replace multiple spaces with single space
|
|
39
|
+
.replace(/>\s/g, '>') // Remove space after opening tags
|
|
40
|
+
.replace(/\s</g, '<') // Remove space before closing tags
|
|
41
|
+
.trim() // Remove leading/trailing whitespace
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Generates supplier XML section
|
|
46
|
+
*/
|
|
47
|
+
const generateSupplierXML = (supplier: InvoiceV1_1['supplier']): string => {
|
|
48
|
+
return `
|
|
49
|
+
<cac:AccountingSupplierParty>
|
|
50
|
+
<cac:Party>
|
|
51
|
+
${supplier.industryClassificationCode ? `<cbc:IndustryClassificationCode>${supplier.industryClassificationCode}</cbc:IndustryClassificationCode>` : ''}
|
|
52
|
+
<cac:PartyIdentification>
|
|
53
|
+
<cbc:ID schemeID="TIN">${escapeXml(supplier.tin)}</cbc:ID>
|
|
54
|
+
</cac:PartyIdentification>
|
|
55
|
+
<cac:PartyIdentification>
|
|
56
|
+
<cbc:ID schemeID="${supplier.registrationType}">${escapeXml(supplier.registrationNumber)}</cbc:ID>
|
|
57
|
+
</cac:PartyIdentification>
|
|
58
|
+
<cac:PartyIdentification>
|
|
59
|
+
<cbc:ID schemeID="SST">${escapeXml(supplier.sstRegistrationNumber || 'NA')}</cbc:ID>
|
|
60
|
+
</cac:PartyIdentification>
|
|
61
|
+
<cac:PartyIdentification>
|
|
62
|
+
<cbc:ID schemeID="TTX">NA</cbc:ID>
|
|
63
|
+
</cac:PartyIdentification>
|
|
64
|
+
${generatePostalAddressXML(supplier.address)}
|
|
65
|
+
<cac:PartyLegalEntity>
|
|
66
|
+
<cbc:RegistrationName>${escapeXml(supplier.name)}</cbc:RegistrationName>
|
|
67
|
+
</cac:PartyLegalEntity>
|
|
68
|
+
<cac:Contact>
|
|
69
|
+
<cbc:Telephone>${escapeXml(supplier.contactNumber)}</cbc:Telephone>
|
|
70
|
+
<cbc:ElectronicMail>${escapeXml(supplier.email || 'NA')}</cbc:ElectronicMail>
|
|
71
|
+
</cac:Contact>
|
|
72
|
+
</cac:Party>
|
|
73
|
+
</cac:AccountingSupplierParty>`
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* Generates buyer XML section
|
|
78
|
+
*/
|
|
79
|
+
const generateBuyerXML = (buyer: InvoiceV1_1['buyer']): string => {
|
|
80
|
+
return `
|
|
81
|
+
<cac:AccountingCustomerParty>
|
|
82
|
+
<cac:Party>
|
|
83
|
+
<cac:PartyIdentification>
|
|
84
|
+
<cbc:ID schemeID="TIN">${escapeXml(buyer.tin)}</cbc:ID>
|
|
85
|
+
</cac:PartyIdentification>
|
|
86
|
+
<cac:PartyIdentification>
|
|
87
|
+
<cbc:ID schemeID="BRN">${escapeXml(buyer.registrationNumber || 'NA')}</cbc:ID>
|
|
88
|
+
</cac:PartyIdentification>
|
|
89
|
+
<cac:PartyIdentification>
|
|
90
|
+
<cbc:ID schemeID="SST">${escapeXml(buyer.sstRegistrationNumber || 'NA')}</cbc:ID>
|
|
91
|
+
</cac:PartyIdentification>
|
|
92
|
+
<cac:PartyIdentification>
|
|
93
|
+
<cbc:ID schemeID="TTX">NA</cbc:ID>
|
|
94
|
+
</cac:PartyIdentification>
|
|
95
|
+
${generatePostalAddressXML(buyer.address)}
|
|
96
|
+
<cac:PartyLegalEntity>
|
|
97
|
+
<cbc:RegistrationName>${escapeXml(buyer.name)}</cbc:RegistrationName>
|
|
98
|
+
</cac:PartyLegalEntity>
|
|
99
|
+
<cac:Contact>
|
|
100
|
+
<cbc:Telephone>${escapeXml(buyer.contactNumber || 'NA')}</cbc:Telephone>
|
|
101
|
+
<cbc:ElectronicMail>${escapeXml(buyer.email || 'NA')}</cbc:ElectronicMail>
|
|
102
|
+
</cac:Contact>
|
|
103
|
+
</cac:Party>
|
|
104
|
+
</cac:AccountingCustomerParty>`
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* Generates postal address XML section (updated to match working example)
|
|
109
|
+
*/
|
|
110
|
+
const generatePostalAddressXML = (
|
|
111
|
+
address: InvoiceV1_1['supplier']['address'],
|
|
112
|
+
): string => {
|
|
113
|
+
return `
|
|
114
|
+
<cac:PostalAddress>
|
|
115
|
+
<cbc:CityName>${escapeXml(address.cityName || ' ')}</cbc:CityName>
|
|
116
|
+
<cbc:PostalZone>${escapeXml(address.postalZone || ' ')}</cbc:PostalZone>
|
|
117
|
+
<cbc:CountrySubentityCode>${escapeXml(address.state || ' ')}</cbc:CountrySubentityCode>
|
|
118
|
+
<cac:AddressLine>
|
|
119
|
+
<cbc:Line>${escapeXml(address.addressLine0 || 'NA')}</cbc:Line>
|
|
120
|
+
</cac:AddressLine>
|
|
121
|
+
<cac:AddressLine>
|
|
122
|
+
<cbc:Line>${escapeXml(address.addressLine1 || ' ')}</cbc:Line>
|
|
123
|
+
</cac:AddressLine>
|
|
124
|
+
<cac:AddressLine>
|
|
125
|
+
<cbc:Line>${escapeXml(address.addressLine2 || ' ')}</cbc:Line>
|
|
126
|
+
</cac:AddressLine>
|
|
127
|
+
<cac:Country>
|
|
128
|
+
<cbc:IdentificationCode listID="ISO3166-1" listAgencyID="6">${escapeXml(address.country || ' ')}</cbc:IdentificationCode>
|
|
129
|
+
</cac:Country>
|
|
130
|
+
</cac:PostalAddress>`
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
/**
|
|
134
|
+
* Generates delivery XML section
|
|
135
|
+
*/
|
|
136
|
+
const generateDeliveryXML = (
|
|
137
|
+
delivery: NonNullable<InvoiceV1_1['delivery']>,
|
|
138
|
+
): string => {
|
|
139
|
+
return `
|
|
140
|
+
<cac:Delivery>
|
|
141
|
+
${delivery.actualDeliveryDate ? `<cbc:ActualDeliveryDate>${delivery.actualDeliveryDate}</cbc:ActualDeliveryDate>` : ''}
|
|
142
|
+
${
|
|
143
|
+
delivery.deliveryParty
|
|
144
|
+
? `
|
|
145
|
+
<cac:DeliveryParty>
|
|
146
|
+
${
|
|
147
|
+
delivery.deliveryParty.name
|
|
148
|
+
? `
|
|
149
|
+
<cac:PartyLegalEntity>
|
|
150
|
+
<cbc:RegistrationName>${escapeXml(delivery.deliveryParty.name)}</cbc:RegistrationName>
|
|
151
|
+
</cac:PartyLegalEntity>`
|
|
152
|
+
: ''
|
|
153
|
+
}
|
|
154
|
+
</cac:DeliveryParty>`
|
|
155
|
+
: ''
|
|
156
|
+
}
|
|
157
|
+
${delivery.deliveryLocation ? generatePostalAddressXML(delivery.deliveryLocation) : ''}
|
|
158
|
+
</cac:Delivery>`
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
/**
|
|
162
|
+
* Generates payment means XML section
|
|
163
|
+
*/
|
|
164
|
+
const generatePaymentMeansXML = (
|
|
165
|
+
paymentMeans: NonNullable<InvoiceV1_1['paymentMeans']>[0],
|
|
166
|
+
): string => {
|
|
167
|
+
return `
|
|
168
|
+
<cac:PaymentMeans>
|
|
169
|
+
<cbc:PaymentMeansCode>${paymentMeans.paymentMeansCode}</cbc:PaymentMeansCode>
|
|
170
|
+
${paymentMeans.paymentDueDate ? `<cbc:PaymentDueDate>${paymentMeans.paymentDueDate}</cbc:PaymentDueDate>` : ''}
|
|
171
|
+
${
|
|
172
|
+
paymentMeans.payeeFinancialAccountID
|
|
173
|
+
? `
|
|
174
|
+
<cac:PayeeFinancialAccount>
|
|
175
|
+
<cbc:ID>${escapeXml(paymentMeans.payeeFinancialAccountID)}</cbc:ID>
|
|
176
|
+
</cac:PayeeFinancialAccount>`
|
|
177
|
+
: ''
|
|
178
|
+
}
|
|
179
|
+
</cac:PaymentMeans>`
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
/**
|
|
183
|
+
* Generates allowance/charge XML section
|
|
184
|
+
*/
|
|
185
|
+
const generateAllowanceChargeXML = (
|
|
186
|
+
allowanceCharge: NonNullable<InvoiceV1_1['allowanceCharges']>[0],
|
|
187
|
+
): string => {
|
|
188
|
+
return `
|
|
189
|
+
<cac:AllowanceCharge>
|
|
190
|
+
<cbc:ChargeIndicator>${allowanceCharge.chargeIndicator}</cbc:ChargeIndicator>
|
|
191
|
+
<cbc:AllowanceChargeReason>${escapeXml(allowanceCharge.reason)}</cbc:AllowanceChargeReason>
|
|
192
|
+
${allowanceCharge.multiplierFactorNumeric ? `<cbc:MultiplierFactorNumeric>${allowanceCharge.multiplierFactorNumeric}</cbc:MultiplierFactorNumeric>` : ''}
|
|
193
|
+
<cbc:Amount currencyID="MYR">${allowanceCharge.amount}</cbc:Amount>
|
|
194
|
+
${allowanceCharge.baseAmount ? `<cbc:BaseAmount currencyID="MYR">${allowanceCharge.baseAmount}</cbc:BaseAmount>` : ''}
|
|
195
|
+
</cac:AllowanceCharge>`
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
/**
|
|
199
|
+
* Generates tax total XML section
|
|
200
|
+
*/
|
|
201
|
+
const generateTaxTotalXML = (taxTotal: InvoiceV1_1['taxTotal']): string => {
|
|
202
|
+
return `
|
|
203
|
+
<cac:TaxTotal>
|
|
204
|
+
<cbc:TaxAmount currencyID="MYR">${taxTotal.taxAmount}</cbc:TaxAmount>
|
|
205
|
+
${
|
|
206
|
+
taxTotal.taxSubtotals
|
|
207
|
+
? taxTotal.taxSubtotals
|
|
208
|
+
.map(
|
|
209
|
+
subtotal => `
|
|
210
|
+
<cac:TaxSubtotal>
|
|
211
|
+
<cbc:TaxableAmount currencyID="MYR">${subtotal.taxableAmount}</cbc:TaxableAmount>
|
|
212
|
+
<cbc:TaxAmount currencyID="MYR">${subtotal.taxAmount}</cbc:TaxAmount>
|
|
213
|
+
${subtotal.taxCategory.taxRate ? `<cbc:Percent>${subtotal.taxCategory.taxRate}</cbc:Percent>` : ''}
|
|
214
|
+
<cac:TaxCategory>
|
|
215
|
+
<cbc:ID>${subtotal.taxCategory.taxTypeCode}</cbc:ID>
|
|
216
|
+
${subtotal.taxCategory.taxExemptionReason ? `<cbc:TaxExemptionReason>${escapeXml(subtotal.taxCategory.taxExemptionReason)}</cbc:TaxExemptionReason>` : ''}
|
|
217
|
+
<cac:TaxScheme>
|
|
218
|
+
<cbc:ID schemeID="UN/ECE 5153" schemeAgencyID="6">OTH</cbc:ID>
|
|
219
|
+
</cac:TaxScheme>
|
|
220
|
+
</cac:TaxCategory>
|
|
221
|
+
</cac:TaxSubtotal>`,
|
|
222
|
+
)
|
|
223
|
+
.join('')
|
|
224
|
+
: ''
|
|
225
|
+
}
|
|
226
|
+
</cac:TaxTotal>`
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
/**
|
|
230
|
+
* Generates legal monetary total XML section (updated to match working example)
|
|
231
|
+
*/
|
|
232
|
+
const generateLegalMonetaryTotalXML = (
|
|
233
|
+
total: InvoiceV1_1['legalMonetaryTotal'],
|
|
234
|
+
): string => {
|
|
235
|
+
return `
|
|
236
|
+
<cac:LegalMonetaryTotal>
|
|
237
|
+
<cbc:LineExtensionAmount currencyID="MYR">${total.taxExclusiveAmount}</cbc:LineExtensionAmount>
|
|
238
|
+
<cbc:TaxExclusiveAmount currencyID="MYR">${total.taxExclusiveAmount}</cbc:TaxExclusiveAmount>
|
|
239
|
+
<cbc:TaxInclusiveAmount currencyID="MYR">${total.taxInclusiveAmount}</cbc:TaxInclusiveAmount>
|
|
240
|
+
<cbc:AllowanceTotalAmount currencyID="MYR">${total.allowanceTotalAmount || '0'}</cbc:AllowanceTotalAmount>
|
|
241
|
+
<cbc:ChargeTotalAmount currencyID="MYR">${total.chargeTotalAmount || '0'}</cbc:ChargeTotalAmount>
|
|
242
|
+
${total.prepaidAmount ? `<cbc:PrepaidAmount currencyID="MYR">${total.prepaidAmount}</cbc:PrepaidAmount>` : ''}
|
|
243
|
+
<cbc:PayableRoundingAmount currencyID="MYR">${total.payableRoundingAmount || '0'}</cbc:PayableRoundingAmount>
|
|
244
|
+
<cbc:PayableAmount currencyID="MYR">${total.payableAmount}</cbc:PayableAmount>
|
|
245
|
+
</cac:LegalMonetaryTotal>`
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
/**
|
|
249
|
+
* Generates invoice line XML section (updated to match working example)
|
|
250
|
+
*/
|
|
251
|
+
const generateInvoiceLineXML = (
|
|
252
|
+
item: InvoiceV1_1['invoiceLineItems'][0],
|
|
253
|
+
lineNumber: number,
|
|
254
|
+
): string => {
|
|
255
|
+
return `
|
|
256
|
+
<cac:InvoiceLine>
|
|
257
|
+
<cbc:ID>${lineNumber}</cbc:ID>
|
|
258
|
+
${item.quantity && item.measurement ? `<cbc:InvoicedQuantity unitCode="${item.measurement}">${item.quantity}</cbc:InvoicedQuantity>` : ''}
|
|
259
|
+
<cbc:LineExtensionAmount currencyID="MYR">${item.totalTaxableAmountPerLine}</cbc:LineExtensionAmount>
|
|
260
|
+
${
|
|
261
|
+
item.discountAmount
|
|
262
|
+
? `
|
|
263
|
+
<cac:AllowanceCharge>
|
|
264
|
+
<cbc:ChargeIndicator>false</cbc:ChargeIndicator>
|
|
265
|
+
<cbc:AllowanceChargeReason>Discount</cbc:AllowanceChargeReason>
|
|
266
|
+
${item.discountRate ? `<cbc:MultiplierFactorNumeric>${item.discountRate / 100}</cbc:MultiplierFactorNumeric>` : ''}
|
|
267
|
+
<cbc:Amount currencyID="MYR">${item.discountAmount}</cbc:Amount>
|
|
268
|
+
</cac:AllowanceCharge>`
|
|
269
|
+
: ''
|
|
270
|
+
}
|
|
271
|
+
<cac:TaxTotal>
|
|
272
|
+
<cbc:TaxAmount currencyID="MYR">${item.taxAmount}</cbc:TaxAmount>
|
|
273
|
+
<cac:TaxSubtotal>
|
|
274
|
+
<cbc:TaxableAmount currencyID="MYR">${item.totalTaxableAmountPerLine}</cbc:TaxableAmount>
|
|
275
|
+
<cbc:TaxAmount currencyID="MYR">${item.taxAmount}</cbc:TaxAmount>
|
|
276
|
+
${item.taxRate ? `<cbc:Percent>${item.taxRate.toFixed(2)}</cbc:Percent>` : ''}
|
|
277
|
+
<cac:TaxCategory>
|
|
278
|
+
<cbc:ID>${item.taxType}</cbc:ID>
|
|
279
|
+
<cac:TaxScheme>
|
|
280
|
+
<cbc:ID schemeID="UN/ECE 5153" schemeAgencyID="6">OTH</cbc:ID>
|
|
281
|
+
</cac:TaxScheme>
|
|
282
|
+
</cac:TaxCategory>
|
|
283
|
+
</cac:TaxSubtotal>
|
|
284
|
+
</cac:TaxTotal>
|
|
285
|
+
<cac:Item>
|
|
286
|
+
<cbc:Description>${escapeXml(item.itemDescription)}</cbc:Description>
|
|
287
|
+
${
|
|
288
|
+
item.countryOfOrigin
|
|
289
|
+
? `
|
|
290
|
+
<cac:OriginCountry>
|
|
291
|
+
<cbc:IdentificationCode>${item.countryOfOrigin}</cbc:IdentificationCode>
|
|
292
|
+
</cac:OriginCountry>`
|
|
293
|
+
: ''
|
|
294
|
+
}
|
|
295
|
+
<cac:CommodityClassification>
|
|
296
|
+
<cbc:ItemClassificationCode listID="PTC">001</cbc:ItemClassificationCode>
|
|
297
|
+
</cac:CommodityClassification>
|
|
298
|
+
<cac:CommodityClassification>
|
|
299
|
+
<cbc:ItemClassificationCode listID="CLASS">${item.itemClassificationCode}</cbc:ItemClassificationCode>
|
|
300
|
+
</cac:CommodityClassification>
|
|
301
|
+
</cac:Item>
|
|
302
|
+
<cac:Price>
|
|
303
|
+
<cbc:PriceAmount currencyID="MYR">${item.unitPrice}</cbc:PriceAmount>
|
|
304
|
+
</cac:Price>
|
|
305
|
+
<cac:ItemPriceExtension>
|
|
306
|
+
<cbc:Amount currencyID="MYR">${item.totalTaxableAmountPerLine}</cbc:Amount>
|
|
307
|
+
</cac:ItemPriceExtension>
|
|
308
|
+
</cac:InvoiceLine>`
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
/**
|
|
312
|
+
* Generates a document hash for submission (separate from signature DocDigest)
|
|
313
|
+
* This is the SHA256 hash required by the Submit Documents API
|
|
314
|
+
*
|
|
315
|
+
* OFFICIAL MyInvois FAQ: "The XML/JSON document is hashed using SHA-256 to create the documentHash value"
|
|
316
|
+
* CRITICAL: Must hash the SAME document that gets encoded for submission (minified XML)
|
|
317
|
+
* Source: https://sdk.myinvois.hasil.gov.my/faq/#how-to-hash-the-documenthash-value-and-encode-the-document-value
|
|
318
|
+
*/
|
|
319
|
+
export const generateDocumentHash = (xmlDocument: string): string => {
|
|
320
|
+
try {
|
|
321
|
+
console.log(
|
|
322
|
+
'🔧 Generating document hash using official MyInvois method (minified XML SHA256)',
|
|
323
|
+
)
|
|
324
|
+
|
|
325
|
+
// CRITICAL: Use the same minified XML that encodeDocumentForSubmission uses
|
|
326
|
+
const minifiedXML = minifyXML(xmlDocument)
|
|
327
|
+
|
|
328
|
+
const crypto = require('crypto')
|
|
329
|
+
const documentHash = crypto
|
|
330
|
+
.createHash('sha256')
|
|
331
|
+
.update(minifiedXML, 'utf8')
|
|
332
|
+
.digest('hex')
|
|
333
|
+
|
|
334
|
+
console.log('📊 Original XML length:', xmlDocument.length, 'characters')
|
|
335
|
+
console.log('📊 Minified XML length:', minifiedXML.length, 'characters')
|
|
336
|
+
console.log('📊 Document hash (SHA256 hex):', documentHash)
|
|
337
|
+
console.log(
|
|
338
|
+
'📊 Hash length:',
|
|
339
|
+
documentHash.length,
|
|
340
|
+
'characters (should be 64)',
|
|
341
|
+
)
|
|
342
|
+
|
|
343
|
+
// Validate hash length
|
|
344
|
+
if (documentHash.length !== 64) {
|
|
345
|
+
console.error(
|
|
346
|
+
`❌ Invalid hash length: ${documentHash.length}, expected 64 characters`,
|
|
347
|
+
)
|
|
348
|
+
throw new Error(`Invalid SHA256 hash length: ${documentHash.length}`)
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
return documentHash
|
|
352
|
+
} catch (error) {
|
|
353
|
+
console.error('❌ Error generating document hash:', error)
|
|
354
|
+
throw new Error(`Failed to generate document hash: ${error}`)
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
/**
|
|
359
|
+
* Encodes the XML document to base64 for submission
|
|
360
|
+
* Includes minification as recommended by MyInvois documentation
|
|
361
|
+
*/
|
|
362
|
+
export const encodeDocumentForSubmission = (xmlDocument: string): string => {
|
|
363
|
+
const minifiedXML = minifyXML(xmlDocument)
|
|
364
|
+
return Buffer.from(minifiedXML, 'utf8').toString('base64')
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
/**
|
|
368
|
+
* Utility functions for extracting certificate information
|
|
369
|
+
*/
|
|
370
|
+
|
|
371
|
+
/**
|
|
372
|
+
* Extracts certificate information from a PEM certificate file
|
|
373
|
+
* @param certificatePem - The certificate in PEM format
|
|
374
|
+
* @returns Object containing issuer name and serial number
|
|
375
|
+
*/
|
|
376
|
+
export const extractCertificateInfo = (
|
|
377
|
+
certificatePem: string,
|
|
378
|
+
): {
|
|
379
|
+
issuerName: string
|
|
380
|
+
serialNumber: string
|
|
381
|
+
} => {
|
|
382
|
+
try {
|
|
383
|
+
// Create X509Certificate object (Node.js 15.6.0+)
|
|
384
|
+
const cert = new crypto.X509Certificate(certificatePem)
|
|
385
|
+
|
|
386
|
+
// Extract issuer name (in the format required by MyInvois)
|
|
387
|
+
const issuerName = cert.issuer
|
|
388
|
+
|
|
389
|
+
// Extract serial number and convert from hex to decimal as required by MyInvois
|
|
390
|
+
const serialNumberHex = cert.serialNumber
|
|
391
|
+
console.log('📋 Certificate serial number (hex):', serialNumberHex)
|
|
392
|
+
|
|
393
|
+
// Convert hex to decimal string (MyInvois requires integer format)
|
|
394
|
+
const serialNumberDecimal = BigInt('0x' + serialNumberHex).toString()
|
|
395
|
+
console.log('📋 Certificate serial number (decimal):', serialNumberDecimal)
|
|
396
|
+
|
|
397
|
+
return {
|
|
398
|
+
issuerName,
|
|
399
|
+
serialNumber: serialNumberDecimal,
|
|
400
|
+
}
|
|
401
|
+
} catch (error) {
|
|
402
|
+
throw new Error(`Failed to extract certificate info: ${error}`)
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
|
|
406
|
+
/**
|
|
407
|
+
* Validates that certificate and private key match
|
|
408
|
+
* @param certificatePem - The certificate in PEM format
|
|
409
|
+
* @param privateKeyPem - The private key in PEM format
|
|
410
|
+
* @returns boolean indicating if they match
|
|
411
|
+
*/
|
|
412
|
+
export const validateKeyPair = (
|
|
413
|
+
certificatePem: string,
|
|
414
|
+
privateKeyPem: string,
|
|
415
|
+
): boolean => {
|
|
416
|
+
try {
|
|
417
|
+
// Extract public key from certificate
|
|
418
|
+
const cert = new crypto.X509Certificate(certificatePem)
|
|
419
|
+
const publicKey = cert.publicKey
|
|
420
|
+
|
|
421
|
+
// Create a test signature with private key
|
|
422
|
+
const testData = 'test-validation-data'
|
|
423
|
+
const signer = crypto.createSign('RSA-SHA256')
|
|
424
|
+
signer.update(testData)
|
|
425
|
+
const signature = signer.sign(privateKeyPem)
|
|
426
|
+
|
|
427
|
+
// Verify signature with public key
|
|
428
|
+
const verifier = crypto.createVerify('RSA-SHA256')
|
|
429
|
+
verifier.update(testData)
|
|
430
|
+
return verifier.verify(publicKey, signature)
|
|
431
|
+
} catch (error) {
|
|
432
|
+
console.error('Key pair validation failed:', error)
|
|
433
|
+
return false
|
|
434
|
+
}
|
|
435
|
+
}
|
|
436
|
+
|
|
437
|
+
/**
|
|
438
|
+
* Helper function to create SigningCredentials from certificate and private key files
|
|
439
|
+
* @param certificatePem - The certificate in PEM format
|
|
440
|
+
* @param privateKeyPem - The private key in PEM format
|
|
441
|
+
* @returns Complete SigningCredentials object
|
|
442
|
+
*/
|
|
443
|
+
export function createSigningCredentials(
|
|
444
|
+
certificatePem: string,
|
|
445
|
+
privateKeyPem: string,
|
|
446
|
+
): SigningCredentials {
|
|
447
|
+
// Validate that the key pair matches
|
|
448
|
+
if (!validateKeyPair(certificatePem, privateKeyPem)) {
|
|
449
|
+
throw new Error('Certificate and private key do not match')
|
|
450
|
+
}
|
|
451
|
+
|
|
452
|
+
// Extract certificate information
|
|
453
|
+
const { issuerName, serialNumber } = extractCertificateInfo(certificatePem)
|
|
454
|
+
|
|
455
|
+
return {
|
|
456
|
+
privateKeyPem,
|
|
457
|
+
certificatePem,
|
|
458
|
+
issuerName,
|
|
459
|
+
serialNumber,
|
|
460
|
+
}
|
|
461
|
+
}
|
|
462
|
+
|
|
463
|
+
/**
|
|
464
|
+
* Generates the UBL XML template with complete signature structure
|
|
465
|
+
*/
|
|
466
|
+
export function generateUBLXMLTemplate(invoiceInfo: InvoiceV1_1): string {
|
|
467
|
+
const { supplier, buyer, invoiceLineItems, legalMonetaryTotal, taxTotal } =
|
|
468
|
+
invoiceInfo
|
|
469
|
+
|
|
470
|
+
return `<?xml version="1.0" encoding="UTF-8"?>
|
|
471
|
+
<Invoice xmlns="urn:oasis:names:specification:ubl:schema:xsd:Invoice-2"
|
|
472
|
+
xmlns:cac="urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2"
|
|
473
|
+
xmlns:cbc="urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2"
|
|
474
|
+
xmlns:ext="urn:oasis:names:specification:ubl:schema:xsd:CommonExtensionComponents-2">
|
|
475
|
+
<UBLExtensions xmlns="urn:oasis:names:specification:ubl:schema:xsd:CommonExtensionComponents-2">
|
|
476
|
+
<UBLExtension>
|
|
477
|
+
<ExtensionURI>urn:oasis:names:specification:ubl:dsig:enveloped:xades</ExtensionURI>
|
|
478
|
+
<ExtensionContent>
|
|
479
|
+
<sig:UBLDocumentSignatures xmlns:sig="urn:oasis:names:specification:ubl:schema:xsd:CommonSignatureComponents-2"
|
|
480
|
+
xmlns:sac="urn:oasis:names:specification:ubl:schema:xsd:SignatureAggregateComponents-2"
|
|
481
|
+
xmlns:sbc="urn:oasis:names:specification:ubl:schema:xsd:SignatureBasicComponents-2">
|
|
482
|
+
<sac:SignatureInformation>
|
|
483
|
+
<cbc:ID>urn:oasis:names:specification:ubl:signature:1</cbc:ID>
|
|
484
|
+
<sbc:ReferencedSignatureID>urn:oasis:names:specification:ubl:signature:Invoice</sbc:ReferencedSignatureID>
|
|
485
|
+
<ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#" Id="signature">
|
|
486
|
+
<ds:SignedInfo>
|
|
487
|
+
<ds:CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
|
|
488
|
+
<ds:SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"/>
|
|
489
|
+
<ds:Reference Id="id-doc-signed-data" URI="">
|
|
490
|
+
<ds:Transforms>
|
|
491
|
+
<ds:Transform Algorithm="http://www.w3.org/TR/1999/REC-xpath-19991116">
|
|
492
|
+
<ds:XPath>not(//ancestor-or-self::ext:UBLExtensions)</ds:XPath>
|
|
493
|
+
</ds:Transform>
|
|
494
|
+
<ds:Transform Algorithm="http://www.w3.org/TR/1999/REC-xpath-19991116">
|
|
495
|
+
<ds:XPath>not(//ancestor-or-self::cac:Signature)</ds:XPath>
|
|
496
|
+
</ds:Transform>
|
|
497
|
+
<ds:Transform Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
|
|
498
|
+
</ds:Transforms>
|
|
499
|
+
<ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/>
|
|
500
|
+
<ds:DigestValue></ds:DigestValue>
|
|
501
|
+
</ds:Reference>
|
|
502
|
+
<ds:Reference Type="http://www.w3.org/2000/09/xmldsig#SignatureProperties" URI="#id-xades-signed-props">
|
|
503
|
+
<ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/>
|
|
504
|
+
<ds:DigestValue></ds:DigestValue>
|
|
505
|
+
</ds:Reference>
|
|
506
|
+
</ds:SignedInfo>
|
|
507
|
+
<ds:SignatureValue></ds:SignatureValue>
|
|
508
|
+
<ds:KeyInfo>
|
|
509
|
+
<ds:X509Data>
|
|
510
|
+
<ds:X509Certificate></ds:X509Certificate>
|
|
511
|
+
</ds:X509Data>
|
|
512
|
+
</ds:KeyInfo>
|
|
513
|
+
<ds:Object>
|
|
514
|
+
<xades:QualifyingProperties xmlns:xades="http://uri.etsi.org/01903/v1.3.2#" Target="signature">
|
|
515
|
+
<xades:SignedProperties Id="id-xades-signed-props">
|
|
516
|
+
<xades:SignedSignatureProperties>
|
|
517
|
+
<xades:SigningTime></xades:SigningTime>
|
|
518
|
+
<xades:SigningCertificate>
|
|
519
|
+
<xades:Cert>
|
|
520
|
+
<xades:CertDigest>
|
|
521
|
+
<ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/>
|
|
522
|
+
<ds:DigestValue></ds:DigestValue>
|
|
523
|
+
</xades:CertDigest>
|
|
524
|
+
<xades:IssuerSerial>
|
|
525
|
+
<ds:X509IssuerName></ds:X509IssuerName>
|
|
526
|
+
<ds:X509SerialNumber></ds:X509SerialNumber>
|
|
527
|
+
</xades:IssuerSerial>
|
|
528
|
+
</xades:Cert>
|
|
529
|
+
</xades:SigningCertificate>
|
|
530
|
+
</xades:SignedSignatureProperties>
|
|
531
|
+
</xades:SignedProperties>
|
|
532
|
+
</xades:QualifyingProperties>
|
|
533
|
+
</ds:Object>
|
|
534
|
+
</ds:Signature>
|
|
535
|
+
</sac:SignatureInformation>
|
|
536
|
+
</sig:UBLDocumentSignatures>
|
|
537
|
+
</ExtensionContent>
|
|
538
|
+
</UBLExtension>
|
|
539
|
+
</UBLExtensions>
|
|
540
|
+
<cbc:ID>${escapeXml(invoiceInfo.eInvoiceCodeOrNumber)}</cbc:ID>
|
|
541
|
+
<cbc:IssueDate>${invoiceInfo.eInvoiceDate}</cbc:IssueDate>
|
|
542
|
+
<cbc:IssueTime>${invoiceInfo.eInvoiceTime}</cbc:IssueTime>
|
|
543
|
+
<cbc:InvoiceTypeCode listVersionID="1.1">${invoiceInfo.eInvoiceTypeCode}</cbc:InvoiceTypeCode>
|
|
544
|
+
<cbc:DocumentCurrencyCode>${invoiceInfo.invoiceCurrencyCode}</cbc:DocumentCurrencyCode>
|
|
545
|
+
<cbc:TaxCurrencyCode>${invoiceInfo.invoiceCurrencyCode}</cbc:TaxCurrencyCode>
|
|
546
|
+
${
|
|
547
|
+
invoiceInfo.billingPeriodStartDate && invoiceInfo.billingPeriodEndDate
|
|
548
|
+
? `
|
|
549
|
+
<cac:InvoicePeriod>
|
|
550
|
+
<cbc:StartDate>${invoiceInfo.billingPeriodStartDate}</cbc:StartDate>
|
|
551
|
+
<cbc:EndDate>${invoiceInfo.billingPeriodEndDate}</cbc:EndDate>
|
|
552
|
+
${invoiceInfo.frequencyOfBilling ? `<cbc:Description>${escapeXml(invoiceInfo.frequencyOfBilling)}</cbc:Description>` : ''}
|
|
553
|
+
</cac:InvoicePeriod>`
|
|
554
|
+
: ''
|
|
555
|
+
}
|
|
556
|
+
<cac:Signature>
|
|
557
|
+
<cbc:ID>urn:oasis:names:specification:ubl:signature:Invoice</cbc:ID>
|
|
558
|
+
<cbc:SignatureMethod>urn:oasis:names:specification:ubl:dsig:enveloped:xades</cbc:SignatureMethod>
|
|
559
|
+
</cac:Signature>
|
|
560
|
+
${generateSupplierXML(supplier)}
|
|
561
|
+
${generateBuyerXML(buyer)}
|
|
562
|
+
${invoiceInfo.delivery ? generateDeliveryXML(invoiceInfo.delivery) : ''}
|
|
563
|
+
${invoiceInfo.paymentMeans ? invoiceInfo.paymentMeans.map(pm => generatePaymentMeansXML(pm)).join('') : ''}
|
|
564
|
+
${invoiceInfo.allowanceCharges ? invoiceInfo.allowanceCharges.map(ac => generateAllowanceChargeXML(ac)).join('') : ''}
|
|
565
|
+
${generateTaxTotalXML(taxTotal)}
|
|
566
|
+
${generateLegalMonetaryTotalXML(legalMonetaryTotal)}
|
|
567
|
+
${invoiceLineItems.map((item, index) => generateInvoiceLineXML(item, index + 1)).join('')}
|
|
568
|
+
</Invoice>`
|
|
569
|
+
}
|
|
570
|
+
|
|
571
|
+
/**
|
|
572
|
+
* Generates a signed UBL XML invoice document following MyInvois specifications.
|
|
573
|
+
*
|
|
574
|
+
* @param invoiceInfo - The invoice data structure
|
|
575
|
+
* @param signingCredentials - Digital signature credentials
|
|
576
|
+
* @returns Promise<string> - The complete signed XML document ready for submission
|
|
577
|
+
*/
|
|
578
|
+
export const generateSignedInvoiceXML = async (
|
|
579
|
+
invoiceInfo: InvoiceV1_1,
|
|
580
|
+
signingCredentials: SigningCredentials,
|
|
581
|
+
): Promise<string> => {
|
|
582
|
+
// Step 1: Generate the UBL XML template with signature structure
|
|
583
|
+
const xmlTemplate = generateUBLXMLTemplate(invoiceInfo)
|
|
584
|
+
|
|
585
|
+
// Parse the XML template
|
|
586
|
+
const parser = new DOMParserImpl()
|
|
587
|
+
const templateDoc = parser.parseFromString(xmlTemplate, 'application/xml')
|
|
588
|
+
|
|
589
|
+
// Step 2: Apply transformations to get the document for hashing
|
|
590
|
+
const transformedXml = transformXmlInvoice(xmlTemplate)
|
|
591
|
+
const transformedDoc = parser.parseFromString(
|
|
592
|
+
transformedXml,
|
|
593
|
+
'application/xml',
|
|
594
|
+
)
|
|
595
|
+
|
|
596
|
+
// Step 3: Canonicalize and generate document hash (DocDigest) - try C14N 1.1 first
|
|
597
|
+
const docDigest =
|
|
598
|
+
await canonicalizeAndHashDocumentWithC14N11Fallback(transformedDoc)
|
|
599
|
+
|
|
600
|
+
// Step 4: Sign the document digest (Sig)
|
|
601
|
+
const signature = signDocumentDigest(
|
|
602
|
+
docDigest,
|
|
603
|
+
signingCredentials.privateKeyPem,
|
|
604
|
+
)
|
|
605
|
+
|
|
606
|
+
// Step 5: Generate certificate hash (CertDigest)
|
|
607
|
+
const certDigest = hashCertificate(signingCredentials.certificatePem)
|
|
608
|
+
|
|
609
|
+
// Step 6: Populate signed properties
|
|
610
|
+
const signedPropertiesData: SignedPropertiesData = {
|
|
611
|
+
certDigest,
|
|
612
|
+
signingTime: new Date().toISOString().replace(/\.\d{3}Z$/, 'Z'), // ISO format without milliseconds
|
|
613
|
+
issuerName: signingCredentials.issuerName,
|
|
614
|
+
serialNumber: signingCredentials.serialNumber,
|
|
615
|
+
}
|
|
616
|
+
|
|
617
|
+
populateSignedProperties(templateDoc, signedPropertiesData)
|
|
618
|
+
|
|
619
|
+
// Step 7: Generate signed properties hash (PropsDigest) - try C14N 1.1 first
|
|
620
|
+
const propsDigest = await hashSignedPropertiesWithC14N11Fallback(templateDoc)
|
|
621
|
+
|
|
622
|
+
// Step 8: Populate final document
|
|
623
|
+
const finalData: FinalDocumentData = {
|
|
624
|
+
signatureValue: signature,
|
|
625
|
+
propsDigest,
|
|
626
|
+
docDigest,
|
|
627
|
+
certificatePem: signingCredentials.certificatePem,
|
|
628
|
+
}
|
|
629
|
+
|
|
630
|
+
populateFinalDocument(templateDoc, finalData)
|
|
631
|
+
|
|
632
|
+
// Serialize the final signed document
|
|
633
|
+
const serializer = new XMLSerializerImpl()
|
|
634
|
+
return serializer.serializeToString(templateDoc)
|
|
635
|
+
}
|
|
636
|
+
|
|
637
|
+
/**
|
|
638
|
+
* Generates a document hash for submission using the same method as signature creation
|
|
639
|
+
* This ensures consistency with MyInvois validation requirements
|
|
640
|
+
*/
|
|
641
|
+
export const generateDocumentHashForSubmission = async (
|
|
642
|
+
xmlDocument: string,
|
|
643
|
+
): Promise<string> => {
|
|
644
|
+
try {
|
|
645
|
+
console.log(
|
|
646
|
+
'🔧 Generating document hash using signature-compatible method...',
|
|
647
|
+
)
|
|
648
|
+
|
|
649
|
+
// Parse the signed XML
|
|
650
|
+
const parser = new DOMParserImpl()
|
|
651
|
+
|
|
652
|
+
// Apply the same transformations as used in signature creation
|
|
653
|
+
const transformedXml = transformXmlInvoice(xmlDocument)
|
|
654
|
+
const transformedDoc = parser.parseFromString(
|
|
655
|
+
transformedXml,
|
|
656
|
+
'application/xml',
|
|
657
|
+
)
|
|
658
|
+
|
|
659
|
+
// Use the same canonicalization as signature creation
|
|
660
|
+
const base64Digest =
|
|
661
|
+
await canonicalizeAndHashDocumentWithC14N11Fallback(transformedDoc)
|
|
662
|
+
const hexDigest = Buffer.from(base64Digest, 'base64').toString('hex')
|
|
663
|
+
console.log('📊 Canonicalized document hash (base64):', base64Digest)
|
|
664
|
+
console.log('📊 Canonicalized document hash (hex):', hexDigest)
|
|
665
|
+
console.log('📊 Hash length:', hexDigest.length, 'characters')
|
|
666
|
+
return hexDigest
|
|
667
|
+
} catch (error) {
|
|
668
|
+
console.error('Error generating canonicalized hash, using fallback:', error)
|
|
669
|
+
return generateDocumentHash(xmlDocument)
|
|
670
|
+
}
|
|
671
|
+
}
|