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