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
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
- Schema document
registry/gh/gra/personal-income-tax-return-dt-0103/1.0.0/schema.jsonapplication/schema+json- Verification record
registry/gh/gra/personal-income-tax-return-dt-0103/1.0.0/VERIFICATION.mdtext/markdown- 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
-
taxOfficeenum requiredWhich 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 -
graOfficeNamestring optionalThe specific named GRA office (e.g. a named district/area office) administering this return, printed alongside the LTO/MTO/STO tick-boxes.
-
yearOfAssessmentstring requiredThe 4-digit tax year this return assesses.
pattern -
periodFromstring optionalThe 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 -
periodTostring optionalThe end of the specific day/month period within the year of assessment this return covers, printed with no year component. See periodFrom.
pattern -
surnamestring requiredThe taxpayer's surname.
classification: pii -
firstNamestring requiredThe taxpayer's first name.
classification: pii -
otherNamesstring optionalAny other/middle name(s) of the taxpayer.
classification: pii -
nationalitystring optionalThe taxpayer's nationality.
classification: pii -
personalTinstring requiredThe taxpayer's Tax Identification Number (TIN), printed alongside the Surname field.
classification: sensitive-pii -
telephoneNumberstring optionalThe taxpayer's own telephone number, printed alongside the First Name field.
classification: pii -
businessLocationDigitalAddressstring optionalThe taxpayer's business location, given either as a physical description or a GhanaPost GPS digital address.
-
businessNamestring optionalThe 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.
-
businessActivitystring optionalA description of the taxpayer's business activity.
-
businessTenancyStatusenum optionalWhether the taxpayer's business premises are rented or owned.
enum: rented | owned -
landlordNamestring optionalThe 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 -
landlordTelephoneNumberstring optionalThe landlord's telephone number(s), part of the landlord particulars required when the business premises are rented.
classification: pii -
landlordTinstring optionalThe landlord's Tax Identification Number, part of the landlord particulars required when the business premises are rented.
classification: sensitive-pii -
employerTinstring optionalThe taxpayer's employer's Tax Identification Number.
classification: sensitive-pii -
employerNamestring optionalThe taxpayer's employer's registered name.
-
employerAddressstring optionalThe taxpayer's employer's address.
-
hasBusinessIncomeboolean requiredWhether 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.
-
netBusinessIncomeOrLossnumber optionalThe 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.
-
hasEmploymentIncomeboolean requiredWhether the taxpayer earns income from employment, gating whether §4B's employment-income breakdown is completed.
-
employmentBasicSalarynumber optionalBasic salary income, item i of §4B.
range: 0–∞ -
employmentCashAllowancesnumber optionalCash allowances, item ii of §4B.
range: 0–∞ -
employmentOtherCashBenefitnumber optionalOther cash benefit, item iii of §4B.
range: 0–∞ -
employmentExcessBonusnumber optionalExcess bonus, item iv of §4B.
range: 0–∞ -
benefitInKindAccommodationnumber optionalBenefit in kind — accommodation, item 1 of §4B's Benefit in Kind sub-group.
range: 0–∞ -
benefitInKindVehiclenumber optionalBenefit in kind — vehicle, item 2 of §4B's Benefit in Kind sub-group.
range: 0–∞ -
benefitInKindOtherBenefitsnumber optionalBenefit in kind — other benefits such as loan or share benefits, item 3 of §4B's Benefit in Kind sub-group.
range: 0–∞ -
totalBenefitsInKindnumber optionalThe sum of the three Benefit in Kind sub-items (accommodation, vehicle, other), item v of §4B.
range: 0–∞ -
employmentOtherIncomenumber optionalOther 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–∞ -
totalEmploymentIncomenumber optionalThe 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–∞ -
hasInvestmentIncomeboolean requiredWhether the taxpayer has investment income, gating whether §4C's investment-and-other-income breakdown is completed.
-
investmentRoyaltynumber optionalRoyalty income, item i of §4C.
range: 0–∞ -
investmentInterestnumber optionalInterest income, item ii of §4C.
range: 0–∞ -
investmentDividendNonResidentnumber optionalDividend income received from a non-resident person, item iii of §4C.
range: 0–∞ -
investmentTaxableRentIncomenumber optionalTaxable rent income, item iv of §4C.
range: 0–∞ -
investmentForeignSourceIncomenumber optionalIncome from a foreign source, item v of §4C.
range: 0–∞ -
investmentOtherIncomenumber optionalOther investment income such as premium, annuity, or discount income, item vi of §4C.
range: 0–∞ -
totalInvestmentAndOtherIncomenumber optionalThe sum of §4C items i to vi.
range: 0–∞ -
totalIncomenumber requiredThe taxpayer's total income: the sum of §4A (business), §4B (employment), and §4C (investment and other).
-
netBusinessProfitOrLossnumber optionalThe taxpayer's net business profit or loss carried forward into the tax-computation worksheet — identical to §4A's netBusinessIncomeOrLoss.
-
addBackDepreciationnumber optionalDepreciation added back to business profit/loss.
range: 0–∞ -
addBackNonAllowableDeductionsnumber optionalNon-allowable deductions added back to business profit/loss.
range: 0–∞ -
totalAddBacksnumber optionalThe sum of the two Add Backs items (depreciation, non-allowable deductions).
range: 0–∞ -
adjustedBusinessProfitOrLossnumber optionalNet business profit/loss plus total add backs.
-
deductNonTaxableIncomenumber optionalNon-taxable income deducted from adjusted business profit/loss.
range: 0–∞ -
deductAllowableDeductionnumber optionalAllowable deductions (capital allowance, carry-forward losses, etc.) deducted from adjusted business profit/loss.
range: 0–∞ -
totalDeductionsnumber optionalThe sum of the two Deduct items (non-taxable income, allowable deduction).
range: 0–∞ -
netAdjustedBusinessProfitOrLossnumber optionalAdjusted business profit/loss (C) minus total deductions (D).
-
addTotalInvestmentIncomenumber optionalThe taxpayer's total investment and other income carried into the tax-computation worksheet — identical to §4C's totalInvestmentAndOtherIncome.
range: 0–∞ -
addTotalEmploymentIncomenumber optionalThe taxpayer's total employment income carried into the tax-computation worksheet — identical to §4B's totalEmploymentIncome.
range: 0–∞ -
totalAssessableIncomenumber requiredThe sum of net adjusted business profit/loss (E), total investment income (F), and total employment income (G).
range: 0–∞ -
incomeTaxedAtDifferentRatesnumber optionalIncome that is taxed at rates different from the standard graduated/chargeable-income rate, subtracted out before computing net assessable income.
range: 0–∞ -
netAssessableIncomenumber requiredTotal assessable income (H) minus income taxed at different rates (I).
-
reliefSocialSecuritynumber optionalRelief for social security contributions.
range: 0–∞ -
reliefMarriageResponsibilitynumber optionalRelief for marriage/responsibility.
range: 0–∞ -
reliefChildrensEducationnumber optionalRelief for up to 3 children's education.
range: 0–∞ -
reliefOldAgenumber optionalRelief for old age, for employees aged 60 years and above.
range: 0–∞ -
reliefAgedDependentsnumber optionalRelief for up to 2 aged dependants.
range: 0–∞ -
reliefDisabilitynumber optionalRelief for disability.
range: 0–∞ -
reliefCostOfTrainingnumber optionalRelief for cost of training.
range: 0–∞ -
reliefVoluntaryPensionContributionnumber optionalRelief for voluntary pension contribution to a 3rd tier provident fund.
range: 0–∞ -
reliefOtherAllowableDeductionsnumber optionalOther 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–∞ -
totalAllowableDeductionsReliefsnumber requiredThe 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–∞ -
chargeableIncomenumber requiredNet assessable income (J) minus total allowable deductions/reliefs (K).
-
taxChargednumber requiredThe tax charged on the taxpayer's chargeable income, computed by applying Ghana's personal income tax rate bands to L.
range: 0–∞ -
paymentsTaxCreditsnumber optionalTax credits applied against tax charged.
range: 0–∞ -
paymentsOnAccountnumber optionalPayments on account, from all sources, applied against tax charged.
range: 0–∞ -
totalPaymentsnumber requiredThe sum of the two Payments items (tax credits, payment on account).
range: 0–∞ -
taxPayableOrOverpaidnumber requiredTax charged (M) minus total payments (N). A negative value indicates an overpayment, per the source's own parenthetical "(OVERPAID)" convention.
-
declarationCapacityenum requiredWhether 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 -
declarantNamestring requiredThe name of the person making this declaration — the taxpayer themselves if declarationCapacity is self, or the representative if declarationCapacity is representative.
classification: pii -
taxpayerOnBehalfOfstring optionalThe name of the taxpayer this return is being made on behalf of, when declarationCapacity is representative.
classification: pii -
representativeAddressstring optionalThe representative's address, printed only in the on-behalf-of-another-person declaration branch.
classification: pii -
relationshipToTaxpayerstring optionalThe representative's relationship to the taxpayer on whose behalf the return is made.
-
declarationDatedate requiredThe date this declaration was signed. Printed once in each of the two declaration branches (a and b); a filer completes exactly one.
-
isCertifiedByRegisteredTaxPractitionerboolean optionalWhether 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:draftverification.method:manual-source-review-v1verification.lastVerifiedAt:2026-07-13maturity.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 aDT_0103-named link, finding exactlyDT_0103_personal_income_tax_return_form_v103-ver-1.1..-1.pdfembedded 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 viacurl:- HTTP 200,
Content-Type: application/pdf, 461,527 bytes. sha256:b394df0bf108c710f6d681c3b261a8af11af35623c56436fb9e77b75c91c8359(computed viasha256sumon 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.
- HTTP 200,
PDF structure, independently confirmed via pdfjs-dist@3 (legacy build)
- 4 pages, a plain print-and-fill specimen:
getFieldObjects()returnednullandpage.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 roundedy-coordinate into rows and sorted byxto 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-canvasat 2.5x scale,FONTCONFIG_PATHpointed at this sandbox's own fontconfig per this registry's established browser-screenshot precedent): page 1 threwTypeError: Image or Canvas expectedinside pdfjs-dist'spaintInlineImageXObject(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 (seeisCertifiedByRegisteredTaxPractitionerbelow).
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:
- §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) andtotalEmploymentIncome(the caption's own mismatch disclosed on the latter field'sdescription). - §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) andtotalAllowableDeductionsReliefs(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) withoutrequiredWhencoupling to §4'shasBusinessIncome/hasEmploymentIncomegates. 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, andlandlordTinare gatedrequiredWhenbusinessTenancyStatusis"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, andhasInvestmentIncomemodel 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 gatedrequiredWhenits corresponding gate istrue, 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: truewhere 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/periodTotyped asdd/mmstrings, notdate: 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, tenancyrented(exercising the landlord-particularsrequiredWhengate), and bothdocuments[]entries provided.valid-representative-employment-only.json— a representative- declared filer (exercising thetaxpayerOnBehalfOf/representativeAddress/relationshipToTaxpayerrequiredWhengates) with employment income only (hasBusinessIncome/hasInvestmentIncomebothfalse), 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— dropspersonalTin(a staticrequired: truefield) from the self-declared valid fixture.mutation-control-invalid-enum-tax-office.json— setstaxOfficeto"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 onlylandlordName, isolating therequiredWhenviolation.mutation-control-missing-conditional-total-employment-income.json— starts from the representative-declared valid fixture (hasEmploymentIncome: true) and drops onlytotalEmploymentIncome.mutation-control-missing-conditional-taxpayer-on-behalf-of.json— starts from the representative-declared valid fixture (declarationCapacity: "representative") and drops onlytaxpayerOnBehalfOf.mutation-control-invalid-pattern-year-of-assessment.json— setsyearOfAssessmentto"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.levelisnational— GRA is Ghana's national revenue authority.process.typeisfiling, matching the form's own nature as an annual tax return.process.languageisen: 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.0draftlatestthis pagehas verification recordschema.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.