{
  "$comment": "Machine-readable companion to https://valem.run/calculators/portugal/vat. Formula, inputs, outputs, engine-verified test vectors, cited sources and the re-runnable Valem ModelSpec behind the page.",
  "url": "https://valem.run/calculators/portugal/vat",
  "dataUrl": "https://valem.run/calculators/portugal/vat.json",
  "license": {
    "name": "CC BY 4.0",
    "url": "https://creativecommons.org/licenses/by/4.0/",
    "attribution": "Portugal iva (vat) model by Valem (https://valem.run/calculators/portugal/vat), CC BY 4.0.",
    "note": "Covers the model — the expression of each rule and the arrangement of the catalog. The rates and thresholds themselves are law and are not licensed by anyone; the cited sources are where they come from."
  },
  "verificationUrl": "https://valem.run/calculators/portugal/vat/verify",
  "country": "portugal",
  "countryName": "Portugal",
  "formula": "vat",
  "formulaName": "IVA (VAT)",
  "title": "Calcular IVA 2026 — Portugal VAT calculator",
  "answer": "Portuguese VAT on the mainland is 23% normal, 13% intermediate and 6% reduced under article 18 of the CIVA, and the article 53 exemption applies while your turnover in the previous calendar year stayed at or under 15 000 EUR.",
  "lang": "en",
  "currency": "EUR",
  "taxYear": "2026",
  "verification": {
    "claim": "internal-consistency",
    "statement": "The Valem engine reproduces this model's stated formula through 6 self-test cases (below, and re-runnable against the spec). That asserts internal consistency, NOT that the formula matches current law — the cited sources are the evidence for that, and carry the date each was last checked.",
    "selfTestCases": 6,
    "ratesAreIllustrative": false,
    "sourcesCheckedOn": "2026-10-05"
  },
  "sources": [
    {
      "label": "CIVA artigo 18.o — Taxas do imposto (23%, 13%, 6%)",
      "url": "https://info.portaldasfinancas.gov.pt/pt/informacao_fiscal/codigos_tributarios/civa_rep/pages/iva18.aspx",
      "checked": "2026-10-05"
    },
    {
      "label": "CIVA artigo 53.o — regime de isencao (15 000 EUR)",
      "url": "https://info.portaldasfinancas.gov.pt/pt/informacao_fiscal/codigos_tributarios/civa_rep/Pages/artigo-53-o-do-civa.aspx",
      "checked": "2026-10-05"
    }
  ],
  "terminalOutput": "mustRegister",
  "headlineOutput": "vatAmount",
  "inputs": [
    {
      "name": "amount",
      "type": "number",
      "label": "Amount",
      "minimum": 0
    },
    {
      "name": "direction",
      "type": "string",
      "label": "Direction",
      "enum": [
        "add",
        "remove"
      ]
    },
    {
      "name": "category",
      "type": "string",
      "label": "What is being supplied",
      "enum": [
        "standard",
        "reduced1",
        "reduced2"
      ]
    },
    {
      "name": "annualTurnover",
      "type": "number",
      "label": "Turnover last calendar year",
      "minimum": 0
    },
    {
      "name": "reverseCharge",
      "type": "boolean",
      "label": "B2B reverse charge applies"
    }
  ],
  "outputs": [
    {
      "name": "rate",
      "type": "number",
      "formula": "category = 'reduced1' ? $const.reducedRate1 : category = 'reduced2' ? $const.reducedRate2 : $const.standardRate"
    },
    {
      "name": "effectiveRate",
      "type": "number",
      "formula": "reverseCharge ? 0 : rate"
    },
    {
      "name": "netAmount",
      "type": "number",
      "formula": "direction = 'remove' ? $round(amount / (1 + effectiveRate), 2) : $round(amount, 2)"
    },
    {
      "name": "vatAmount",
      "type": "number",
      "formula": "$round(netAmount * effectiveRate, 2)"
    },
    {
      "name": "grossAmount",
      "type": "number",
      "formula": "$round(netAmount + vatAmount, 2)"
    },
    {
      "name": "mustRegister",
      "type": "boolean",
      "formula": "annualTurnover > $const.registrationThreshold"
    }
  ],
  "testCases": [
    {
      "description": "S1 100.00 EUR net at the normal rate",
      "given": {
        "amount": 100,
        "direction": "add",
        "category": "standard",
        "reverseCharge": false,
        "annualTurnover": 0
      },
      "expect": {
        "vatAmount": 23,
        "grossAmount": 123,
        "netAmount": 100
      }
    },
    {
      "description": "S2 123.00 EUR gross back to net at the normal rate",
      "given": {
        "amount": 123,
        "direction": "remove",
        "category": "standard",
        "reverseCharge": false,
        "annualTurnover": 0
      },
      "expect": {
        "netAmount": 100,
        "vatAmount": 23
      }
    },
    {
      "description": "S3 100.00 EUR net at the 6% reduced rate",
      "given": {
        "amount": 100,
        "direction": "add",
        "category": "reduced1",
        "reverseCharge": false,
        "annualTurnover": 0
      },
      "expect": {
        "vatAmount": 6,
        "grossAmount": 106
      }
    },
    {
      "description": "S4 100.00 EUR net at the 13% intermediate rate",
      "given": {
        "amount": 100,
        "direction": "add",
        "category": "reduced2",
        "reverseCharge": false,
        "annualTurnover": 0
      },
      "expect": {
        "vatAmount": 13,
        "grossAmount": 113
      }
    },
    {
      "description": "S5 last year over 15 000 EUR: the exemption does not apply",
      "given": {
        "amount": 100,
        "direction": "add",
        "category": "standard",
        "reverseCharge": false,
        "annualTurnover": 20000
      },
      "expect": {
        "mustRegister": true
      }
    },
    {
      "description": "S6 last year at or under the limit: exempt",
      "given": {
        "amount": 100,
        "direction": "add",
        "category": "standard",
        "reverseCharge": false,
        "annualTurnover": 12000
      },
      "expect": {
        "mustRegister": false
      }
    }
  ],
  "spec": {
    "id": "vat-portugal",
    "version": "1.0.0",
    "schema": {
      "type": "object",
      "properties": {
        "amount": {
          "type": "number",
          "minimum": 0
        },
        "direction": {
          "type": "string",
          "enum": [
            "add",
            "remove"
          ]
        },
        "category": {
          "type": "string",
          "enum": [
            "standard",
            "reduced1",
            "reduced2"
          ]
        },
        "annualTurnover": {
          "type": "number",
          "minimum": 0
        },
        "reverseCharge": {
          "type": "boolean"
        },
        "rate": {
          "type": "number",
          "readOnly": true
        },
        "effectiveRate": {
          "type": "number",
          "readOnly": true
        },
        "netAmount": {
          "type": "number",
          "readOnly": true
        },
        "vatAmount": {
          "type": "number",
          "readOnly": true
        },
        "grossAmount": {
          "type": "number",
          "readOnly": true
        },
        "mustRegister": {
          "type": "boolean",
          "readOnly": true
        }
      }
    },
    "constants": {
      "standardRate": 0.23,
      "reducedRate1": 0.06,
      "reducedRate2": 0.13,
      "registrationThreshold": 15000
    },
    "defaultValues": [
      {
        "path": "$",
        "expr": "{ 'amount': 100, 'direction': 'add', 'category': 'standard', 'reverseCharge': false, 'annualTurnover': 0 }"
      }
    ],
    "derivations": [
      {
        "path": "$.rate",
        "expr": "category = 'reduced1' ? $const.reducedRate1 : category = 'reduced2' ? $const.reducedRate2 : $const.standardRate"
      },
      {
        "path": "$.effectiveRate",
        "expr": "reverseCharge ? 0 : rate"
      },
      {
        "path": "$.netAmount",
        "expr": "direction = 'remove' ? $round(amount / (1 + effectiveRate), 2) : $round(amount, 2)"
      },
      {
        "path": "$.vatAmount",
        "expr": "$round(netAmount * effectiveRate, 2)"
      },
      {
        "path": "$.grossAmount",
        "expr": "$round(netAmount + vatAmount, 2)"
      },
      {
        "path": "$.mustRegister",
        "expr": "annualTurnover > $const.registrationThreshold"
      }
    ],
    "constraints": [],
    "viewDefinition": {
      "renderer": "builtin",
      "defaultView": "main",
      "views": [
        {
          "id": "main",
          "label": "VAT",
          "layout": "vertical",
          "components": [
            {
              "id": "note",
              "type": "staticText",
              "text": "These are the Continente rates. The Azores and Madeira apply their own lower rates under the same article, so an invoice issued there carries different figures. The article 53 exemption turns on the PREVIOUS calendar year alone: if last year stayed at or under 15 000 EUR you are exempt this year, however this year turns out."
            },
            {
              "id": "inputs",
              "type": "fieldSet",
              "label": "Your figures",
              "components": [
                {
                  "id": "amount",
                  "type": "numericField",
                  "label": "Amount",
                  "bind": "$.amount",
                  "helperText": "Net amount when adding VAT, gross amount when removing it."
                },
                {
                  "id": "direction",
                  "type": "selectField",
                  "label": "Direction",
                  "bind": "$.direction",
                  "options": [
                    {
                      "value": "add",
                      "label": "Add VAT (net → gross)"
                    },
                    {
                      "value": "remove",
                      "label": "Remove VAT (gross → net)"
                    }
                  ]
                },
                {
                  "id": "category",
                  "type": "selectField",
                  "label": "What is being supplied",
                  "bind": "$.category",
                  "helperText": "The rate follows the category. Exports and intra-EU supplies are zero-rated or exempt — a different mechanism, not a rate you pick here.",
                  "options": [
                    {
                      "value": "standard",
                      "label": "Normal — 23% (Continente)"
                    },
                    {
                      "value": "reduced1",
                      "label": "Reduzida — 6% (Lista I)"
                    },
                    {
                      "value": "reduced2",
                      "label": "Intermedia — 13% (Lista II)"
                    }
                  ]
                },
                {
                  "id": "reverseCharge",
                  "type": "checkboxField",
                  "label": "B2B reverse charge applies",
                  "bind": "$.reverseCharge",
                  "helperText": "The customer accounts for the VAT, so you charge none."
                },
                {
                  "id": "annualTurnover",
                  "type": "numericField",
                  "label": "Turnover last calendar year",
                  "bind": "$.annualTurnover",
                  "helperText": "Article 53 tests the previous calendar year, not the current one."
                }
              ]
            },
            {
              "id": "sep",
              "type": "separatorLine"
            },
            {
              "id": "vatTile",
              "type": "statTile",
              "label": "VAT",
              "value": "$.vatAmount"
            },
            {
              "id": "netTile",
              "type": "statTile",
              "label": "Net",
              "value": "$.netAmount"
            },
            {
              "id": "grossTile",
              "type": "statTile",
              "label": "Gross",
              "value": "$.grossAmount"
            },
            {
              "id": "breakdown",
              "type": "keyValueList",
              "label": "Detail",
              "items": [
                {
                  "label": "Rate applied",
                  "value": "$.effectiveRate"
                },
                {
                  "label": "Statutory rate for this category",
                  "value": "$.rate"
                },
                {
                  "label": "VAT registration required",
                  "value": "$.mustRegister"
                }
              ]
            },
            {
              "id": "sources",
              "type": "sourceList",
              "label": "Sources",
              "layers": 2,
              "items": [
                {
                  "label": "CIVA artigo 18.o — Taxas do imposto (23%, 13%, 6%)",
                  "url": "https://info.portaldasfinancas.gov.pt/pt/informacao_fiscal/codigos_tributarios/civa_rep/pages/iva18.aspx",
                  "date": "2026-10-05",
                  "covers": [
                    "standardRate",
                    "reducedRate1",
                    "reducedRate2"
                  ]
                },
                {
                  "label": "CIVA artigo 53.o — regime de isencao (15 000 EUR)",
                  "url": "https://info.portaldasfinancas.gov.pt/pt/informacao_fiscal/codigos_tributarios/civa_rep/Pages/artigo-53-o-do-civa.aspx",
                  "date": "2026-10-05",
                  "covers": [
                    "registrationThreshold"
                  ]
                }
              ]
            }
          ]
        }
      ]
    },
    "tests": [
      {
        "description": "S1 100.00 EUR net at the normal rate",
        "given": {
          "$.amount": 100,
          "$.direction": "add",
          "$.category": "standard",
          "$.reverseCharge": false,
          "$.annualTurnover": 0
        },
        "expect": {
          "$.vatAmount": 23,
          "$.grossAmount": 123,
          "$.netAmount": 100
        }
      },
      {
        "description": "S2 123.00 EUR gross back to net at the normal rate",
        "given": {
          "$.amount": 123,
          "$.direction": "remove",
          "$.category": "standard",
          "$.reverseCharge": false,
          "$.annualTurnover": 0
        },
        "expect": {
          "$.netAmount": 100,
          "$.vatAmount": 23
        }
      },
      {
        "description": "S3 100.00 EUR net at the 6% reduced rate",
        "given": {
          "$.amount": 100,
          "$.direction": "add",
          "$.category": "reduced1",
          "$.reverseCharge": false,
          "$.annualTurnover": 0
        },
        "expect": {
          "$.vatAmount": 6,
          "$.grossAmount": 106
        }
      },
      {
        "description": "S4 100.00 EUR net at the 13% intermediate rate",
        "given": {
          "$.amount": 100,
          "$.direction": "add",
          "$.category": "reduced2",
          "$.reverseCharge": false,
          "$.annualTurnover": 0
        },
        "expect": {
          "$.vatAmount": 13,
          "$.grossAmount": 113
        }
      },
      {
        "description": "S5 last year over 15 000 EUR: the exemption does not apply",
        "given": {
          "$.amount": 100,
          "$.direction": "add",
          "$.category": "standard",
          "$.reverseCharge": false,
          "$.annualTurnover": 20000
        },
        "expect": {
          "$.mustRegister": true
        }
      },
      {
        "description": "S6 last year at or under the limit: exempt",
        "given": {
          "$.amount": 100,
          "$.direction": "add",
          "$.category": "standard",
          "$.reverseCharge": false,
          "$.annualTurnover": 12000
        },
        "expect": {
          "$.mustRegister": false
        }
      }
    ]
  }
}
