{
  "$schema": "https://govschema.org/spec/v0.3/govschema.schema.json",
  "govschemaVersion": "0.3.0",
  "id": "id/djp/annual-individual-income-tax-return-1770s",
  "version": "1.0.0",
  "title": "Indonesia Annual Individual Income Tax Return — Form 1770 S (SPT Tahunan Pajak Penghasilan Wajib Pajak Orang Pribadi Formulir 1770 S)",
  "description": "File Indonesia's annual individual income tax return using Form 1770 S through the Direktorat Jenderal Pajak's (DJP, Directorate General of Taxes) e-Filing web application on djponline.pajak.go.id. Form 1770 S is for an individual taxpayer with income from one or more employers, plus other domestic income and/or income subject to final/definitive tax — the middle of DJP's three individual annual-return forms (1770 SS for gross income under Rp60 million from a single employer; 1770 S for one-or-more-employer salaried filers above that threshold; 1770 for filers who also run a business or independent profession). Opens Indonesia's Taxes vertical (its 3rd of 6 verticals modelled, after DMV and Business Formation). Covers the e-Filing wizard's own five-page 'SPT 1770 S dengan formulir' flow: return metadata (tax year, normal/amended status), Lampiran II (final/definitive-tax income, year-end assets, year-end debts, and the family/dependents register), Lampiran I (other domestic income not subject to final tax, income excluded from the tax object, and withholding certificates issued by other parties), and the Induk (main form) covering marital status, net income, the non-taxable-income (PTKP) status/dependent-count selection, Article 24 foreign-tax-credit adjustment, Article 25 self-paid installments, the following tax year's Article 25 installment basis, and the closing declaration. Scoped to a resident individual taxpayer using the 1770 S form's own 'dengan bentuk formulir' (structured-form) filing pathway; the alternative 'dengan panduan' (guided-interview) and 'dengan upload SPT' (bulk-file-upload) pathways, the account login/NIK-NPWP-password/CAPTCHA screen, the OTP-style e-mail/SMS verification-code exchange used only to authorize submission, the post-submission satisfaction survey, and every DJP-calculated subtotal/control-total field (Penghasilan Neto totals, Penghasilan Kena Pajak, PPh Terutang, Jumlah Kredit Pajak, and the final Nihil/Kurang Bayar/Lebih Bayar status) are all out of scope for this v1.0.0 — see VERIFICATION.md. This document does not submit a tax return; djponline.pajak.go.id and DJP are always authoritative.",
  "status": "draft",
  "jurisdiction": {
    "country": "ID",
    "level": "national"
  },
  "authority": {
    "name": "Direktorat Jenderal Pajak (Directorate General of Taxes)",
    "abbreviation": "DJP",
    "url": "https://www.pajak.go.id/"
  },
  "process": {
    "type": "filing",
    "language": "id"
  },
  "source": {
    "url": "https://www.pajak.go.id/sites/default/files/2023-03/Modul%20Pengisian%20SPT%20Tahunan%20e-Filling%20Orang%20Pribadi%201770S.pdf",
    "retrievedAt": "2026-07-07",
    "documentRef": "DJP official guide 'Tata Cara Pengisian SPT Tahunan Wajib Pajak Orang Pribadi 1770S' (Modul Pengisian SPT Tahunan e-Filing Orang Pribadi 1770S, dated 2023-03-13), a 46-slide screenshot-driven walkthrough of the djponline.pajak.go.id e-Filing wizard"
  },
  "verification": {
    "method": "manual-source-review-v1",
    "lastVerifiedAt": "2026-07-07",
    "verifiedBy": "GovSchema Engineering (Standards Engineer)",
    "nextReviewBy": "2027-01-07",
    "notes": "GOV-1560 'GovSchema Standard Research' cycle. Indonesia (opened GOV-1546/GOV-1553, the registry's 18th jurisdiction) had only DMV and Business Formation modelled; this cycle screened its four remaining verticals (Passport, Visa, Taxes, National ID) before picking this one. The strongest other candidate, `evisa.imigrasi.go.id`'s own official 'User Manual e-Visa' (a directly downloadable, unauthenticated PDF), was screened first and found genuinely weaker at the field level: its own 'Fill Form' step shows only an unlabelled wireframe diagram for the Personal Information block (dashed placeholder rectangles, no field labels at any resolution), whereas its visa-type-selection wizard (nationality/sub-purpose/category/applicant-type/length-of-stay) and payment step are well-labelled — see the rejected-candidate note below. This 1770 S guide was chosen instead because DJP's own PDF (hosted directly on pajak.go.id, HTTP 200, no login/CAPTCHA/WAF gate to the PDF itself) is genuinely screenshot-driven end to end: every page of the live djponline.pajak.go.id e-Filing wizard is captured with real, legible field labels, dropdown examples, and a fully worked example filing (taxpayer 'Nn Shinta', tax year 2022), including its numbered Induk (main form) lines A.1-F.18 read directly off the rendered screenshots (each PDF page rendered to PNG via pdfjs-dist + node-canvas at 2.2x scale and read visually; the PDF's own text layer is PowerPoint-slide-note-level only, not the in-app field labels). This is the closest Indonesian analogue in sourcing shape to `ph/bir/annual-income-tax-return-1701a` and `au/ato/individual-tax-return-mytax` (an official step-by-step walkthrough of a real online-filing wizard, not a blank paper specimen). The e-Filing wizard itself (djponline.pajak.go.id) requires an NIK/NPWP + password + CAPTCHA login and was not walked live — consistent with this registry's practice of not creating or using real taxpayer credentials on a live government tax system; every field, label, and example value in this schema is read from the guide's own rendered screenshots, not inferred. See VERIFICATION.md for the full candidate-screening record, the field-by-field provenance table, and every disclosed interpretive judgment call (in particular: several dropdown fields — `finalIncomeSourceType`, `assetCode`, `debtCode`, `withholdingTaxType`, `ptkpStatusCode`, `nextYearInstallmentBasisType` — show only one or zero example option in the guide's own screenshots, so DJP's full underlying code tables are not reproduced and these fields are modelled as open strings rather than fabricated enums). A mock filing packet (`conformance/id/djp/annual-individual-income-tax-return-1770s/1.0.0/`) independently exercises every requiredWhen branch. Status remains 'draft': the live wizard was not walked interactively (per the login-credential policy above), consistent with this registry's structural-reference convention for guide-derived documents."
  },
  "maturity": {
    "level": "structural-reference",
    "criteria": {
      "structuralReference": true,
      "verifiedSchema": false,
      "agentReadySchema": false,
      "executionTestedSchema": false
    },
    "method": "maturity-self-assessment-v1",
    "assertedBy": "GovSchema Engineering (Standards Engineer)",
    "assertedAt": "2026-07-07"
  },
  "license": "CC-BY-4.0",
  "fields": [
    {
      "name": "taxYear",
      "label": "Tahun Pajak (tax year)",
      "type": "integer",
      "required": true,
      "description": "The fiscal year this SPT Tahunan covers, selected from the 'Data Formulir' screen's own year dropdown. Confirmed example value: 2022.",
      "sourceRef": "Modul Pengisian SPT Tahunan e-Filing 1770S — 'Isi Formulir' > 'Data Formulir' screen, field 'Tahun Pajak'",
      "validation": {
        "minimum": 2000,
        "maximum": 2099
      }
    },
    {
      "name": "sptStatus",
      "label": "Status SPT (return status)",
      "type": "enum",
      "required": true,
      "description": "Whether this is a first-time (Normal) filing for the tax year or a corrected (Pembetulan) filing.",
      "sourceRef": "Modul Pengisian SPT Tahunan e-Filing 1770S — 'Data Formulir' screen, field 'Status SPT'",
      "validation": {
        "enum": [
          "normal",
          "pembetulan"
        ]
      }
    },
    {
      "name": "amendmentNumber",
      "label": "Pembetulan Ke (amendment sequence number)",
      "type": "integer",
      "required": false,
      "requiredWhen": {
        "field": "sptStatus",
        "equals": "pembetulan"
      },
      "description": "Which numbered amendment this filing is, when sptStatus is 'pembetulan'. Disabled and fixed at 0 in the wizard when sptStatus is 'normal'.",
      "sourceRef": "Modul Pengisian SPT Tahunan e-Filing 1770S — 'Data Formulir' screen, field 'Pembetulan Ke'",
      "validation": {
        "minimum": 1
      }
    },
    {
      "name": "hasFinalIncome",
      "label": "Memperoleh penghasilan yang dikenakan PPh Final dan/atau bersifat final? (received income subject to final/definitive tax?)",
      "type": "boolean",
      "required": true,
      "description": "Gates whether the taxpayer reports at least one Lampiran II Bagian A (Penghasilan yang dikenakan PPh Final dan/atau bersifat final) entry, e.g. bank deposit/savings interest. The wizard presents this section as an empty add-a-row table ('Tambah+') rather than a literal yes/no question; this field is an inferred gate, mirroring this registry's established convention for guide-derived add-a-row sections (e.g. br/rfb/individual-income-tax-return-irpf). The real table repeats once per income source; this document models a single, primary entry only.",
      "sourceRef": "Modul Pengisian SPT Tahunan e-Filing 1770S — 'Lampiran II' > 'Bagian A. Penghasilan yang dikenakan PPh Final dan/atau bersifat final', inferred gating field"
    },
    {
      "name": "finalIncomeSourceType",
      "label": "Sumber/Jenis Penghasilan (source/type of final-tax income)",
      "type": "string",
      "required": false,
      "requiredWhen": {
        "field": "hasFinalIncome",
        "equals": true
      },
      "description": "DJP's own final-tax income-source code, selected from a dropdown. Only one example option is legible in the guide's own screenshot ('1. Bunga Deposito, Tabungan, Diskonto SBI, ...'); the full code list is not reproduced there and is not modelled as an enum — flagged as a judgment call.",
      "sourceRef": "Modul Pengisian SPT Tahunan e-Filing 1770S — Lampiran II Bagian A, 'Sumber/Jenis Penghasilan' modal field",
      "validation": {
        "maxLength": 200
      }
    },
    {
      "name": "finalIncomeGrossAmount",
      "label": "DPP/Penghasilan Bruto (Rp) (gross income/tax base subject to final tax)",
      "type": "number",
      "required": false,
      "requiredWhen": {
        "field": "hasFinalIncome",
        "equals": true
      },
      "sourceRef": "Modul Pengisian SPT Tahunan e-Filing 1770S — Lampiran II Bagian A, 'DPP/Penghasilan Bruto' modal field"
    },
    {
      "name": "finalIncomeTaxDueAmount",
      "label": "PPh Terutang (Rp) (final tax due on this income)",
      "type": "number",
      "required": false,
      "requiredWhen": {
        "field": "hasFinalIncome",
        "equals": true
      },
      "sourceRef": "Modul Pengisian SPT Tahunan e-Filing 1770S — Lampiran II Bagian A, 'PPh Terutang' modal field"
    },
    {
      "name": "hasAssetsAtYearEnd",
      "label": "Memiliki harta pada akhir tahun? (owns assets at year end?)",
      "type": "boolean",
      "required": true,
      "description": "Gates whether the taxpayer reports at least one Lampiran II Bagian B (Harta Pada Akhir Tahun) asset entry. Inferred gate for an add-a-row table (see hasFinalIncome); the real table repeats once per asset (the guide's own worked example lists three: two savings accounts and one motorcycle). This document models a single, primary asset entry only.",
      "sourceRef": "Modul Pengisian SPT Tahunan e-Filing 1770S — 'Lampiran II' > 'Bagian B: Harta Pada Akhir Tahun', inferred gating field"
    },
    {
      "name": "assetCode",
      "label": "Kode Harta (asset type code)",
      "type": "string",
      "required": false,
      "requiredWhen": {
        "field": "hasAssetsAtYearEnd",
        "equals": true
      },
      "description": "DJP's own asset-type code, selected from a dropdown (the guide's worked example uses '012' for a savings account and '042' for a motorcycle). The full code table is not reproduced in the guide and is not modelled as an enum.",
      "sourceRef": "Modul Pengisian SPT Tahunan e-Filing 1770S — Lampiran II Bagian B, 'Harta Baru' modal, field 'Kode Harta'; worked example rows",
      "validation": {
        "maxLength": 10
      }
    },
    {
      "name": "assetName",
      "label": "Nama Harta (asset name)",
      "type": "string",
      "required": false,
      "requiredWhen": {
        "field": "hasAssetsAtYearEnd",
        "equals": true
      },
      "description": "Example values from the guide's worked example: 'Tabungan' (savings), 'Sepeda Motor' (motorcycle).",
      "sourceRef": "Modul Pengisian SPT Tahunan e-Filing 1770S — Lampiran II Bagian B, 'Harta Baru' modal, field 'Nama Harta'",
      "validation": {
        "maxLength": 100
      }
    },
    {
      "name": "assetAcquisitionYear",
      "label": "Tahun Perolehan (year of acquisition)",
      "type": "integer",
      "required": false,
      "requiredWhen": {
        "field": "hasAssetsAtYearEnd",
        "equals": true
      },
      "description": "Example values from the guide's worked example: 2022, 2021.",
      "sourceRef": "Modul Pengisian SPT Tahunan e-Filing 1770S — Lampiran II Bagian B, 'Harta Baru' modal, field 'Tahun Perolehan'",
      "validation": {
        "minimum": 1900,
        "maximum": 2099
      }
    },
    {
      "name": "assetAcquisitionValue",
      "label": "Harga Perolehan (Rp) (acquisition value)",
      "type": "number",
      "required": false,
      "requiredWhen": {
        "field": "hasAssetsAtYearEnd",
        "equals": true
      },
      "description": "Example values from the guide's worked example: Rp2,000,000; Rp1,000,000; Rp18,500,000.",
      "sourceRef": "Modul Pengisian SPT Tahunan e-Filing 1770S — Lampiran II Bagian B, 'Harta Baru' modal, field 'Harga Perolehan'"
    },
    {
      "name": "assetDescription",
      "label": "Keterangan (description/notes)",
      "type": "string",
      "required": false,
      "requiredWhen": {
        "field": "hasAssetsAtYearEnd",
        "equals": true
      },
      "description": "Free-text note about the asset. Example values from the guide's worked example: 'Bank Sendiri', 'BCI', 'Kredit'. Whether this specific sub-field is itself optional within an otherwise-required row is not distinguishable from the guide's screenshots; modelled with the same requiredWhen as its sibling fields for consistency — flagged as a judgment call.",
      "sourceRef": "Modul Pengisian SPT Tahunan e-Filing 1770S — Lampiran II Bagian B, 'Harta Baru' modal, field 'Keterangan'",
      "validation": {
        "maxLength": 200
      }
    },
    {
      "name": "hasDebtsAtYearEnd",
      "label": "Memiliki utang pada akhir tahun? (owes debts at year end?)",
      "type": "boolean",
      "required": true,
      "description": "Gates whether the taxpayer reports at least one Lampiran II Bagian C (Kewajiban/Utang Pada Akhir Tahun) debt entry. Inferred gate for an add-a-row table; the real table repeats once per debt/loan. This document models a single, primary debt entry only.",
      "sourceRef": "Modul Pengisian SPT Tahunan e-Filing 1770S — 'Lampiran II' > 'Bagian C: Kewajiban/Utang Pada Akhir Tahun', inferred gating field"
    },
    {
      "name": "debtCode",
      "label": "Kode Utang (debt type code)",
      "type": "string",
      "required": false,
      "requiredWhen": {
        "field": "hasDebtsAtYearEnd",
        "equals": true
      },
      "description": "DJP's own debt-type code, selected from a dropdown (the guide's worked example uses '101'). The full code table is not reproduced in the guide and is not modelled as an enum.",
      "sourceRef": "Modul Pengisian SPT Tahunan e-Filing 1770S — Lampiran II Bagian C, 'Hutang Baru' modal, field 'Kode Utang'; worked example row",
      "validation": {
        "maxLength": 10
      }
    },
    {
      "name": "lenderName",
      "label": "Nama Pemberi Pinjaman (lender's name)",
      "type": "string",
      "required": false,
      "requiredWhen": {
        "field": "hasDebtsAtYearEnd",
        "equals": true
      },
      "description": "Example value from the guide's worked example: 'Adadeh'.",
      "sourceRef": "Modul Pengisian SPT Tahunan e-Filing 1770S — Lampiran II Bagian C, 'Hutang Baru' modal, field 'Nama Pemberi Pinjaman'",
      "validation": {
        "maxLength": 100
      }
    },
    {
      "name": "lenderAddress",
      "label": "Alamat Pemberi Pinjaman (lender's address)",
      "type": "string",
      "required": false,
      "requiredWhen": {
        "field": "hasDebtsAtYearEnd",
        "equals": true
      },
      "description": "Example value from the guide's worked example: 'Balikpapan'.",
      "sourceRef": "Modul Pengisian SPT Tahunan e-Filing 1770S — Lampiran II Bagian C, 'Hutang Baru' modal, field 'Alamat Pemberi Pinjaman'",
      "validation": {
        "maxLength": 200
      }
    },
    {
      "name": "loanYear",
      "label": "Tahun Peminjaman (year the loan was taken out)",
      "type": "integer",
      "required": false,
      "requiredWhen": {
        "field": "hasDebtsAtYearEnd",
        "equals": true
      },
      "description": "Example value from the guide's worked example: 2021.",
      "sourceRef": "Modul Pengisian SPT Tahunan e-Filing 1770S — Lampiran II Bagian C, 'Hutang Baru' modal, field 'Tahun Peminjaman'",
      "validation": {
        "minimum": 1900,
        "maximum": 2099
      }
    },
    {
      "name": "loanBalanceAmount",
      "label": "Jumlah (Rp) (remaining loan balance at year end)",
      "type": "number",
      "required": false,
      "requiredWhen": {
        "field": "hasDebtsAtYearEnd",
        "equals": true
      },
      "description": "The remaining balance owed as of 31 December of the tax year. Example value from the guide's worked example: Rp10,000,000.",
      "sourceRef": "Modul Pengisian SPT Tahunan e-Filing 1770S — Lampiran II Bagian C, 'Hutang Baru' modal, field 'Jumlah'"
    },
    {
      "name": "hasFamilyMembersListed",
      "label": "Memiliki susunan anggota keluarga yang didaftarkan? (has family members to register?)",
      "type": "boolean",
      "required": true,
      "description": "Gates whether the taxpayer reports at least one Lampiran II Bagian D (Daftar Susunan Anggota Keluarga) entry. Inferred gate for an add-a-row table; the real table repeats once per family member. Unlike the sibling Harta/Utang tables, the guide's own screenshot of this table was not populated with a worked example row — only its column headers (Nama, NIK, Hubungan Keluarga, Pekerjaan) are confirmed. This document models a single, primary family-member entry only.",
      "sourceRef": "Modul Pengisian SPT Tahunan e-Filing 1770S — 'Lampiran II' > 'Bagian D: Daftar Susunan Anggota Keluarga', inferred gating field"
    },
    {
      "name": "familyMemberName",
      "label": "Nama (family member's name)",
      "type": "string",
      "required": false,
      "requiredWhen": {
        "field": "hasFamilyMembersListed",
        "equals": true
      },
      "sourceRef": "Modul Pengisian SPT Tahunan e-Filing 1770S — Lampiran II Bagian D table, column 'Nama'",
      "validation": {
        "maxLength": 100
      }
    },
    {
      "name": "familyMemberNik",
      "label": "NIK (family member's national ID number)",
      "type": "string",
      "required": false,
      "requiredWhen": {
        "field": "hasFamilyMembersListed",
        "equals": true
      },
      "classification": "sensitive-pii",
      "description": "16-digit Nomor Induk Kependudukan of the registered family member.",
      "sourceRef": "Modul Pengisian SPT Tahunan e-Filing 1770S — Lampiran II Bagian D table, column 'NIK'",
      "validation": {
        "pattern": "^[0-9]{16}$"
      }
    },
    {
      "name": "familyMemberRelationship",
      "label": "Hubungan Keluarga (family relationship)",
      "type": "string",
      "required": false,
      "requiredWhen": {
        "field": "hasFamilyMembersListed",
        "equals": true
      },
      "description": "DJP's own family-relationship code/label (e.g. spouse, child); the underlying option list is not shown in the guide's screenshot (no worked example row was captured for this table) and is not modelled as an enum — flagged as a judgment call.",
      "sourceRef": "Modul Pengisian SPT Tahunan e-Filing 1770S — Lampiran II Bagian D table, column 'Hubungan Keluarga'",
      "validation": {
        "maxLength": 50
      }
    },
    {
      "name": "familyMemberOccupation",
      "label": "Pekerjaan (family member's occupation)",
      "type": "string",
      "required": false,
      "requiredWhen": {
        "field": "hasFamilyMembersListed",
        "equals": true
      },
      "sourceRef": "Modul Pengisian SPT Tahunan e-Filing 1770S — Lampiran II Bagian D table, column 'Pekerjaan'",
      "validation": {
        "maxLength": 100
      }
    },
    {
      "name": "otherDomesticInterestIncome",
      "label": "Bunga (Rp) (interest income)",
      "type": "number",
      "required": false,
      "description": "Lampiran I Bagian A, line 1 — Penghasilan Neto Dalam Negeri Lainnya (other domestic net income not subject to final tax): interest income. This is a fixed, always-visible line on the wizard's own static form (not an add-a-row table), so no inferred gate is used; the taxpayer enters 0 if not applicable.",
      "sourceRef": "Modul Pengisian SPT Tahunan e-Filing 1770S — 'Lampiran I' > 'Bagian A', line 1 'Bunga'"
    },
    {
      "name": "otherDomesticRoyaltyIncome",
      "label": "Royalti (Rp) (royalty income)",
      "type": "number",
      "required": false,
      "description": "Lampiran I Bagian A, line 2.",
      "sourceRef": "Modul Pengisian SPT Tahunan e-Filing 1770S — 'Lampiran I' > 'Bagian A', line 2 'Royalti'"
    },
    {
      "name": "otherDomesticRentIncome",
      "label": "Sewa (Rp) (rental income)",
      "type": "number",
      "required": false,
      "description": "Lampiran I Bagian A, line 3.",
      "sourceRef": "Modul Pengisian SPT Tahunan e-Filing 1770S — 'Lampiran I' > 'Bagian A', line 3 'Sewa'"
    },
    {
      "name": "otherDomesticPrizeIncome",
      "label": "Hadiah (Rp) (prize/award income)",
      "type": "number",
      "required": false,
      "description": "Lampiran I Bagian A, line 4.",
      "sourceRef": "Modul Pengisian SPT Tahunan e-Filing 1770S — 'Lampiran I' > 'Bagian A', line 4 'Hadiah'"
    },
    {
      "name": "otherDomesticAssetSaleGainIncome",
      "label": "Keuntungan dari Penjualan/Pengalihan Harta (Rp) (gain from sale/transfer of assets)",
      "type": "number",
      "required": false,
      "description": "Lampiran I Bagian A, line 5.",
      "sourceRef": "Modul Pengisian SPT Tahunan e-Filing 1770S — 'Lampiran I' > 'Bagian A', line 5 'Keuntungan dari Penjualan/Pengalihan Harta'"
    },
    {
      "name": "otherDomesticMiscIncome",
      "label": "Penghasilan Lain (Rp) (other miscellaneous income)",
      "type": "number",
      "required": false,
      "description": "Lampiran I Bagian A, line 6.",
      "sourceRef": "Modul Pengisian SPT Tahunan e-Filing 1770S — 'Lampiran I' > 'Bagian A', line 6 'Penghasilan Lain'"
    },
    {
      "name": "nonTaxableGrantAmount",
      "label": "Bantuan/Sumbangan/Hibah (Rp) (aid/donation/grant received)",
      "type": "number",
      "required": false,
      "description": "Lampiran I Bagian B, line 1 — Penghasilan yang Tidak Termasuk Objek Pajak (income excluded from the tax object). Fixed, always-visible static-form line; taxpayer enters 0 if not applicable.",
      "sourceRef": "Modul Pengisian SPT Tahunan e-Filing 1770S — 'Lampiran I' > 'Bagian B', line 1 'Bantuan/Sumbangan/Hibah'"
    },
    {
      "name": "nonTaxableInheritanceAmount",
      "label": "Warisan (Rp) (inheritance received)",
      "type": "number",
      "required": false,
      "description": "Lampiran I Bagian B, line 2.",
      "sourceRef": "Modul Pengisian SPT Tahunan e-Filing 1770S — 'Lampiran I' > 'Bagian B', line 2 'Warisan'"
    },
    {
      "name": "nonTaxablePartnershipProfitShareAmount",
      "label": "Bagian Laba Anggota Perseroan Komanditer tidak atas saham, persekutuan, perkumpulan, firma, kongsi (Rp)",
      "type": "number",
      "required": false,
      "description": "Lampiran I Bagian B, line 3 — profit share as a non-share-based member of a limited partnership (CV), partnership, association, firm, or kongsi.",
      "sourceRef": "Modul Pengisian SPT Tahunan e-Filing 1770S — 'Lampiran I' > 'Bagian B', line 3"
    },
    {
      "name": "nonTaxableInsuranceClaimAmount",
      "label": "Klaim Asuransi Kesehatan, Kecelakaan, Jiwa, Dwiguna, Beasiswa (Rp) (health/accident/life/endowment insurance claim)",
      "type": "number",
      "required": false,
      "description": "Lampiran I Bagian B, line 4.",
      "sourceRef": "Modul Pengisian SPT Tahunan e-Filing 1770S — 'Lampiran I' > 'Bagian B', line 4"
    },
    {
      "name": "nonTaxableScholarshipAmount",
      "label": "Beasiswa (Rp) (scholarship received)",
      "type": "number",
      "required": false,
      "description": "Lampiran I Bagian B, line 5.",
      "sourceRef": "Modul Pengisian SPT Tahunan e-Filing 1770S — 'Lampiran I' > 'Bagian B', line 5 'Beasiswa'"
    },
    {
      "name": "nonTaxableOtherAmount",
      "label": "Penghasilan Lainnya yang tidak termasuk Objek Pajak (Rp) (other income excluded from the tax object)",
      "type": "number",
      "required": false,
      "description": "Lampiran I Bagian B, line 6.",
      "sourceRef": "Modul Pengisian SPT Tahunan e-Filing 1770S — 'Lampiran I' > 'Bagian B', line 6"
    },
    {
      "name": "hasWithholdingCertificate",
      "label": "Memiliki bukti pemotongan/pemungutan PPh oleh pihak lain? (has a withholding tax certificate from another party?)",
      "type": "boolean",
      "required": true,
      "description": "Gates whether the taxpayer reports at least one Lampiran I Bagian C (Daftar Pemotongan/Pemungutan PPh Oleh Pihak Lain dan PPh Yang Ditanggung Pemerintah) entry, e.g. the Form 1721-A1 PPh Pasal 21 certificate an employer issues. Inferred gate for an add-a-row table; the real table repeats once per withholding certificate. This document models a single, primary certificate entry only.",
      "sourceRef": "Modul Pengisian SPT Tahunan e-Filing 1770S — 'Lampiran I' > 'Bagian C: Daftar Pemotongan/Pemungutan PPh Oleh Pihak Lain dan PPh Yang Ditanggung Pemerintah', inferred gating field"
    },
    {
      "name": "withholdingTaxType",
      "label": "Jenis Pajak (withholding tax type)",
      "type": "string",
      "required": false,
      "requiredWhen": {
        "field": "hasWithholdingCertificate",
        "equals": true
      },
      "description": "DJP's own withholding-tax-type code, selected from a dropdown. Only one example option is legible in the guide's own screenshot ('PPh Pasal 21'); the full code list is not reproduced there and is not modelled as an enum — flagged as a judgment call.",
      "sourceRef": "Modul Pengisian SPT Tahunan e-Filing 1770S — Lampiran I Bagian C, 'Bukti Potong Baru' modal, field 'Jenis Pajak'",
      "validation": {
        "maxLength": 50
      }
    },
    {
      "name": "withholdingAgentTaxId",
      "label": "NPWP Pemotong/Pemungut Pajak (withholding agent's taxpayer ID)",
      "type": "string",
      "required": false,
      "requiredWhen": {
        "field": "hasWithholdingCertificate",
        "equals": true
      },
      "description": "The 15/16-digit NPWP of the employer/entity that issued the withholding certificate.",
      "sourceRef": "Modul Pengisian SPT Tahunan e-Filing 1770S — Lampiran I Bagian C, 'Bukti Potong Baru' modal, field 'NPWP Pemotong/Pemungut Pajak'",
      "validation": {
        "maxLength": 20
      }
    },
    {
      "name": "withholdingAgentName",
      "label": "Nama Pemotong/Pemungut Pajak (withholding agent's name)",
      "type": "string",
      "required": false,
      "requiredWhen": {
        "field": "hasWithholdingCertificate",
        "equals": true
      },
      "description": "Example value from the guide's worked example: 'PT Punya Nya Raka'.",
      "sourceRef": "Modul Pengisian SPT Tahunan e-Filing 1770S — Lampiran I Bagian C, 'Bukti Potong Baru' modal, field 'Nama Pemotong/Pemungut Pajak'",
      "validation": {
        "maxLength": 100
      }
    },
    {
      "name": "withholdingCertificateNumber",
      "label": "Nomor Bukti Pemotongan/Pemungutan (withholding certificate number)",
      "type": "string",
      "required": false,
      "requiredWhen": {
        "field": "hasWithholdingCertificate",
        "equals": true
      },
      "description": "Example value from the guide's worked example: '1.1.12.22.0000001', from a Formulir 1721-A1 certificate.",
      "sourceRef": "Modul Pengisian SPT Tahunan e-Filing 1770S — Lampiran I Bagian C, 'Bukti Potong Baru' modal, field 'Nomor Bukti Pemotongan/Pemungutan'",
      "validation": {
        "maxLength": 30
      }
    },
    {
      "name": "withholdingCertificateDate",
      "label": "Tanggal Bukti Pemotongan/Pemungutan (withholding certificate date)",
      "type": "date",
      "required": false,
      "requiredWhen": {
        "field": "hasWithholdingCertificate",
        "equals": true
      },
      "description": "Example value from the guide's worked example: 31-12-2023 (as printed on the certificate, for a preceding-year filing example).",
      "sourceRef": "Modul Pengisian SPT Tahunan e-Filing 1770S — Lampiran I Bagian C, 'Bukti Potong Baru' modal, field 'Tanggal Bukti Pemotongan/Pemungutan'"
    },
    {
      "name": "withholdingTaxAmount",
      "label": "Jumlah PPh Yang Dipotong/Dipungut (Rp) (amount of tax withheld)",
      "type": "number",
      "required": false,
      "requiredWhen": {
        "field": "hasWithholdingCertificate",
        "equals": true
      },
      "description": "Example value from the guide's worked example: Rp4,951,650.",
      "sourceRef": "Modul Pengisian SPT Tahunan e-Filing 1770S — Lampiran I Bagian C, 'Bukti Potong Baru' modal, field 'Jumlah PPh Yang Dipotong/Dipungut'"
    },
    {
      "name": "maritalStatus",
      "label": "Status Perkawinan (marital status)",
      "type": "enum",
      "required": true,
      "sourceRef": "Modul Pengisian SPT Tahunan e-Filing 1770S — 'Induk' > 'Identitas' section, field 'Status Perkawinan'",
      "validation": {
        "enum": [
          "tidak_kawin",
          "kawin"
        ]
      }
    },
    {
      "name": "domesticEmploymentNetIncome",
      "label": "Penghasilan Neto Dalam Negeri Sehubungan dengan Pekerjaan (Rp) (net domestic income from employment)",
      "type": "number",
      "required": true,
      "description": "Induk A, line 1 — carried from the taxpayer's Formulir 1721-A1/A2 withholding certificate (line 12, Jumlah Penghasilan Neto). Required because Form 1770 S is scoped to taxpayers whose income is from one or more employers.",
      "sourceRef": "Modul Pengisian SPT Tahunan e-Filing 1770S — 'Induk' > 'A. PENGHASILAN NETTO', line 1"
    },
    {
      "name": "foreignNetIncome",
      "label": "Penghasilan Neto Luar Negeri (Rp) (net foreign income)",
      "type": "number",
      "required": false,
      "description": "Induk A, line 3.",
      "sourceRef": "Modul Pengisian SPT Tahunan e-Filing 1770S — 'Induk' > 'A. PENGHASILAN NETTO', line 3"
    },
    {
      "name": "mandatoryZakatDonationAmount",
      "label": "Zakat/Sumbangan Keagamaan yang Sifatnya Wajib (Rp) (mandatory religious zakat/donation)",
      "type": "number",
      "required": false,
      "description": "Induk A, line 5 — deductible mandatory religious alms/donation.",
      "sourceRef": "Modul Pengisian SPT Tahunan e-Filing 1770S — 'Induk' > 'A. PENGHASILAN NETTO', line 5"
    },
    {
      "name": "ptkpStatusCode",
      "label": "Status PTKP (non-taxable-income status code)",
      "type": "string",
      "required": true,
      "description": "DJP's own combined marital/dependent PTKP (Penghasilan Tidak Kena Pajak) status code (e.g. TK for Tidak Kawin/unmarried). Only one example option ('Tidak Kawin/TK') is legible in the guide's own screenshot; the full code table (which publicly documented DJP guidance shows also includes K and K/I variants, each with a dependent-count suffix) is not reproduced in this guide and is not modelled as an enum — flagged as a judgment call.",
      "sourceRef": "Modul Pengisian SPT Tahunan e-Filing 1770S — 'Induk' > 'B. PENGHASILAN KENA PAJAK', line 7, first dropdown",
      "validation": {
        "maxLength": 10
      }
    },
    {
      "name": "numberOfDependentsForPtkp",
      "label": "Jumlah Tanggungan untuk PTKP (number of dependents for non-taxable-income calculation)",
      "type": "integer",
      "required": true,
      "description": "The count of dependents used in the PTKP calculation. The guide's own screenshot confirms only the value 0; the statutory 0-3 cap is well-documented public DJP PTKP policy, not itself shown as a full dropdown list in this guide — flagged as a judgment call.",
      "sourceRef": "Modul Pengisian SPT Tahunan e-Filing 1770S — 'Induk' > 'B. PENGHASILAN KENA PAJAK', line 7, second dropdown",
      "validation": {
        "minimum": 0,
        "maximum": 3
      }
    },
    {
      "name": "article24CreditRefundAmount",
      "label": "Pengembalian/Pengurangan PPh Pasal 24 yang telah dikreditkan (Rp) (Article 24 foreign tax credit refund/reduction previously credited)",
      "type": "number",
      "required": false,
      "description": "Induk C, line 10.",
      "sourceRef": "Modul Pengisian SPT Tahunan e-Filing 1770S — 'Induk' > 'C. PPh TERUTANG', line 10"
    },
    {
      "name": "article25SelfPaidInstallmentAmount",
      "label": "PPh Yang dibayar Sendiri — PPh Pasal 25 (Rp) (self-paid Article 25 monthly installment tax)",
      "type": "number",
      "required": false,
      "description": "Induk D, line 14a.",
      "sourceRef": "Modul Pengisian SPT Tahunan e-Filing 1770S — 'Induk' > 'D. KREDIT PAJAK', line 14a"
    },
    {
      "name": "article25STPPrincipalAmount",
      "label": "PPh Yang dibayar Sendiri — STP PPh Pasal 25 (Hanya Pokok Pajak) (Rp) (Article 25 tax collection notice, principal only)",
      "type": "number",
      "required": false,
      "description": "Induk D, line 14b — the principal-tax-only portion of an STP (Surat Tagihan Pajak) for Article 25 installments.",
      "sourceRef": "Modul Pengisian SPT Tahunan e-Filing 1770S — 'Induk' > 'D. KREDIT PAJAK', line 14b"
    },
    {
      "name": "nextYearInstallmentBasisType",
      "label": "Angsuran PPh Pasal 25 Tahun Pajak Berikutnya Dihitung Berdasarkan (basis for computing next tax year's Article 25 installment)",
      "type": "string",
      "required": false,
      "description": "Selected from a dropdown labelled only 'Pilih..' in the guide's own screenshot; no option values are legible at any resolution captured, so this is modelled as an open string rather than a fabricated enum — flagged as a judgment call, this document's weakest-sourced field.",
      "sourceRef": "Modul Pengisian SPT Tahunan e-Filing 1770S — 'Induk' > 'F. ANGSURAN PPh PASAL 25 TAHUN PAJAK BERIKUTNYA', line 18, dropdown",
      "validation": {
        "maxLength": 100
      }
    },
    {
      "name": "nextYearInstallmentAmount",
      "label": "Angsuran PPh Pasal 25 Tahun Pajak Berikutnya (Rp) (next tax year's Article 25 installment amount)",
      "type": "number",
      "required": false,
      "sourceRef": "Modul Pengisian SPT Tahunan e-Filing 1770S — 'Induk' > 'F. ANGSURAN PPh PASAL 25 TAHUN PAJAK BERIKUTNYA', line 18, amount field"
    },
    {
      "name": "declarationAgreement",
      "label": "Pernyataan — Setuju (declaration — I agree)",
      "type": "boolean",
      "required": true,
      "description": "The taxpayer's affirmative agreement that the return, 'with full awareness of all consequences including sanctions under applicable law', is true, complete, and clear. Must be checked before the wizard allows proceeding to submission.",
      "sourceRef": "Modul Pengisian SPT Tahunan e-Filing 1770S — 'Induk' > 'Pernyataan' section, checkbox 'Setuju'"
    }
  ],
  "steps": [
    {
      "id": "data_formulir",
      "title": "Return metadata (tax year, normal/amended status)",
      "fields": ["taxYear", "sptStatus", "amendmentNumber"],
      "next": "final_income"
    },
    {
      "id": "final_income",
      "title": "Lampiran II Bagian A — income subject to final/definitive tax",
      "fields": ["hasFinalIncome", "finalIncomeSourceType", "finalIncomeGrossAmount", "finalIncomeTaxDueAmount"],
      "next": "assets"
    },
    {
      "id": "assets",
      "title": "Lampiran II Bagian B — assets at year end",
      "fields": ["hasAssetsAtYearEnd", "assetCode", "assetName", "assetAcquisitionYear", "assetAcquisitionValue", "assetDescription"],
      "next": "debts"
    },
    {
      "id": "debts",
      "title": "Lampiran II Bagian C — debts/liabilities at year end",
      "fields": ["hasDebtsAtYearEnd", "debtCode", "lenderName", "lenderAddress", "loanYear", "loanBalanceAmount"],
      "next": "family_members"
    },
    {
      "id": "family_members",
      "title": "Lampiran II Bagian D — family/dependents register",
      "fields": ["hasFamilyMembersListed", "familyMemberName", "familyMemberNik", "familyMemberRelationship", "familyMemberOccupation"],
      "next": "other_domestic_income"
    },
    {
      "id": "other_domestic_income",
      "title": "Lampiran I Bagian A — other domestic income not subject to final tax",
      "fields": [
        "otherDomesticInterestIncome", "otherDomesticRoyaltyIncome", "otherDomesticRentIncome",
        "otherDomesticPrizeIncome", "otherDomesticAssetSaleGainIncome", "otherDomesticMiscIncome"
      ],
      "next": "non_taxable_income"
    },
    {
      "id": "non_taxable_income",
      "title": "Lampiran I Bagian B — income excluded from the tax object",
      "fields": [
        "nonTaxableGrantAmount", "nonTaxableInheritanceAmount", "nonTaxablePartnershipProfitShareAmount",
        "nonTaxableInsuranceClaimAmount", "nonTaxableScholarshipAmount", "nonTaxableOtherAmount"
      ],
      "next": "withholding"
    },
    {
      "id": "withholding",
      "title": "Lampiran I Bagian C — withholding certificates from other parties",
      "fields": [
        "hasWithholdingCertificate", "withholdingTaxType", "withholdingAgentTaxId", "withholdingAgentName",
        "withholdingCertificateNumber", "withholdingCertificateDate", "withholdingTaxAmount"
      ],
      "next": "identity_and_net_income"
    },
    {
      "id": "identity_and_net_income",
      "title": "Induk — marital status and net income",
      "fields": ["maritalStatus", "domesticEmploymentNetIncome", "foreignNetIncome", "mandatoryZakatDonationAmount"],
      "next": "ptkp_and_tax_due"
    },
    {
      "id": "ptkp_and_tax_due",
      "title": "Induk — non-taxable-income status and tax-due adjustments",
      "fields": [
        "ptkpStatusCode", "numberOfDependentsForPtkp", "article24CreditRefundAmount",
        "article25SelfPaidInstallmentAmount", "article25STPPrincipalAmount"
      ],
      "next": "installment_and_declaration"
    },
    {
      "id": "installment_and_declaration",
      "title": "Induk — next year's installment basis and closing declaration",
      "fields": ["nextYearInstallmentBasisType", "nextYearInstallmentAmount", "declarationAgreement"]
    }
  ]
}
