@ripwords/myinvois-client 0.2.4 → 0.2.6
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/dist/{1X-ClnJ79HH.d.cts → 1X-DYw2tURz.d.cts} +1 -1
- package/dist/{2X-CV9eYhog.d.cts → 2X-CXtqiwRg.d.cts} +1 -1
- package/dist/{3X--VWVsC84.d.cts → 3X-Bk_fUIAk.d.cts} +1 -1
- package/dist/{4X-By9PzHaY.d.cts → 4X-CK9rj5qd.d.cts} +1 -1
- package/dist/{5X-B5M0Cv_K.d.cts → 5X-CpAvNxvd.d.cts} +1 -1
- package/dist/{6X-C3elgd-n.d.cts → 6X-bXWr_7xY.d.cts} +1 -1
- package/dist/{7X-D3idQBl9.d.cts → 7X-BJBOlWhV.d.cts} +1 -1
- package/dist/{8X-C6UMFvQW.d.cts → 8X-dshwiOxU.d.cts} +1 -1
- package/dist/{9X-CJjPJgIG.d.cts → 9X-9j2Djy4W.d.cts} +1 -1
- package/dist/{AX-DrEd2Ov6.d.cts → AX-CWCopjCC.d.cts} +1 -1
- package/dist/{BX-C5jc6myN.d.cts → BX-Cq7WdhD3.d.cts} +1 -1
- package/dist/{CX-oSgvmn3h.d.cts → CX-DlcVZfxx.d.cts} +1 -1
- package/dist/{DX-ZIG0enmK.d.cts → DX-DLdv-Nxj.d.cts} +1 -1
- package/dist/{EX-BpWZ5ADq.d.cts → EX-CIJv8-Lw.d.cts} +1 -1
- package/dist/{FX-CvYBEc51.d.cts → FX-DlDM_Zea.d.cts} +1 -1
- package/dist/{GX-CU8PZy0G.d.cts → GX-BFGNX6Jy.d.cts} +1 -1
- package/dist/{HX-DoEErDeE.d.cts → HX-D7Y9qRSm.d.cts} +1 -1
- package/dist/{IX-jLAUHe8i.d.cts → IX-DPTrbhgX.d.cts} +1 -1
- package/dist/{JX-DX8BjYQC.d.cts → JX-D8JmtNpo.d.cts} +1 -1
- package/dist/{KX-fZb4_vhw.d.cts → KX-B46KJZrH.d.cts} +1 -1
- package/dist/{LX-D_mI1bk-.d.cts → LX-CfTKy8Sx.d.cts} +1 -1
- package/dist/{MX-DlYZhpkT.d.cts → MX-BKJ4gNvV.d.cts} +1 -1
- package/dist/{NX-DELEEbad.d.cts → NX-CSdLIFqU.d.cts} +1 -1
- package/dist/{OX-CKPyrIFf.d.cts → OX-BwqOsulT.d.cts} +1 -1
- package/dist/{PX-SP6NxBtG.d.cts → PX-BTx0TXsJ.d.cts} +1 -1
- package/dist/{QX-QZA7E2O-.d.cts → QX-BUXR8RJL.d.cts} +1 -1
- package/dist/{RX-DBcgbdeE.d.cts → RX-CZ8HiH37.d.cts} +1 -1
- package/dist/{SX-DmiJeCMN.d.cts → SX-CLxsqiQk.d.cts} +1 -1
- package/dist/{TX-C1SoDobK.d.cts → TX-DKc8hLc4.d.cts} +1 -1
- package/dist/{UX-DFVynFhQ.d.cts → UX-bc7xDnZI.d.cts} +1 -1
- package/dist/{VX-DsRum5k3.d.cts → VX-CIHTFyoC.d.cts} +1 -1
- package/dist/{WX-VReU5R5M.d.cts → WX-BHvlq7Jx.d.cts} +1 -1
- package/dist/{XX-ChAviUMj.d.cts → XX-DztQxYHJ.d.cts} +1 -1
- package/dist/{YX-QfzeMEKx.d.cts → YX-CkxLeFb4.d.cts} +1 -1
- package/dist/{ZX-Ca2E726a.d.cts → ZX-DVb_buNI.d.cts} +1 -1
- package/dist/api/documentManagement.d.ts +39 -39
- package/dist/api/documentSubmission.d.ts +39 -39
- package/dist/api/documentSubmission.js +2 -2
- package/dist/api/documentTypeManagement.d.ts +39 -39
- package/dist/api/notificationManagement.d.ts +39 -39
- package/dist/api/platformLogin.d.ts +39 -39
- package/dist/api/taxpayerValidation.d.ts +39 -39
- package/dist/{document-BSuYbfXR.js → document-BvyYSCPx.js} +85 -1
- package/dist/{document-vDphtJTv.cjs → document-djvnrrZo.cjs} +121 -1
- package/dist/document-djvnrrZo.cjs.map +1 -0
- package/dist/{documentSubmission-BdJxIB_I.js → documentSubmission-695VhFA8.js} +1 -1
- package/dist/{documentSubmission-D5TC0MPC.cjs → documentSubmission-CK1zOsSV.cjs} +2 -2
- package/dist/{documentSubmission-D5TC0MPC.cjs.map → documentSubmission-CK1zOsSV.cjs.map} +1 -1
- package/dist/{documents-DCOYxz61.d.cts → documents-BuU5vKSi.d.cts} +39 -3
- package/dist/{documents-zzL50wnG.d.ts → documents-Bw8tPK9r.d.ts} +38 -2
- package/dist/index.cjs +2 -2
- package/dist/index.d.ts +39 -39
- package/dist/index.js +2 -2
- package/dist/index10.cjs +187 -16
- package/dist/index10.cjs.map +1 -1
- package/dist/index12.cjs +16 -25
- package/dist/index12.cjs.map +1 -1
- package/dist/index13.cjs +0 -24
- package/dist/index15.cjs +29 -0
- package/dist/index15.cjs.map +1 -0
- package/dist/index16.cjs +25 -0
- package/dist/index16.cjs.map +1 -0
- package/dist/index17.cjs +0 -5
- package/dist/index18.cjs +33 -5
- package/dist/index18.cjs.map +1 -0
- package/dist/index19.cjs +23 -4
- package/dist/{index13.cjs.map → index19.cjs.map} +1 -1
- package/dist/index2.cjs +4 -61
- package/dist/index20.cjs +0 -3
- package/dist/index21.cjs +0 -3
- package/dist/index22.cjs +0 -5
- package/dist/index25.cjs +7 -1
- package/dist/index27.cjs +1 -1
- package/dist/index28.cjs +53 -0
- package/dist/index28.cjs.map +1 -1
- package/dist/index3.cjs +5 -531
- package/dist/index4.cjs +4 -195
- package/dist/index5.cjs +3 -0
- package/dist/index6.cjs +2 -24
- package/dist/index7.cjs +5 -0
- package/dist/index70.cts.map +1 -1
- package/dist/index73.cts.map +1 -1
- package/dist/index8.cjs +62 -0
- package/dist/{index2.cjs.map → index8.cjs.map} +1 -1
- package/dist/index9.cjs +526 -23
- package/dist/index9.cjs.map +1 -1
- package/dist/{payment-modes-ghFEXnUl.d.cts → payment-modes-7c1lWlIr.d.cts} +1 -1
- package/dist/{taxpayer-aaXyVf7B.d.cts → taxpayer-C2ZUMCP6.d.cts} +2 -2
- package/dist/{taxpayer-CxAVm7lJ.d.ts → taxpayer-Rnw1l38P.d.ts} +1 -1
- package/dist/types/documents.d.ts +37 -1
- package/dist/types/index.d.ts +39 -39
- package/dist/types/payment-modes.d.ts +1 -1
- package/dist/types/taxpayer.d.ts +38 -2
- package/dist/types/unit/1X.d.ts +1 -1
- package/dist/types/unit/2X.d.ts +1 -1
- package/dist/types/unit/3X.d.ts +1 -1
- package/dist/types/unit/4X.d.ts +1 -1
- package/dist/types/unit/5X.d.ts +1 -1
- package/dist/types/unit/6X.d.ts +1 -1
- package/dist/types/unit/7X.d.ts +1 -1
- package/dist/types/unit/8X.d.ts +1 -1
- package/dist/types/unit/9X.d.ts +1 -1
- package/dist/types/unit/AX.d.ts +1 -1
- package/dist/types/unit/BX.d.ts +1 -1
- package/dist/types/unit/CX.d.ts +1 -1
- package/dist/types/unit/DX.d.ts +1 -1
- package/dist/types/unit/EX.d.ts +1 -1
- package/dist/types/unit/FX.d.ts +1 -1
- package/dist/types/unit/GX.d.ts +1 -1
- package/dist/types/unit/HX.d.ts +1 -1
- package/dist/types/unit/IX.d.ts +1 -1
- package/dist/types/unit/JX.d.ts +1 -1
- package/dist/types/unit/KX.d.ts +1 -1
- package/dist/types/unit/LX.d.ts +1 -1
- package/dist/types/unit/MX.d.ts +1 -1
- package/dist/types/unit/NX.d.ts +1 -1
- package/dist/types/unit/OX.d.ts +1 -1
- package/dist/types/unit/PX.d.ts +1 -1
- package/dist/types/unit/QX.d.ts +1 -1
- package/dist/types/unit/RX.d.ts +1 -1
- package/dist/types/unit/SX.d.ts +1 -1
- package/dist/types/unit/TX.d.ts +1 -1
- package/dist/types/unit/UX.d.ts +1 -1
- package/dist/types/unit/VX.d.ts +1 -1
- package/dist/types/unit/WX.d.ts +1 -1
- package/dist/types/unit/XX.d.ts +1 -1
- package/dist/types/unit/YX.d.ts +1 -1
- package/dist/types/unit/ZX.d.ts +1 -1
- package/dist/types/unit-types.d.ts +36 -36
- package/dist/unit-types-BXdufGWm.d.cts +56 -0
- package/dist/unit-types-COhKgwRx.d.ts +55 -0
- package/dist/utils/document.d.ts +91 -40
- package/dist/utils/document.js +2 -2
- package/dist/utils/signature-diagnostics.d.ts +39 -39
- package/dist/utils/signature-diagnostics.js +1 -1
- package/dist/utils/validation.d.ts +65 -3
- package/dist/utils/validation.js +53 -1
- package/package.json +1 -1
- package/dist/document-vDphtJTv.cjs.map +0 -1
- package/dist/index3.cjs.map +0 -1
- package/dist/index4.cjs.map +0 -1
- package/dist/index6.cjs.map +0 -1
- package/dist/unit-types-CjWNk2wS.d.cts +0 -56
- package/dist/unit-types-VgYXIwTT.d.ts +0 -55
- /package/dist/{1X-C72Wa4pk.d.ts → 1X-DItnKpyI.d.ts} +0 -0
- /package/dist/{2X-CH89y3Af.d.ts → 2X-BRqwtcFk.d.ts} +0 -0
- /package/dist/{3X-DryrwYRf.d.ts → 3X-B9ib7hmz.d.ts} +0 -0
- /package/dist/{4X-BPMLRoDv.d.ts → 4X-DnvqoFRK.d.ts} +0 -0
- /package/dist/{5X-Bv7M6KyG.d.ts → 5X-B5VgbyuP.d.ts} +0 -0
- /package/dist/{6X-ZeZ8OB57.d.ts → 6X-DkXfHpvM.d.ts} +0 -0
- /package/dist/{7X-Dvw2Z2VN.d.ts → 7X-C5JVFy1t.d.ts} +0 -0
- /package/dist/{8X-BkgoX8dg.d.ts → 8X-B4ugLZwg.d.ts} +0 -0
- /package/dist/{9X-Du0e44cq.d.ts → 9X-CJNvMnQl.d.ts} +0 -0
- /package/dist/{AX-BSPLpkVT.d.ts → AX-DOUxT2rI.d.ts} +0 -0
- /package/dist/{BX-u4yMaIkz.d.ts → BX-oblwBfTI.d.ts} +0 -0
- /package/dist/{CX-BKZG0pVE.d.ts → CX-BSkJgKgO.d.ts} +0 -0
- /package/dist/{DX-CwA9WJAf.d.ts → DX-BnaWlGEa.d.ts} +0 -0
- /package/dist/{EX-BRNu1Ooi.d.ts → EX-DqMLkTD6.d.ts} +0 -0
- /package/dist/{FX-DBxjq6xY.d.ts → FX-WMYJJiXw.d.ts} +0 -0
- /package/dist/{GX-B3CvWNrP.d.ts → GX-Bq5dlHcB.d.ts} +0 -0
- /package/dist/{HX-D7FABgTv.d.ts → HX-rnN-1gc4.d.ts} +0 -0
- /package/dist/{IX-D3ZknsAB.d.ts → IX-DEhTE-sl.d.ts} +0 -0
- /package/dist/{JX-BRaZM3Gc.d.ts → JX-DDmdLUAf.d.ts} +0 -0
- /package/dist/{KX-B1K0OWoi.d.ts → KX-ahQ_YdHF.d.ts} +0 -0
- /package/dist/{LX-CKRefinL.d.ts → LX-C7pFhvwp.d.ts} +0 -0
- /package/dist/{MX-DKmaeO9r.d.ts → MX-BiGP-zfs.d.ts} +0 -0
- /package/dist/{NX-CJL2Gn1U.d.ts → NX-D9OweSyC.d.ts} +0 -0
- /package/dist/{OX-Do2ap5v_.d.ts → OX-DnnpAMzr.d.ts} +0 -0
- /package/dist/{PX-_DOr_rm9.d.ts → PX-Zg8k4vu2.d.ts} +0 -0
- /package/dist/{QX-HlXLkIki.d.ts → QX-DxR99yw8.d.ts} +0 -0
- /package/dist/{RX-DVPGOVES.d.ts → RX-DBVE-XJ8.d.ts} +0 -0
- /package/dist/{SX-OGT3qwlS.d.ts → SX-BPJh5Wy9.d.ts} +0 -0
- /package/dist/{TX-cPDINmZ5.d.ts → TX-BWd2tM68.d.ts} +0 -0
- /package/dist/{UX-Be3sqvPV.d.ts → UX-B8bqUo26.d.ts} +0 -0
- /package/dist/{VX-CoEuBNDK.d.ts → VX-C-mcQkWG.d.ts} +0 -0
- /package/dist/{WX-DMvw__jH.d.ts → WX-C-7bazUi.d.ts} +0 -0
- /package/dist/{XX-DOA-10JW.d.ts → XX-DhTx4dT8.d.ts} +0 -0
- /package/dist/{YX-F34sJ7Ik.d.ts → YX-CzIG0m1_.d.ts} +0 -0
- /package/dist/{ZX-CDQOfsHh.d.ts → ZX-BoEUGCYa.d.ts} +0 -0
- /package/dist/{payment-modes-NpE3OcCV.d.ts → payment-modes-tbWpu_Qh.d.ts} +0 -0
package/dist/index16.cjs
CHANGED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
|
|
2
|
+
//#region src/types/payment-modes.d.ts
|
|
3
|
+
/**
|
|
4
|
+
* Enum representing the allowed payment mode codes with descriptive names.
|
|
5
|
+
* Provides a more readable way to reference payment modes.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* const mode = PaymentModeCodeEnum.Cash;
|
|
9
|
+
* console.log(mode); // Output: "01"
|
|
10
|
+
*/
|
|
11
|
+
let PaymentModeCodeEnum = /* @__PURE__ */ function(PaymentModeCodeEnum$1) {
|
|
12
|
+
PaymentModeCodeEnum$1["Cash"] = "01";
|
|
13
|
+
PaymentModeCodeEnum$1["Cheque"] = "02";
|
|
14
|
+
PaymentModeCodeEnum$1["BankTransfer"] = "03";
|
|
15
|
+
PaymentModeCodeEnum$1["CreditCard"] = "04";
|
|
16
|
+
PaymentModeCodeEnum$1["DebitCard"] = "05";
|
|
17
|
+
PaymentModeCodeEnum$1["EWalletDigitalWallet"] = "06";
|
|
18
|
+
PaymentModeCodeEnum$1["DigitalBank"] = "07";
|
|
19
|
+
PaymentModeCodeEnum$1["Others"] = "08";
|
|
20
|
+
return PaymentModeCodeEnum$1;
|
|
21
|
+
}({});
|
|
22
|
+
|
|
23
|
+
//#endregion
|
|
24
|
+
exports.PaymentModeCodeEnum = PaymentModeCodeEnum;
|
|
25
|
+
//# sourceMappingURL=index16.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index16.cjs","names":[],"sources":["../src/types/payment-modes.d.ts"],"sourcesContent":["/**\n * Represents the allowed codes for payment modes.\n * Based on the documentation: https://sdk.myinvois.hasil.gov.my/codes/payment-methods/\n */\nexport type PaymentModeCode =\n | '01' // Cash\n | '02' // Cheque\n | '03' // Bank Transfer\n | '04' // Credit Card\n | '05' // Debit Card\n | '06' // e-Wallet / Digital Wallet\n | '07' // Digital Bank\n | '08' // Others\n\n/**\n * Enum representing the allowed payment mode codes with descriptive names.\n * Provides a more readable way to reference payment modes.\n *\n * @example\n * const mode = PaymentModeCodeEnum.Cash;\n * console.log(mode); // Output: \"01\"\n */\nexport enum PaymentModeCodeEnum {\n Cash = '01',\n Cheque = '02',\n BankTransfer = '03',\n CreditCard = '04',\n DebitCard = '05',\n EWalletDigitalWallet = '06',\n DigitalBank = '07',\n Others = '08',\n}\n\n/**\n * Interface representing a payment mode entry.\n * Contains the code and its corresponding description.\n */\nexport interface PaymentMode {\n code: PaymentModeCode\n description: string\n}\n"],"mappings":";;;;;;;;;;AAsBA,IAAY,sEAAL;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AACD"}
|
package/dist/index17.cjs
CHANGED
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
const require_documentManagement = require('./documentManagement-DQ7JEcBq.cjs');
|
|
2
|
-
|
|
3
|
-
exports.getDocument = require_documentManagement.getDocument;
|
|
4
|
-
exports.getDocumentDetails = require_documentManagement.getDocumentDetails;
|
|
5
|
-
exports.searchDocuments = require_documentManagement.searchDocuments;
|
package/dist/index18.cjs
CHANGED
|
@@ -1,6 +1,34 @@
|
|
|
1
|
-
require('./document-vDphtJTv.cjs');
|
|
2
|
-
const require_documentSubmission = require('./documentSubmission-D5TC0MPC.cjs');
|
|
3
1
|
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
2
|
+
//#region src/types/state-codes.d.ts
|
|
3
|
+
/**
|
|
4
|
+
* Enum representing the allowed state codes with descriptive names.
|
|
5
|
+
* Provides a more readable way to reference states.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* const code = StateCodeEnum.Selangor;
|
|
9
|
+
* console.log(code); // Output: "10"
|
|
10
|
+
*/
|
|
11
|
+
let StateCodeEnum = /* @__PURE__ */ function(StateCodeEnum$1) {
|
|
12
|
+
StateCodeEnum$1["Johor"] = "01";
|
|
13
|
+
StateCodeEnum$1["Kedah"] = "02";
|
|
14
|
+
StateCodeEnum$1["Kelantan"] = "03";
|
|
15
|
+
StateCodeEnum$1["Melaka"] = "04";
|
|
16
|
+
StateCodeEnum$1["NegeriSembilan"] = "05";
|
|
17
|
+
StateCodeEnum$1["Pahang"] = "06";
|
|
18
|
+
StateCodeEnum$1["PulauPinang"] = "07";
|
|
19
|
+
StateCodeEnum$1["Perak"] = "08";
|
|
20
|
+
StateCodeEnum$1["Perlis"] = "09";
|
|
21
|
+
StateCodeEnum$1["Selangor"] = "10";
|
|
22
|
+
StateCodeEnum$1["Terengganu"] = "11";
|
|
23
|
+
StateCodeEnum$1["Sabah"] = "12";
|
|
24
|
+
StateCodeEnum$1["Sarawak"] = "13";
|
|
25
|
+
StateCodeEnum$1["WPKualaLumpur"] = "14";
|
|
26
|
+
StateCodeEnum$1["WPLabuan"] = "15";
|
|
27
|
+
StateCodeEnum$1["WPPutrajaya"] = "16";
|
|
28
|
+
StateCodeEnum$1["NotApplicable"] = "17";
|
|
29
|
+
return StateCodeEnum$1;
|
|
30
|
+
}({});
|
|
31
|
+
|
|
32
|
+
//#endregion
|
|
33
|
+
exports.StateCodeEnum = StateCodeEnum;
|
|
34
|
+
//# sourceMappingURL=index18.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index18.cjs","names":[],"sources":["../src/types/state-codes.d.ts"],"sourcesContent":["/**\n * Represents the allowed codes for Malaysian states and federal territories.\n * Based on the documentation: https://sdk.myinvois.hasil.gov.my/codes/state-codes/\n */\nexport type StateCode =\n | '01' // Johor\n | '02' // Kedah\n | '03' // Kelantan\n | '04' // Melaka\n | '05' // Negeri Sembilan\n | '06' // Pahang\n | '07' // Pulau Pinang\n | '08' // Perak\n | '09' // Perlis\n | '10' // Selangor\n | '11' // Terengganu\n | '12' // Sabah\n | '13' // Sarawak\n | '14' // Wilayah Persekutuan Kuala Lumpur\n | '15' // Wilayah Persekutuan Labuan\n | '16' // Wilayah Persekutuan Putrajaya\n | '17' // Not Applicable\n\n/**\n * Enum representing the allowed state codes with descriptive names.\n * Provides a more readable way to reference states.\n *\n * @example\n * const code = StateCodeEnum.Selangor;\n * console.log(code); // Output: \"10\"\n */\nexport enum StateCodeEnum {\n Johor = '01',\n Kedah = '02',\n Kelantan = '03',\n Melaka = '04',\n NegeriSembilan = '05',\n Pahang = '06',\n PulauPinang = '07',\n Perak = '08',\n Perlis = '09',\n Selangor = '10',\n Terengganu = '11',\n Sabah = '12',\n Sarawak = '13',\n WPKualaLumpur = '14',\n WPLabuan = '15',\n WPPutrajaya = '16',\n NotApplicable = '17',\n}\n\n/**\n * Interface representing a state code entry.\n * Contains the code and its corresponding name.\n */\nexport interface State {\n code: StateCode\n name: string\n}\n"],"mappings":";;;;;;;;;;AA+BA,IAAY,0DAAL;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AACD"}
|
package/dist/index19.cjs
CHANGED
|
@@ -1,5 +1,24 @@
|
|
|
1
|
-
const require_documentTypeManagement = require('./documentTypeManagement-DXRLfTsW.cjs');
|
|
2
1
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
2
|
+
//#region src/types/tax-types.d.ts
|
|
3
|
+
/**
|
|
4
|
+
* Enum representing the allowed tax type codes with descriptive names.
|
|
5
|
+
* Provides a more readable way to reference tax types.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* const code = TaxTypeCodeEnum.SalesTax;
|
|
9
|
+
* console.log(code); // Output: "01"
|
|
10
|
+
*/
|
|
11
|
+
let TaxTypeCodeEnum = /* @__PURE__ */ function(TaxTypeCodeEnum$1) {
|
|
12
|
+
TaxTypeCodeEnum$1["SalesTax"] = "01";
|
|
13
|
+
TaxTypeCodeEnum$1["ServiceTax"] = "02";
|
|
14
|
+
TaxTypeCodeEnum$1["TourismTax"] = "03";
|
|
15
|
+
TaxTypeCodeEnum$1["HighValueGoodsTax"] = "04";
|
|
16
|
+
TaxTypeCodeEnum$1["SalesTaxLowValueGoods"] = "05";
|
|
17
|
+
TaxTypeCodeEnum$1["NotApplicable"] = "06";
|
|
18
|
+
TaxTypeCodeEnum$1["TaxExemption"] = "E";
|
|
19
|
+
return TaxTypeCodeEnum$1;
|
|
20
|
+
}({});
|
|
21
|
+
|
|
22
|
+
//#endregion
|
|
23
|
+
exports.TaxTypeCodeEnum = TaxTypeCodeEnum;
|
|
24
|
+
//# sourceMappingURL=index19.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"
|
|
1
|
+
{"version":3,"file":"index19.cjs","names":[],"sources":["../src/types/tax-types.d.ts"],"sourcesContent":["/**\n * Represents the allowed codes for tax types.\n * Based on the documentation: https://sdk.myinvois.hasil.gov.my/codes/tax-types/\n */\nexport type TaxTypeCode =\n | '01' // Sales Tax\n | '02' // Service Tax\n | '03' // Tourism Tax\n | '04' // High-Value Goods Tax\n | '05' // Sales Tax on Low Value Goods\n | '06' // Not Applicable\n | 'E' // Tax exemption (where applicable)\n\n/**\n * Enum representing the allowed tax type codes with descriptive names.\n * Provides a more readable way to reference tax types.\n *\n * @example\n * const code = TaxTypeCodeEnum.SalesTax;\n * console.log(code); // Output: \"01\"\n */\nexport enum TaxTypeCodeEnum {\n SalesTax = '01',\n ServiceTax = '02',\n TourismTax = '03',\n HighValueGoodsTax = '04',\n SalesTaxLowValueGoods = '05',\n NotApplicable = '06',\n TaxExemption = 'E',\n}\n\n/**\n * Interface representing a tax type entry.\n * Contains the code and its corresponding description.\n */\nexport interface TaxType {\n code: TaxTypeCode\n description: string\n}\n"],"mappings":";;;;;;;;;;AAqBA,IAAY,8DAAL;AACL;AACA;AACA;AACA;AACA;AACA;AACA;;AACD"}
|
package/dist/index2.cjs
CHANGED
|
@@ -1,62 +1,5 @@
|
|
|
1
|
+
const require_documentManagement = require('./documentManagement-DQ7JEcBq.cjs');
|
|
1
2
|
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
* Provides a more readable way to reference classification codes.
|
|
6
|
-
*
|
|
7
|
-
* @example
|
|
8
|
-
* const code = ClassificationCodeEnum.ComputerSmartphoneOrTablet;
|
|
9
|
-
* console.log(code); // Output: "003"
|
|
10
|
-
*/
|
|
11
|
-
let ClassificationCodeEnum = /* @__PURE__ */ function(ClassificationCodeEnum$1) {
|
|
12
|
-
ClassificationCodeEnum$1["BreastfeedingEquipment"] = "001";
|
|
13
|
-
ClassificationCodeEnum$1["ChildCareCentresAndKindergartensFees"] = "002";
|
|
14
|
-
ClassificationCodeEnum$1["ComputerSmartphoneOrTablet"] = "003";
|
|
15
|
-
ClassificationCodeEnum$1["ConsolidatedEInvoice"] = "004";
|
|
16
|
-
ClassificationCodeEnum$1["ConstructionMaterials"] = "005";
|
|
17
|
-
ClassificationCodeEnum$1["Disbursement"] = "006";
|
|
18
|
-
ClassificationCodeEnum$1["Donation"] = "007";
|
|
19
|
-
ClassificationCodeEnum$1["ECommerceEInvoiceToBuyer"] = "008";
|
|
20
|
-
ClassificationCodeEnum$1["ECommerceSelfBilledToSellerLogistics"] = "009";
|
|
21
|
-
ClassificationCodeEnum$1["EducationFees"] = "010";
|
|
22
|
-
ClassificationCodeEnum$1["GoodsOnConsignmentConsignor"] = "011";
|
|
23
|
-
ClassificationCodeEnum$1["GoodsOnConsignmentConsignee"] = "012";
|
|
24
|
-
ClassificationCodeEnum$1["GymMembership"] = "013";
|
|
25
|
-
ClassificationCodeEnum$1["InsuranceEducationMedicalBenefits"] = "014";
|
|
26
|
-
ClassificationCodeEnum$1["InsuranceTakafulLife"] = "015";
|
|
27
|
-
ClassificationCodeEnum$1["InterestFinancingExpenses"] = "016";
|
|
28
|
-
ClassificationCodeEnum$1["InternetSubscription"] = "017";
|
|
29
|
-
ClassificationCodeEnum$1["LandAndBuilding"] = "018";
|
|
30
|
-
ClassificationCodeEnum$1["MedicalExamLearningDisabilities"] = "019";
|
|
31
|
-
ClassificationCodeEnum$1["MedicalExamVaccination"] = "020";
|
|
32
|
-
ClassificationCodeEnum$1["MedicalExpensesSeriousDiseases"] = "021";
|
|
33
|
-
ClassificationCodeEnum$1["Others"] = "022";
|
|
34
|
-
ClassificationCodeEnum$1["PetroleumOperations"] = "023";
|
|
35
|
-
ClassificationCodeEnum$1["PrivateRetirementSchemeDeferredAnnuity"] = "024";
|
|
36
|
-
ClassificationCodeEnum$1["MotorVehicle"] = "025";
|
|
37
|
-
ClassificationCodeEnum$1["SubscriptionBooksJournalsEtc"] = "026";
|
|
38
|
-
ClassificationCodeEnum$1["Reimbursement"] = "027";
|
|
39
|
-
ClassificationCodeEnum$1["RentalOfMotorVehicle"] = "028";
|
|
40
|
-
ClassificationCodeEnum$1["EVChargingFacilities"] = "029";
|
|
41
|
-
ClassificationCodeEnum$1["RepairAndMaintenance"] = "030";
|
|
42
|
-
ClassificationCodeEnum$1["ResearchAndDevelopment"] = "031";
|
|
43
|
-
ClassificationCodeEnum$1["ForeignIncome"] = "032";
|
|
44
|
-
ClassificationCodeEnum$1["SelfBilledBettingGaming"] = "033";
|
|
45
|
-
ClassificationCodeEnum$1["SelfBilledImportationGoods"] = "034";
|
|
46
|
-
ClassificationCodeEnum$1["SelfBilledImportationServices"] = "035";
|
|
47
|
-
ClassificationCodeEnum$1["SelfBilledOthers"] = "036";
|
|
48
|
-
ClassificationCodeEnum$1["SelfBilledMonetaryPaymentToAgents"] = "037";
|
|
49
|
-
ClassificationCodeEnum$1["SportsEquipmentRentalFeesEtc"] = "038";
|
|
50
|
-
ClassificationCodeEnum$1["SupportingEquipmentDisabledPerson"] = "039";
|
|
51
|
-
ClassificationCodeEnum$1["VoluntaryContributionProvidentFund"] = "040";
|
|
52
|
-
ClassificationCodeEnum$1["DentalExamTreatment"] = "041";
|
|
53
|
-
ClassificationCodeEnum$1["FertilityTreatment"] = "042";
|
|
54
|
-
ClassificationCodeEnum$1["TreatmentHomeCareNursingEtc"] = "043";
|
|
55
|
-
ClassificationCodeEnum$1["VouchersGiftCardsLoyaltyPoints"] = "044";
|
|
56
|
-
ClassificationCodeEnum$1["SelfBilledNonMonetaryPaymentToAgents"] = "045";
|
|
57
|
-
return ClassificationCodeEnum$1;
|
|
58
|
-
}({});
|
|
59
|
-
|
|
60
|
-
//#endregion
|
|
61
|
-
exports.ClassificationCodeEnum = ClassificationCodeEnum;
|
|
62
|
-
//# sourceMappingURL=index2.cjs.map
|
|
3
|
+
exports.getDocument = require_documentManagement.getDocument;
|
|
4
|
+
exports.getDocumentDetails = require_documentManagement.getDocumentDetails;
|
|
5
|
+
exports.searchDocuments = require_documentManagement.searchDocuments;
|
package/dist/index20.cjs
CHANGED
package/dist/index21.cjs
CHANGED
package/dist/index22.cjs
CHANGED
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
const require_taxpayerValidation = require('./taxpayerValidation-CSuifcY1.cjs');
|
|
2
|
-
|
|
3
|
-
exports.taxpayerQRCode = require_taxpayerValidation.taxpayerQRCode;
|
|
4
|
-
exports.tinSearch = require_taxpayerValidation.tinSearch;
|
|
5
|
-
exports.verifyTin = require_taxpayerValidation.verifyTin;
|
package/dist/index25.cjs
CHANGED
|
@@ -1,13 +1,19 @@
|
|
|
1
|
-
const require_document = require('./document-
|
|
1
|
+
const require_document = require('./document-djvnrrZo.cjs');
|
|
2
2
|
|
|
3
3
|
exports.calculateCertificateDigest = require_document.calculateCertificateDigest;
|
|
4
4
|
exports.calculateDocumentDigest = require_document.calculateDocumentDigest;
|
|
5
|
+
exports.calculateExpectedTaxAmount = require_document.calculateExpectedTaxAmount;
|
|
6
|
+
exports.calculateInvoiceTotals = require_document.calculateInvoiceTotals;
|
|
5
7
|
exports.calculateSignedPropertiesDigest = require_document.calculateSignedPropertiesDigest;
|
|
6
8
|
exports.canonicalizeJSON = require_document.canonicalizeJSON;
|
|
9
|
+
exports.createFixedRateTaxLineItem = require_document.createFixedRateTaxLineItem;
|
|
10
|
+
exports.createPercentageTaxLineItem = require_document.createPercentageTaxLineItem;
|
|
7
11
|
exports.createSignedInfoAndSign = require_document.createSignedInfoAndSign;
|
|
8
12
|
exports.createSignedProperties = require_document.createSignedProperties;
|
|
9
13
|
exports.extractCertificateInfo = require_document.extractCertificateInfo;
|
|
10
14
|
exports.generateCleanInvoiceObject = require_document.generateCleanInvoiceObject;
|
|
11
15
|
exports.generateCleanUBLDocument = require_document.generateCleanUBLDocument;
|
|
12
16
|
exports.generateCompleteDocument = require_document.generateCompleteDocument;
|
|
17
|
+
exports.isFixedRateTax = require_document.isFixedRateTax;
|
|
18
|
+
exports.isPercentageTax = require_document.isPercentageTax;
|
|
13
19
|
exports.sortObjectKeys = require_document.sortObjectKeys;
|
package/dist/index27.cjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
const require_chunk = require('./chunk-CUT6urMc.cjs');
|
|
2
|
-
const require_document = require('./document-
|
|
2
|
+
const require_document = require('./document-djvnrrZo.cjs');
|
|
3
3
|
const crypto = require_chunk.__toESM(require("crypto"));
|
|
4
4
|
|
|
5
5
|
//#region src/utils/signature-diagnostics.ts
|
package/dist/index28.cjs
CHANGED
|
@@ -83,10 +83,62 @@ const validateMonetaryAmount = (amount, fieldName, maxDigits = 18, maxDecimals =
|
|
|
83
83
|
return errors;
|
|
84
84
|
};
|
|
85
85
|
/**
|
|
86
|
+
* Validates line item tax calculation consistency for both fixed rate and percentage taxation
|
|
87
|
+
*/
|
|
88
|
+
const validateLineItemTax = (item, index) => {
|
|
89
|
+
const errors = [];
|
|
90
|
+
const tolerance = .01;
|
|
91
|
+
const hasFixedRate = item.taxPerUnitAmount !== void 0 && item.baseUnitMeasure !== void 0;
|
|
92
|
+
const hasPercentageRate = item.taxRate !== void 0;
|
|
93
|
+
if (!hasFixedRate && !hasPercentageRate) {
|
|
94
|
+
errors.push({
|
|
95
|
+
field: `lineItem[${index}]`,
|
|
96
|
+
code: "TAX_METHOD_MISSING",
|
|
97
|
+
message: `Line item ${index + 1} must specify either taxRate (for percentage) or taxPerUnitAmount + baseUnitMeasure (for fixed rate)`,
|
|
98
|
+
severity: "error"
|
|
99
|
+
});
|
|
100
|
+
return errors;
|
|
101
|
+
}
|
|
102
|
+
if (hasFixedRate && hasPercentageRate) errors.push({
|
|
103
|
+
field: `lineItem[${index}]`,
|
|
104
|
+
code: "TAX_METHOD_CONFLICT",
|
|
105
|
+
message: `Line item ${index + 1} cannot have both percentage and fixed rate tax methods`,
|
|
106
|
+
severity: "error"
|
|
107
|
+
});
|
|
108
|
+
if (hasFixedRate) {
|
|
109
|
+
if (item.baseUnitMeasureCode === void 0) errors.push({
|
|
110
|
+
field: `lineItem[${index}].baseUnitMeasureCode`,
|
|
111
|
+
code: "UNIT_CODE_MISSING",
|
|
112
|
+
message: `Line item ${index + 1} with fixed rate tax must specify baseUnitMeasureCode`,
|
|
113
|
+
severity: "error"
|
|
114
|
+
});
|
|
115
|
+
const expectedTaxAmount = item.taxPerUnitAmount * item.baseUnitMeasure;
|
|
116
|
+
if (Math.abs(item.taxAmount - expectedTaxAmount) > tolerance) errors.push({
|
|
117
|
+
field: `lineItem[${index}].taxAmount`,
|
|
118
|
+
code: "FIXED_TAX_CALCULATION_MISMATCH",
|
|
119
|
+
message: `Line item ${index + 1} tax amount (${item.taxAmount}) doesn't match fixed rate calculation (${item.taxPerUnitAmount} × ${item.baseUnitMeasure} = ${expectedTaxAmount})`,
|
|
120
|
+
severity: "error"
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
if (hasPercentageRate && !hasFixedRate) {
|
|
124
|
+
const expectedTaxAmount = item.totalTaxableAmountPerLine * item.taxRate / 100;
|
|
125
|
+
if (Math.abs(item.taxAmount - expectedTaxAmount) > tolerance) errors.push({
|
|
126
|
+
field: `lineItem[${index}].taxAmount`,
|
|
127
|
+
code: "PERCENTAGE_TAX_CALCULATION_MISMATCH",
|
|
128
|
+
message: `Line item ${index + 1} tax amount (${item.taxAmount}) doesn't match percentage calculation (${item.totalTaxableAmountPerLine} × ${item.taxRate}% = ${expectedTaxAmount})`,
|
|
129
|
+
severity: "error"
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
return errors;
|
|
133
|
+
};
|
|
134
|
+
/**
|
|
86
135
|
* Validates tax calculation consistency
|
|
87
136
|
*/
|
|
88
137
|
const validateTaxCalculations = (invoice) => {
|
|
89
138
|
const errors = [];
|
|
139
|
+
invoice.invoiceLineItems.forEach((item, index) => {
|
|
140
|
+
errors.push(...validateLineItemTax(item, index));
|
|
141
|
+
});
|
|
90
142
|
const expectedTaxExclusive = invoice.invoiceLineItems.reduce((sum, item) => sum + item.totalTaxableAmountPerLine, 0);
|
|
91
143
|
const expectedTaxAmount = invoice.invoiceLineItems.reduce((sum, item) => sum + item.taxAmount, 0);
|
|
92
144
|
const tolerance = .01;
|
|
@@ -134,6 +186,7 @@ const validateInvoice = (invoice) => {
|
|
|
134
186
|
//#endregion
|
|
135
187
|
exports.validateContactNumber = validateContactNumber;
|
|
136
188
|
exports.validateInvoice = validateInvoice;
|
|
189
|
+
exports.validateLineItemTax = validateLineItemTax;
|
|
137
190
|
exports.validateMonetaryAmount = validateMonetaryAmount;
|
|
138
191
|
exports.validateTIN = validateTIN;
|
|
139
192
|
exports.validateTaxCalculations = validateTaxCalculations;
|
package/dist/index28.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index28.cjs","names":["tin: string","registrationType?: string","errors: ValidationError[]","contactNumber: string","amount: number","fieldName: string","invoice: InvoiceV1_1","allErrors: ValidationError[]"],"sources":["../src/utils/validation.ts"],"sourcesContent":["import type { InvoiceV1_1 } from '../types/documents/index.js'\n\n/**\n * MyInvois Invoice Validation Utilities\n *\n * Provides comprehensive validation for invoice data before document generation\n * and submission to ensure compliance with MyInvois business rules and format requirements.\n */\n\nexport interface ValidationResult {\n isValid: boolean\n errors: ValidationError[]\n warnings: ValidationWarning[]\n}\n\nexport interface ValidationError {\n field: string\n code: string\n message: string\n severity: 'error' | 'warning'\n}\n\nexport interface ValidationWarning extends ValidationError {\n severity: 'warning'\n}\n\n/**\n * Validates TIN format based on registration type\n */\nexport const validateTIN = (\n tin: string,\n registrationType?: string,\n): ValidationError[] => {\n const errors: ValidationError[] = []\n\n if (!tin) {\n errors.push({\n field: 'tin',\n code: 'TIN_REQUIRED',\n message: 'TIN is required',\n severity: 'error',\n })\n return errors\n }\n\n // TIN format validation based on type\n if (registrationType === 'BRN' && !tin.startsWith('C')) {\n errors.push({\n field: 'tin',\n code: 'TIN_FORMAT_INVALID',\n message: 'Company TIN should start with \"C\" for BRN registration',\n severity: 'warning',\n })\n }\n\n if (registrationType === 'NRIC' && !tin.startsWith('IG')) {\n errors.push({\n field: 'tin',\n code: 'TIN_FORMAT_INVALID',\n message: 'Individual TIN should start with \"IG\" for NRIC registration',\n severity: 'warning',\n })\n }\n\n // Length validation\n if (tin.length > 14) {\n errors.push({\n field: 'tin',\n code: 'TIN_LENGTH_INVALID',\n message: 'TIN cannot exceed 14 characters',\n severity: 'error',\n })\n }\n\n return errors\n}\n\n/**\n * Validates contact number format (E.164 standard)\n */\nexport const validateContactNumber = (\n contactNumber: string,\n): ValidationError[] => {\n const errors: ValidationError[] = []\n\n if (!contactNumber || contactNumber === 'NA') {\n return errors // Allow NA for consolidated e-invoices\n }\n\n // E.164 format validation\n const e164Regex = /^\\+[1-9]\\d{1,14}$/\n if (!e164Regex.test(contactNumber)) {\n errors.push({\n field: 'contactNumber',\n code: 'CONTACT_FORMAT_INVALID',\n message: 'Contact number must be in E.164 format (e.g., +60123456789)',\n severity: 'error',\n })\n }\n\n if (contactNumber.length < 8) {\n errors.push({\n field: 'contactNumber',\n code: 'CONTACT_LENGTH_INVALID',\n message: 'Contact number must be at least 8 characters',\n severity: 'error',\n })\n }\n\n return errors\n}\n\n/**\n * Validates monetary amounts\n */\nexport const validateMonetaryAmount = (\n amount: number,\n fieldName: string,\n maxDigits = 18,\n maxDecimals = 2,\n): ValidationError[] => {\n const errors: ValidationError[] = []\n\n if (amount < 0) {\n errors.push({\n field: fieldName,\n code: 'AMOUNT_NEGATIVE',\n message: `${fieldName} cannot be negative`,\n severity: 'error',\n })\n }\n\n // Check total digits\n const amountStr = amount.toString()\n const [integerPart, decimalPart] = amountStr.split('.')\n\n if (integerPart && integerPart.length > maxDigits - maxDecimals) {\n errors.push({\n field: fieldName,\n code: 'AMOUNT_DIGITS_EXCEEDED',\n message: `${fieldName} exceeds maximum ${maxDigits} digits`,\n severity: 'error',\n })\n }\n\n if (decimalPart && decimalPart.length > maxDecimals) {\n errors.push({\n field: fieldName,\n code: 'AMOUNT_DECIMALS_EXCEEDED',\n message: `${fieldName} exceeds maximum ${maxDecimals} decimal places`,\n severity: 'error',\n })\n }\n\n return errors\n}\n\n/**\n * Validates tax calculation consistency\n */\nexport const validateTaxCalculations = (\n invoice: InvoiceV1_1,\n): ValidationError[] => {\n const errors: ValidationError[] = []\n\n // Calculate expected totals from line items\n const expectedTaxExclusive = invoice.invoiceLineItems.reduce(\n (sum, item) => sum + item.totalTaxableAmountPerLine,\n 0,\n )\n const expectedTaxAmount = invoice.invoiceLineItems.reduce(\n (sum, item) => sum + item.taxAmount,\n 0,\n )\n\n // Allow small rounding differences (0.01)\n const tolerance = 0.01\n\n if (\n Math.abs(\n invoice.legalMonetaryTotal.taxExclusiveAmount - expectedTaxExclusive,\n ) > tolerance\n ) {\n errors.push({\n field: 'legalMonetaryTotal.taxExclusiveAmount',\n code: 'TAX_EXCLUSIVE_MISMATCH',\n message: `Tax exclusive amount (${invoice.legalMonetaryTotal.taxExclusiveAmount}) doesn't match sum of line items (${expectedTaxExclusive})`,\n severity: 'error',\n })\n }\n\n if (Math.abs(invoice.taxTotal.taxAmount - expectedTaxAmount) > tolerance) {\n errors.push({\n field: 'taxTotal.taxAmount',\n code: 'TAX_AMOUNT_MISMATCH',\n message: `Tax amount (${invoice.taxTotal.taxAmount}) doesn't match sum of line item taxes (${expectedTaxAmount})`,\n severity: 'error',\n })\n }\n\n return errors\n}\n\n/**\n * Main validation function for complete invoice\n */\nexport const validateInvoice = (invoice: InvoiceV1_1): ValidationResult => {\n const allErrors: ValidationError[] = []\n\n // Core field validations\n allErrors.push(\n ...validateTIN(invoice.supplier.tin, invoice.supplier.registrationType),\n )\n allErrors.push(\n ...validateTIN(invoice.buyer.tin, invoice.buyer.registrationType),\n )\n\n allErrors.push(...validateContactNumber(invoice.supplier.contactNumber))\n allErrors.push(...validateContactNumber(invoice.buyer.contactNumber))\n\n // Monetary validations\n allErrors.push(\n ...validateMonetaryAmount(\n invoice.legalMonetaryTotal.taxExclusiveAmount,\n 'taxExclusiveAmount',\n ),\n )\n allErrors.push(\n ...validateMonetaryAmount(\n invoice.legalMonetaryTotal.payableAmount,\n 'payableAmount',\n ),\n )\n allErrors.push(\n ...validateMonetaryAmount(invoice.taxTotal.taxAmount, 'taxAmount'),\n )\n\n // Line item validations\n invoice.invoiceLineItems.forEach((item, index) => {\n allErrors.push(\n ...validateMonetaryAmount(item.unitPrice, `lineItem[${index}].unitPrice`),\n )\n allErrors.push(\n ...validateMonetaryAmount(item.taxAmount, `lineItem[${index}].taxAmount`),\n )\n allErrors.push(\n ...validateMonetaryAmount(\n item.totalTaxableAmountPerLine,\n `lineItem[${index}].totalTaxableAmountPerLine`,\n ),\n )\n })\n\n // Business rule validations\n allErrors.push(...validateTaxCalculations(invoice))\n\n // Separate errors and warnings\n const errors = allErrors.filter(e => e.severity === 'error')\n const warnings = allErrors.filter(\n e => e.severity === 'warning',\n ) as ValidationWarning[]\n\n return {\n isValid: errors.length === 0,\n errors,\n warnings,\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index28.cjs","names":["tin: string","registrationType?: string","errors: ValidationError[]","contactNumber: string","amount: number","fieldName: string","item: InvoiceLineItem","index: number","invoice: InvoiceV1_1","allErrors: ValidationError[]"],"sources":["../src/utils/validation.ts"],"sourcesContent":["import type { InvoiceV1_1, InvoiceLineItem } from '../types'\n\n/**\n * MyInvois Invoice Validation Utilities\n *\n * Provides comprehensive validation for invoice data before document generation\n * and submission to ensure compliance with MyInvois business rules and format requirements.\n */\n\nexport interface ValidationResult {\n isValid: boolean\n errors: ValidationError[]\n warnings: ValidationWarning[]\n}\n\nexport interface ValidationError {\n field: string\n code: string\n message: string\n severity: 'error' | 'warning'\n}\n\nexport interface ValidationWarning extends ValidationError {\n severity: 'warning'\n}\n\n/**\n * Validates TIN format based on registration type\n */\nexport const validateTIN = (\n tin: string,\n registrationType?: string,\n): ValidationError[] => {\n const errors: ValidationError[] = []\n\n if (!tin) {\n errors.push({\n field: 'tin',\n code: 'TIN_REQUIRED',\n message: 'TIN is required',\n severity: 'error',\n })\n return errors\n }\n\n // TIN format validation based on type\n if (registrationType === 'BRN' && !tin.startsWith('C')) {\n errors.push({\n field: 'tin',\n code: 'TIN_FORMAT_INVALID',\n message: 'Company TIN should start with \"C\" for BRN registration',\n severity: 'warning',\n })\n }\n\n if (registrationType === 'NRIC' && !tin.startsWith('IG')) {\n errors.push({\n field: 'tin',\n code: 'TIN_FORMAT_INVALID',\n message: 'Individual TIN should start with \"IG\" for NRIC registration',\n severity: 'warning',\n })\n }\n\n // Length validation\n if (tin.length > 14) {\n errors.push({\n field: 'tin',\n code: 'TIN_LENGTH_INVALID',\n message: 'TIN cannot exceed 14 characters',\n severity: 'error',\n })\n }\n\n return errors\n}\n\n/**\n * Validates contact number format (E.164 standard)\n */\nexport const validateContactNumber = (\n contactNumber: string,\n): ValidationError[] => {\n const errors: ValidationError[] = []\n\n if (!contactNumber || contactNumber === 'NA') {\n return errors // Allow NA for consolidated e-invoices\n }\n\n // E.164 format validation\n const e164Regex = /^\\+[1-9]\\d{1,14}$/\n if (!e164Regex.test(contactNumber)) {\n errors.push({\n field: 'contactNumber',\n code: 'CONTACT_FORMAT_INVALID',\n message: 'Contact number must be in E.164 format (e.g., +60123456789)',\n severity: 'error',\n })\n }\n\n if (contactNumber.length < 8) {\n errors.push({\n field: 'contactNumber',\n code: 'CONTACT_LENGTH_INVALID',\n message: 'Contact number must be at least 8 characters',\n severity: 'error',\n })\n }\n\n return errors\n}\n\n/**\n * Validates monetary amounts\n */\nexport const validateMonetaryAmount = (\n amount: number,\n fieldName: string,\n maxDigits = 18,\n maxDecimals = 2,\n): ValidationError[] => {\n const errors: ValidationError[] = []\n\n if (amount < 0) {\n errors.push({\n field: fieldName,\n code: 'AMOUNT_NEGATIVE',\n message: `${fieldName} cannot be negative`,\n severity: 'error',\n })\n }\n\n // Check total digits\n const amountStr = amount.toString()\n const [integerPart, decimalPart] = amountStr.split('.')\n\n if (integerPart && integerPart.length > maxDigits - maxDecimals) {\n errors.push({\n field: fieldName,\n code: 'AMOUNT_DIGITS_EXCEEDED',\n message: `${fieldName} exceeds maximum ${maxDigits} digits`,\n severity: 'error',\n })\n }\n\n if (decimalPart && decimalPart.length > maxDecimals) {\n errors.push({\n field: fieldName,\n code: 'AMOUNT_DECIMALS_EXCEEDED',\n message: `${fieldName} exceeds maximum ${maxDecimals} decimal places`,\n severity: 'error',\n })\n }\n\n return errors\n}\n\n/**\n * Validates line item tax calculation consistency for both fixed rate and percentage taxation\n */\nexport const validateLineItemTax = (\n item: InvoiceLineItem,\n index: number,\n): ValidationError[] => {\n const errors: ValidationError[] = []\n const tolerance = 0.01\n\n // Check if tax calculation method is specified\n const hasFixedRate =\n item.taxPerUnitAmount !== undefined && item.baseUnitMeasure !== undefined\n const hasPercentageRate = item.taxRate !== undefined\n\n if (!hasFixedRate && !hasPercentageRate) {\n errors.push({\n field: `lineItem[${index}]`,\n code: 'TAX_METHOD_MISSING',\n message: `Line item ${index + 1} must specify either taxRate (for percentage) or taxPerUnitAmount + baseUnitMeasure (for fixed rate)`,\n severity: 'error',\n })\n return errors\n }\n\n if (hasFixedRate && hasPercentageRate) {\n errors.push({\n field: `lineItem[${index}]`,\n code: 'TAX_METHOD_CONFLICT',\n message: `Line item ${index + 1} cannot have both percentage and fixed rate tax methods`,\n severity: 'error',\n })\n }\n\n // Validate fixed rate tax calculation\n if (hasFixedRate) {\n if (item.baseUnitMeasureCode === undefined) {\n errors.push({\n field: `lineItem[${index}].baseUnitMeasureCode`,\n code: 'UNIT_CODE_MISSING',\n message: `Line item ${index + 1} with fixed rate tax must specify baseUnitMeasureCode`,\n severity: 'error',\n })\n }\n\n const expectedTaxAmount = item.taxPerUnitAmount! * item.baseUnitMeasure!\n if (Math.abs(item.taxAmount - expectedTaxAmount) > tolerance) {\n errors.push({\n field: `lineItem[${index}].taxAmount`,\n code: 'FIXED_TAX_CALCULATION_MISMATCH',\n message: `Line item ${index + 1} tax amount (${item.taxAmount}) doesn't match fixed rate calculation (${item.taxPerUnitAmount} × ${item.baseUnitMeasure} = ${expectedTaxAmount})`,\n severity: 'error',\n })\n }\n }\n\n // Validate percentage tax calculation\n if (hasPercentageRate && !hasFixedRate) {\n const expectedTaxAmount =\n (item.totalTaxableAmountPerLine * item.taxRate!) / 100\n if (Math.abs(item.taxAmount - expectedTaxAmount) > tolerance) {\n errors.push({\n field: `lineItem[${index}].taxAmount`,\n code: 'PERCENTAGE_TAX_CALCULATION_MISMATCH',\n message: `Line item ${index + 1} tax amount (${item.taxAmount}) doesn't match percentage calculation (${item.totalTaxableAmountPerLine} × ${item.taxRate}% = ${expectedTaxAmount})`,\n severity: 'error',\n })\n }\n }\n\n return errors\n}\n\n/**\n * Validates tax calculation consistency\n */\nexport const validateTaxCalculations = (\n invoice: InvoiceV1_1,\n): ValidationError[] => {\n const errors: ValidationError[] = []\n\n // Validate individual line item tax calculations\n invoice.invoiceLineItems.forEach((item, index) => {\n errors.push(...validateLineItemTax(item, index))\n })\n\n // Calculate expected totals from line items\n const expectedTaxExclusive = invoice.invoiceLineItems.reduce(\n (sum, item) => sum + item.totalTaxableAmountPerLine,\n 0,\n )\n const expectedTaxAmount = invoice.invoiceLineItems.reduce(\n (sum, item) => sum + item.taxAmount,\n 0,\n )\n\n // Allow small rounding differences (0.01)\n const tolerance = 0.01\n\n if (\n Math.abs(\n invoice.legalMonetaryTotal.taxExclusiveAmount - expectedTaxExclusive,\n ) > tolerance\n ) {\n errors.push({\n field: 'legalMonetaryTotal.taxExclusiveAmount',\n code: 'TAX_EXCLUSIVE_MISMATCH',\n message: `Tax exclusive amount (${invoice.legalMonetaryTotal.taxExclusiveAmount}) doesn't match sum of line items (${expectedTaxExclusive})`,\n severity: 'error',\n })\n }\n\n if (Math.abs(invoice.taxTotal.taxAmount - expectedTaxAmount) > tolerance) {\n errors.push({\n field: 'taxTotal.taxAmount',\n code: 'TAX_AMOUNT_MISMATCH',\n message: `Tax amount (${invoice.taxTotal.taxAmount}) doesn't match sum of line item taxes (${expectedTaxAmount})`,\n severity: 'error',\n })\n }\n\n return errors\n}\n\n/**\n * Main validation function for complete invoice\n */\nexport const validateInvoice = (invoice: InvoiceV1_1): ValidationResult => {\n const allErrors: ValidationError[] = []\n\n // Core field validations\n allErrors.push(\n ...validateTIN(invoice.supplier.tin, invoice.supplier.registrationType),\n )\n allErrors.push(\n ...validateTIN(invoice.buyer.tin, invoice.buyer.registrationType),\n )\n\n allErrors.push(...validateContactNumber(invoice.supplier.contactNumber))\n allErrors.push(...validateContactNumber(invoice.buyer.contactNumber))\n\n // Monetary validations\n allErrors.push(\n ...validateMonetaryAmount(\n invoice.legalMonetaryTotal.taxExclusiveAmount,\n 'taxExclusiveAmount',\n ),\n )\n allErrors.push(\n ...validateMonetaryAmount(\n invoice.legalMonetaryTotal.payableAmount,\n 'payableAmount',\n ),\n )\n allErrors.push(\n ...validateMonetaryAmount(invoice.taxTotal.taxAmount, 'taxAmount'),\n )\n\n // Line item validations\n invoice.invoiceLineItems.forEach((item, index) => {\n allErrors.push(\n ...validateMonetaryAmount(item.unitPrice, `lineItem[${index}].unitPrice`),\n )\n allErrors.push(\n ...validateMonetaryAmount(item.taxAmount, `lineItem[${index}].taxAmount`),\n )\n allErrors.push(\n ...validateMonetaryAmount(\n item.totalTaxableAmountPerLine,\n `lineItem[${index}].totalTaxableAmountPerLine`,\n ),\n )\n })\n\n // Business rule validations\n allErrors.push(...validateTaxCalculations(invoice))\n\n // Separate errors and warnings\n const errors = allErrors.filter(e => e.severity === 'error')\n const warnings = allErrors.filter(\n e => e.severity === 'warning',\n ) as ValidationWarning[]\n\n return {\n isValid: errors.length === 0,\n errors,\n warnings,\n }\n}\n"],"mappings":"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"}
|