# Malaysia: validation rules

Find the rule behind a rejected Malaysian e-invoice and correct it. Start with the document type you sent and the errors returned by Unify or LHDN.

A Malaysian e-invoice is checked twice. Unify checks the GETS request against LHDN’s requirements before anything is submitted. LHDN then runs its own [document validation rules](https://sdk.myinvois.hasil.gov.my/document-validation-rules/) when the document reaches MyInvois.

## Check the GETS request

Select **Malaysia** and the document type in the [field reference](https://docs.complyance.io/countries/my/fields/). The **Requirement** column shows which GETS fields are mandatory, optional or conditional. In **List with sample request**, choose the document type and inspect the fields for that selection. Use values from the invoice and the company’s registration records.

## Read a `422` response

A `422` response from Unify lists each failed rule in `errors`. `code` is the rule ID from the table below, `getsPath` names the GETS field to correct and `message` describes the rule. Correct the source data, then send the document again. See [Unify errors](https://docs.complyance.io/api-reference/unify/errors/) for the response format.

## Read LHDN’s result

After the `200`, [follow the document](https://docs.complyance.io/api-reference/unify/submit-and-retrieve/#follow-the-document) until `isTerminal` is `true`. `final_valid` means LHDN validated the document. `final_invalid` means LHDN marked it invalid; `government` holds LHDN’s answer with the reason.

LHDN’s checks cover the document structure and core fields, taxpayer identities, references on credit and debit notes, codes, duplicate documents, currency and exchange rates. Check the current [MyInvois code tables](https://sdk.myinvois.hasil.gov.my/codes/) when a code is rejected. For a credit or debit note, check that the invoice it refers to is valid in MyInvois. For a taxpayer error, confirm the identifiers against the company’s registration records. Do not replace a rejected identifier with a guessed value.

## Every rule Unify checks

These are the 173 rules Unify applies to a Malaysian GETS request, with the message you get back and the field it points at. `MY-*` codes are Unify’s checks of LHDN’s requirements. `IBR-*`, `ALIGNED-IBRP-*` and `BR-*` codes come from the Peppol rules and apply with the `peppol` modifier. **Applies to** shows the document types, modifiers or variant each rule belongs to. A receipt (`is_receipt`) skips the buyer checks.

| Rule | What it checks | Field | Applies to |
| - | - | - | - |
| `ALIGNED-IBRP-046` | Each tax breakdown must have tax amount. | `taxTotals` | Modifier `peppol` |
| `ALIGNED-IBRP-047` | Each tax breakdown must have tax category code. | `taxTotals` | Modifier `peppol` |
| `ALIGNED-IBRP-048` | Tax breakdown rate must be present for taxable categories, optional for O, and absent for TTX. | `taxTotals` | Modifier `peppol` |
| `ALIGNED-IBRP-CL-01-MY` | Malaysian invoice tax categories must use the MY aligned tax-category codes. | `taxTotals` | Modifier `peppol` |
| `ALIGNED-IBRP-E-05` | Invoice line with 'Exempt from tax' must have tax rate 0. | `lineItems` | Modifier `peppol` |
| `ALIGNED-IBRP-E-08` | Exempt tax breakdown taxable amount must reconcile against exempt lines, allowances, and charges. | `taxTotals` | Modifier `peppol` |
| `ALIGNED-IBRP-E-09` | Exempt tax breakdown tax amount must equal 0. | `taxTotals` | Modifier `peppol` |
| `ALIGNED-IBRP-HVG-08` | HVG tax breakdown taxable amount must reconcile by rate. | `taxTotals` | Modifier `peppol` |
| `ALIGNED-IBRP-HVG-09` | HVG tax breakdown tax amount must equal taxable amount multiplied by rate. | `taxTotals` | Modifier `peppol` |
| `ALIGNED-IBRP-HVG-10` | HVG tax breakdown must not have exemption reason code or text. | `taxTotals` | Modifier `peppol` |
| `ALIGNED-IBRP-LVG-08` | LVG tax breakdown taxable amount must reconcile by rate. | `taxTotals` | Modifier `peppol` |
| `ALIGNED-IBRP-LVG-09` | LVG tax breakdown tax amount must equal taxable amount multiplied by rate. | `taxTotals` | Modifier `peppol` |
| `ALIGNED-IBRP-LVG-10` | LVG tax breakdown must not have exemption reason code or text. | `taxTotals` | Modifier `peppol` |
| `ALIGNED-IBRP-O-09` | Not subject to tax breakdown tax amount must equal 0. | `taxTotals` | Modifier `peppol` |
| `ALIGNED-IBRP-SA-08` | SA tax breakdown taxable amount must reconcile by rate. | `taxTotals` | Modifier `peppol` |
| `ALIGNED-IBRP-SA-09` | SA tax breakdown tax amount must equal taxable amount multiplied by rate. | `taxTotals` | Modifier `peppol` |
| `ALIGNED-IBRP-SA-10` | SA tax breakdown must not have exemption reason code or text. | `taxTotals` | Modifier `peppol` |
| `ALIGNED-IBRP-SE-08` | SE tax breakdown taxable amount must reconcile by rate. | `taxTotals` | Modifier `peppol` |
| `ALIGNED-IBRP-SE-09` | SE tax breakdown tax amount must equal taxable amount multiplied by rate. | `taxTotals` | Modifier `peppol` |
| `ALIGNED-IBRP-SE-10` | SE tax breakdown must not have exemption reason code or text. | `taxTotals` | Modifier `peppol` |
| `ALIGNED-IBRP-TTX-08` | Tourism tax breakdown must not include tax percentage. | `taxTotals` | Modifier `peppol` |
| `ALIGNED-IBRP-TTX-09` | Tourism tax amount must equal line-level and document-level TTX tax amounts. | `taxTotals` | Modifier `peppol` |
| `BR-CL-14` | Country codes in an invoice MUST be coded using ISO code list 3166-1. | `parties` | Modifier `peppol` |
| `BR-CO-04` | Each Invoice line MUST have an Invoice line VAT category code (ibt-151). | `lineItems` | Modifier `peppol` |
| `IBR-002` | An Invoice MUST have an Invoice number (ibt-001). | `header.documentNumber` | Modifier `peppol` |
| `IBR-02-MY` | Invoice must have supplier BRN number. | `parties.seller.registrationNumbers` | Modifier `peppol` |
| `IBR-003` | An Invoice MUST have an Invoice issue date (ibt-002). | `header.issueDate` | Modifier `peppol` |
| `IBR-03-MY` | Invoice must have buyer BRN number. | `parties.buyer.registrationNumbers` | Modifier `peppol` |
| `IBR-04-MY` | Invoice must have supplier TIN. | `parties.seller.taxIds` | Modifier `peppol` |
| `IBR-005` | An Invoice MUST have an Invoice currency code (ibt-005). | `header.currency` | Modifier `peppol` |
| `IBR-006` | An Invoice MUST contain the Seller name (ibt-027). | `parties.seller.name` | Modifier `peppol` |
| `IBR-007` | An Invoice MUST contain the Buyer name (ibt-044). | `parties.buyer.name` | Modifier `peppol` |
| `IBR-008` | An Invoice MUST contain the Seller postal address (ibg-05). | `parties.seller.address` | Modifier `peppol` |
| `IBR-009` | The Seller postal address (ibg-05) MUST contain a Seller country code (ibt-040). | `parties.seller.address.country` | Modifier `peppol` |
| `IBR-010` | An Invoice MUST contain the Buyer postal address (ibg-08). | `parties.buyer.address` | Modifier `peppol` |
| `IBR-011` | The Buyer postal address (ibg-08) MUST contain a Buyer country code (ibt-055). | `parties.buyer.address.country` | Modifier `peppol` |
| `IBR-012` | An Invoice MUST have the Sum of Invoice line net amount (ibt-106). | `totals.totalLineTaxableAmount` | Modifier `peppol` |
| `IBR-013` | An Invoice MUST have the Invoice total amount without Tax (ibt-109). | `totals.totalAmountExcludingTax` | Modifier `peppol` |
| `IBR-014` | An Invoice MUST have the Invoice total amount with Tax (ibt-112). | `totals.totalAmountIncludingTax` | Modifier `peppol` |
| `IBR-015` | An Invoice MUST have the Amount due for payment (ibt-115). | `totals.amountDue` | Modifier `peppol` |
| `IBR-016` | An Invoice MUST have at least one Invoice line (ibg-25). | `lineItems` | Modifier `peppol` |
| `IBR-017` | The Payee name (ibt-059) MUST be provided in the Invoice, if the Payee (ibg-10) is different from the Seller (ibg-04). | `payment.paymentMeans.0.creditTransferInfo.payeeFinancialAccountName` | Modifier `peppol` |
| `IBR-021` | Each Invoice line MUST have an Invoice line identifier (ibt-126). | `lineItems` | Modifier `peppol` |
| `IBR-022` | Each Invoice line (ibg-25) MUST have an invoiced quantity (ibt-129).. | `lineItems` | Modifier `peppol` |
| `IBR-023` | An Invoice line (ibg-25) MUST have an Invoiced quantity unit of measure code (ibt-130). | `lineItems` | Modifier `peppol` |
| `IBR-024` | Each Invoice line (ibg-25) MUST have an Invoice line net amount (ibt-131). | `lineItems` | Modifier `peppol` |
| `IBR-025` | Each Invoice line (ibg-25) MUST contain the Item name (ibt-153). | `lineItems` | Modifier `peppol` |
| `IBR-026` | Each Invoice line (ibg-25) MUST contain the Item net price (ibt-146). | `lineItems` | Modifier `peppol` |
| `IBR-027` | The Item net price (ibt-146) MUST NOT be negative. | `lineItems` | Modifier `peppol` |
| `IBR-028` | The Item gross price (ibt-148) MUST NOT be negative. | `lineItems` | Modifier `peppol` |
| `IBR-029` | If both Invoicing period start date (ibt-073) and Invoicing period end date (ibt-074) are given then the Invoicing period end date (ibt-074) MUST be later or equal to the Invoicing period start date (ibt-073). | `header.invoicePeriod` | Modifier `peppol` |
| `IBR-030` | If both Invoice line period start date (ibt-134) and Invoice line period end date (ibt-135) are given then the Invoice line period end date (ibt-135) MUST be later or equal to the Invoice line period start date (ibt-134). | `lineItems` | Modifier `peppol` |
| `IBR-031` | Allowance (ibg-20) MUST have an allowance amount (ibt-092). | `allowancesAndCharges` | Modifier `peppol` |
| `IBR-033` | Each Document level allowance (ibg-20) MUST have a Document level allowance reason (ibt-097) or a Document level allowance reason code (ibt-098). | `allowancesAndCharges` | Modifier `peppol` |
| `IBR-036` | Charge (ibg-21) MUST have a charge amount (ibt-099). | `allowancesAndCharges` | Modifier `peppol` |
| `IBR-038` | Each Document level charge (ibg-21) MUST have a Document level charge reason (ibt-104) or a Document level charge reason code (ibt-105). | `allowancesAndCharges` | Modifier `peppol` |
| `IBR-041` | Each Invoice line allowance (ibg-27) MUST have an Invoice line allowance amount (ibt-136). | `lineItems` | Modifier `peppol` |
| `IBR-042` | Each Invoice line allowance (ibg-27) MUST have an Invoice line allowance reason (ibt-139) or an Invoice line allowance reason code (ibt-140). | `lineItems` | Modifier `peppol` |
| `IBR-043` | Each Invoice line charge (ibg-28) MUST have an Invoice line charge amount (ibt-141). | `lineItems` | Modifier `peppol` |
| `IBR-044` | Each Invoice line charge (ibg-28) MUST have an Invoice line charge reason (ibt-144) or an invoice line charge reason code (ibt-145). | `lineItems` | Modifier `peppol` |
| `IBR-049` | A Payment instruction (ibg-16) MUST specify the Payment means type code (ibt-081). | `payment.paymentMeans` | Modifier `peppol` |
| `IBR-052` | Each Additional supporting document (ibg-24) MUST contain a Supporting document reference (ibt-122). | `supportingDocuments` | Modifier `peppol` |
| `IBR-053` | If the Tax accounting currency code (ibt-006) is present, then the Invoice total Tax amount in accounting currency (ibt-111) MUST be provided. | `extensions.peppol_totalTaxAmountInTaxCurrency` | Modifier `peppol` |
| `IBR-054` | Each Item attribute (ibg-32) MUST contain an Item attribute name (ibt-160) and an Item attribute value (ibt-161). | `lineItems` | Modifier `peppol` |
| `IBR-057` | Each Deliver to address MUST contain a Deliver to country code (ibt-080). | `parties.delivery.address.country` | Modifier `peppol` |
| `IBR-062` | The Seller electronic address (ibt-034) MUST have a Scheme identifier. | `extensions.peppol_seller_peppolIdScheme` | Modifier `peppol` |
| `IBR-063` | The Buyer electronic address (ibt-049) MUST have a Scheme identifier. | `extensions.peppol_buyer_peppolIdScheme` | Modifier `peppol` |
| `IBR-064` | The Item standard identifier (ibt-157) MUST have a Scheme identifier. | `lineItems` | Modifier `peppol` |
| `IBR-065` | The Item classification identifier (ibt-158) MUST have a Scheme identifier. | `lineItems` | Modifier `peppol` |
| `IBR-066` | An Invoice MUST contain maximum one Payment Card account (ibg-18). | `payment.paymentMeans` | Modifier `peppol` |
| `IBR-067` | An Invoice MUST contain maximum one Payment Mandate (ibg-19). | `payment.paymentMeans` | Modifier `peppol` |
| `IBR-068` | GLN MUST have a valid format according to GS1 rules for endpoints (ibt-034), (ibt-049), party identification (ibt-029), (ibt-046), (ibt-060), legal entities (ibt-030), (ibt-047), (ibt-061). | `parties` | Modifier `peppol` |
| `IBR-069` | Norwegian organization number MUST be stated in the correct format for endpoints (ibt-034), (ibt-049), party identification (ibt-029), (ibt-046), (ibt-060), legal entities (ibt-030), (ibt-047), (ibt-061). | `parties` | Modifier `peppol` |
| `IBR-070` | Danish organization number (CVR) MUST be stated in the correct format for endpoints (ibt-034), (ibt-049), party identification (ibt-029), (ibt-046), (ibt-060), legal entities (ibt-030), (ibt-047), (ibt-061). | `parties` | Modifier `peppol` |
| `IBR-071` | An invoice should not include an AdditonalDocumentReference (ibg-24) simultaneously referring an Invoice Object Identifier (ibt-018) and an Attachment (ibt-125). | `supportingDocuments` | Modifier `peppol` |
| `IBR-072` | An invoice MUST not include an AdditionalDocumentReference (ibg-24) simultaneously referring an Invoice Object Identifier (ibt-018) and an Document Description (ibt-123). | `supportingDocuments` | Modifier `peppol` |
| `IBR-073` | A date MUST be formatted YYYY-MM-DD in (ibt-002), (ibt-007), (ibt-009), (ibt-026), (ibt-072), (ibt-073), (ibt-074), (ibt-134), (ibt-135). | `header` | Modifier `peppol` |
| `IBR-074` | Binary object elements (ibt-125) MUST contain the mime code attribute (ibt-125-1). | `supportingDocuments` | Modifier `peppol` |
| `IBR-075` | Binary object elements (ibt-125) MUST contain the filename attribute (ibt-125-2). | `supportingDocuments` | Modifier `peppol` |
| `IBR-077` | Tax accounting currency code (ibt-006) MUST be different from invoice currency code (ibt-005) when provided. | `header.taxCurrency` | Modifier `peppol` |
| `IBR-078` | Only one invoiced object (ibt-018) is allowed on document level. | `supportingDocuments` | Modifier `peppol` |
| `IBR-080` | The Buyer electronic address (ibt-049) MUST be provided. | `parties.buyer.peppolId` | Modifier `peppol` |
| `IBR-081` | The Seller electronic address (ibt-049) MUST be provided. | `parties.seller.peppolId` | Modifier `peppol` |
| `IBR-082` | Allowance/charge indicator value MUST equal 'true' or 'false'. | `allowancesAndCharges` | Modifier `peppol` |
| `IBR-084` | Invoice total tax amount (ibt-110) and Invoice total tax amount in accounting currency (ibt-111) MUST have the same operational sign. | `totals.totalTaxAmount` | Modifier `peppol` |
| `IBR-085` | Start date of line period (ibt-134) MUST be within invoice period (ibg-14). | `lineItems` | Modifier `peppol` |
| `IBR-086` | End date of line period (ibt-135) MUST be within invoice period (ibg-14). | `lineItems` | Modifier `peppol` |
| `IBR-087` | Base quantity (ibt-149) MUST be a positive number above zero. | `lineItems` | Modifier `peppol` |
| `IBR-088` | Unit code of price base quantity (ibt-150) MUST be same as invoiced quantity (ibt-130). | `lineItems` | Modifier `peppol` |
| `IBR-090` | Only one project reference (ibt-011) is allowed on document level. | `supportingDocuments` | Modifier `peppol` |
| `IBR-091` | Invoice amount due for payment (ibt-115) MUST have no more than 2 decimals. | `totals.amountDue` | Modifier `peppol` |
| `IBR-113` | Belgian enterprise number MUST be stated in the correct format for endpoints (ibt-034), (ibt-049), party identification (ibt-029), (ibt-046), (ibt-060), legal entities (ibt-030), (ibt-047), (ibt-061). | `parties` | Modifier `peppol` |
| `IBR-114` | IPA Code (Codice Univoco Unità Organizzativa) must be stated in the correct format for endpoints (ibt-034), (ibt-049), party identification (ibt-029), (ibt-046), (ibt-060), legal entities (ibt-030), (ibt-047), (ibt-061). | `parties` | Modifier `peppol` |
| `IBR-115` | Tax Code (Codice Fiscale) must be stated in the correct format for endpoints (ibt-034), (ibt-049), party identification (ibt-029), (ibt-046), (ibt-060), legal entities (ibt-030), (ibt-047), (ibt-061). | `parties` | Modifier `peppol` |
| `IBR-116` | Italian VAT Code (Partita Iva) must be stated in the correct format for endpoints (ibt-034), (ibt-049), party identification (ibt-029), (ibt-046), (ibt-060), legal entities (ibt-030), (ibt-047), (ibt-061). | `parties` | Modifier `peppol` |
| `IBR-120` | Australian Business Number (ABN) must be stated in the correct format for for endpoints (ibt-034), (ibt-049), party identification (ibt-029), (ibt-046), (ibt-060), legal entities (ibt-030), (ibt-047), (ibt-061). | `parties` | Modifier `peppol` |
| `IBR-121` | Document level allowance amount (ibt-107) MUST have no more than 2 decimals. | `totals.totalAllowances` | Modifier `peppol` |
| `IBR-122` | Document level charge amount (ibt-108) MUST have no more than 2 decimals. | `totals.totalCharges` | Modifier `peppol` |
| `IBR-123` | Invoice total amount without TAX (ibt-109) MUST have no more than 2 decimals. | `totals.totalAmountExcludingTax` | Modifier `peppol` |
| `IBR-124` | Invoice total TAX amount (ibt-110) MUST have no more than 2 decimals. | `taxTotals.0.taxAmount` | Modifier `peppol` |
| `IBR-125` | Invoice total amount with TAX (ibt-112) MUST have no more than 2 decimals. | `totals.totalAmountIncludingTax` | Modifier `peppol` |
| `IBR-127` | Swedish organization number MUST be stated in the correct format for endpoints (ibt-034), (ibt-049), party identification (ibt-029), (ibt-046), (ibt-060), legal entities (ibt-030), (ibt-047), (ibt-061). | `parties` | Modifier `peppol` |
| `IBR-CL-04` | Invoice currency code (ibt-005) MUST be coded using ISO code list 4217 alpha-3. | `header.currency` | Modifier `peppol` |
| `IBR-CL-05` | Tax currency code (ibt-006) MUST be coded using ISO code list 4217 alpha-3. | `header.taxCurrency` | Modifier `peppol` |
| `IBR-CL-05-MY` | If tax accounting currency is present, it must be MYR. | `header.taxCurrency` | Modifier `peppol` |
| `IBR-CL-07` | Object identifier schemes must use the UAE UNTDID 1153 restriction. | `lineItems` | Modifier `peppol` |
| `IBR-CL-10` | Party identifier scheme MUST be a code from the ISO 6523 ICD list. | `extensions` | Modifier `peppol` |
| `IBR-CL-11` | Legal registration identifier scheme MUST be a code from the ISO 6523 ICD list. | `extensions.peppol_registrationNumberScheme` | Modifier `peppol` |
| `IBR-CL-13` | Item classification identifier identification scheme MUST be coded using the UNTDID 7143 list. | `lineItems` | Modifier `peppol` |
| `IBR-CL-14` | Country codes in an invoice MUST be coded using ISO code list 3166-1. | `parties` | Modifier `peppol` |
| `IBR-CL-15` | Origin country codes in an invoice (ibt-159) MUST be coded using ISO code list 3166-1. | `lineItems` | Modifier `peppol` |
| `IBR-CL-16` | Payment means in an invoice (ibt-081) MUST be coded using UNCL4461 code list. | `payment.paymentMeans` | Modifier `peppol` |
| `IBR-CL-19` | Reason code MUST be according to subset of UNCL 5189 D.16B. | `allowancesAndCharges` | Modifier `peppol` |
| `IBR-CL-20` | Reason code MUST be according to UNCL 7161 D.16B. | `allowancesAndCharges` | Modifier `peppol` |
| `IBR-CL-21` | Item standard identifier scheme (IBT-157-1) MUST belong to the ISO 6523 ICD list. | `lineItems` | Modifier `peppol` |
| `IBR-CL-23` | Unit code (ibt-130), (ibt-150) MUST be coded according to the UN/ECE Recommendation 20 with Rec 21 extension. | `lineItems` | Modifier `peppol` |
| `IBR-CL-24` | Mime code (ibt-125-1) MUST be according to subset of IANA code list. | `supportingDocuments` | Modifier `peppol` |
| `IBR-CL-25` | Endpoint identifier scheme MUST belong to the CEF EAS code list. | `extensions` | Modifier `peppol` |
| `IBR-CL-26` | Delivery location identifier scheme (IBT-071-1) MUST belong to the ISO 6523 ICD list. | `extensions.peppol_deliveryLocationIdScheme` | Modifier `peppol` |
| `IBR-CO-10` | Sum of Invoice line net amount MUST equal the rounded sum of Invoice line net amounts. | `totals.totalLineTaxableAmount` | Modifier `peppol` |
| `IBR-CO-11` | Sum of allowances on document level (ibt-107) = Σ Document level allowance amount (ibt-092). | `totals.totalAllowances` | Modifier `peppol` |
| `IBR-CO-12` | Sum of charges on document level (ibt-108) = Σ Document level charge amount (ibt-099). | `totals.totalCharges` | Modifier `peppol` |
| `IBR-CO-13` | Invoice total amount without Tax (ibt-109) = Σ Invoice line net amount (ibt-131) - Sum of allowances on document level (ibt-107) + Sum of charges on document level (ibt-108). | `totals.totalAmountExcludingTax` | Modifier `peppol` |
| `IBR-CO-14` | Invoice total Tax amount MUST equal the rounded sum of Tax category tax amounts. | `taxTotals.0.taxAmount` | Modifier `peppol` |
| `IBR-CO-15` | Invoice total amount with Tax (ibt-112) = Invoice total amount without Tax (ibt-109) + Invoice total Tax amount (ibt-110). | `totals.totalAmountIncludingTax` | Modifier `peppol` |
| `IBR-CO-16` | Amount due for payment (ibt-115) = Invoice total amount with Tax (ibt-112) - Paid amount (ibt-113) + Rounding amount (ibt-114). | `totals.amountDue` | Modifier `peppol` |
| `IBR-CO-26` | At least one Seller party, legal registration or tax identifier MUST be present. | `parties.seller` | Modifier `peppol` |
| `MY-COMMODITY-CLASSIFICATION` | MY: Commodity classification code must be in the range 1–45. | `lineItems` | Every document type |
| `MY-DATE-001` | MY: Issue time is mandatory. | `header.issueTime` | Every document type |
| `MY-DATE-002` | Issuance date time value of the document is too old and cannot be submitted. | `header.issueDate` | Every document type |
| `MY-DATE-003` | MY: Document issue date cannot be in the future. | `header.issueDate` | Every document type |
| `MY-DATE-004` | MY: Issue time must match HH:mm:ssZ format. | `header.issueTime` | Every document type |
| `MY-DATE-005` | MY: Document issue date and time (UTC) cannot be in the future. | `header.issueTime` | Every document type |
| `MY-DATE-006` | MY: Invoice period start and end dates must both be provided and start must not be after end. | `header.invoicePeriod` | Every document type |
| `MY-DEBIT-NOTE-REFERENCE` | MY: Debit note must have a reference to the original invoice. | `header.referenceId` | Debit note |
| `MY-GEN-TOTALS` | MY: Totals section is mandatory for Malaysia e-invoicing. | `totals` | Every document type |
| `MY-INVALID-TIN-BUYER` | MY: Buyer TIN format is invalid. | `parties.buyer.taxIds` | Every document type |
| `MY-INVALID-TIN-SELLER` | MY: Seller TIN format is invalid. | `parties.seller.taxIds` | Every document type |
| `MY-LINE-CLASSIFICATION` | MY: Line item classification is mandatory. | `lineItems` | Every document type |
| `MY-LINE-DESCRIPTION` | MY: Line item description is mandatory. | `lineItems` | Every document type |
| `MY-LINE-EXTENSION-SUM` | MY: Line taxable value must match quantity × unit price. | `lineItems` | Every document type |
| `MY-LINE-ITEM-PRICE-EXTENSION` | MY: Line item subtotal is mandatory. | `lineItems` | Every document type |
| `MY-LINE-QUANTITY` | MY: Line item quantity must be greater than zero. | `lineItems` | Every document type |
| `MY-LINE-TAX-AMOUNT` | MY: Line tax amount must equal taxable value × tax rate. | `lineItems` | Every document type |
| `MY-LINE-TAX-AMOUNT-NON-NEGATIVE` | MY: Line tax amount cannot be negative. | `lineItems` | Every document type |
| `MY-LINE-TAX-CATEGORY` | MY: Line item tax category must be a valid LHDN code. | `lineItems` | Every document type |
| `MY-LINE-TAX-RATE-RANGE` | MY: Tax rate must be between 0 and 100. | `lineItems` | Every document type |
| `MY-LINE-TOTAL` | MY: Line total must equal taxable value + tax amount. | `lineItems` | Every document type |
| `MY-MSIC-CODE` | MY: Invalid MSIC code for seller. | `parties.seller.industryClassification.code` | Every document type |
| `MY-MSIC-CODE-REQUIRED` | MY: Seller MSIC code is mandatory. | `parties.seller.industryClassification.code` | Every document type |
| `MY-MSIC-DESCRIPTION-REQUIRED` | MY: Seller business activity description is mandatory. | `parties.seller.industryClassification.description` | Every document type |
| `MY-PARTY-001` | MY: Buyer TIN is mandatory. | `parties.buyer.taxIds` | Every document type |
| `MY-PARTY-002` | MY: Credit note must have a reference to the original invoice. | `header.referenceId` | Credit note |
| `MY-PARTY-003` | MY: Seller BRN registration number is mandatory. | `parties.seller.registrationNumbers` | Every document type |
| `MY-PARTY-005` | MY: Seller's mobile number is mandatory. | `parties.seller.contact.phone` | Every document type |
| `MY-PARTY-BUYER-PHONE` | MY: Buyer's mobile number format is invalid. | `parties.buyer.contact.phone` | Every document type |
| `MY-PARTY-BUYER-PHONE-REQUIRED` | MY: Buyer's mobile number is mandatory. | `parties.buyer.contact.phone` | Every document type |
| `MY-PARTY-REGISTRATION-BUYER` | MY: Buyer registration number is mandatory. | `parties.buyer.registrationNumbers` | Every document type |
| `MY-PARTY-TIN-SELLER` | MY: Seller TIN is mandatory. | `parties.seller.taxIds` | Every document type |
| `MY-REFUND-BASE` | MY: variant 'refund' is only allowed with base type 'credit_note'. | `documentType.base` | Variant `refund` |
| `MY-REFUND-REFERENCE` | MY: header.referenceId is mandatory when documentType.variant='refund'. | `header.referenceId` | Variant `refund` |
| `MY-SELF-BILLED-EXPORT` | MY: modifier 'self_billed' cannot be combined with modifier 'export'. | `documentType.modifiers` | Modifier `self_billed` |
| `MY-SELLER-BUYER-TIN-SAME` | MY: Seller and Buyer TIN cannot be the same. | `parties.buyer.taxIds` | Every document type |
| `MY-SELLER-COUNTRY` | MY: Seller address country must be MY. | `parties.seller.address.country` | Every document type |
| `MY-SELLER-STATE` | MY: Seller address state is invalid. | `parties.seller.address.stateOrProvince` | Every document type |
| `MY-TAX-001` | MY: Cannot apply invoice-level discount or charge if line item tax rates differ. | `allowancesAndCharges` | Every document type |
| `MY-TAX-002` | MY: Total tax amount must match sum of line tax amounts. | `totals.totalTaxAmount` | Every document type |
| `MY-TAX-SUBTOTAL` | MY: At least one tax subtotal is required. | `taxTotals.0.taxSubtotals` | Every document type |
| `MY-TAX-SUBTOTAL-CATEGORY` | MY: Tax subtotal category must be a valid LHDN code. | `taxTotals` | Every document type |
| `MY-TAX-TOTAL-AMOUNT` | MY: Document tax total amount is required. | `taxTotals.0.taxAmount` | Every document type |
| `MY-TAX-TOTAL-GROUP` | MY: Exactly one document tax total is required. | `taxTotals` | Every document type |
| `MY-TOTAL-EXCLUDING` | MY: Total amount excluding tax must reconcile with line totals and adjustments. | `totals.totalAmountExcludingTax` | Every document type |
| `MY-TOTAL-INCLUSIVE` | MY: Total amount including tax must equal excluding tax + total tax. | `totals.totalAmountIncludingTax` | Every document type |

Source: https://docs.complyance.io/countries/my/validation-rules/
