Ringkasan Utama
Penanganan pajak Indonesia termasuk bagian tersulit dalam membangun ERP. Sejak 2025 PPN sebesar 12 persen, dikenakan atas harga penuh hanya untuk barang mewah dan atas DPP 11/12 untuk selebihnya, setara 11 persen, dan ERP harus mengodekan hal itu bersama pemotongan PPh dan pengiriman e-Faktur.
Sistem pajak Indonesia adalah salah satu yang paling kompleks di Asia Tenggara untuk implementor ERP. Pada 2025, tarif PPN menjadi 12%, dikenakan atas harga penuh hanya untuk barang mewah yang dikenai PPnBM dan atas DPP Nilai Lain sebesar 11/12 dari harga untuk sebagian besar barang dan jasa, setara tarif efektif 11% — perbedaan teknis yang membingungkan banyak bisnis. Berdasarkan PER-19/PJ/2025, PKP yang tidak menyampaikan SPT Masa PPN selama tiga bulan berturut-turut dapat dinonaktifkan akses pembuatan Faktur Pajaknya (e-Faktur), sehingga operasional bisnis langsung terganggu. Dalam pekerjaan konsultasi ERP lepas saya, saya telah membangun kepatuhan pajak Indonesia ke dalam sistem ERP kustom dari nol.
Memahami Pajak Indonesia dalam Konteks ERP
Pajak Indonesia yang paling relevan untuk sistem ERP adalah: PPN (Pajak Pertambahan Nilai) 12% sejak 1 Januari 2025, dikenakan atas DPP Nilai Lain sebesar 11/12 dari harga untuk sebagian besar barang dan jasa (setara 11%) dan atas harga penuh untuk barang mewah yang dikenai PPnBM; PPh 21 (Pemotongan Pajak Penghasilan Pasal 21 — pemotongan gaji karyawan); PPh 23 (PPh Pasal 23 — pemotongan atas jasa, dividen, bunga sebesar 2-15%); PPh 25 (angsuran pajak penghasilan badan); dan PPh 4(2) (pajak final atas jenis penghasilan tertentu seperti jasa konstruksi, yang menurut PP 9/2022 memiliki tujuh tarif dari 1,75% sampai 6% tergantung jenis pekerjaan dan apakah penyedia jasa memiliki sertifikat).
Modul PPN
Modul PPN melacak pajak masukan (PPN atas pembelian yang dapat dikreditkan) dan pajak keluaran (PPN atas penjualan yang harus disetorkan). Setiap faktur AR ke pelanggan PKP menghasilkan faktur pajak (e-Faktur). Setiap faktur AP dari vendor PKP mengandung pajak masukan. Kewajiban PPN bulanan bersih adalah: pajak keluaran dikurangi pajak masukan yang dapat dikreditkan. ERP yang saya bangun memelihara buku besar PPN yang mengagregasi hal ini secara otomatis dari faktur AR dan AP yang telah diposting. PPN dilaporkan setiap bulan dalam SPT Masa PPN, yang sejak Coretax beroperasi pada 1 Januari 2025 disampaikan melalui Coretax DJP; data e-Faktur dibuat di portal Coretax, diunggah sebagai XML sesuai template DJP, atau dikirim melalui integrasi PJAP, dan sejak 12 Februari 2025 faktur normal juga boleh dibuat dari aplikasi desktop e-Faktur.
Indonesian Tax Module Architecture (NestJS + PostgreSQL)
AR Invoice (PKP customer)
│ PPN 12% on DPP Nilai Lain (11/12 × DPP)
▼ (full DPP for goods subject to PPnBM)
┌─────────────────────────────────────────────────────┐
│ e-Faktur Generation │
│ │
│ NSFP assigned by DJP when the e-Faktur is approved │
│ Customer NPWP/NIK (16 digits) + NITKU (22 digits) │
│ DPP (Dasar Pengenaan Pajak) + DPP Nilai Lain │
│ PPN = 12% × 11/12 × DPP (non-luxury goods) │
│ │
│ Export → XML (DJP Coretax template) │
└─────────────────────────────────────────────────────┘
AP Invoice (PKP vendor)
│ Input Tax: vendor's PPN
▼
┌─────────────────────────────────────────────────────┐
│ Input Tax Register │
│ Credited against Output Tax monthly │
└─────────────────────────────────────────────────────┘
Monthly PPN Closing:
Output Tax (AR e-Faktur total PPN)
− Input Tax (AP creditable PPN)
= Net PPN Payable (or Credit)
→ SPT Masa PPN filed in Coretax by last business day of next month
PPh 23 Withholding (on service invoices):
Vendor Invoice: Rp 50,000,000 (consulting fee)
PPh 23: 50,000,000 × 2% = Rp 1,000,000 (withheld by buyer)
Net Payment to vendor: Rp 49,000,000
Bukti Potong issued to vendor ← vendor uses for their own tax creditDari pengalaman saya membangun sistem ERP sebagai konsultan ERP lepas: bangun ekspor e-Faktur terlebih dahulu, bukan perhitungan PPN. Banyak implementor ERP membangun logika perhitungan pajak tetapi kemudian menyadari file impor e-Faktur (CSV dengan urutan kolom tetap untuk aplikasi desktop lama, dan XML sesuai template DJP sejak Coretax) adalah upaya rekayasa yang sepenuhnya terpisah. Format DJP e-Faktur berubah secara berkala — simpan format ekspor sebagai template yang dapat dikonfigurasi, bukan pemetaan field yang dikodekan keras. Saya sudah dua kali harus memperbarui format ekspor dalam dua tahun karena perubahan format DJP.
Pemotongan PPh 23 atas Faktur Vendor
Saat membayar faktur jasa tertentu (konsultasi, layanan teknis, biaya manajemen, sewa), pembeli harus memotong PPh 23 sebesar 2% dari biaya jasa bruto (atau 4% jika vendor tidak memiliki NPWP). Jumlah yang dipotong disetorkan ke DJP oleh pembeli dan dikurangi dari pembayaran vendor. Modul AP yang saya bangun memiliki tanda PPh23 pada setiap baris faktur — ketika dicentang, komputasi pembayaran secara otomatis mengurangi jumlah pemotongan.
Validasi NPWP dan Pemeriksaan Status PKP
Sebelum bertransaksi dengan vendor baru, bisnis Indonesia harus memverifikasi NPWP dan status PKP mereka. Master vendor yang saya bangun mencakup bidang NPWP dan status PKP. Ketika vendor baru dibuat, ERP memanggil API validasi NPWP DJP untuk memverifikasi nomor tersebut valid dan nama bisnis cocok. Jika vendor mengklaim sebagai PKP tetapi statusnya tidak mengkonfirmasi ini, saya menandainya sebelum pajak masukan PPN dikreditkan.
// NestJS: e-Faktur XML export for Coretax DJP (live since 1 Jan 2025)
// Element names follow DJP's sample template (Faktur PK v1.4). DJP revises
// its templates, so pin the version your serializer targets.
@Injectable()
export class EFakturService {
// NPWP: exactly 16 digits (a resident individual may use the 16-digit NIK).
// NITKU (IDTKU in the XML): 22 digits, the 16-digit NPWP + a 6-digit sequence.
private validateTaxId(value: string, digits: 16 | 22, label: string): string {
const clean = value.replace(/\D/g, '');
if (clean.length !== digits) {
throw new BadRequestException(
`Invalid ${label}: ${value} (must be ${digits} digits)`
);
}
return clean;
}
async generateExport(periodYear: number, periodMonth: number): Promise<string> {
const invoices = await this.arRepo.findEfakturReadyInvoices(
periodYear, periodMonth
);
const sellerTin = this.validateTaxId(this.company.npwp, 16, 'NPWP');
const taxInvoices = invoices.map((inv) => {
const buyerTin = this.validateTaxId(inv.customer.npwp, 16, 'NPWP/NIK');
const buyerIdtku = this.validateTaxId(inv.customer.nitku, 22, 'NITKU');
const goods = inv.lines.map((line) => {
// PMK 131/2024: PPN 12% on DPP Nilai Lain (11/12) for non-luxury goods;
// PPnBM goods use the full DPP, so OtherTaxBase equals TaxBase.
// PER-11/PJ/2025 Art. 129: whole rupiah, 0.50 and above rounds up.
const taxBase = line.netAmount; // after line discount, excl. PPN
const otherTaxBase = line.isLuxury
? taxBase
: Math.round((taxBase * 11) / 12);
const vat = Math.round((otherTaxBase * 12) / 100);
return [
'<GoodService>',
`<Name>${escapeXml(line.name)}</Name>`, // your XML-escaping helper
`<TaxBase>${taxBase}</TaxBase>`,
`<OtherTaxBase>${otherTaxBase}</OtherTaxBase>`,
'<VATRate>12</VATRate>',
`<VAT>${vat}</VAT>`,
// ...Opt, Code, Unit, Price, Qty, TotalDiscount, STLGRate, STLG
'</GoodService>',
].join('');
});
return [
'<TaxInvoice>',
`<TaxInvoiceDate>${inv.invoiceDate.toISOString().slice(0, 10)}</TaxInvoiceDate>`,
`<TrxCode>${inv.transactionType}</TrxCode>`, // e.g. 04 = DPP Nilai Lain
`<BuyerTin>${buyerTin}</BuyerTin>`,
`<BuyerIDTKU>${buyerIdtku}</BuyerIDTKU>`,
// ...remaining header elements per DJP's template
`<ListOfGoodService>${goods.join('')}</ListOfGoodService>`,
'</TaxInvoice>',
].join('');
});
return [
'<?xml version="1.0" encoding="utf-8"?>',
'<TaxInvoiceBulk>',
`<TIN>${sellerTin}</TIN>`,
`<ListOfTaxInvoice>${taxInvoices.join('')}</ListOfTaxInvoice>`,
'</TaxInvoiceBulk>',
].join('\n');
}
}Bagaimana Saya Mendekati Ini
Modul pajak adalah NestJS TaxModule dengan: PpnService (pelacakan pajak keluaran/masukan), PphService (pemotongan 21, 23, dan 4(2)), EFakturService (menghasilkan file impor e-Faktur; dulu berupa CSV untuk aplikasi desktop lama, dan Coretax, yang beroperasi sejak 1 Januari 2025, menerima XML sesuai template DJP sebagai gantinya), dan BuktiPotongService (menghasilkan sertifikat pemotongan via Puppeteer PDF). Pembuatan e-Faktur menggunakan serializer yang divalidasi secara ketat yang memberlakukan urutan field, encoding (untuk CSV, UTF-8 dengan BOM untuk kompatibilitas Windows), dan semua format field yang diperlukan DJP. Saya menjalankan serializer terhadap lebih dari 20 kasus uji, termasuk edge case (NPWP kosong, pelanggan non-PKP, faktur pajak pengganti), di setiap deployment.
Unggahan e-Faktur gagal validasi DJP bila datanya salah: template XML DJP memeriksa nilai seperti NPWP dan NITKU, sehingga identitas dengan format yang salah ditolak. Saya pernah mengalami 140 e-Faktur ditolak dalam satu bulan karena validasi NPWP saya terlalu longgar dan menerima NPWP dengan digit yang hilang. Bangun validasi NPWP yang ketat (tepat 16 digit angka untuk NPWP atau NIK pembeli) ke dalam alur pembuatan e-Faktur, dan validasi setiap file terhadap template DJP sebelum diunggah. e-Faktur yang ditolak harus dikoreksi dan dikirim ulang secara manual — sangat merepotkan dalam skala besar.
Proses Penutupan Pajak Bulanan
Pada akhir setiap bulan, modul pajak menjalankan daftar periksa penutupan: semua faktur AR dengan PPN harus memiliki nomor referensi e-Faktur yang lengkap (dari DJP), semua faktur AP dengan PPh23 harus memiliki nomor Bukti Potong, buku besar PPN harus seimbang, dan masa harus dikunci sebelum batas waktu pelaporan SPT Masa PPN (akhir bulan berikutnya, atau hari kerja berikutnya bila jatuh pada akhir pekan atau hari libur, menurut PMK 81/2024).
Pelaporan Pajak Tahunan dan Rekonsiliasi
Untuk persiapan SPT Badan tahunan, ERP menyediakan: L/R tahunan dalam format yang diperlukan DJP, rekonsiliasi PPh 21 tahunan, rekonsiliasi PPh 23 tahunan, dan rekonsiliasi PPN tahunan (12 bulan SPT Masa PPN cocok dengan catatan e-Faktur). Laporan rekonsiliasi ini dijalankan sebelum konsultan pajak mulai menyiapkan SPT Badan.
Sumber & Bacaan Lebih Lanjut
- Legal Indonesia — VAT (PPN) in Indonesia 2026: Rates, Calculation, Filing & Requirements
- International Tax Review — Indonesian Tax Roundup: e-Invoicing Access May Be Deactivated
- Invest in Asia — Indonesia's PPN Guide: 2025 Regulation, Rates, Calculation
- Kemenkeu JDIH — PMK No. 131 Tahun 2024 on PPN treatment (12% rate, DPP Nilai Lain 11/12)
- DJP — PENG-26/PJ.09/2024 on using the 16-digit NPWP and NITKU
- DJP — FAQ on NITKU (22-digit structure)
- DJP — Template XML dan Converter Excel ke XML for Coretax imports
- DJP — PENG-13/PJ.09/2025 on tax invoices via e-Faktur Client Desktop and Coretax
- DJP — PER-19/PJ/2025 on deactivating tax invoice access for non-compliant PKPs
- JDIH BPK — PP No. 9 Tahun 2022 on final income tax for construction services
- JDIH BPK — PMK No. 81 Tahun 2024 (Articles 171 and 173: SPT Masa PPN deadline)
