{
  "$schema": "https://govschema.org/spec/v0.3/govschema.schema.json",
  "govschemaVersion": "0.3.0",
  "id": "ng/firs/fct-irs-personal-income-tax-return-form-a",
  "version": "1.0.0",
  "title": "Nigeria (FCT) Personal Income Tax Return Form A (FCT-IRS)",
  "description": "The Federal Capital Territory Internal Revenue Service (FCT-IRS)'s \"Form A\", the Personal Income Tax Return Form for a resident individual in Nigeria's Federal Capital Territory (Abuja), filed under the Personal Income Tax Act (PITA), Cap. P8, Laws of the Federation of Nigeria 2004 (as amended). Closes Nigeria's Taxes vertical (2 of 6; Business Formation via `ng/cac/cac-1-1-application-for-registration-of-company` already modelled, GOV-2518). Personal income tax in Nigeria is administered on a state-by-state basis (each state, plus the FCT, has its own Internal Revenue Service under the PAYE/direct-assessment regime of the nationally-standardized PITA), so this schema is deliberately scoped to the FCT-IRS edition of Form A rather than asserted as Nigeria's single national tax-return form; other states' Internal Revenue Services administer their own editions of what is structurally the same nationally-standardized Form A design. This is a 2-page flat, print-and-hand-fill specimen (0 AcroForm widgets, confirmed via `pdfjs-dist` `getAnnotations()`), covering Part A (Personal Details), Part B (Statement of Income — earned income from trade/employment/pension/foreign sources, and investment income from dividends/interest/rents/other profits), a conditional spouse-and-children declaration block, Part C (Benefits in Kind — residence, rent, domestic servants, vehicles, and other benefits), and Part D (Allowances for Life Assurance, Gratuities, NHIS, and Pension Contribution), closing with a signed declaration. This v1.0.0 models 82 `fields[]` (derived from the form's lettered/numbered items, since a flat print form carries no AcroForm widget names to source from) and 8 `documents[]` entries (the form's own \"Attach ...\" instructions plus the signed declaration statement), including four disclosed bounded repeating groups (a 4-slot children table, a 2-slot domestic-servants table, a 2-slot vehicles table, and a 2-slot life-assurance-policy table in Part D), each bounded to the number of rows the specimen itself prints, per this registry's established bounded-repeating-group convention. GovSchema is independent and is not affiliated with, endorsed by, or operated by the Government of Nigeria, the Federal Capital Territory Administration, or FCT-IRS.",
  "status": "draft",
  "jurisdiction": {
    "country": "NG",
    "level": "subnational",
    "subdivision": "NG-FC"
  },
  "authority": {
    "name": "Federal Capital Territory Internal Revenue Service",
    "abbreviation": "FCT-IRS",
    "url": "https://fctirs.gov.ng"
  },
  "process": {
    "type": "filing",
    "language": "en"
  },
  "source": {
    "url": "https://fctirs.gov.ng/wp-content/uploads/Personal-Income-Tax-Return-Form-A.pdf",
    "retrievedAt": "2026-07-12",
    "documentRef": "\"Form A\" (footer: \"FCT-IRS Form A\"), \"PERSONAL INCOME TAX RETURN FORM FOR YEAR ENDED 31ST DECEMBER ____\", a 2-page flat (0 AcroForm widgets) PDF published directly on fctirs.gov.ng."
  },
  "verification": {
    "method": "manual-source-review-v1",
    "lastVerifiedAt": "2026-07-12",
    "verifiedBy": "GovSchema Engineering (Standards Engineer)",
    "nextReviewBy": "2027-01-12",
    "notes": "GovSchema Standard Research cycle GOV-2553, closing Nigeria's Taxes vertical (2 of 6; Business Formation already modelled via GOV-2518). Independently re-fetched the cited source directly (HTTP 200, application/pdf, 323,404 bytes, Last-Modified 2025-10-09, sha256:5062478b44c42c94524d773691e0903d2328640a9d5f3a252475c094a3bd324d), confirming the child issue's own citation exactly rather than trusting it. pdfjs-dist (legacy build) getAnnotations() confirms 0 Widget annotations across both pages — a flat print form, the same tier as this registry's rw/dgie, pe/sunat, uy/dgi, and ke/brs specimens. getTextContent() (position-sorted by transform x/y, grouped into printed rows) was used to read the full form text and correlate every lettered/numbered item and its blank(s); a font-rendering defect in the specimen's embedded bold typeface caused pdfjs-dist/node-canvas page.render() to silently drop most bold caption glyphs (confirmed via repeated 'ignoring character'/'TT: undefined function: 32' warnings), so rendered PNGs were used only to read table geometry (row/column counts) from vector ruling lines, cross-checked against the position-sorted text dump for every actual label and value. Every printed Part (A-D) and every lettered/numbered item (i)-(viii), (a)-(h) was accounted for. 82 fields[] entries were derived: 6 from Part A's personal-details block (First/Middle/Surname split across 3 separate printed comb-box rows, plus FCT-IRS TIN, e-mail, and telephone); 16 from Part B's income statement (each of items (i)-(viii) plus the Aggregate Earned Income (X), Aggregate Investment Income (Y), and Total Income (X+Y) computed lines); 5 from the conditional \"If Married, State Spouse's...\" block; 20 from the printed 4-slot children table (Full name/Date of Birth/Educational Institution/Child's Income on own right/School Fees, per this registry's fi/migri-style bounded-repeating-group convention, matching the 4 numbered rows (1-4) rendered in the source); 5 from Part C's non-repeating Residential Address/Rent items; 6 from a 2-slot domestic-servants table (row count confirmed by rendering the vector-ruled table geometry, since the header text itself is invisible under the font-rendering defect); 10 from a 2-slot vehicles table (2 printed \"Date of Purchase .../Cost/Brand/Model/Year\" rows, confirmed both from getTextContent()'s duplicated row text and from the rendered ruled-table geometry); 4 from a 2-slot \"Other Benefits in Kind\" table (items \"1\"/\"2\", each a description blank plus a Cost N blank); 8 from Part D's 2-slot life-assurance/gratuities/NHIS/pension-contribution table; and 2 from the closing declaration (\"I ___ hereby declare...\"; \"Given under my hand this ___ Day of ___ 20 ___\"), with the Signature/Thumb print line itself excluded per this registry's established signature-capture convention. Disclosed discrepancy (not silently corrected): Part B's own printed label reads \"Aggregate Investment Income (iv - vii above) (Y)\", but the item numbering it purports to sum is items (v) Dividends through (viii) Other profits — item (iv), \"Income received in or brought into Nigeria from all sources outside Nigeria\", is itself one of the four items already summed into the preceding \"Aggregate Earned Income (i-iv above) (X)\" line, so \"(iv - vii above)\" cannot be the literal item range intended; this is modelled as the sum of (v)-(viii) (the only numerically consistent reading) with the printed range quoted verbatim in aggregateInvestmentIncome's own description rather than silently reworded. This specimen carries zero asterisks or any other required-field marking convention anywhere in its extracted text (confirmed by a full-text scan of both pages), unlike ng/cac's specimen (which had asterisks that turned out not to correspond to the authoritative requiredness source either); requiredness here is therefore a disclosed judgment call based on which items are unconditionally applicable to every return (personal identity, and Part B's income-statement lines, all modelled required with a `0`-permitting minimum since a filer with no income of a given type is still expected to enter `0` rather than leave the line blank) versus genuinely conditional items (the spouse/children block, and every item in Parts C and D, none of which apply to every filer), modelled fully optional. No separate \"Marital Status\" boolean/checkbox exists anywhere on this specimen to machine-gate the spouse/children block against (unlike rw/dgie's dedicated tick-box) — the printed instruction is simply \"If Married, State Spouse's and Children's details\", with no corresponding field to reference in a requiredWhen; per this registry's ng/cac Section D/D1 precedent (no fabricated boolean field invented to force a machine-checkable gate where the source provides none), this is disclosed here and the spouse/children fields are left plain-optional rather than requiredWhen-gated — deliberately avoiding this registry's own documented notEquals-empty-string-against-an-absent-optional-field bug class, since there is no boolean sibling field to gate on safely in the first place. A web search confirms the Personal Income Tax Act (PITA), Cap. P8 LFN 2004 (as amended by the Personal Income Tax (Amendment) Act 2011 and, most recently, the Nigeria Tax Act 2025/Nigeria Tax Administration Act 2025 package, both assented to in 2025 with a 2026 commencement), remains the governing statute for individual income tax, with FCT-IRS (established under the FCT Internal Revenue Service Act 2015) as the FCT's own current, operating collecting authority distinct from the federal FIRS (which administers companies income tax, not personal income tax) — confirmed as a live, currently operating agency in 2026. Conformance run: 2 valid mock scenarios (0 errors each) and 4 mutation-control fixtures (each raising exactly 1 error) using a disposable, from-scratch conformance checker (not committed) implementing this schema's own required/validation rules directly from spec/v0.3/SPEC.md, plus ajv for the static JSON Schema subset — see VERIFICATION.md for the full write-up, including the disposable checker's source and every fixture's expected-vs-actual result."
  },
  "maturity": {
    "level": "structural-reference",
    "criteria": {
      "structuralReference": true,
      "verifiedSchema": false,
      "agentReadySchema": false,
      "executionTestedSchema": false
    },
    "method": "maturity-self-assessment-v1",
    "assertedBy": "GovSchema Engineering (Standards Engineer)",
    "assertedAt": "2026-07-12"
  },
  "license": "CC-BY-4.0",
  "fields": [
    {
      "name": "firstName",
      "label": "First Name",
      "type": "string",
      "required": true,
      "classification": "pii",
      "sourceRef": "Part A: Personal Details — \"First Name\"",
      "validation": { "maxLength": 100 }
    },
    {
      "name": "middleName",
      "label": "Middle Name",
      "type": "string",
      "required": false,
      "classification": "pii",
      "description": "Not required: not every taxpayer has a middle name and the form provides no separate \"none\" indicator.",
      "sourceRef": "Part A: Personal Details — \"Middle Name\"",
      "validation": { "maxLength": 100 }
    },
    {
      "name": "surname",
      "label": "Surname",
      "type": "string",
      "required": true,
      "classification": "pii",
      "sourceRef": "Part A: Personal Details — \"Surname\"",
      "validation": { "maxLength": 100 }
    },
    {
      "name": "fctIrsTin",
      "label": "FCT-IRS TIN",
      "type": "string",
      "required": true,
      "classification": "pii",
      "description": "The taxpayer's FCT-IRS Tax Identification Number.",
      "sourceRef": "Part A: Personal Details — \"FCT-IRS TIN\"",
      "validation": { "maxLength": 20 }
    },
    {
      "name": "emailAddress",
      "label": "e-mail Address",
      "type": "string",
      "required": true,
      "classification": "pii",
      "sourceRef": "Part A: Personal Details — \"e-mail Address\"",
      "validation": { "pattern": "^[^@\\s]+@[^@\\s]+\\.[^@\\s]+$", "maxLength": 150 }
    },
    {
      "name": "contactTelephoneNumbers",
      "label": "Contact Telephone No(s).",
      "type": "string",
      "required": true,
      "classification": "pii",
      "description": "One printed blank line; the label's own \"No(s).\" plural allows more than one number to be entered on it (e.g. comma-separated), not modelled as a repeating group since only one blank is printed.",
      "sourceRef": "Part A: Personal Details — \"Contact Telephone No(s).\"",
      "validation": { "maxLength": 100 }
    },
    {
      "name": "tradeBusinessProfessionVocationIncome",
      "label": "(i) Trade, Business, Profession, Vocation etc",
      "type": "number",
      "required": true,
      "classification": "financial",
      "description": "Enter 0 if the taxpayer has no self-employment/trade income for the year; this specimen carries no asterisk or other required-field marking anywhere (confirmed by a full-text scan), so every Part B income-statement line is modelled required with a 0-permitting minimum, on the disclosed judgment that a filer with none of a given income type still enters 0 rather than leaving the line blank — see VERIFICATION.md.",
      "sourceRef": "Part B: Statement of Income — item (i): \"Trade, Business, Profession, Vocation etc\"",
      "validation": { "minimum": 0 }
    },
    {
      "name": "employmentSalary",
      "label": "(ii) Employment: Salary",
      "type": "number",
      "required": true,
      "classification": "financial",
      "sourceRef": "Part B: Statement of Income — item (ii) Employment: \"Salary\"",
      "validation": { "minimum": 0 }
    },
    {
      "name": "employmentCommissionsBonuses",
      "label": "(ii) Employment: Commissions, Bonuses etc",
      "type": "number",
      "required": true,
      "classification": "financial",
      "sourceRef": "Part B: Statement of Income — item (ii) Employment: \"Commissions, Bonuses etc\"",
      "validation": { "minimum": 0 }
    },
    {
      "name": "employmentAllowances",
      "label": "(ii) Employment: Allowances",
      "type": "number",
      "required": true,
      "classification": "financial",
      "sourceRef": "Part B: Statement of Income — item (ii) Employment: \"Allowances\" (\"Attach details of each allowances paid on your behalf)\")",
      "validation": { "minimum": 0 }
    },
    {
      "name": "pensionFrom",
      "label": "(iii) Pension From",
      "type": "number",
      "required": true,
      "classification": "financial",
      "description": "State name and address of the payer (see the pensionAnnuityGratuityPayerDetails document entry).",
      "sourceRef": "Part B: Statement of Income — item (iii): \"Pension From\"",
      "validation": { "minimum": 0 }
    },
    {
      "name": "annuityFrom",
      "label": "(iii) Annuity From",
      "type": "number",
      "required": true,
      "classification": "financial",
      "sourceRef": "Part B: Statement of Income — item (iii): \"Annuity From\"",
      "validation": { "minimum": 0 }
    },
    {
      "name": "gratuities",
      "label": "(iii) Gratuities",
      "type": "number",
      "required": true,
      "classification": "financial",
      "sourceRef": "Part B: Statement of Income — item (iii): \"Gratuities\"",
      "validation": { "minimum": 0 }
    },
    {
      "name": "incomeFromOutsideNigeria",
      "label": "(iv) Income received in or brought into Nigeria from all sources outside Nigeria",
      "type": "number",
      "required": true,
      "classification": "financial",
      "sourceRef": "Part B: Statement of Income — item (iv): \"Income received in or brought into Nigeria from all sources outside Nigeria\"",
      "validation": { "minimum": 0 }
    },
    {
      "name": "aggregateEarnedIncome",
      "label": "Aggregate Earned Income (i-iv above) (X)",
      "type": "number",
      "required": true,
      "classification": "financial",
      "description": "Sum of items (i)-(iv) above. The source presents this as a literal blank to be filled in (typically computed by the filer), not a pre-printed total.",
      "sourceRef": "Part B: Statement of Income — \"Aggregate Earned Income (i-iv above) (X)\"",
      "validation": { "minimum": 0 }
    },
    {
      "name": "dividendsFromNigerianCompanies",
      "label": "(v) Dividends from Nigerian Companies",
      "type": "number",
      "required": true,
      "classification": "financial",
      "sourceRef": "Part B: Statement of Income — item (v): \"Dividends from Nigerian Companies\"",
      "validation": { "minimum": 0 }
    },
    {
      "name": "dividendsFromOutsideCountry",
      "label": "(v) Dividends from outside the Country",
      "type": "number",
      "required": true,
      "classification": "financial",
      "description": "Enter the gross amount before tax deduction, per the source's own parenthetical instruction.",
      "sourceRef": "Part B: Statement of Income — item (v): \"Dividends from outside the Country\" (\"Enter the gross amount before tax deduction\")",
      "validation": { "minimum": 0 }
    },
    {
      "name": "interestIncome",
      "label": "(vi) Interest",
      "type": "number",
      "required": true,
      "classification": "financial",
      "sourceRef": "Part B: Statement of Income — item (vi): \"Interest\" (\"Attach a list giving details of each source and the gross income received therefrom\")",
      "validation": { "minimum": 0 }
    },
    {
      "name": "rentsIncome",
      "label": "(vii) Rents",
      "type": "number",
      "required": true,
      "classification": "financial",
      "sourceRef": "Part B: Statement of Income — item (vii): \"Rents\" (\"Attach a list showing for each property, the amount of gross and other expenses Rent & or premium received therefrom with rates\")",
      "validation": { "minimum": 0 }
    },
    {
      "name": "otherProfitsIncome",
      "label": "(viii) Income in respect of other profits arising from sources not included above",
      "type": "number",
      "required": true,
      "classification": "financial",
      "sourceRef": "Part B: Statement of Income — item (viii): \"Income in respect of other profits arising from sources not included above\" (\"Attach details of each source and the income therefrom\")",
      "validation": { "minimum": 0 }
    },
    {
      "name": "aggregateInvestmentIncome",
      "label": "Aggregate Investment Income (Y)",
      "type": "number",
      "required": true,
      "classification": "financial",
      "description": "Sum of items (v)-(viii) above. DISCLOSED DISCREPANCY: the source's own printed label reads \"Aggregate Investment Income (iv - vii above) (Y)\", but item (iv) is already summed into the preceding \"Aggregate Earned Income (i-iv above) (X)\" line, so the printed item range cannot be the literal one intended — modelled here as the sum of (v)-(viii), the only numerically consistent reading, with the printed range preserved verbatim in this description rather than silently reworded. See VERIFICATION.md.",
      "sourceRef": "Part B: Statement of Income — \"Aggregate Investment Income (iv - vii above) (Y)\" [as printed; see description]",
      "validation": { "minimum": 0 }
    },
    {
      "name": "totalIncome",
      "label": "TOTAL INCOME (X + Y)",
      "type": "number",
      "required": true,
      "classification": "financial",
      "description": "aggregateEarnedIncome + aggregateInvestmentIncome.",
      "sourceRef": "Part B: Statement of Income — \"TOTAL INCOME (X + Y)\" \"=N=\"",
      "validation": { "minimum": 0 }
    },
    {
      "name": "spouseFullName",
      "label": "Spouse's full name",
      "type": "string",
      "required": false,
      "classification": "pii",
      "description": "This block is printed under the instruction \"If Married, State Spouse's and Children's details\"; the specimen has no separate Marital Status tick-box or other boolean field to machine-gate this block against (unlike, e.g., rw/dgie's dedicated tick-box), so — per this registry's ng/cac Section D/D1 precedent of not fabricating a gating field the source does not itself provide — this and the remaining spouse/children fields are modelled plain-optional rather than requiredWhen-gated. See VERIFICATION.md.",
      "sourceRef": "\"If Married, State Spouse's and Children's details:\" — \"Full name:\"",
      "validation": { "maxLength": 150 }
    },
    {
      "name": "spouseDateOfBirth",
      "label": "Spouse's Date of Birth",
      "type": "date",
      "required": false,
      "classification": "sensitive-pii",
      "sourceRef": "\"If Married, State Spouse's and Children's details:\" — \"Date of Birth\" (D D / M M / Y Y Y Y)"
    },
    {
      "name": "spouseEmployerOrBusinessName",
      "label": "Spouse's Employer's/Business Name",
      "type": "string",
      "required": false,
      "classification": "pii",
      "sourceRef": "\"If Married, State Spouse's and Children's details:\" — \"Employer's/Business Name:\"",
      "validation": { "maxLength": 150 }
    },
    {
      "name": "spouseOccupation",
      "label": "Spouse's Occupation",
      "type": "string",
      "required": false,
      "sourceRef": "\"If Married, State Spouse's and Children's details:\" — \"Occupation:\"",
      "validation": { "maxLength": 100 }
    },
    {
      "name": "spouseEmployerOrBusinessAddress",
      "label": "Spouse's Employer's/Business Address",
      "type": "string",
      "required": false,
      "classification": "pii",
      "sourceRef": "\"If Married, State Spouse's and Children's details:\" — \"Employer's/Business Address:\"",
      "validation": { "maxLength": 250 }
    },
    {
      "name": "child1FullName",
      "label": "Accompanying child 1: Full name",
      "type": "string",
      "required": false,
      "classification": "pii",
      "description": "The printed children table has exactly 4 numbered rows (1-4); flattened here to child1..child4, per this registry's bounded-repeating-group convention. Not required: an applicant with no children (or fewer than 4) leaves the remaining rows blank.",
      "sourceRef": "Children table, row 1: \"Full name of Children\"",
      "validation": { "maxLength": 150 }
    },
    {
      "name": "child1DateOfBirth",
      "label": "Accompanying child 1: Date of Birth",
      "type": "date",
      "required": false,
      "classification": "sensitive-pii",
      "sourceRef": "Children table, row 1: \"Dates of Birth\" (D D / M M / Y Y Y Y)"
    },
    {
      "name": "child1EducationalInstitutionNameAddress",
      "label": "Accompanying child 1: Name & Address of Educational Institution",
      "type": "string",
      "required": false,
      "sourceRef": "Children table, row 1: \"Name & Address of Educational Institution\"",
      "validation": { "maxLength": 250 }
    },
    {
      "name": "child1IncomeOwnRight",
      "label": "Accompanying child 1: Child's Income on own right (N)",
      "type": "number",
      "required": false,
      "classification": "financial",
      "sourceRef": "Children table, row 1: \"Child's Income on own right (N)\"",
      "validation": { "minimum": 0 }
    },
    {
      "name": "child1SchoolFees",
      "label": "Accompanying child 1: School Fees",
      "type": "number",
      "required": false,
      "classification": "financial",
      "sourceRef": "Children table, row 1: \"School Fees\"",
      "validation": { "minimum": 0 }
    },
    {
      "name": "child2FullName",
      "label": "Accompanying child 2: Full name",
      "type": "string",
      "required": false,
      "classification": "pii",
      "sourceRef": "Children table, row 2: \"Full name of Children\"",
      "validation": { "maxLength": 150 }
    },
    {
      "name": "child2DateOfBirth",
      "label": "Accompanying child 2: Date of Birth",
      "type": "date",
      "required": false,
      "classification": "sensitive-pii",
      "sourceRef": "Children table, row 2: \"Dates of Birth\" (D D / M M / Y Y Y Y)"
    },
    {
      "name": "child2EducationalInstitutionNameAddress",
      "label": "Accompanying child 2: Name & Address of Educational Institution",
      "type": "string",
      "required": false,
      "sourceRef": "Children table, row 2: \"Name & Address of Educational Institution\"",
      "validation": { "maxLength": 250 }
    },
    {
      "name": "child2IncomeOwnRight",
      "label": "Accompanying child 2: Child's Income on own right (N)",
      "type": "number",
      "required": false,
      "classification": "financial",
      "sourceRef": "Children table, row 2: \"Child's Income on own right (N)\"",
      "validation": { "minimum": 0 }
    },
    {
      "name": "child2SchoolFees",
      "label": "Accompanying child 2: School Fees",
      "type": "number",
      "required": false,
      "classification": "financial",
      "sourceRef": "Children table, row 2: \"School Fees\"",
      "validation": { "minimum": 0 }
    },
    {
      "name": "child3FullName",
      "label": "Accompanying child 3: Full name",
      "type": "string",
      "required": false,
      "classification": "pii",
      "sourceRef": "Children table, row 3: \"Full name of Children\"",
      "validation": { "maxLength": 150 }
    },
    {
      "name": "child3DateOfBirth",
      "label": "Accompanying child 3: Date of Birth",
      "type": "date",
      "required": false,
      "classification": "sensitive-pii",
      "sourceRef": "Children table, row 3: \"Dates of Birth\" (D D / M M / Y Y Y Y)"
    },
    {
      "name": "child3EducationalInstitutionNameAddress",
      "label": "Accompanying child 3: Name & Address of Educational Institution",
      "type": "string",
      "required": false,
      "sourceRef": "Children table, row 3: \"Name & Address of Educational Institution\"",
      "validation": { "maxLength": 250 }
    },
    {
      "name": "child3IncomeOwnRight",
      "label": "Accompanying child 3: Child's Income on own right (N)",
      "type": "number",
      "required": false,
      "classification": "financial",
      "sourceRef": "Children table, row 3: \"Child's Income on own right (N)\"",
      "validation": { "minimum": 0 }
    },
    {
      "name": "child3SchoolFees",
      "label": "Accompanying child 3: School Fees",
      "type": "number",
      "required": false,
      "classification": "financial",
      "sourceRef": "Children table, row 3: \"School Fees\"",
      "validation": { "minimum": 0 }
    },
    {
      "name": "child4FullName",
      "label": "Accompanying child 4: Full name",
      "type": "string",
      "required": false,
      "classification": "pii",
      "sourceRef": "Children table, row 4: \"Full name of Children\"",
      "validation": { "maxLength": 150 }
    },
    {
      "name": "child4DateOfBirth",
      "label": "Accompanying child 4: Date of Birth",
      "type": "date",
      "required": false,
      "classification": "sensitive-pii",
      "sourceRef": "Children table, row 4: \"Dates of Birth\" (D D / M M / Y Y Y Y)"
    },
    {
      "name": "child4EducationalInstitutionNameAddress",
      "label": "Accompanying child 4: Name & Address of Educational Institution",
      "type": "string",
      "required": false,
      "sourceRef": "Children table, row 4: \"Name & Address of Educational Institution\"",
      "validation": { "maxLength": 250 }
    },
    {
      "name": "child4IncomeOwnRight",
      "label": "Accompanying child 4: Child's Income on own right (N)",
      "type": "number",
      "required": false,
      "classification": "financial",
      "sourceRef": "Children table, row 4: \"Child's Income on own right (N)\"",
      "validation": { "minimum": 0 }
    },
    {
      "name": "child4SchoolFees",
      "label": "Accompanying child 4: School Fees",
      "type": "number",
      "required": false,
      "classification": "financial",
      "sourceRef": "Children table, row 4: \"School Fees\"",
      "validation": { "minimum": 0 }
    },
    {
      "name": "residentialAddressAsAt1January",
      "label": "Residential Address: As at 1st January, 20__",
      "type": "string",
      "required": true,
      "classification": "pii",
      "description": "Every filer has a residence as at 1 January of the return year, so this is modelled required, unlike the remaining, genuinely conditional Part C/D items.",
      "sourceRef": "Part C: Benefits in Kind, item a: \"Residential Address — 1. As at 1st January, 20 _______\"",
      "validation": { "maxLength": 250 }
    },
    {
      "name": "residentialAddressChangesDuringYear",
      "label": "Residential Address: Changes during the year",
      "type": "string",
      "required": false,
      "classification": "pii",
      "description": "Not required: only applicable if the filer's residence changed during the year.",
      "sourceRef": "Part C: Benefits in Kind, item a: \"Residential Address — 2. Changes during the year\"",
      "validation": { "maxLength": 250 }
    },
    {
      "name": "rentPaid",
      "label": "Rent Paid",
      "type": "number",
      "required": false,
      "classification": "financial",
      "description": "The gross amount, per the guide notes (\"Rent Paid is the gross amount\"). Not required: only applicable to a filer who pays rent.",
      "sourceRef": "Part C: Benefits in Kind, item b: \"Rent Paid\"",
      "validation": { "minimum": 0 }
    },
    {
      "name": "rentPaidByEmployer",
      "label": "Rent Paid by the Employer",
      "type": "number",
      "required": false,
      "classification": "financial",
      "sourceRef": "Part C: Benefits in Kind, item c: \"Rent Paid by the Employer\"",
      "validation": { "minimum": 0 }
    },
    {
      "name": "rentPaidOrReimbursedByApplicant",
      "label": "Rent Paid or Reimbursed by you",
      "type": "number",
      "required": false,
      "classification": "financial",
      "sourceRef": "Part C: Benefits in Kind, item d: \"Rent Paid or Reimbursed by you\"",
      "validation": { "minimum": 0 }
    },
    {
      "name": "domesticServant1Name",
      "label": "Domestic Servant 1: Name",
      "type": "string",
      "required": false,
      "classification": "pii",
      "description": "Item e's printed table (\"Name of Domestic Servants (e.g. Maids, Drivers, Gardener, Watchmen, Cooks, Stewards, Cleaners etc)\") is bounded to 2 rows, confirmed by rendering the specimen's vector table geometry (the header/body text itself is invisible under a font-rendering defect affecting this specimen's bold typeface — see VERIFICATION.md); flattened to domesticServant1/2, per this registry's bounded-repeating-group convention. Not required: a filer with no domestic servants leaves the table blank. The guide notes instruct asterisking any servant paid for by the employer or a separate entity apart from self, disclosed here rather than modelled as a separate field (no corresponding blank exists for it).",
      "sourceRef": "Part C: Benefits in Kind, item e, row 1: \"Name\"",
      "validation": { "maxLength": 150 }
    },
    {
      "name": "domesticServant1ResidentialAddress",
      "label": "Domestic Servant 1: Residential Address",
      "type": "string",
      "required": false,
      "classification": "pii",
      "sourceRef": "Part C: Benefits in Kind, item e, row 1: \"Residential Address\"",
      "validation": { "maxLength": 250 }
    },
    {
      "name": "domesticServant1AmountPaid",
      "label": "Domestic Servant 1: Amount Paid",
      "type": "number",
      "required": false,
      "classification": "financial",
      "sourceRef": "Part C: Benefits in Kind, item e, row 1: \"Amount Paid\"",
      "validation": { "minimum": 0 }
    },
    {
      "name": "domesticServant2Name",
      "label": "Domestic Servant 2: Name",
      "type": "string",
      "required": false,
      "classification": "pii",
      "sourceRef": "Part C: Benefits in Kind, item e, row 2: \"Name\"",
      "validation": { "maxLength": 150 }
    },
    {
      "name": "domesticServant2ResidentialAddress",
      "label": "Domestic Servant 2: Residential Address",
      "type": "string",
      "required": false,
      "classification": "pii",
      "sourceRef": "Part C: Benefits in Kind, item e, row 2: \"Residential Address\"",
      "validation": { "maxLength": 250 }
    },
    {
      "name": "domesticServant2AmountPaid",
      "label": "Domestic Servant 2: Amount Paid",
      "type": "number",
      "required": false,
      "classification": "financial",
      "sourceRef": "Part C: Benefits in Kind, item e, row 2: \"Amount Paid\"",
      "validation": { "minimum": 0 }
    },
    {
      "name": "vehicle1DateOfPurchase",
      "label": "Vehicle 1: Date of Purchase",
      "type": "date",
      "required": false,
      "description": "Item g's printed \"Vehicle(s)\" section prints exactly 2 \"Date of Purchase .../Cost/Brand/Model/Year\" rows (confirmed both from getTextContent()'s duplicated row text and the rendered vector table geometry); flattened to vehicle1/2. Not required: a filer with no employer/self-owned vehicle benefit leaves the table blank.",
      "sourceRef": "Part C: Benefits in Kind, item g, row 1: \"Date of Purchase\" (D D / M M / Y Y Y Y)"
    },
    {
      "name": "vehicle1Cost",
      "label": "Vehicle 1: Cost (N)",
      "type": "number",
      "required": false,
      "classification": "financial",
      "sourceRef": "Part C: Benefits in Kind, item g, row 1: \"Cost N\"",
      "validation": { "minimum": 0 }
    },
    {
      "name": "vehicle1Brand",
      "label": "Vehicle 1: Brand",
      "type": "string",
      "required": false,
      "sourceRef": "Part C: Benefits in Kind, item g, row 1: \"Brand\"",
      "validation": { "maxLength": 100 }
    },
    {
      "name": "vehicle1Model",
      "label": "Vehicle 1: Model",
      "type": "string",
      "required": false,
      "sourceRef": "Part C: Benefits in Kind, item g, row 1: \"Model\"",
      "validation": { "maxLength": 100 }
    },
    {
      "name": "vehicle1Year",
      "label": "Vehicle 1: Year",
      "type": "integer",
      "required": false,
      "description": "The vehicle's model/manufacture year, distinct from vehicle1DateOfPurchase.",
      "sourceRef": "Part C: Benefits in Kind, item g, row 1: \"Year\"",
      "validation": { "minimum": 1900, "maximum": 2100 }
    },
    {
      "name": "vehicle2DateOfPurchase",
      "label": "Vehicle 2: Date of Purchase",
      "type": "date",
      "required": false,
      "sourceRef": "Part C: Benefits in Kind, item g, row 2: \"Date of Purchase\" (D D / M M / Y Y Y Y)"
    },
    {
      "name": "vehicle2Cost",
      "label": "Vehicle 2: Cost (N)",
      "type": "number",
      "required": false,
      "classification": "financial",
      "sourceRef": "Part C: Benefits in Kind, item g, row 2: \"Cost N\"",
      "validation": { "minimum": 0 }
    },
    {
      "name": "vehicle2Brand",
      "label": "Vehicle 2: Brand",
      "type": "string",
      "required": false,
      "sourceRef": "Part C: Benefits in Kind, item g, row 2: \"Brand\"",
      "validation": { "maxLength": 100 }
    },
    {
      "name": "vehicle2Model",
      "label": "Vehicle 2: Model",
      "type": "string",
      "required": false,
      "sourceRef": "Part C: Benefits in Kind, item g, row 2: \"Model\"",
      "validation": { "maxLength": 100 }
    },
    {
      "name": "vehicle2Year",
      "label": "Vehicle 2: Year",
      "type": "integer",
      "required": false,
      "sourceRef": "Part C: Benefits in Kind, item g, row 2: \"Year\"",
      "validation": { "minimum": 1900, "maximum": 2100 }
    },
    {
      "name": "otherBenefitInKind1Description",
      "label": "Other Benefit in Kind 1: Description",
      "type": "string",
      "required": false,
      "description": "Item h's printed \"Other Benefits in Kind\" section prints exactly 2 numbered rows (1, 2), each a description blank followed by a \"Cost N\" blank; flattened to otherBenefitInKind1/2. Not required: a filer with no other benefits in kind leaves the table blank.",
      "sourceRef": "Part C: Benefits in Kind, item h, row 1",
      "validation": { "maxLength": 200 }
    },
    {
      "name": "otherBenefitInKind1Cost",
      "label": "Other Benefit in Kind 1: Cost (N)",
      "type": "number",
      "required": false,
      "classification": "financial",
      "sourceRef": "Part C: Benefits in Kind, item h, row 1: \"Cost N\"",
      "validation": { "minimum": 0 }
    },
    {
      "name": "otherBenefitInKind2Description",
      "label": "Other Benefit in Kind 2: Description",
      "type": "string",
      "required": false,
      "sourceRef": "Part C: Benefits in Kind, item h, row 2",
      "validation": { "maxLength": 200 }
    },
    {
      "name": "otherBenefitInKind2Cost",
      "label": "Other Benefit in Kind 2: Cost (N)",
      "type": "number",
      "required": false,
      "classification": "financial",
      "sourceRef": "Part C: Benefits in Kind, item h, row 2: \"Cost N\"",
      "validation": { "minimum": 0 }
    },
    {
      "name": "lifeAssurancePolicy1CompanyName",
      "label": "Life Assurance Policy 1: Name of Company (Insurance/Employer/HMO/PFA)",
      "type": "string",
      "required": false,
      "description": "Part D's printed table is bounded to 2 rows (confirmed via the rendered vector table geometry — see VERIFICATION.md); flattened to lifeAssurancePolicy1/2. Not required: only applicable to a filer with a life-assurance policy, gratuity, NHIS, or pension contribution to declare. A certificate/receipt must be attached as evidence of payment, per the source's own note — see the lifeAssuranceCertificateOrReceipt document entry.",
      "sourceRef": "Part D: Allowances for Life Assurance, Gratuities, NHIS and Pension Contribution, row 1: \"Name of Company (Insurance/Employer/HMO/PFA)\"",
      "validation": { "maxLength": 150 }
    },
    {
      "name": "lifeAssurancePolicy1LifeOfSelfOrSpouse",
      "label": "Life Assurance Policy 1: Whether on life of Self or Spouse",
      "type": "enum",
      "required": false,
      "sourceRef": "Part D: Allowances for Life Assurance, Gratuities, NHIS and Pension Contribution, row 1: \"Whether on life of Self or Spouse\"",
      "validation": { "enum": ["self", "spouse"] }
    },
    {
      "name": "lifeAssurancePolicy1CapitalSumPaidOnDeath",
      "label": "Life Assurance Policy 1: Capital sum paid on death, excluding any bonus or additional benefit (N)",
      "type": "number",
      "required": false,
      "classification": "financial",
      "sourceRef": "Part D: Allowances for Life Assurance, Gratuities, NHIS and Pension Contribution, row 1: \"Capital sum paid on death, excluding any bonus or additional benefit (N)\"",
      "validation": { "minimum": 0 }
    },
    {
      "name": "lifeAssurancePolicy1PremiumsPaid",
      "label": "Life Assurance Policy 1: Premiums Paid during the year ended 31st December 20__ (to the nearest N)",
      "type": "number",
      "required": false,
      "classification": "financial",
      "sourceRef": "Part D: Allowances for Life Assurance, Gratuities, NHIS and Pension Contribution, row 1: \"Premiums Paid during the year ended 31st December 20 ………. (to the nearest N)\"",
      "validation": { "minimum": 0 }
    },
    {
      "name": "lifeAssurancePolicy2CompanyName",
      "label": "Life Assurance Policy 2: Name of Company (Insurance/Employer/HMO/PFA)",
      "type": "string",
      "required": false,
      "sourceRef": "Part D: Allowances for Life Assurance, Gratuities, NHIS and Pension Contribution, row 2: \"Name of Company (Insurance/Employer/HMO/PFA)\"",
      "validation": { "maxLength": 150 }
    },
    {
      "name": "lifeAssurancePolicy2LifeOfSelfOrSpouse",
      "label": "Life Assurance Policy 2: Whether on life of Self or Spouse",
      "type": "enum",
      "required": false,
      "sourceRef": "Part D: Allowances for Life Assurance, Gratuities, NHIS and Pension Contribution, row 2: \"Whether on life of Self or Spouse\"",
      "validation": { "enum": ["self", "spouse"] }
    },
    {
      "name": "lifeAssurancePolicy2CapitalSumPaidOnDeath",
      "label": "Life Assurance Policy 2: Capital sum paid on death, excluding any bonus or additional benefit (N)",
      "type": "number",
      "required": false,
      "classification": "financial",
      "sourceRef": "Part D: Allowances for Life Assurance, Gratuities, NHIS and Pension Contribution, row 2: \"Capital sum paid on death, excluding any bonus or additional benefit (N)\"",
      "validation": { "minimum": 0 }
    },
    {
      "name": "lifeAssurancePolicy2PremiumsPaid",
      "label": "Life Assurance Policy 2: Premiums Paid during the year ended 31st December 20__ (to the nearest N)",
      "type": "number",
      "required": false,
      "classification": "financial",
      "sourceRef": "Part D: Allowances for Life Assurance, Gratuities, NHIS and Pension Contribution, row 2: \"Premiums Paid during the year ended 31st December 20 ………. (to the nearest N)\"",
      "validation": { "minimum": 0 }
    },
    {
      "name": "declarantFullName",
      "label": "Declarant's full name",
      "type": "string",
      "required": true,
      "classification": "pii",
      "description": "The blank in the declaration's own opening \"I ________ hereby declare that...\" — see the declarationStatement document entry for the full attested text.",
      "sourceRef": "Declaration: \"I ________________________________________________________________________ hereby declare that...\"",
      "validation": { "maxLength": 200 }
    },
    {
      "name": "declarationDate",
      "label": "Declaration date",
      "type": "date",
      "required": true,
      "description": "The date the declaration was given, printed as a sentence with day/month/year blanks (\"Given under my hand this ___ Day of ___ 20 ___\") rather than boxed D/M/Y fields; modelled as a single date field, consistent with this registry's convention for an unambiguous date-of-signing item. The adjoining \"(Signature/Thumb print of Returnee)\" line is excluded per this registry's signature-capture convention.",
      "sourceRef": "Declaration: \"Given under my hand this ………….………… Day of …......………... 20 ………………. (Signature/Thumb print of Returnee)\""
    }
  ],
  "documents": [
    {
      "id": "accountsForTradeBusinessIncome",
      "label": "Accounts for the Year Ended 31st December (Trade/Business/Profession/Vocation income)",
      "category": "supporting-evidence",
      "required": false,
      "belongsTo": "applicant",
      "handling": "The source instructs \"Attach copies of Accounts for the Year Ended 31st December 20 …….\" directly beneath item (i); relevant only when tradeBusinessProfessionVocationIncome is nonzero. Not machine-gated via requiredWhen since a `greaterThan 0` condition against a required-but-frequently-zero numeric field would flag every zero-income return, which is the common case for this line.",
      "sourceRef": "Part B: Statement of Income, item (i): \"Attach copies of Accounts for the Year Ended 31st December 20 …….\""
    },
    {
      "id": "employmentAllowancesDetails",
      "label": "Details of each allowance paid on your behalf",
      "category": "supporting-evidence",
      "required": false,
      "belongsTo": "applicant",
      "handling": "Relevant only when employmentAllowances is nonzero; not machine-gated, for the same reason as accountsForTradeBusinessIncome.",
      "sourceRef": "Part B: Statement of Income, item (ii): \"(Attach details of each allowances paid on your behalf)\""
    },
    {
      "id": "interestIncomeSourceList",
      "label": "List of each interest-income source and the gross income received therefrom",
      "category": "supporting-evidence",
      "required": false,
      "belongsTo": "applicant",
      "handling": "Relevant only when interestIncome is nonzero; not machine-gated, for the same reason as accountsForTradeBusinessIncome.",
      "sourceRef": "Part B: Statement of Income, item (vi): \"(Attach a list giving details of each source and the gross income received therefrom)\""
    },
    {
      "id": "rentalIncomePropertyList",
      "label": "Per-property list of gross rent/premium and other expenses",
      "category": "supporting-evidence",
      "required": false,
      "belongsTo": "applicant",
      "handling": "Relevant only when rentsIncome is nonzero; not machine-gated, for the same reason as accountsForTradeBusinessIncome.",
      "sourceRef": "Part B: Statement of Income, item (vii): \"(Attach a list showing for each property, the amount of gross and other expenses) Rent & or premium received therefrom with rates\""
    },
    {
      "id": "otherProfitsSourceDetails",
      "label": "Details of each other-profits source and the income therefrom",
      "category": "supporting-evidence",
      "required": false,
      "belongsTo": "applicant",
      "handling": "Relevant only when otherProfitsIncome is nonzero; not machine-gated, for the same reason as accountsForTradeBusinessIncome.",
      "sourceRef": "Part B: Statement of Income, item (viii): \"(Attach details of each source and the income therefrom)\""
    },
    {
      "id": "incomeSourceChangeParticulars",
      "label": "Particulars and dates of any income source acquired or ceased during the year",
      "category": "supporting-evidence",
      "required": false,
      "belongsTo": "applicant",
      "sourceRef": "Part B: Statement of Income, closing note: \"When any source of income have been acquired or have ceased during this year ended 31st December, 20 …….. (Attach particulars and dates)\""
    },
    {
      "id": "lifeAssuranceCertificateOrReceipt",
      "label": "Certificate/Receipt as evidence of premium payment",
      "category": "supporting-evidence",
      "required": false,
      "belongsTo": "applicant",
      "handling": "Relevant only when Part D (any lifeAssurancePolicy1/2 field) is used to declare a life-assurance/gratuity/NHIS/pension contribution.",
      "sourceRef": "Part D: Allowances for Life Assurance, Gratuities, NHIS and Pension Contribution, closing note: \"Certificate/Receipt as evidence of payment must be attached\""
    },
    {
      "id": "declarationStatement",
      "label": "Declaration that the information supplied is complete and correct",
      "category": "attestation",
      "required": true,
      "belongsTo": "applicant",
      "statement": "I ... hereby declare that the information supplied in this form to the best of my knowledge and belief contains correct and complete statement of the amount of income from all sources. I understand that I may have to pay financial penalties and face prosecution if I give false information.",
      "sourceRef": "Declaration (MUST BE COMPLETED AND SIGNED)"
    }
  ]
}
