{
  "$comment": "Machine-readable companion to https://valem.run/calculators/nigeria/net-salary. Formula, inputs, outputs, engine-verified test vectors, cited sources and the re-runnable Valem ModelSpec behind the page.",
  "url": "https://valem.run/calculators/nigeria/net-salary",
  "dataUrl": "https://valem.run/calculators/nigeria/net-salary.json",
  "license": {
    "name": "CC BY 4.0",
    "url": "https://creativecommons.org/licenses/by/4.0/",
    "attribution": "Nigeria salary after tax model by Valem (https://valem.run/calculators/nigeria/net-salary), 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/nigeria/net-salary/verify",
  "country": "nigeria",
  "countryName": "Nigeria",
  "formula": "net-salary",
  "formulaName": "Salary after tax",
  "localName": null,
  "localLang": null,
  "englishName": "Salary after tax",
  "title": "PAYE calculator Nigeria 2026 — take-home pay, new tax law",
  "answer": "Your take-home pay in Nigeria in 2026 is your pay minus income tax under the Nigeria Tax Act 2025 — nothing on the first ₦800,000 of chargeable income, then 15% rising to 25% above ₦50 million — and your 8% pension contribution, which is deducted before the tax, as is a 2.5% National Housing Fund contribution if you make one (compulsory in the public sector, voluntary in the private sector).",
  "lang": "en",
  "currency": "NGN",
  "taxYear": "2026",
  "verification": {
    "claim": "internal-consistency",
    "statement": "The Valem engine reproduces this model's stated formula through 9 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": 9,
    "ratesAreIllustrative": false,
    "sourcesCheckedOn": "2026-11-01"
  },
  "sources": [
    {
      "label": "Nigeria Tax Act 2025 (Act No. 7, in force 1 Jan 2026), s.58 and Fourth Schedule",
      "url": "https://nass.gov.ng/documents/download/11249",
      "checked": "2026-11-01"
    },
    {
      "label": "Nigeria Tax Act 2025 s.30(2)(a): eligible deductions, rent relief 20% up to ₦500,000",
      "url": "https://nass.gov.ng/documents/download/11249",
      "checked": "2026-11-01"
    },
    {
      "label": "Pension Reform Act 2014 (PenCom) s.4(1): employee at least 8% of monthly emoluments",
      "url": "https://www.pencom.gov.ng/wp-content/uploads/2018/01/PRA_2014.pdf",
      "checked": "2026-11-01"
    },
    {
      "label": "National Housing Fund Act Cap N45 (FMBN, 2004 text) s.4: 2.5% of basic; s.4 replaced by the Business Facilitation Act 2022 s.45",
      "url": "https://fmbn.gov.ng/backend/storage/uploads/37UNgpzsyASabzhQCnHuyzFtIpnsfmW2ODvAmQSG.pdf",
      "checked": "2026-11-01"
    }
  ],
  "terminalOutput": "netMonthly",
  "headlineOutput": "netMonthly",
  "inputs": [
    {
      "name": "grossMonthly",
      "type": "number",
      "label": "Gross monthly pay, all taxable allowances (₦)",
      "minimum": 0
    },
    {
      "name": "basicMonthly",
      "type": "number",
      "label": "of which basic salary (₦ / month)",
      "minimum": 0
    },
    {
      "name": "housingTransportMonthly",
      "type": "number",
      "label": "of which housing and transport allowances (₦ / month)",
      "minimum": 0
    },
    {
      "name": "annualRent",
      "type": "number",
      "label": "Rent you pay for your home (₦ / year)",
      "minimum": 0
    },
    {
      "name": "pensionMember",
      "type": "boolean",
      "label": "In the contributory pension scheme (8% of basic, housing and transport)"
    },
    {
      "name": "nhfMember",
      "type": "boolean",
      "label": "Public-sector employee, or a private-sector employee who opted in to the NHF (2.5% of basic)"
    },
    {
      "name": "healthInsuranceMonthly",
      "type": "number",
      "label": "Your contribution under the national health insurance scheme (NHIA) (₦ / month)",
      "minimum": 0
    },
    {
      "name": "minimumWageMonthly",
      "type": "number",
      "label": "National minimum wage (₦ / month)",
      "minimum": 0
    }
  ],
  "outputs": [
    {
      "name": "grossAnnual",
      "type": "number",
      "label": "Gross pay for the year",
      "format": "currency",
      "formula": "$round($n(grossMonthly) * 12, 2)"
    },
    {
      "name": "pensionAnnual",
      "type": "number",
      "label": "Pension 8% for the year",
      "format": "currency",
      "formula": "pensionMember ? $round($min([$n(basicMonthly) + $n(housingTransportMonthly), $n(grossMonthly)]) * 12 * $const.pensionEmployeeRate, 2) : 0"
    },
    {
      "name": "nhfAnnual",
      "type": "number",
      "label": "National Housing Fund 2.5%",
      "format": "currency",
      "formula": "nhfMember ? $round($min([$n(basicMonthly), $n(grossMonthly)]) * 12 * $const.nhfRate, 2) : 0"
    },
    {
      "name": "healthInsuranceAnnual",
      "type": "number",
      "label": "National health insurance scheme",
      "format": "currency",
      "formula": "$round($n(healthInsuranceMonthly) * 12, 2)"
    },
    {
      "name": "rentRelief",
      "type": "number",
      "label": "Rent relief",
      "format": "currency",
      "formula": "$round($min([$n(annualRent) * $const.rentReliefRate, $const.rentReliefCap]), 2)"
    },
    {
      "name": "minimumWageExempt",
      "type": "boolean",
      "label": "Exempt: pay at or below the minimum wage",
      "formula": "$n(grossMonthly) <= $n(minimumWageMonthly)"
    },
    {
      "name": "chargeableIncome",
      "type": "number",
      "label": "Chargeable income",
      "format": "currency",
      "formula": "$round($max([0, grossAnnual - pensionAnnual - nhfAnnual - healthInsuranceAnnual - rentRelief]), 2)"
    },
    {
      "name": "incomeTaxAnnual",
      "type": "number",
      "label": "Income tax for the year",
      "format": "currency",
      "formula": "minimumWageExempt ? 0 : $round($bandedCharge(chargeableIncome, [{\"upTo\": $const.band1, \"rate\": $const.rate0}, {\"upTo\": $const.band2, \"rate\": $const.rate1}, {\"upTo\": $const.band3, \"rate\": $const.rate2}, {\"upTo\": $const.band4, \"rate\": $const.rate3}, {\"upTo\": $const.band5, \"rate\": $const.rate4}, {\"upTo\": null, \"rate\": $const.rate5}]), 2)"
    },
    {
      "name": "incomeTaxMonthly",
      "type": "number",
      "label": "Income tax / month (PAYE)",
      "format": "currency",
      "formula": "$round(incomeTaxAnnual / 12, 2)"
    },
    {
      "name": "netAnnual",
      "type": "number",
      "label": "Net / year",
      "format": "currency",
      "formula": "$round($max([0, grossAnnual - incomeTaxAnnual - pensionAnnual - nhfAnnual - healthInsuranceAnnual]), 2)"
    },
    {
      "name": "netMonthly",
      "type": "number",
      "label": "Net / month",
      "format": "currency",
      "formula": "$round(netAnnual / 12, 2)"
    }
  ],
  "testCases": [
    {
      "description": "N1 ₦500,000 a month (₦300,000 basic, ₦150,000 housing and transport), ₦1.2m rent, no NHF: tax ₦330,000 + 18% of ₦2,328,000",
      "given": {
        "grossMonthly": 500000,
        "basicMonthly": 300000,
        "housingTransportMonthly": 150000,
        "annualRent": 1200000,
        "pensionMember": true,
        "nhfMember": false,
        "healthInsuranceMonthly": 0,
        "minimumWageMonthly": 70000
      },
      "expect": {
        "pensionAnnual": 432000,
        "chargeableIncome": 5328000,
        "incomeTaxAnnual": 749040,
        "netMonthly": 401580
      }
    },
    {
      "description": "N1b the same pay: rent relief, monthly PAYE and net for the year",
      "given": {
        "grossMonthly": 500000,
        "basicMonthly": 300000,
        "housingTransportMonthly": 150000,
        "annualRent": 1200000,
        "pensionMember": true,
        "nhfMember": false,
        "healthInsuranceMonthly": 0,
        "minimumWageMonthly": 70000
      },
      "expect": {
        "nhfAnnual": 0,
        "rentRelief": 240000,
        "incomeTaxMonthly": 62420,
        "netAnnual": 4818960
      }
    },
    {
      "description": "N1c the same pay, opted in to the NHF: 2.5% of ₦3.6m basic = ₦90,000, tax ₦330,000 + 18% of ₦2,238,000",
      "given": {
        "grossMonthly": 500000,
        "basicMonthly": 300000,
        "housingTransportMonthly": 150000,
        "annualRent": 1200000,
        "pensionMember": true,
        "nhfMember": true,
        "healthInsuranceMonthly": 0,
        "minimumWageMonthly": 70000
      },
      "expect": {
        "nhfAnnual": 90000,
        "chargeableIncome": 5238000,
        "incomeTaxAnnual": 732840,
        "netMonthly": 395430
      }
    },
    {
      "description": "N2 ₦70,000 a month, no pension or NHF: the minimum wage, so exempt (₦6,000 otherwise)",
      "given": {
        "grossMonthly": 70000,
        "basicMonthly": 50000,
        "housingTransportMonthly": 15000,
        "annualRent": 0,
        "pensionMember": false,
        "nhfMember": false,
        "healthInsuranceMonthly": 0,
        "minimumWageMonthly": 70000
      },
      "expect": {
        "minimumWageExempt": true,
        "chargeableIncome": 840000,
        "incomeTaxAnnual": 0
      }
    },
    {
      "description": "N3 ₦1 a month above the minimum wage: 15% of the ₦40,012 above ₦800,000",
      "given": {
        "grossMonthly": 70001,
        "basicMonthly": 50001,
        "housingTransportMonthly": 15000,
        "annualRent": 0,
        "pensionMember": false,
        "nhfMember": false,
        "healthInsuranceMonthly": 0,
        "minimumWageMonthly": 70000
      },
      "expect": {
        "minimumWageExempt": false,
        "incomeTaxAnnual": 6001.8
      }
    },
    {
      "description": "N4 ₦3,000,000 chargeable: the 15% band ends at ₦330,000",
      "given": {
        "grossMonthly": 250000,
        "basicMonthly": 250000,
        "housingTransportMonthly": 0,
        "annualRent": 0,
        "pensionMember": false,
        "nhfMember": false,
        "healthInsuranceMonthly": 0,
        "minimumWageMonthly": 70000
      },
      "expect": {
        "chargeableIncome": 3000000,
        "incomeTaxAnnual": 330000
      }
    },
    {
      "description": "N5 rent of ₦3,000,000: 20% would be ₦600,000, capped at ₦500,000",
      "given": {
        "grossMonthly": 500000,
        "basicMonthly": 300000,
        "housingTransportMonthly": 150000,
        "annualRent": 3000000,
        "pensionMember": true,
        "nhfMember": false,
        "healthInsuranceMonthly": 0,
        "minimumWageMonthly": 70000
      },
      "expect": {
        "rentRelief": 500000,
        "chargeableIncome": 5068000
      }
    },
    {
      "description": "N6 ₦5,000,000 a month, public sector (NHF): ₦54,780,000 chargeable, ₦10,430,000 + 25% of ₦4,780,000",
      "given": {
        "grossMonthly": 5000000,
        "basicMonthly": 3000000,
        "housingTransportMonthly": 1500000,
        "annualRent": 0,
        "pensionMember": true,
        "nhfMember": true,
        "healthInsuranceMonthly": 0,
        "minimumWageMonthly": 70000
      },
      "expect": {
        "pensionAnnual": 4320000,
        "nhfAnnual": 900000,
        "incomeTaxAnnual": 11625000
      }
    },
    {
      "description": "N7 ₦10,000 a month under the national health insurance scheme is deducted too",
      "given": {
        "grossMonthly": 500000,
        "basicMonthly": 300000,
        "housingTransportMonthly": 150000,
        "annualRent": 1200000,
        "pensionMember": true,
        "nhfMember": false,
        "healthInsuranceMonthly": 10000,
        "minimumWageMonthly": 70000
      },
      "expect": {
        "chargeableIncome": 5208000,
        "incomeTaxAnnual": 727440
      }
    }
  ],
  "spec": {
    "id": "net-salary-nigeria",
    "version": "1.0.0",
    "schema": {
      "type": "object",
      "properties": {
        "grossMonthly": {
          "type": "number",
          "minimum": 0
        },
        "basicMonthly": {
          "type": "number",
          "minimum": 0
        },
        "housingTransportMonthly": {
          "type": "number",
          "minimum": 0
        },
        "annualRent": {
          "type": "number",
          "minimum": 0
        },
        "pensionMember": {
          "type": "boolean"
        },
        "nhfMember": {
          "type": "boolean"
        },
        "healthInsuranceMonthly": {
          "type": "number",
          "minimum": 0
        },
        "minimumWageMonthly": {
          "type": "number",
          "minimum": 0
        },
        "grossAnnual": {
          "type": "number",
          "readOnly": true
        },
        "pensionAnnual": {
          "type": "number",
          "readOnly": true
        },
        "nhfAnnual": {
          "type": "number",
          "readOnly": true
        },
        "healthInsuranceAnnual": {
          "type": "number",
          "readOnly": true
        },
        "rentRelief": {
          "type": "number",
          "readOnly": true
        },
        "minimumWageExempt": {
          "type": "boolean",
          "readOnly": true
        },
        "chargeableIncome": {
          "type": "number",
          "readOnly": true
        },
        "incomeTaxAnnual": {
          "type": "number",
          "readOnly": true
        },
        "incomeTaxMonthly": {
          "type": "number",
          "readOnly": true
        },
        "netAnnual": {
          "type": "number",
          "readOnly": true
        },
        "netMonthly": {
          "type": "number",
          "readOnly": true
        }
      }
    },
    "constants": {
      "band1": 800000,
      "band2": 3000000,
      "band3": 12000000,
      "band4": 25000000,
      "band5": 50000000,
      "rate0": 0,
      "rate1": 0.15,
      "rate2": 0.18,
      "rate3": 0.21,
      "rate4": 0.23,
      "rate5": 0.25,
      "rentReliefRate": 0.2,
      "rentReliefCap": 500000,
      "pensionEmployeeRate": 0.08,
      "nhfRate": 0.025
    },
    "library": {
      "layers": [
        {
          "id": "statutory",
          "define": "(\n  /* Shared statutory helpers — the canonical copy (docs/sandbox/d8-statutory-families.md §5.4).\n     DO NOT EDIT A SPEC'S INLINED COPY. Edit this file and run `npm run sync:helpers`; a vitest\n     assertion and a Java assertion both require every inlined copy to be byte-identical to this one.\n\n     Why inlined rather than referenced: the `library` section's `ref` form — a library shared\n     between models — is still proposed, gated on the model-references design (see\n     ../../../../docs/design/library/jsonata-library.md). Inlining keeps each spec self-contained,\n     which is what lets `#e=` embedding, `#share=` import and MCP forking work with no resolver.\n\n     TWO TRAPS, both of which fail SILENTLY and both of which bit during the debt-payoff build:\n\n       1. A library function sees ONLY its arguments. It cannot read the consuming document — not\n          through a bare field name, not through `$`, not through `$$`. Everything these helpers\n          need is passed in. (`$const` is late-bound and so would resolve, but relying on it would\n          couple a shared helper to one spec's constant names.)\n       2. ONE null member wrecks a whole aggregate, and the two engines disagree about how. The JS\n          reference implementation THROWS (\"Argument 1 of function sum must be an array of\n          numbers\"); the Java port can instead yield null for the entire aggregate. Neither gives a\n          partial total, and the null-yielding form is the dangerous one because it is silent. So\n          callers coerce with `$n()` below before aggregating, which makes the behaviour identical\n          in both engines — measured, not assumed: see helpers.test.ts.\n\n       3. A PATH STEP DIRECTLY ON A CALL RESULT RETURNS NOTHING in the Java engine. This matters for\n          every caller of $amortize, which is the one helper here returning an object:\n\n              $amortize(p, r, n, 0).months            -> empty in Java, 360 in JS.  WRONG\n              ($a := $amortize(p, r, n, 0); $a.months) -> 360 in both.               RIGHT\n\n          Bind the result to a variable, then step into it. The JS reference accepts both forms, so\n          this is invisible until the page is served by the real engine, and it fails as a blank\n          field rather than an error. Measured with a probe, not inferred — the field simply does\n          not appear. */\n\n  /* Number coercion with an explicit zero default. The guard against trap 2. */\n  $n := function($v) { $v = null or $not($exists($v)) ? 0 : $number($v) };\n\n  /* ISO date -> its year / month / day parts. String slicing rather than $fromMillis formatting:\n     these are statutory dates (\"2026-04-06\"), and a timezone-sensitive round-trip through millis\n     can shift the day, which silently moves a service anniversary across a band boundary. */\n  $isoY := function($d) { $number($substring($d, 0, 4)) };\n  $isoM := function($d) { $number($substring($d, 5, 2)) };\n  $isoD := function($d) { $number($substring($d, 8, 2)) };\n\n  /* Whole years of completed service between two ISO dates. Counts an anniversary as reached only\n     when the month-and-day has arrived, which is what \"completed years of service\" means in every\n     severance statute — not a 365.25-day division, whose drift crosses a 5-year band boundary in\n     the wrong direction roughly one year in four. */\n  $yearsBetween := function($from, $to) { (\n    $y := $isoY($to) - $isoY($from);\n    $beforeAnniversary := $isoM($to) < $isoM($from)\n      or ($isoM($to) = $isoM($from) and $isoD($to) < $isoD($from));\n    $beforeAnniversary ? $y - 1 : $y\n  ) };\n\n  /* Whole completed months between two ISO dates, same convention. */\n  $monthsBetween := function($from, $to) { (\n    $m := ($isoY($to) - $isoY($from)) * 12 + ($isoM($to) - $isoM($from));\n    $isoD($to) < $isoD($from) ? $m - 1 : $m\n  ) };\n\n  /* Inclusive count of days between two ISO dates — both endpoints counted, because a leave year\n     runs from its first day to its last and an employee present on both is present for both.\n     Pro-rata accrual is then $proRataDays(a, b) / $proRataDays(yearStart, yearEnd). */\n  $proRataDays := function($from, $to) {\n    ($toMillis($to) - $toMillis($from)) / 86400000 + 1\n  };\n\n  /* Progressive charge across bands. `$bands` is ordered lowest-first, each {\"upTo\": n, \"rate\": r};\n     the final band's `upTo` is omitted or null to mean \"no ceiling\". Each band's rate applies ONLY\n     to the slice of the amount inside it — the single most common error in a hand-written bracket\n     walk is applying the top rate to the whole amount. Returns 0 for a non-positive amount. */\n  $bandedCharge := function($amount, $bands) { (\n    $a := $n($amount);\n    $a <= 0 ? 0 : $reduce($bands, function($acc, $band) { (\n      $ceiling := $exists($band.upTo) and $band.upTo != null ? $band.upTo : $a;\n      $top := $ceiling < $a ? $ceiling : $a;\n      $slice := $top - $acc.floor;\n      {\n        \"floor\": $top > $acc.floor ? $top : $acc.floor,\n        \"charge\": $acc.charge + ($slice > 0 ? $slice * $n($band.rate) : 0)\n      }\n    ) }, {\"floor\": 0, \"charge\": 0}).charge\n  ) };\n\n  /* Clamp into [floor, cap]. Either bound may be omitted (null) to leave that side open — a benefit\n     with a cap and no floor is as common as one with both. */\n  $clampFloorCap := function($value, $floor, $cap) { (\n    $v := $n($value);\n    $withFloor := $exists($floor) and $floor != null and $v < $floor ? $floor : $v;\n    $exists($cap) and $cap != null and $withFloor > $cap ? $cap : $withFloor\n  ) };\n\n  /* Level annuity payment for a principal over `$months` at `$annualRatePct` nominal, compounded\n     monthly. Falls back to straight-line division at a zero rate, where the standard formula\n     divides by zero. */\n  $annuityPayment := function($principal, $annualRatePct, $months) { (\n    $p := $n($principal);\n    $m := $n($months);\n    $i := $n($annualRatePct) / 1200;\n    $m <= 0 ? 0 : ($i = 0 ? $p / $m : $p * $i * $power(1 + $i, $m) / ($power(1 + $i, $m) - 1))\n  ) };\n\n  /* Amortisation schedule: one row per month until the balance clears or `$months` is reached.\n     Returns {\"payment\", \"months\", \"totalInterest\", \"schedule\": [{month, interest, principal,\n     balance}]}. `$extra` is an optional monthly overpayment.\n\n     A real month-by-month fold rather than a closed form, because an overpayment changes every\n     later row — the same reason debt-payoff simulates. Bounded by `$months`, so it always\n     terminates. */\n  $amortize := function($principal, $annualRatePct, $months, $extra) { (\n    $i := $n($annualRatePct) / 1200;\n    $pay := $annuityPayment($principal, $annualRatePct, $months) + $n($extra);\n    $r := $reduce([1..$n($months)], function($acc, $month) {\n      $acc.balance <= 0 ? $acc : (\n        /* The running balance is kept UNROUNDED and only the emitted row is rounded. Rounding the\n           balance each month instead accumulates drift: at 200,000 over 360 months it left 2.83\n           still owing in the final row, which would break the \"final balance is zero\" invariant\n           (§7.3) and look to a reader like the schedule does not pay the loan off. Lenders compute\n           on the exact balance and adjust the last payment, which is what this does. */\n        $interest := $acc.balance * $i;\n        $due := $acc.balance + $interest < $pay ? $acc.balance + $interest : $pay;\n        $principalPart := $due - $interest;\n        $balance := $acc.balance - $principalPart;\n        {\n          \"balance\": $balance,\n          \"totalInterest\": $acc.totalInterest + $interest,\n          \"schedule\": $append($acc.schedule, [{\n            \"month\": $month,\n            \"interest\": $round($interest, 2),\n            \"principal\": $round($principalPart, 2),\n            \"balance\": $round($balance, 2)\n          }])\n        }\n      )\n    }, {\"balance\": $n($principal), \"totalInterest\": 0, \"schedule\": []});\n    {\n      \"payment\": $round($pay, 2),\n      \"months\": $count($r.schedule),\n      \"totalInterest\": $round($r.totalInterest, 2),\n      \"schedule\": [$r.schedule]\n    }\n  ) };\n\n  [\"n\", \"isoY\", \"isoM\", \"isoD\", \"yearsBetween\", \"monthsBetween\", \"proRataDays\",\n   \"bandedCharge\", \"clampFloorCap\", \"annuityPayment\", \"amortize\"]\n)\n"
        }
      ]
    },
    "defaultValues": [
      {
        "path": "$",
        "expr": "{ 'grossMonthly': 500000, 'basicMonthly': 300000, 'housingTransportMonthly': 150000, 'annualRent': 1200000, 'pensionMember': true, 'nhfMember': false, 'healthInsuranceMonthly': 0, 'minimumWageMonthly': 70000 }"
      }
    ],
    "derivations": [
      {
        "path": "$.grossAnnual",
        "expr": "$round($n(grossMonthly) * 12, 2)"
      },
      {
        "path": "$.pensionAnnual",
        "expr": "pensionMember ? $round($min([$n(basicMonthly) + $n(housingTransportMonthly), $n(grossMonthly)]) * 12 * $const.pensionEmployeeRate, 2) : 0"
      },
      {
        "path": "$.nhfAnnual",
        "expr": "nhfMember ? $round($min([$n(basicMonthly), $n(grossMonthly)]) * 12 * $const.nhfRate, 2) : 0"
      },
      {
        "path": "$.healthInsuranceAnnual",
        "expr": "$round($n(healthInsuranceMonthly) * 12, 2)"
      },
      {
        "path": "$.rentRelief",
        "expr": "$round($min([$n(annualRent) * $const.rentReliefRate, $const.rentReliefCap]), 2)"
      },
      {
        "path": "$.minimumWageExempt",
        "expr": "$n(grossMonthly) <= $n(minimumWageMonthly)"
      },
      {
        "path": "$.chargeableIncome",
        "expr": "$round($max([0, grossAnnual - pensionAnnual - nhfAnnual - healthInsuranceAnnual - rentRelief]), 2)"
      },
      {
        "path": "$.incomeTaxAnnual",
        "expr": "minimumWageExempt ? 0 : $round($bandedCharge(chargeableIncome, [{\"upTo\": $const.band1, \"rate\": $const.rate0}, {\"upTo\": $const.band2, \"rate\": $const.rate1}, {\"upTo\": $const.band3, \"rate\": $const.rate2}, {\"upTo\": $const.band4, \"rate\": $const.rate3}, {\"upTo\": $const.band5, \"rate\": $const.rate4}, {\"upTo\": null, \"rate\": $const.rate5}]), 2)"
      },
      {
        "path": "$.incomeTaxMonthly",
        "expr": "$round(incomeTaxAnnual / 12, 2)"
      },
      {
        "path": "$.netAnnual",
        "expr": "$round($max([0, grossAnnual - incomeTaxAnnual - pensionAnnual - nhfAnnual - healthInsuranceAnnual]), 2)"
      },
      {
        "path": "$.netMonthly",
        "expr": "$round(netAnnual / 12, 2)"
      }
    ],
    "constraints": [],
    "viewDefinition": {
      "renderer": "builtin",
      "defaultView": "main",
      "views": [
        {
          "id": "main",
          "label": "Take-home pay",
          "layout": "vertical",
          "components": [
            {
              "id": "gross",
              "type": "numericField",
              "label": "Gross monthly pay, all taxable allowances (₦)",
              "bind": "$.grossMonthly"
            },
            {
              "id": "basic",
              "type": "numericField",
              "label": "of which basic salary (₦ / month)",
              "bind": "$.basicMonthly"
            },
            {
              "id": "housingTransport",
              "type": "numericField",
              "label": "of which housing and transport allowances (₦ / month)",
              "bind": "$.housingTransportMonthly"
            },
            {
              "id": "rent",
              "type": "numericField",
              "label": "Rent you pay for your home (₦ / year)",
              "bind": "$.annualRent",
              "helperText": "Rent relief is 20% of it, at most ₦500,000."
            },
            {
              "id": "pension",
              "type": "checkboxField",
              "label": "In the contributory pension scheme (8% of basic, housing and transport)",
              "bind": "$.pensionMember",
              "helperText": "Compulsory where the employer has 15 or more staff."
            },
            {
              "id": "nhf",
              "type": "checkboxField",
              "label": "Public-sector employee, or a private-sector employee who opted in to the NHF (2.5% of basic)",
              "bind": "$.nhfMember",
              "helperText": "A Nigerian worker earning at least the national minimum wage. Private-sector NHF is voluntary since 2023."
            },
            {
              "id": "health",
              "type": "numericField",
              "label": "Your contribution under the national health insurance scheme (NHIA) (₦ / month)",
              "bind": "$.healthInsuranceMonthly"
            },
            {
              "id": "minWage",
              "type": "numericField",
              "label": "National minimum wage (₦ / month)",
              "bind": "$.minimumWageMonthly",
              "helperText": "₦70,000 since the 2024 amendment, whose text is not on an official site. Pay at or below it is tax-free."
            },
            {
              "id": "tiles",
              "type": "group",
              "layout": "horizontal",
              "components": [
                {
                  "id": "netM",
                  "type": "statTile",
                  "label": "Net / month",
                  "bind": "$.netMonthly",
                  "format": "currency",
                  "currency": "NGN"
                },
                {
                  "id": "netY",
                  "type": "statTile",
                  "label": "Net / year",
                  "bind": "$.netAnnual",
                  "format": "currency",
                  "currency": "NGN"
                }
              ]
            },
            {
              "id": "breakdown",
              "type": "keyValueList",
              "label": "How that is worked out",
              "items": [
                {
                  "label": "Gross pay for the year",
                  "bind": "$.grossAnnual",
                  "format": "currency",
                  "currency": "NGN"
                },
                {
                  "label": "Pension 8% for the year",
                  "bind": "$.pensionAnnual",
                  "format": "currency",
                  "currency": "NGN"
                },
                {
                  "label": "National Housing Fund 2.5%",
                  "bind": "$.nhfAnnual",
                  "format": "currency",
                  "currency": "NGN"
                },
                {
                  "label": "National health insurance scheme",
                  "bind": "$.healthInsuranceAnnual",
                  "format": "currency",
                  "currency": "NGN"
                },
                {
                  "label": "Rent relief",
                  "bind": "$.rentRelief",
                  "format": "currency",
                  "currency": "NGN"
                },
                {
                  "label": "Chargeable income",
                  "bind": "$.chargeableIncome",
                  "format": "currency",
                  "currency": "NGN"
                },
                {
                  "label": "Income tax for the year",
                  "bind": "$.incomeTaxAnnual",
                  "format": "currency",
                  "currency": "NGN"
                },
                {
                  "label": "Income tax / month (PAYE)",
                  "bind": "$.incomeTaxMonthly",
                  "format": "currency",
                  "currency": "NGN"
                },
                {
                  "label": "Exempt: pay at or below the minimum wage",
                  "bind": "$.minimumWageExempt"
                }
              ]
            },
            {
              "id": "note",
              "type": "staticText",
              "text": "Nigeria Tax Act 2025, in force from 1 January 2026 (it replaced PITA and the consolidated relief allowance). Pay is assumed the same every month. Not modelled: life-assurance premiums and mortgage interest (also deductible), benefits in kind, exempt pensions and gratuities, the exempt pay of military officers and of personnel in combat zones (s.162(1)(o), (u)), other income. The employer’s own 10% pension is on top and not shown. PAYE is collected by your state of residence at these federal rates. Estimate, not tax advice."
            },
            {
              "id": "sources",
              "type": "sourceList",
              "label": "Sources",
              "layers": 3,
              "items": [
                {
                  "label": "Nigeria Tax Act 2025 (Act No. 7, in force 1 Jan 2026), s.58 and Fourth Schedule",
                  "url": "https://nass.gov.ng/documents/download/11249",
                  "date": "2026-11-01",
                  "covers": [
                    "band1",
                    "band2",
                    "band3",
                    "band4",
                    "band5",
                    "rate0",
                    "rate1",
                    "rate2",
                    "rate3",
                    "rate4",
                    "rate5"
                  ]
                },
                {
                  "label": "Nigeria Tax Act 2025 s.30(2)(a): eligible deductions, rent relief 20% up to ₦500,000",
                  "url": "https://nass.gov.ng/documents/download/11249",
                  "date": "2026-11-01",
                  "covers": [
                    "rentReliefRate",
                    "rentReliefCap"
                  ]
                },
                {
                  "label": "Pension Reform Act 2014 (PenCom) s.4(1): employee at least 8% of monthly emoluments",
                  "url": "https://www.pencom.gov.ng/wp-content/uploads/2018/01/PRA_2014.pdf",
                  "date": "2026-11-01",
                  "covers": [
                    "pensionEmployeeRate"
                  ]
                },
                {
                  "label": "National Housing Fund Act Cap N45 (FMBN, 2004 text) s.4: 2.5% of basic; s.4 replaced by the Business Facilitation Act 2022 s.45",
                  "url": "https://fmbn.gov.ng/backend/storage/uploads/37UNgpzsyASabzhQCnHuyzFtIpnsfmW2ODvAmQSG.pdf",
                  "date": "2026-11-01",
                  "covers": [
                    "nhfRate"
                  ]
                }
              ]
            }
          ]
        }
      ]
    },
    "tests": [
      {
        "description": "N1 ₦500,000 a month (₦300,000 basic, ₦150,000 housing and transport), ₦1.2m rent, no NHF: tax ₦330,000 + 18% of ₦2,328,000",
        "given": {
          "$.grossMonthly": 500000,
          "$.basicMonthly": 300000,
          "$.housingTransportMonthly": 150000,
          "$.annualRent": 1200000,
          "$.pensionMember": true,
          "$.nhfMember": false,
          "$.healthInsuranceMonthly": 0,
          "$.minimumWageMonthly": 70000
        },
        "expect": {
          "$.pensionAnnual": 432000,
          "$.chargeableIncome": 5328000,
          "$.incomeTaxAnnual": 749040,
          "$.netMonthly": 401580
        }
      },
      {
        "description": "N1b the same pay: rent relief, monthly PAYE and net for the year",
        "given": {
          "$.grossMonthly": 500000,
          "$.basicMonthly": 300000,
          "$.housingTransportMonthly": 150000,
          "$.annualRent": 1200000,
          "$.pensionMember": true,
          "$.nhfMember": false,
          "$.healthInsuranceMonthly": 0,
          "$.minimumWageMonthly": 70000
        },
        "expect": {
          "$.nhfAnnual": 0,
          "$.rentRelief": 240000,
          "$.incomeTaxMonthly": 62420,
          "$.netAnnual": 4818960
        }
      },
      {
        "description": "N1c the same pay, opted in to the NHF: 2.5% of ₦3.6m basic = ₦90,000, tax ₦330,000 + 18% of ₦2,238,000",
        "given": {
          "$.grossMonthly": 500000,
          "$.basicMonthly": 300000,
          "$.housingTransportMonthly": 150000,
          "$.annualRent": 1200000,
          "$.pensionMember": true,
          "$.nhfMember": true,
          "$.healthInsuranceMonthly": 0,
          "$.minimumWageMonthly": 70000
        },
        "expect": {
          "$.nhfAnnual": 90000,
          "$.chargeableIncome": 5238000,
          "$.incomeTaxAnnual": 732840,
          "$.netMonthly": 395430
        }
      },
      {
        "description": "N2 ₦70,000 a month, no pension or NHF: the minimum wage, so exempt (₦6,000 otherwise)",
        "given": {
          "$.grossMonthly": 70000,
          "$.basicMonthly": 50000,
          "$.housingTransportMonthly": 15000,
          "$.annualRent": 0,
          "$.pensionMember": false,
          "$.nhfMember": false,
          "$.healthInsuranceMonthly": 0,
          "$.minimumWageMonthly": 70000
        },
        "expect": {
          "$.minimumWageExempt": true,
          "$.chargeableIncome": 840000,
          "$.incomeTaxAnnual": 0
        }
      },
      {
        "description": "N3 ₦1 a month above the minimum wage: 15% of the ₦40,012 above ₦800,000",
        "given": {
          "$.grossMonthly": 70001,
          "$.basicMonthly": 50001,
          "$.housingTransportMonthly": 15000,
          "$.annualRent": 0,
          "$.pensionMember": false,
          "$.nhfMember": false,
          "$.healthInsuranceMonthly": 0,
          "$.minimumWageMonthly": 70000
        },
        "expect": {
          "$.minimumWageExempt": false,
          "$.incomeTaxAnnual": 6001.8
        }
      },
      {
        "description": "N4 ₦3,000,000 chargeable: the 15% band ends at ₦330,000",
        "given": {
          "$.grossMonthly": 250000,
          "$.basicMonthly": 250000,
          "$.housingTransportMonthly": 0,
          "$.annualRent": 0,
          "$.pensionMember": false,
          "$.nhfMember": false,
          "$.healthInsuranceMonthly": 0,
          "$.minimumWageMonthly": 70000
        },
        "expect": {
          "$.chargeableIncome": 3000000,
          "$.incomeTaxAnnual": 330000
        }
      },
      {
        "description": "N5 rent of ₦3,000,000: 20% would be ₦600,000, capped at ₦500,000",
        "given": {
          "$.grossMonthly": 500000,
          "$.basicMonthly": 300000,
          "$.housingTransportMonthly": 150000,
          "$.annualRent": 3000000,
          "$.pensionMember": true,
          "$.nhfMember": false,
          "$.healthInsuranceMonthly": 0,
          "$.minimumWageMonthly": 70000
        },
        "expect": {
          "$.rentRelief": 500000,
          "$.chargeableIncome": 5068000
        }
      },
      {
        "description": "N6 ₦5,000,000 a month, public sector (NHF): ₦54,780,000 chargeable, ₦10,430,000 + 25% of ₦4,780,000",
        "given": {
          "$.grossMonthly": 5000000,
          "$.basicMonthly": 3000000,
          "$.housingTransportMonthly": 1500000,
          "$.annualRent": 0,
          "$.pensionMember": true,
          "$.nhfMember": true,
          "$.healthInsuranceMonthly": 0,
          "$.minimumWageMonthly": 70000
        },
        "expect": {
          "$.pensionAnnual": 4320000,
          "$.nhfAnnual": 900000,
          "$.incomeTaxAnnual": 11625000
        }
      },
      {
        "description": "N7 ₦10,000 a month under the national health insurance scheme is deducted too",
        "given": {
          "$.grossMonthly": 500000,
          "$.basicMonthly": 300000,
          "$.housingTransportMonthly": 150000,
          "$.annualRent": 1200000,
          "$.pensionMember": true,
          "$.nhfMember": false,
          "$.healthInsuranceMonthly": 10000,
          "$.minimumWageMonthly": 70000
        },
        "expect": {
          "$.chargeableIncome": 5208000,
          "$.incomeTaxAnnual": 727440
        }
      }
    ]
  }
}
