Registry entry

Bosnia and Herzegovina (Republika Srpska) — Annual Tax Return for Income Tax (Form 1004)

The Tax Administration of Republika Srpska's (Poreska uprava Republike Srpske, PURS), part of the Ministry of Finance, Form 1004, Годишња пореска пријава за порез на доходак (Annual Tax Return for Income Tax) — opens Bosnia and Herzegovina's Taxes vertical (3 of 6). Republika Srpska is one of Bosnia and Herzegovina's constituent entities (the other being the Federation of Bosnia and Herzegovina, plus the Brčko District); this schema is scoped to Republika Srpska only, consistent with this registry's existing ba/apif and ba/mup-rs schemas. Individual taxpayers who realize income from more than one of six income categories in a tax year (personal earnings/employment, copyright income, capital income, capital gains, self-employment income, and other income) must file this annual reconciliation return, per Article 41 of Republika Srpska's Law on Income Tax. GovSchema is an independent, non-profit standards body and is not affiliated with, endorsed by, or operated by the Government of Bosnia and Herzegovina, the Government of Republika Srpska, or the Tax Administration of Republika Srpska.

Registry entry

ba/purs/annual-income-tax-return

Jurisdiction
Bosnia and Herzegovina · Republika Srpska (subnational)
Version
1.0.0
Verification
draft

Authoritative source Образац 1004 — "Годишња пореска пријава за порез на доходак" (Form 1004 — Annual Tax Return for Income Tax)

Machine access

Schema document
registry/ba/purs/annual-income-tax-return/1.0.0/schema.jsonapplication/schema+json
Registry catalog
registry/index.jsonone record per schema id

Field reference

93 fields across 4 steps, 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.

Одјељак 1 – Подаци о пореском обвезнику (Taxpayer data)

  • taxpayerId string required

    The taxpayer's unique personal identification number (JMB, for a natural person) or unique identification number (JIB, e.g. for a self-employed/registered entrepreneur), printed as a 13-box comb field.

    length: 1–20classification: sensitive-pii
  • filingType enum required

    Whether this is a basic (original) annual return or an amended return correcting a previously filed one.

    enum: basic | amended
  • amendedFilingBarcode string optional

    The protocol/barcode number of the original (basic) filing being corrected. The form's own instruction (matching the Tax Administration's XML e-filing guide for the same form family) states this is filled in only when submitting an amended return, and left blank for a basic return.

    length: 1–20
  • municipalityCode string required

    The 3-digit code of the municipality where the taxpayer is registered for this return, printed as a 3-box comb field.

    length: 1–10
  • fullName string required

    The taxpayer's full given name and surname.

    length: 1–300classification: pii
  • address string required

    The taxpayer's address.

    length: 1–300classification: pii
  • phone string optional

    The taxpayer's contact telephone number.

    length: 1–60classification: pii
  • email string optional

    The taxpayer's email address.

    patternlength: 0–200classification: pii
  • taxPeriodFrom date required

    Start date of the tax period this annual return covers. The form prints two stacked DD/MM/20YY box rows under "Порески период" with no printed "Од"/"До" labels; a worked example published by the Tax Administration alongside this same form ("Primjer popunjavanja obrasca 1004") confirms the upper row is the period start and the lower row the period end, each in day/month/year order with the "20" century prefix pre-printed and only the last two year digits taxpayer-entered — see this document's own VERIFICATION.md.

  • taxPeriodTo date required

    End date of the tax period this annual return covers (typically 31 December of the tax year, but the box structure accommodates a partial-year period). See taxPeriodFrom's own description and this document's VERIFICATION.md for the source's box-layout ambiguity and how it was resolved.

Одјељак 2 - Доходак (Income)

  • personalEarningsMunicipality string optional

    Section 2 (Одјељак 2 - Доходак), row 1 "Лична примања", column 3 "Општина".

    length: 1–100
  • personalEarningsRevenue number optional

    Section 2 (Одјељак 2 - Доходак), row 1 "Лична примања", column 4 "Приход".

    range: 0–∞
  • personalEarningsExpense number optional

    Section 2 (Одјељак 2 - Доходак), row 1 "Лична примања", column 5 "Расход".

    range: 0–∞
  • personalEarningsIncome number optional

    Section 2 (Одјељак 2 - Доходак), row 1 "Лична примања", column 6 "Доходак (4 – 5)".

  • personalEarningsTaxBaseReduction number optional

    Section 2 (Одјељак 2 - Доходак), row 1 "Лична примања", column 7 "Умањење пореске основице".

    range: 0–∞
  • personalEarningsTaxBase number optional

    Section 2 (Одјељак 2 - Доходак), row 1 "Лична примања", column 9 "Основица за порез 6 – (7 + 8)".

  • personalEarningsCalculatedTax number optional

    Section 2 (Одјељак 2 - Доходак), row 1 "Лична примања", column 10 "Обрачунат".

    range: 0–∞
  • personalEarningsPaidTax number optional

    Section 2 (Одјељак 2 - Доходак), row 1 "Лична примања", column 11 "Уплаћен".

    range: 0–∞
  • personalEarningsTaxCredit number optional

    Section 2 (Одјељак 2 - Доходак), row 1 "Лична примања", column 12 "Порески кредит".

    range: 0–∞
  • personalEarningsTaxDifference number optional

    Section 2 (Одјељак 2 - Доходак), row 1 "Лична примања", column 13 "Разлика 10 – (11 + 12)".

  • personalEarningsIncomeAfterTax number optional

    Section 2 (Одјељак 2 - Доходак), row 1 "Лична примања", column 14 "Доходак послије опорезивања (6– 10)".

  • copyrightIncomeMunicipality string optional

    Section 2 (Одјељак 2 - Доходак), row 2 "Доходак од ауторских права", column 3 "Општина".

    length: 1–100
  • copyrightIncomeRevenue number optional

    Section 2 (Одјељак 2 - Доходак), row 2 "Доходак од ауторских права", column 4 "Приход".

    range: 0–∞
  • copyrightIncomeExpense number optional

    Section 2 (Одјељак 2 - Доходак), row 2 "Доходак од ауторских права", column 5 "Расход".

    range: 0–∞
  • copyrightIncomeIncome number optional

    Section 2 (Одјељак 2 - Доходак), row 2 "Доходак од ауторских права", column 6 "Доходак (4 – 5)".

  • copyrightIncomeTaxBaseReduction number optional

    Section 2 (Одјељак 2 - Доходак), row 2 "Доходак од ауторских права", column 7 "Умањење пореске основице".

    range: 0–∞
  • copyrightIncomeTaxBase number optional

    Section 2 (Одјељак 2 - Доходак), row 2 "Доходак од ауторских права", column 9 "Основица за порез 6 – (7 + 8)".

  • copyrightIncomeCalculatedTax number optional

    Section 2 (Одјељак 2 - Доходак), row 2 "Доходак од ауторских права", column 10 "Обрачунат".

    range: 0–∞
  • copyrightIncomePaidTax number optional

    Section 2 (Одјељак 2 - Доходак), row 2 "Доходак од ауторских права", column 11 "Уплаћен".

    range: 0–∞
  • copyrightIncomeTaxCredit number optional

    Section 2 (Одјељак 2 - Доходак), row 2 "Доходак од ауторских права", column 12 "Порески кредит".

    range: 0–∞
  • copyrightIncomeTaxDifference number optional

    Section 2 (Одјељак 2 - Доходак), row 2 "Доходак од ауторских права", column 13 "Разлика 10 – (11 + 12)".

  • copyrightIncomeIncomeAfterTax number optional

    Section 2 (Одјељак 2 - Доходак), row 2 "Доходак од ауторских права", column 14 "Доходак послије опорезивања (6– 10)".

  • capitalIncomeMunicipality string optional

    Section 2 (Одјељак 2 - Доходак), row 3 "Доходак од капитала", column 3 "Општина".

    length: 1–100
  • capitalIncomeRevenue number optional

    Section 2 (Одјељак 2 - Доходак), row 3 "Доходак од капитала", column 4 "Приход".

    range: 0–∞
  • capitalIncomeExpense number optional

    Section 2 (Одјељак 2 - Доходак), row 3 "Доходак од капитала", column 5 "Расход".

    range: 0–∞
  • capitalIncomeIncome number optional

    Section 2 (Одјељак 2 - Доходак), row 3 "Доходак од капитала", column 6 "Доходак (4 – 5)".

  • capitalIncomeTaxBaseReduction number optional

    Section 2 (Одјељак 2 - Доходак), row 3 "Доходак од капитала", column 7 "Умањење пореске основице".

    range: 0–∞
  • capitalIncomeTaxBase number optional

    Section 2 (Одјељак 2 - Доходак), row 3 "Доходак од капитала", column 9 "Основица за порез 6 – (7 + 8)".

  • capitalIncomeCalculatedTax number optional

    Section 2 (Одјељак 2 - Доходак), row 3 "Доходак од капитала", column 10 "Обрачунат".

    range: 0–∞
  • capitalIncomePaidTax number optional

    Section 2 (Одјељак 2 - Доходак), row 3 "Доходак од капитала", column 11 "Уплаћен".

    range: 0–∞
  • capitalIncomeTaxCredit number optional

    Section 2 (Одјељак 2 - Доходак), row 3 "Доходак од капитала", column 12 "Порески кредит".

    range: 0–∞
  • capitalIncomeTaxDifference number optional

    Section 2 (Одјељак 2 - Доходак), row 3 "Доходак од капитала", column 13 "Разлика 10 – (11 + 12)".

  • capitalIncomeIncomeAfterTax number optional

    Section 2 (Одјељак 2 - Доходак), row 3 "Доходак од капитала", column 14 "Доходак послије опорезивања (6– 10)".

  • capitalGainMunicipality string optional

    Section 2 (Одјељак 2 - Доходак), row 4 "Капитални добитак", column 3 "Општина".

    length: 1–100
  • capitalGainRevenue number optional

    Section 2 (Одјељак 2 - Доходак), row 4 "Капитални добитак", column 4 "Приход".

    range: 0–∞
  • capitalGainExpense number optional

    Section 2 (Одјељак 2 - Доходак), row 4 "Капитални добитак", column 5 "Расход".

    range: 0–∞
  • capitalGainIncome number optional

    Section 2 (Одјељак 2 - Доходак), row 4 "Капитални добитак", column 6 "Доходак (4 – 5)".

  • capitalGainTaxBaseReduction number optional

    Section 2 (Одјељак 2 - Доходак), row 4 "Капитални добитак", column 7 "Умањење пореске основице".

    range: 0–∞
  • capitalGainTaxBase number optional

    Section 2 (Одјељак 2 - Доходак), row 4 "Капитални добитак", column 9 "Основица за порез 6 – (7 + 8)".

  • capitalGainCalculatedTax number optional

    Section 2 (Одјељак 2 - Доходак), row 4 "Капитални добитак", column 10 "Обрачунат".

    range: 0–∞
  • capitalGainPaidTax number optional

    Section 2 (Одјељак 2 - Доходак), row 4 "Капитални добитак", column 11 "Уплаћен".

    range: 0–∞
  • capitalGainTaxCredit number optional

    Section 2 (Одјељак 2 - Доходак), row 4 "Капитални добитак", column 12 "Порески кредит".

    range: 0–∞
  • capitalGainTaxDifference number optional

    Section 2 (Одјељак 2 - Доходак), row 4 "Капитални добитак", column 13 "Разлика 10 – (11 + 12)".

  • capitalGainIncomeAfterTax number optional

    Section 2 (Одјељак 2 - Доходак), row 4 "Капитални добитак", column 14 "Доходак послије опорезивања (6– 10)".

  • selfEmploymentIncomeMunicipality string optional

    Section 2 (Одјељак 2 - Доходак), row 5 "Доходак од самосталне дјелатности", column 3 "Општина".

    length: 1–100
  • selfEmploymentIncomeRevenue number optional

    Section 2 (Одјељак 2 - Доходак), row 5 "Доходак од самосталне дјелатности", column 4 "Приход".

    range: 0–∞
  • selfEmploymentIncomeExpense number optional

    Section 2 (Одјељак 2 - Доходак), row 5 "Доходак од самосталне дјелатности", column 5 "Расход".

    range: 0–∞
  • selfEmploymentIncomeIncome number optional

    Section 2 (Одјељак 2 - Доходак), row 5 "Доходак од самосталне дјелатности", column 6 "Доходак (4 – 5)".

  • selfEmploymentIncomeTaxBaseReduction number optional

    Section 2 (Одјељак 2 - Доходак), row 5 "Доходак од самосталне дјелатности", column 7 "Умањење пореске основице".

    range: 0–∞
  • selfEmploymentIncomeTaxBase number optional

    Section 2 (Одјељак 2 - Доходак), row 5 "Доходак од самосталне дјелатности", column 9 "Основица за порез 6 – (7 + 8)".

  • selfEmploymentIncomeCalculatedTax number optional

    Section 2 (Одјељак 2 - Доходак), row 5 "Доходак од самосталне дјелатности", column 10 "Обрачунат".

    range: 0–∞
  • selfEmploymentIncomePaidTax number optional

    Section 2 (Одјељак 2 - Доходак), row 5 "Доходак од самосталне дјелатности", column 11 "Уплаћен".

    range: 0–∞
  • selfEmploymentIncomeTaxCredit number optional

    Section 2 (Одјељак 2 - Доходак), row 5 "Доходак од самосталне дјелатности", column 12 "Порески кредит".

    range: 0–∞
  • selfEmploymentIncomeTaxDifference number optional

    Section 2 (Одјељак 2 - Доходак), row 5 "Доходак од самосталне дјелатности", column 13 "Разлика 10 – (11 + 12)".

  • selfEmploymentIncomeIncomeAfterTax number optional

    Section 2 (Одјељак 2 - Доходак), row 5 "Доходак од самосталне дјелатности", column 14 "Доходак послије опорезивања (6– 10)".

  • selfEmploymentIncomeCarriedLoss number optional

    Loss carried forward from a prior tax period, applied to reduce the tax base for self-employment income (Доходак од самосталне дјелатности). The form's own column 8 cell is shaded/blocked for every other income-type row (personal earnings, copyright income, capital income, capital gain, other income, and the total row) — a loss carryforward against the tax base only applies to self-employment income under Republika Srpska's income tax law, so this field is modelled only for this row, not the other six.

    range: 0–∞
  • otherIncomeMunicipality string optional

    Section 2 (Одјељак 2 - Доходак), row 6 "Остали доходак", column 3 "Општина".

    length: 1–100
  • otherIncomeRevenue number optional

    Section 2 (Одјељак 2 - Доходак), row 6 "Остали доходак", column 4 "Приход".

    range: 0–∞
  • otherIncomeExpense number optional

    Section 2 (Одјељак 2 - Доходак), row 6 "Остали доходак", column 5 "Расход".

    range: 0–∞
  • otherIncomeIncome number optional

    Section 2 (Одјељак 2 - Доходак), row 6 "Остали доходак", column 6 "Доходак (4 – 5)".

  • otherIncomeTaxBaseReduction number optional

    Section 2 (Одјељак 2 - Доходак), row 6 "Остали доходак", column 7 "Умањење пореске основице".

    range: 0–∞
  • otherIncomeTaxBase number optional

    Section 2 (Одјељак 2 - Доходак), row 6 "Остали доходак", column 9 "Основица за порез 6 – (7 + 8)".

  • otherIncomeCalculatedTax number optional

    Section 2 (Одјељак 2 - Доходак), row 6 "Остали доходак", column 10 "Обрачунат".

    range: 0–∞
  • otherIncomePaidTax number optional

    Section 2 (Одјељак 2 - Доходак), row 6 "Остали доходак", column 11 "Уплаћен".

    range: 0–∞
  • otherIncomeTaxCredit number optional

    Section 2 (Одјељак 2 - Доходак), row 6 "Остали доходак", column 12 "Порески кредит".

    range: 0–∞
  • otherIncomeTaxDifference number optional

    Section 2 (Одјељак 2 - Доходак), row 6 "Остали доходак", column 13 "Разлика 10 – (11 + 12)".

  • otherIncomeIncomeAfterTax number optional

    Section 2 (Одјељак 2 - Доходак), row 6 "Остали доходак", column 14 "Доходак послије опорезивања (6– 10)".

  • totalMunicipality string optional

    Section 2 (Одјељак 2 - Доходак), row 7 "УКУПНО (р. бр. 1 до р. бр. 6)", column 3 "Општина".

    length: 1–100
  • totalRevenue number optional

    Section 2 (Одјељак 2 - Доходак), row 7 "УКУПНО (р. бр. 1 до р. бр. 6)", column 4 "Приход".

    range: 0–∞
  • totalExpense number optional

    Section 2 (Одјељак 2 - Доходак), row 7 "УКУПНО (р. бр. 1 до р. бр. 6)", column 5 "Расход".

    range: 0–∞
  • totalIncome number optional

    Section 2 (Одјељак 2 - Доходак), row 7 "УКУПНО (р. бр. 1 до р. бр. 6)", column 6 "Доходак (4 – 5)".

  • totalTaxBaseReduction number optional

    Section 2 (Одјељак 2 - Доходак), row 7 "УКУПНО (р. бр. 1 до р. бр. 6)", column 7 "Умањење пореске основице".

    range: 0–∞
  • totalTaxBase number optional

    Section 2 (Одјељак 2 - Доходак), row 7 "УКУПНО (р. бр. 1 до р. бр. 6)", column 9 "Основица за порез 6 – (7 + 8)".

  • totalCalculatedTax number optional

    Section 2 (Одјељак 2 - Доходак), row 7 "УКУПНО (р. бр. 1 до р. бр. 6)", column 10 "Обрачунат".

    range: 0–∞
  • totalPaidTax number optional

    Section 2 (Одјељак 2 - Доходак), row 7 "УКУПНО (р. бр. 1 до р. бр. 6)", column 11 "Уплаћен".

    range: 0–∞
  • totalTaxCredit number optional

    Section 2 (Одјељак 2 - Доходак), row 7 "УКУПНО (р. бр. 1 до р. бр. 6)", column 12 "Порески кредит".

    range: 0–∞
  • totalTaxDifference number optional

    Section 2 (Одјељак 2 - Доходак), row 7 "УКУПНО (р. бр. 1 до р. бр. 6)", column 13 "Разлика 10 – (11 + 12)".

  • totalIncomeAfterTax number optional

    Section 2 (Одјељак 2 - Доходак), row 7 "УКУПНО (р. бр. 1 до р. бр. 6)", column 14 "Доходак послије опорезивања (6– 10)".

Overpaid-tax refund/advance-credit preference

  • refundPaymentAccountNumber string optional

    The taxpayer's own bank transaction account number, into which an overpaid-tax refund should be paid, if the taxpayer requests a cash refund rather than an advance credit. See this document's own VERIFICATION.md for how this line's two unlabelled PDF form widgets were collapsed to a single field.

    length: 1–60
  • overpaymentAsAdvanceCreditNote string optional

    Taxpayer's own note electing to carry an overpaid-tax amount forward as an advance credit against future tax obligations, instead of (or alongside) a cash refund. See this document's own VERIFICATION.md for how this line's two unlabelled PDF form widgets were collapsed to a single field.

    length: 1–60

Овјера пореског обвезника (Taxpayer certification)

  • authorizedPersonFullName string required

    Full name of the authorized person or legal representative certifying, under moral, material, and criminal liability, that every entry in this return is complete, accurate, and truthful.

    length: 1–300classification: pii
  • certificationDate date required

    Date this return was certified by the authorized person/legal representative.

  • preparerFullName string optional

    Full name of the person who physically completed this return, when different from the authorized person/legal representative certifying it (e.g. an accountant or other preparer).

    length: 1–300classification: pii

Verification record

Candidate selection

GOV-4727 ("GovSchema Standard Research"). Bosnia and Herzegovina stood at 2 of 6 verticals (Business Formation, Passport) after GOV-4713/GOV-4720. Both prior cycles' own disclosed backlog for Republika Srpska (MUP RS's vehicle-registration/DMV page, the primary in-person passport application, and the national visa form) had already screened DMV and confirmed the Ministry of Foreign Affairs' visa form a Schengen-template duplicate; this cycle re-confirmed both remain a dead end/unscreened rather than re-trying them (see "Other verticals re-checked this cycle" below), and screened Taxes and National ID fresh. The Tax Administration of Republika Srpska (Poreska uprava Republike Srpske, PURS)'s own public forms page (poreskaupravars.org/fizicka-lica/obrasci/porez-na-dohodak/?lang=lat, HTTP 200) came back strongest: a live, unauthenticated, genuinely fillable AcroForm PDF with a real /Widget annotation layer (this registry's usual strongest source class), plus an authority-published worked example resolving the one structurally ambiguous part of the form. Authored.

Other verticals re-checked this cycle

  • DMVmup.vladars.rs/lat/mup-servisi/registracija-vozila fetched fresh (HTTP 200, 1,037,702 bytes); no .pdf/.doc/.docx link found anywhere in the page. Re-confirms GOV-4720's finding: MUP RS publishes no downloadable vehicle-registration request form. Left open backlog, not a hard dead end (a form may exist off this specific page), but not re-attempted this cycle beyond this re-check.
  • National IDmup.vladars.rs/lat/mup-servisi/licna-dokumenta fetched fresh (HTTP 200, 1,024,207 bytes); likewise no downloadable form link. Public secondary sources describe the ID-card application ("obrazac LK/OI-1") as obtained only in person at a MUP counter, not published online as a blank specimen — consistent with the Passport vertical's own primary-application finding from GOV-4720. Left open backlog.
  • Visa — not re-screened; GOV-4720 already confirmed the Ministry of Foreign Affairs' national visa form a Schengen-template duplicate this same cycle-family. Standing dead end.

Reaching the live source

poreskaupravars.org's forms page (https://poreskaupravars.org/fizicka-lica/obrasci/porez-na-dohodak/?lang=lat, fetched via curl -k — the domain's TLS chain did not verify cleanly against this session's default CA bundle, unrelated to the form's own authenticity) lists Form 1004 in three vintages (a bare 2015/2019 flat scan, a Word/Excel pair, and a "popunjiva" — fillable — PDF). The fillable PDF was fetched directly: https://poreskaupravars.org/dokumenti/obrasci/Obrazac%201004popunjiva.pdf (HTTP 200, Content-Type: application/pdf, 202,935 bytes, sha256 c85ec6f7f1cfdfaabafffd495936c3e7964932b644505eed014164e880fd8b0c, Last-Modified: Fri, 18 Mar 2022, confirming a long-stable specimen).

A companion worked example published on the same site, https://www.poreskaupravars.org/dokumenti/uputstva/Primjer_popunjavanja_1004_za_veb_stranicu_29_02_12.pdf ("Примјер попуњавања Годишње пореске пријаве за порез на доходак — Образац 1004 за 2011. годину", HTTP 200, 395,493 bytes), was fetched and read in full — both its narrative worked calculation (pages 1-5) and its two appended filled-specimen pages (pages 6-7, an older form vintage) — solely to resolve one structurally ambiguous part of the current form (see Finding 1 below), not as the authored source itself.

Extraction method

pdfjs-dist (legacy/build/pdf.js, vendored at /tmp/node_modules) for getAnnotations() (form-field enumeration) and getTextContent() (label text and position). canvas (same vendor location) rendered the page to PNG at 2.5x and 6x scale to resolve box layout the meaningless raw field names alone could not.

getAnnotations() returns 106 /Widget annotations, but every field name is a generic auto-generated token (fill_1, fill_2, ..., Text2, Text3, ..., comb_1, comb_4, undefined, undefined_2, ...) with no semantic content — the telltale signature of an automated "flatten a scanned/printed form into a fillable AcroForm" conversion tool (distinct from, but in the same family as, this registry's already-documented non-sequential-reading-order and vector-checkbox PDF-extraction failure modes; see gov-form-pdf-extraction). Every field's real meaning was recovered by rendering the page visually and correlating each widget's rect (x/y position) against the nearest printed label read from getTextContent()'s item positions, not from the field names themselves.

Document structure

A single page. Header: Republika Srpska / Ministry of Finance / Tax Administration letterhead, form number and title, and a barcode box. Одјељак 1 – Подаци о пореском обвезнику (Section 1, taxpayer data): JMB/JIB (13-box comb), filing type (Основна/Измијењена checkboxes) with a conditional barcode-of-original-filing box, municipality code (3-box comb), full name, address, phone, email, and a two-row "Порески период" (tax period) box block — see Finding 1. Одјељак 2 - Доходак (Section 2, income): a 14-column x 7-row table (6 income-category rows plus a УКУПНО/total row), columns Општина/Приход/Расход/Доходак/Умањење пореске основице/Пренесени губитак/Основица за порез/Обрачунат/Уплаћен/Порески кредит/Разлика/Доходак послије опорезивања — see Finding 2 for column 8's row-conditional shading. Below the table: a "Напомена" (note, static text) and two refund-preference lines — see Finding 3. Овјера (certification): a taxpayer-side block (declaration text, authorized-person name + date, preparer name, two signature lines — signatures excluded, not modelable) and a Tax Administration-side block (received date, officer name, refund decision, official stamp) — the latter entirely authority/officer-populated and excluded from this schema, consistent with this registry's established convention (e.g. ba/apif's own excluded "Попуњава АПИФ" block).

Disclosed findings and interpretation choices

  1. taxPeriodFrom/taxPeriodTo semantics were resolved from a companion worked example, not the blank form alone. The current form's "8) Порески период:" prints two stacked rows of unlabelled boxes (a 2-box group, a second 2-box group, then a third group rendered as a single undivided box, per row) with no "Од"/"До" or "ДД"/"ММ"/"ГГГГ" captions anywhere near them. The Tax Administration's own worked example for this same form (Primjer_popunjavanja_1004...pdf, an older form vintage sharing this exact header layout) shows the identical box group filled in as "Од: 01/01/20 1 1" / "До: 31/12/20 1 1" — confirming (a) the upper row is the period start and the lower row the period end, (b) each is a day/month/year date with the "20" century prefix pre-printed on the form itself (not a fillable box) and only the last two year digits taxpayer-entered, and (c) the third, visually-undivided box is a single two-character comb field for those two year digits, not one single-digit box. Modelled as two full ISO date fields (taxPeriodFrom, taxPeriodTo) with the 21st-century assumption disclosed here rather than silently baked in.
  2. selfEmploymentIncomeCarriedLoss is the only field modelled for column 8 ("Пренесени губитак за умањење пореске основице") — visually confirmed by rendering the table at 2.5x scale: column 8's cell is filled solid grey (blocked) for every row except row 5 (Доходак од самосталне дјелатности, self-employment income). A loss carryforward against the tax base applies only to self-employment income under Republika Srpska's income tax law; the other five income-type rows and the УКУПНО/total row have no fillable box in this column at all, so no corresponding field is modelled for them (matching this registry's established convention of not fabricating an input the source itself structurally disallows).
  3. refundPaymentAccountNumber and overpaymentAsAdvanceCreditNote each collapse two raw PDF widgets into one field. Both refund-preference lines below the income table ("Молим да ми се износ ... уплати на рачун" and "Износ више плаћеног пореза ħу користити као аконтацију...") are followed by two adjacent text-type (not checkbox-type) form widgets with no distinguishing sub-label between them — consistent with this whole document's auto-converted, semantically-empty field-naming pattern (see "Extraction method" above) rather than a deliberate two-part value. Modelled as one free-text field per line, matching the line's own printed label; the exact internal split the original PDF widgets intended is not recoverable from this source and is disclosed here rather than guessed at a finer grain.
  4. taxpayerId, municipalityCode, refundPaymentAccountNumber, and overpaymentAsAdvanceCreditNote are modelled without an exact digit-count pattern, matching this registry's own precedent on the same judgment (ba/apif/business-entity-classification-application's Findings 7-8) — the printed comb-box counts are a specific paper form's layout choice, not a length the underlying identifier/value is otherwise documented to require.
  5. The Tax Administration's own certification block ("Овјера Пореске управе") is entirely excluded — every field in it (date received, officer name, processing officer, processing date, refund approved/not-approved, official stamp) is authority-populated, not taxpayer-entered, matching this registry's established exclusion pattern for officer/authority-only sections.
  6. municipality per income-category row (column 3) is modelled separately per row, not reused from the header's municipalityCode — the table's own column exists specifically because different income categories (e.g. employment income vs. a rental property) can arise in different municipalities within the same tax year.

Conformance

2 valid scenarios — valid-single-income-source-basic-filing (a taxpayer with personal-earnings income only, a basic filing, exercising every unconditionally-optional field's absent case and the amendedFilingBarcode requiredWhen gate in its required-false branch) and valid-multi-income-source-amended-filing (personal earnings, capital income, and self-employment income with a carried-forward loss, an amended filing supplying the original filing's barcode, exercising the requiredWhen gate's required-true branch and selfEmploymentIncomeCarriedLoss) — plus 9 static-required-field mutation fixtures (one per top-level required: true field), 1 requiredWhen-gate mutation fixture (mutation-missing-amendedfilingbarcode-requiredwhen-amended), and 1 unknown-field-rejected fixture, committed under conformance/ba/purs/annual-income-tax-return/1.0.0/.

An ephemeral, from-scratch conformance checker (deriving required/ requiredWhen rules directly from this schema's own fields[], discarded after use, not committed) ran all 13 fixtures: both valid scenarios at 0 errors, all 10 mutation controls each raising exactly 1 error, and the unknown-field fixture correctly rejected. Validated clean with node tools/validate.mjs and node tools/validate-ajv.mjs, individually and as part of the full registry run (653/653). registry-index.json regenerated via npm run build-index in tools/govschema-client/.

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 Пореска управа Републике Српске (Tax Administration of Republika Srpska) or any government. The authoritative source is always the live government form and its official instructions.