Registry entry

Ghana — Personal Income Tax Return (Form DT 0103)

The Ghana Revenue Authority's (GRA) Domestic Tax Revenue Division "Personal Income Tax Return" (Form DT 0103, edition "ver 1.1"), the annual return an individual taxpayer files reporting business, employment, and investment income, computing chargeable income and tax payable, and declaring the return either personally or through a representative. Opens Ghana's Taxes vertical (previously only National ID, via gh/nia/ghana-card-application-form-1a, GOV-2510). The source is a genuine 4-page print-and-fill specimen hosted unauthenticated on gra.gov.gh's own forms listing — confirmed via pdfjs-dist to carry zero AcroForm/Widget annotations on every page — with real printed line-labels reconstructed from the extracted text layer's own (x, y) coordinates grouped into rows and sorted left-to-right, since no interactive field metadata exists to read directly. The form's own structure runs: a filing-identification header (current tax office LTO/MTO/STO, GRA office name, year of assessment, and an optional dd/mm return period); §1 Personal Information; §2 Business Information (including landlord particulars, printed as 'If rented provide particulars of Landlord' directly beneath the tenancy-status tick-boxes); §3 Employment Information; §4 Sources of Income (A. net business income/loss, B. employment income broken into basic salary/cash allowances/other cash benefit/excess bonus/benefit-in-kind sub-items/other income, C. investment and other incomes broken into royalty/interest/non-resident dividend/taxable rent/foreign-source/other, D. total income); §5 Tax Computation (a full worksheet from adjusted business profit through total assessable income, net assessable income, itemised reliefs, down to K. total allowable deductions/reliefs); and, on page 4, L. chargeable income through O. tax payable/(overpaid), followed by a two-branch Declaration (a. the taxpayer declaring on their own behalf, or b. a representative declaring on behalf of another named taxpayer). This v1.0.0 models the form's full structure end to end: 80 fields plus 2 documents[] entries (the business-income financial-statement attachment the form itself cites, and the declaration's own attestation text). Two source-form artifacts are disclosed rather than silently corrected: (1) §4B's employment-income breakdown lists items i–v then jumps straight to 'vii. Others (e.g. Director's Fees)' (no 'vi' item is printed), while the section's own total caption still reads 'TOTAL EMPLOYMENT INCOME (Sum i to vi)' — modeled verbatim as employmentOtherIncome, with the caption mismatch disclosed on totalEmploymentIncome rather than corrected; (2) §5's reliefs list runs i–viii then jumps to 'x. Other allowable deductions' (no 'ix' item is printed), while its own total caption reads 'K. Total allowable deductions/reliefs (Sum of i to ix)' — modeled verbatim as reliefOtherAllowableDeductions, with the same kind of disclosed caption/item-list mismatch on totalAllowableDeductionsReliefs. The declaration's self-filing branch prints a Signature/Date block immediately followed on the same and next line by the tokens 'OR' and 'R.T.P' — read here as a Registered Tax Practitioner co-certification option, but the exact box/checkbox mechanics could not be fully disambiguated from the text layer alone (a page-image cross-check was attempted this cycle but a pdfjs-dist/node-canvas inline-image rendering incompatibility prevented a usable render); modeled as a disclosed, best-effort boolean (isCertifiedByRegisteredTaxPractitioner) rather than invented structure. GovSchema is an independent, non-profit standards body and is not affiliated with, endorsed by, or operated by the Government of Ghana or the Ghana Revenue Authority.

Registry entry

gh/gra/personal-income-tax-return-dt-0103

Jurisdiction
Ghana · national
Version
1.0.0
Verification
draft

Authoritative source Ghana Revenue Authority, Domestic Tax Revenue Division, "Personal Income Tax Return" (Form DT 0103, edition "ver 1.1"), distributed via GRA's own forms listing at https://gra.gov.gh/forms/

Machine access

Registry catalog
registry/index.jsonone record per schema id

Field reference

80 fields, read from the published schema.json, with names, types, requiredness, and validation as the document states them. The live government form remains the authoritative source.

Fields

  • taxOffice enum required

    Which of GRA's three tax-office tiers administers this filer's return: Large Taxpayer Office (LTO), Medium Taxpayer Office (MTO), or Small Taxpayer Office (STO). Printed as a tick-one choice on the form's header.

    enum: lto | mto | sto
  • graOfficeName string optional

    The specific named GRA office (e.g. a named district/area office) administering this return, printed alongside the LTO/MTO/STO tick-boxes.

  • yearOfAssessment string required

    The 4-digit tax year this return assesses.

    pattern
  • periodFrom string optional

    The start of the specific day/month period within the year of assessment this return covers, printed with no year component — applicable when the filer's business/employment did not span the full assessment year (e.g. commencement or cessation mid-year).

    pattern
  • periodTo string optional

    The end of the specific day/month period within the year of assessment this return covers, printed with no year component. See periodFrom.

    pattern
  • surname string required

    The taxpayer's surname.

    classification: pii
  • firstName string required

    The taxpayer's first name.

    classification: pii
  • otherNames string optional

    Any other/middle name(s) of the taxpayer.

    classification: pii
  • nationality string optional

    The taxpayer's nationality.

    classification: pii
  • personalTin string required

    The taxpayer's Tax Identification Number (TIN), printed alongside the Surname field.

    classification: sensitive-pii
  • telephoneNumber string optional

    The taxpayer's own telephone number, printed alongside the First Name field.

    classification: pii
  • businessLocationDigitalAddress string optional

    The taxpayer's business location, given either as a physical description or a GhanaPost GPS digital address.

  • businessName string optional

    The registered name(s) of the taxpayer's business. The source notes that a taxpayer with more than one business should provide the same information on a separate sheet, out of scope for this v1.0.0's single-business modeling.

  • businessActivity string optional

    A description of the taxpayer's business activity.

  • businessTenancyStatus enum optional

    Whether the taxpayer's business premises are rented or owned.

    enum: rented | owned
  • landlordName string optional

    The landlord's name, required only when the business premises are rented, per the source's own instruction printed directly beneath the tenancy tick-boxes.

    classification: pii
  • landlordTelephoneNumber string optional

    The landlord's telephone number(s), part of the landlord particulars required when the business premises are rented.

    classification: pii
  • landlordTin string optional

    The landlord's Tax Identification Number, part of the landlord particulars required when the business premises are rented.

    classification: sensitive-pii
  • employerTin string optional

    The taxpayer's employer's Tax Identification Number.

    classification: sensitive-pii
  • employerName string optional

    The taxpayer's employer's registered name.

  • employerAddress string optional

    The taxpayer's employer's address.

  • hasBusinessIncome boolean required

    Whether the taxpayer earns income from business, gating whether §4A's net business income/loss is completed. Printed in the source as an unlabeled tick-box pair (not extractable as text on a non-AcroForm specimen) alongside the prompt; the prompt's own 'If No proceed to B' instruction is the basis for this field.

  • netBusinessIncomeOrLoss number optional

    The taxpayer's net business income or loss, as per the financial statement attached (see the financialStatementAttachment document). May be negative in the case of a loss.

  • hasEmploymentIncome boolean required

    Whether the taxpayer earns income from employment, gating whether §4B's employment-income breakdown is completed.

  • employmentBasicSalary number optional

    Basic salary income, item i of §4B.

    range: 0–∞
  • employmentCashAllowances number optional

    Cash allowances, item ii of §4B.

    range: 0–∞
  • employmentOtherCashBenefit number optional

    Other cash benefit, item iii of §4B.

    range: 0–∞
  • employmentExcessBonus number optional

    Excess bonus, item iv of §4B.

    range: 0–∞
  • benefitInKindAccommodation number optional

    Benefit in kind — accommodation, item 1 of §4B's Benefit in Kind sub-group.

    range: 0–∞
  • benefitInKindVehicle number optional

    Benefit in kind — vehicle, item 2 of §4B's Benefit in Kind sub-group.

    range: 0–∞
  • benefitInKindOtherBenefits number optional

    Benefit in kind — other benefits such as loan or share benefits, item 3 of §4B's Benefit in Kind sub-group.

    range: 0–∞
  • totalBenefitsInKind number optional

    The sum of the three Benefit in Kind sub-items (accommodation, vehicle, other), item v of §4B.

    range: 0–∞
  • employmentOtherIncome number optional

    Other employment income such as director's fees. Printed in the source as item 'vii' immediately following item 'v' (Total Benefits in kind) — no item 'vi' is printed anywhere on the form; see totalEmploymentIncome for the resulting caption/item-list mismatch this leaves in the source.

    range: 0–∞
  • totalEmploymentIncome number optional

    The total of the §4B employment-income items. The source's own caption reads "Sum i to vi", but the printed item list itself has no 'vi' and instead runs i–v then 'vii' (employmentOtherIncome) — disclosed here as a verbatim source artifact (an apparently stale caption) rather than silently corrected; this field is modeled as the sum of every §4B item actually printed (i through v and vii).

    range: 0–∞
  • hasInvestmentIncome boolean required

    Whether the taxpayer has investment income, gating whether §4C's investment-and-other-income breakdown is completed.

  • investmentRoyalty number optional

    Royalty income, item i of §4C.

    range: 0–∞
  • investmentInterest number optional

    Interest income, item ii of §4C.

    range: 0–∞
  • investmentDividendNonResident number optional

    Dividend income received from a non-resident person, item iii of §4C.

    range: 0–∞
  • investmentTaxableRentIncome number optional

    Taxable rent income, item iv of §4C.

    range: 0–∞
  • investmentForeignSourceIncome number optional

    Income from a foreign source, item v of §4C.

    range: 0–∞
  • investmentOtherIncome number optional

    Other investment income such as premium, annuity, or discount income, item vi of §4C.

    range: 0–∞
  • totalInvestmentAndOtherIncome number optional

    The sum of §4C items i to vi.

    range: 0–∞
  • totalIncome number required

    The taxpayer's total income: the sum of §4A (business), §4B (employment), and §4C (investment and other).

  • netBusinessProfitOrLoss number optional

    The taxpayer's net business profit or loss carried forward into the tax-computation worksheet — identical to §4A's netBusinessIncomeOrLoss.

  • addBackDepreciation number optional

    Depreciation added back to business profit/loss.

    range: 0–∞
  • addBackNonAllowableDeductions number optional

    Non-allowable deductions added back to business profit/loss.

    range: 0–∞
  • totalAddBacks number optional

    The sum of the two Add Backs items (depreciation, non-allowable deductions).

    range: 0–∞
  • adjustedBusinessProfitOrLoss number optional

    Net business profit/loss plus total add backs.

  • deductNonTaxableIncome number optional

    Non-taxable income deducted from adjusted business profit/loss.

    range: 0–∞
  • deductAllowableDeduction number optional

    Allowable deductions (capital allowance, carry-forward losses, etc.) deducted from adjusted business profit/loss.

    range: 0–∞
  • totalDeductions number optional

    The sum of the two Deduct items (non-taxable income, allowable deduction).

    range: 0–∞
  • netAdjustedBusinessProfitOrLoss number optional

    Adjusted business profit/loss (C) minus total deductions (D).

  • addTotalInvestmentIncome number optional

    The taxpayer's total investment and other income carried into the tax-computation worksheet — identical to §4C's totalInvestmentAndOtherIncome.

    range: 0–∞
  • addTotalEmploymentIncome number optional

    The taxpayer's total employment income carried into the tax-computation worksheet — identical to §4B's totalEmploymentIncome.

    range: 0–∞
  • totalAssessableIncome number required

    The sum of net adjusted business profit/loss (E), total investment income (F), and total employment income (G).

    range: 0–∞
  • incomeTaxedAtDifferentRates number optional

    Income that is taxed at rates different from the standard graduated/chargeable-income rate, subtracted out before computing net assessable income.

    range: 0–∞
  • netAssessableIncome number required

    Total assessable income (H) minus income taxed at different rates (I).

  • reliefSocialSecurity number optional

    Relief for social security contributions.

    range: 0–∞
  • reliefMarriageResponsibility number optional

    Relief for marriage/responsibility.

    range: 0–∞
  • reliefChildrensEducation number optional

    Relief for up to 3 children's education.

    range: 0–∞
  • reliefOldAge number optional

    Relief for old age, for employees aged 60 years and above.

    range: 0–∞
  • reliefAgedDependents number optional

    Relief for up to 2 aged dependants.

    range: 0–∞
  • reliefDisability number optional

    Relief for disability.

    range: 0–∞
  • reliefCostOfTraining number optional

    Relief for cost of training.

    range: 0–∞
  • reliefVoluntaryPensionContribution number optional

    Relief for voluntary pension contribution to a 3rd tier provident fund.

    range: 0–∞
  • reliefOtherAllowableDeductions number optional

    Other allowable deductions. Printed in the source as item 'x' immediately following item 'viii' (Voluntary Pension contribution) — no item 'ix' is printed anywhere on the form; see totalAllowableDeductionsReliefs for the resulting caption/item-list mismatch this leaves in the source.

    range: 0–∞
  • totalAllowableDeductionsReliefs number required

    The total of the §5 Reliefs items. The source's own caption reads "Sum of i to ix", but the printed item list itself has no 'ix' and instead runs i–viii then 'x' (reliefOtherAllowableDeductions) — disclosed here as a verbatim source artifact (an apparently stale caption) rather than silently corrected; this field is modeled as the sum of every Reliefs item actually printed (i through viii and x).

    range: 0–∞
  • chargeableIncome number required

    Net assessable income (J) minus total allowable deductions/reliefs (K).

  • taxCharged number required

    The tax charged on the taxpayer's chargeable income, computed by applying Ghana's personal income tax rate bands to L.

    range: 0–∞
  • paymentsTaxCredits number optional

    Tax credits applied against tax charged.

    range: 0–∞
  • paymentsOnAccount number optional

    Payments on account, from all sources, applied against tax charged.

    range: 0–∞
  • totalPayments number required

    The sum of the two Payments items (tax credits, payment on account).

    range: 0–∞
  • taxPayableOrOverpaid number required

    Tax charged (M) minus total payments (N). A negative value indicates an overpayment, per the source's own parenthetical "(OVERPAID)" convention.

  • declarationCapacity enum required

    Whether this return is declared by the taxpayer personally (self), or by a representative on behalf of the taxpayer, per the form's own two mutually-exclusive declaration branches.

    enum: self | representative
  • declarantName string required

    The name of the person making this declaration — the taxpayer themselves if declarationCapacity is self, or the representative if declarationCapacity is representative.

    classification: pii
  • taxpayerOnBehalfOf string optional

    The name of the taxpayer this return is being made on behalf of, when declarationCapacity is representative.

    classification: pii
  • representativeAddress string optional

    The representative's address, printed only in the on-behalf-of-another-person declaration branch.

    classification: pii
  • relationshipToTaxpayer string optional

    The representative's relationship to the taxpayer on whose behalf the return is made.

  • declarationDate date required

    The date this declaration was signed. Printed once in each of the two declaration branches (a and b); a filer completes exactly one.

  • isCertifiedByRegisteredTaxPractitioner boolean optional

    Whether this return's self-declaration branch (a) is co-certified by a Registered Tax Practitioner. The source prints a Signature/Date block in declaration branch (a) immediately followed by the tokens "OR" and "R.T.P." on the same and next printed line; the exact box/checkbox mechanics of this R.T.P. co-certification option could not be fully disambiguated from the extracted text layer alone (a page-image cross-check was attempted but did not produce a usable render this cycle — see VERIFICATION.md), so this is modeled as a single disclosed, best-effort boolean rather than an invented multi-field structure.

Verification record

This file is the source-review record for this document version, per the manual-source-review-v1 practice.

Current claim

  • status: draft
  • verification.method: manual-source-review-v1
  • verification.lastVerifiedAt: 2026-07-13
  • maturity.level: structural-reference

This is GovSchema Standard Research cycle GOV-2697 (parent research cycle GOV-2695, which scouted Ghana's 5 remaining open verticals in parallel — Ghana opened as the 41st jurisdiction via GOV-2510, National ID only). This schema opens Ghana's Taxes vertical.

Source verification (independently re-derived, not copied from the task briefing)

  • Re-confirmed the exact PDF filename against GRA's own live forms listing rather than trusting the task briefing's pre-scouted filename verbatim: curl -s https://gra.gov.gh/forms/ (HTTP 200), then grepped the returned HTML for a DT_0103-named link, finding exactly DT_0103_personal_income_tax_return_form_v103-ver-1.1..-1.pdf embedded in the listing.
  • PDF source: https://gra.gov.gh/wp-content/uploads/2020/09/DT_0103_personal_income_tax_return_form_v103-ver-1.1..-1.pdf — fetched independently this cycle via curl:
    • HTTP 200, Content-Type: application/pdf, 461,527 bytes.
    • sha256: b394df0bf108c710f6d681c3b261a8af11af35623c56436fb9e77b75c91c8359 (computed via sha256sum on the freshly-downloaded file).
    • Both the byte count and hash independently match the task briefing's own pre-scouted figures exactly, confirming the specimen has not changed since that scouting pass.

PDF structure, independently confirmed via pdfjs-dist@3 (legacy build)

  • 4 pages, a plain print-and-fill specimen: getFieldObjects() returned null and page.getAnnotations({intent: "display"}) returned zero Widget-subtype annotations across all 4 pages — confirmed, not assumed from the task briefing's own characterization.
  • getTextContent() returned a full, clean, English-only text layer on every page. Every text item's (x, y) transform was grouped by rounded y-coordinate into rows and sorted by x to reconstruct the source's own line breaks and column layout — the full per-page, per-row transcript was read in full before modeling any field.
  • Attempted page-image cross-check (pdfjs-dist + node-canvas at 2.5x scale, FONTCONFIG_PATH pointed at this sandbox's own fontconfig per this registry's established browser-screenshot precedent): page 1 threw TypeError: Image or Canvas expected inside pdfjs-dist's paintInlineImageXObject (almost certainly the GRA letterhead crest, an inline image XObject this pdfjs-dist/node-canvas combination cannot rasterize in this sandbox); page 4 (the Declaration page, printed with no images) rendered without throwing but produced a blank white canvas — no usable visual cross-check was obtained for any page this cycle. Every field below is derived from the text-layer transcript alone, and the one place this genuinely matters — the Signature/Date/"OR"/"R.T.P" block on page 4's self-declaration branch — is disclosed explicitly rather than resolved by invented visual structure (see isCertifiedByRegisteredTaxPractitioner below).

Field derivation

The form's structure, reconstructed by row (English-only, verified via getTextContent() positions):

Page 1 — header (Ghana Revenue Authority, Domestic Tax Revenue Division, Personal Income Tax Return; Current Tax Office LTO/MTO/STO tick-one + Name of GRA Office; Year of Assessment; Period From/To dd/mm); §1 Personal Information (Surname/TIN, First Name/Telephone No., Other Name(s), Nationality); §2 Business Information (Location/GhanaPost Digital Address; Business Name(s)/Business Activity; "If more than ONE provide the same information on a separate sheet"; Tenancy status of Business Rented/Owned + "(If rented provide particulars of Landlord)"; Name of Landlord; Telephone Number(s); TIN); §3 Employment Information (TIN of Employer, Name of Employer, Address).

Page 2 — §4 Sources of Income: "(Do you earn income from business? If No proceed to B)"; A. Net Business Income/Loss (As per financial Statement attached); "(Do you earn income from employment? If No proceed to C)"; B. Employment Income (i. Basic salary, ii. Cash Allowances, iii. Other Cash Benefit, iv. Excess Bonus, Benefit in Kind [1. Accommodation Benefit, 2. Vehicle Benefit, 3. Others e.g. Loan Benefit & Share Benefit etc.], v. Total Benefits in kind, vii. Others (e.g. Director's Fees), TOTAL EMPLOYMENT INCOME (Sum i to vi)); "Do you any investment income? (If No proceed to D)"; C. Investment and Other Incomes (i. Royalty, ii. Interest, iii. Dividend (Received from Non-Resident Person), iv. Taxable Rent Income, v. Income from Foreign Source, vi. Other, TOTAL INVESTMENT INCOME & OTHER INCOMES); D. TOTAL INCOME.

Page 3 — §5 Tax Computation: A. Net Business Profit/Loss (Same as 4A); Add Backs (i. Depreciation, ii. Non-allowable deductions); B. Total Add Backs; C. Adjusted Business Profit/Loss; Deduct (i. Non-Taxable income, ii. Allowable Deduction); D. Total Deductions; E. Net Adjusted Business Profit/Loss; F. Add Total Investment Income (same as 4C); G. Add Total Employment Income (same as 4B); H. Total Assessable Income; I. Income Taxed at Different Rates; J. Net Assessable Income; Deduct: Reliefs (i. Social Security, ii. Marriage/Responsibility, iii. Children's education, iv. Old Age, v. Aged Dependents, vi. Disability, vii. Cost of Training, viii. Voluntary Pension contribution, x. Other allowable deductions); K. Total allowable deductions/reliefs (Sum of i to ix).

Page 4 — L. Chargeable Income (5J – 5K); M. Tax Charged; Less Payments (i. Tax Credits, ii. Payment on Account (All Sources)); N. Total Payments; O. Tax Payable/(Overpaid); DECLARATION — a. For persons making return on their own behalf ("I, ___ do hereby declare..."; Signature/Date; "OR" / "R.T.P"); b. For persons making return on behalf of another person ("I ___ on behalf of ___ do hereby declare..."; Address; Signature; Relationship to taxpayer; Date).

Every printed field was mapped to one of this schema's 80 fields[] entries or 2 documents[] entries. See the schema's own sourceRef on each field for the exact page/section/label it was read from.

Disclosed source-form artifacts (not silently corrected)

Two apparent stale-caption artifacts in the source PDF itself, each modeled verbatim rather than corrected, consistent with this registry's established precedent (e.g. gr/aade's own disclosed code-to-label ambiguities) of modeling what the source actually prints:

  1. §4B employment-income breakdown: the printed item list runs i–v then jumps directly to "vii. Others (e.g. Director's Fees)" — no "vi" item is printed anywhere in the extracted text — while the section's own total caption still reads "TOTAL EMPLOYMENT INCOME (Sum i to vi)". Modeled as employmentOtherIncome (item vii) and totalEmploymentIncome (the caption's own mismatch disclosed on the latter field's description).
  2. §5 Reliefs: the printed item list runs i–viii then jumps directly to "x. Other allowable deductions" — no "ix" item is printed — while its own total caption reads "K. Total allowable deductions/reliefs (Sum of i to ix)". Modeled as reliefOtherAllowableDeductions (item x) and totalAllowableDeductionsReliefs (the same kind of disclosed mismatch).

Scoping and modeling judgment calls

  • §2/§3 header fields not gated to §4's yes/no questions: Business Information (businessName, businessActivity, etc.) and Employment Information (employerName, employerTin, etc.) fields are modeled as optional (required: false) without requiredWhen coupling to §4's hasBusinessIncome/hasEmploymentIncome gates. The source's own "If No proceed to..." instructions gate only the §4 income-*amount* entries themselves, not explicitly the §2/§3 identification fields — a filer could plausibly complete §2/§3 (e.g. to record a dormant business) while still answering "No" in §4. The natural applicability relationship is disclosed here narratively rather than encoded as an invented hard rule.
  • Landlord particulars gated to tenancy status: landlordName, landlordTelephoneNumber, and landlordTin are gated requiredWhen businessTenancyStatus is "rented", directly matching the source's own printed instruction "(If rented provide particulars of Landlord)" immediately beneath the tenancy tick-boxes — the task briefing's own description independently corroborates this as "landlord particulars."
  • §4 gating booleans and their totals: hasBusinessIncome, hasEmploymentIncome, and hasInvestmentIncome model the source's own unlabeled Yes/No tick-box pairs (not extractable as text on a non-AcroForm specimen, consistent with this registry's established pattern for tick-box gates); each section's headline total (netBusinessIncomeOrLoss, totalEmploymentIncome, totalInvestmentAndOtherIncome) is gated requiredWhen its corresponding gate is true, directly matching the source's own explicit "if No proceed to [next section]" skip instructions. The itemised breakdown lines beneath each total are left optional individually since not every filer has every sub-category of income.
  • §5 worksheet requiredness: the lettered subtotal/total lines (A, C, E, H, J, K, and page 4's L/M/N/O) are modeled required: true where they represent a mandatory bottom-line computation every filer must reach, while the itemised numbered add-back/deduction/relief lines beneath them are optional, since a given filer will not have every add-back or relief category.
  • isCertifiedByRegisteredTaxPractitioner — disclosed best-effort field: page 4's self-declaration branch prints a Signature/Date block immediately followed by the tokens "OR" and "R.T.P" on the same and next printed line. Read here as a Registered Tax Practitioner co-certification option, but — since the page-image cross-check did not produce a usable render this cycle (see above) — the exact box/checkbox mechanics (e.g. whether R.T.P. has its own name/registration-number sub-fields) could not be fully disambiguated from the text layer alone. Modeled as a single disclosed boolean rather than invented multi-field structure; a future cycle with a working page render should revisit this.
  • periodFrom/periodTo typed as dd/mm strings, not date: the source prints no year component for this field, so it cannot represent a full calendar date; modeled as a pattern-constrained string instead.

Conformance run

Two hand-authored valid fixtures under conformance/gh/gra/personal-income-tax-return-dt-0103/1.0.0/:

  • valid-self-declared-full-income.json — a self-declared filer with business, employment, and investment income all present, tenancy rented (exercising the landlord-particulars requiredWhen gate), and both documents[] entries provided.
  • valid-representative-employment-only.json — a representative- declared filer (exercising the taxpayerOnBehalfOf/representativeAddress/ relationshipToTaxpayer requiredWhen gates) with employment income only (hasBusinessIncome/hasInvestmentIncome both false), so the business/investment totals and the financial-statement document are correctly absent.

Both were checked with a from-scratch Node conformance checker (check_conformance.mjs, not committed — a disposable script, per this registry's own established practice) implementing this schema's own required/requiredWhen/type/validation.enum/validation.pattern/ validation.minimum grammar directly against spec/v0.3/SPEC.md's rules:

`` $ node check_conformance.mjs schema.json \ valid-self-declared-full-income.json \ valid-representative-employment-only.json valid-self-declared-full-income.json: 0 error(s) valid-representative-employment-only.json: 0 error(s) ``

Six mutation-control fixtures, each isolated to raise exactly one error:

  • mutation-control-missing-personal-tin.json — drops personalTin (a static required: true field) from the self-declared valid fixture.
  • mutation-control-invalid-enum-tax-office.json — sets taxOffice to "xto", not one of the enum's 3 values.
  • mutation-control-missing-conditional-landlord-name.json — starts from the self-declared valid fixture (businessTenancyStatus: "rented") and drops only landlordName, isolating the requiredWhen violation.
  • mutation-control-missing-conditional-total-employment-income.json — starts from the representative-declared valid fixture (hasEmploymentIncome: true) and drops only totalEmploymentIncome.
  • mutation-control-missing-conditional-taxpayer-on-behalf-of.json — starts from the representative-declared valid fixture (declarationCapacity: "representative") and drops only taxpayerOnBehalfOf.
  • mutation-control-invalid-pattern-year-of-assessment.json — sets yearOfAssessment to "20255" (5 digits), violating the field's ^[0-9]{4}$ pattern.

`` $ node check_conformance.mjs schema.json \ mutation-control-missing-personal-tin.json \ mutation-control-invalid-enum-tax-office.json \ mutation-control-missing-conditional-landlord-name.json \ mutation-control-missing-conditional-total-employment-income.json \ mutation-control-missing-conditional-taxpayer-on-behalf-of.json \ mutation-control-invalid-pattern-year-of-assessment.json mutation-control-missing-personal-tin.json: 1 error(s) - personalTin: required but missing mutation-control-invalid-enum-tax-office.json: 1 error(s) - taxOffice: value "xto" not in enum ["lto","mto","sto"] mutation-control-missing-conditional-landlord-name.json: 1 error(s) - landlordName: required but missing mutation-control-missing-conditional-total-employment-income.json: 1 error(s) - totalEmploymentIncome: required but missing mutation-control-missing-conditional-taxpayer-on-behalf-of.json: 1 error(s) - taxpayerOnBehalfOf: required but missing mutation-control-invalid-pattern-year-of-assessment.json: 1 error(s) - yearOfAssessment: value "20255" does not match pattern ^[0-9]{4}$ ``

All six negative controls raised exactly one error each, and neither valid scenario raised an unexpected error.

Both registry validators were run against the schema document and pass:

``` $ node tools/validate.mjs registry/gh/gra/personal-income-tax-return-dt-0103/1.0.0/schema.json ok registry/gh/gra/personal-income-tax-return-dt-0103/1.0.0/schema.json 1/1 document(s) passed.

$ node tools/validate-ajv.mjs registry/gh/gra/personal-income-tax-return-dt-0103/1.0.0/schema.json ok registry/gh/gra/personal-income-tax-return-dt-0103/1.0.0/schema.json [v0.3] 1/1 document(s) validated against the meta-schema (ajv 2020-12). ```

(tools/node_modules did not have ajv/ajv-formats present in this worktree at the start of this cycle; ran npm ci --include=dev inside tools/ first, per this registry's own known NODE_ENV=production gotcha.)

tools/govschema-client/registry-index.json was regenerated via npm run build-index inside tools/govschema-client/.

Scope and jurisdiction notes

  • Opens Ghana's Taxes vertical; National ID (gh/nia) is already published. DMV, Passport, Visa, and Business Formation remain open backlog per GOV-2695's parallel scouting pass.
  • jurisdiction.level is national — GRA is Ghana's national revenue authority.
  • process.type is filing, matching the form's own nature as an annual tax return.
  • process.language is en: the form's full text layer is entirely in English, with no other language present anywhere in the extracted text.

Re-verification

Per the practice's cadence, nextReviewBy is set to 2027-01-13 (6 months). A future review should prioritize: (1) confirming the specimen has not been silently replaced with a revised edition (this cycle's byte count/hash both matched the pre-scouted figures exactly, so no drift has occurred yet); (2) re-attempting the page-image render (with a fixed pdfjs-dist/node-canvas combination or an alternative renderer) to visually resolve the isCertifiedByRegisteredTaxPractitioner ambiguity; (3) whether a future cycle wants to author Ghana's remaining open verticals (DMV, Passport, Visa, Business Formation) as companion schemas.

View the raw record (VERIFICATION.md)

Version history

  • 1.0.0 draft latest this page has verification record schema.json

Independent and non-affiliated

GovSchema is an independent, open-source project. This reference is not produced, reviewed, or endorsed by Ghana Revenue Authority or any government. The authoritative source is always the live government form and its official instructions.