423 Tax
Today: 9 Nov 2026

VAT report

Output VAT - input VAT = VAT to pay (PP 30), with the sales and purchase tax reports for the month.

Output VAT (sales)
66,652.60
Input VAT (purchases)
11,131.40
VAT to pay
55,521.20
File PP 30 by 15 Nov 2026
Net VAT for 2026
298,295.20

Month by month

OutputInput
020K40K60K80KJan Output VAT: 52,807.30Jan Input VAT: 11,800.60JanFeb Output VAT: 40,772.20Feb Input VAT: 13,523.30FebMar Output VAT: 33,742.10Mar Input VAT: 29,948.80MarApr Output VAT: 63,357.70Apr Input VAT: 12,452.30AprMay Output VAT: 28,857.50May Input VAT: 12,962.60MayJun Output VAT: 37,224.60Jun Input VAT: 13,920.20JunJul Output VAT: 62,088.60Jul Input VAT: 13,260.80JulAug Output VAT: 33,116.30Aug Input VAT: 22,517.60AugSep Output VAT: 36,829.80Sep Input VAT: 15,635.90SepOct Output VAT: 66,652.60Oct Input VAT: 11,131.40OctNov Output VAT: 0.00Nov Input VAT: 0.00NovDec Output VAT: 0.00Dec Input VAT: 0.00Dec
MonthOutputInputNet
Jan 52,807.3011,800.60 41,006.70
Feb 40,772.2013,523.30 27,248.90
Mar 33,742.1029,948.80 3,793.30
Apr 63,357.7012,452.30 50,905.40
May 28,857.5012,962.60 15,894.90
Jun 37,224.6013,920.20 23,304.40
Jul 62,088.6013,260.80 48,827.80
Aug 33,116.3022,517.60 10,598.70
Sep 36,829.8015,635.90 21,193.90
Oct 66,652.6011,131.40 55,521.20
Nov 0.000.00 0.00
Dec 0.000.00 0.00
Year455,448.70157,153.50 298,295.20

Sales tax report - October 2026

DateDocumentTypeCustomerTax IDBranchBefore VATVAT
2 Oct 2026 InvoiceSiam Retail Co., Ltd. 0105556012345Head office 233,560.00 16,349.20
5 Oct 2026 InvoiceChao Phraya Logistics PLC 0107558001234Head office 228,000.00 15,960.00
9 Oct 2026 InvoiceNorthern Craft Co., Ltd. 0505559003456Branch 00001 60,000.00 4,200.00
12 Oct 2026 IncomePublic workshop tickets 26,330.00 1,843.10
15 Oct 2026 InvoiceAndaman Hotels Group Co., Ltd. 0835560007890Head office 360,000.00 25,200.00
20 Oct 2026 InvoiceNapat Wongsakul 3100500123456- 27,000.00 1,890.00
22 Oct 2026 IncomeOnline software sales 17,290.00 1,210.30
Total952,180.0066,652.60

Purchase tax report - October 2026

DateTax invoiceTypeVendorTax IDBranchBefore VATVAT
1 Oct 2026 BillBangkok Office Tower Co., Ltd. 0105550099887Head office 85,000.005,950.00
5 Oct 2026 BillMetropolitan Electricity Authority 0994000165323Head office 15,580.001,090.60
8 Oct 2026 ExpenseOfficeMate Supplies Co., Ltd. 0105547012233Branch 00012 2,730.00191.10
10 Oct 2026 BillBright Ads Agency Co., Ltd. 0105561044556Head office 52,300.003,661.00
20 Oct 2026 ExpenseSwift Courier Co., Ltd. 0105563088776Head office 3,410.00238.70
Total159,020.0011,131.40
How this works - feature 423 Output VAT - input VAT per month (PP 30) with the tax invoice lists.

Concepts

  • Monthly totals come from the two VAT accounts in the ledger.
  • The sales and purchase tax reports UNION ALL invoices, credit notes, bills and cash records.
  • Positive net = VAT to pay by the 15th of next month; negative = carried forward as a credit.

Read the code

  • service/TaxService#vatMonths
  • service/TaxService#salesVat

SQL behind this page

SELECT MONTH(l.entry_date) AS m,
       SUM(CASE WHEN a.system_role = 'VAT_OUT' THEN l.credit - l.debit ELSE 0 END) AS output_vat,
       SUM(CASE WHEN a.system_role = 'VAT_IN'  THEN l.debit - l.credit ELSE 0 END) AS input_vat
FROM v_ledger l
JOIN account a ON a.id = l.account_id
WHERE a.system_role IN ('VAT_OUT','VAT_IN') AND l.entry_date BETWEEN :from AND :to
GROUP BY MONTH(l.entry_date)

SELECT i.issue_date AS doc_date, i.invoice_no AS doc_no, 'Invoice' AS doc_type, p.name AS party, p.tax_id, p.branch,
       ROUND(i.subtotal * i.fx_rate, 2) AS net, ROUND(i.vat_amount * i.fx_rate, 2) AS vat, i.id AS doc_id
FROM invoice i JOIN party p ON p.id = i.customer_id
WHERE i.status <> 'DRAFT' AND i.status <> 'VOID' AND i.vat_amount <> 0 AND i.issue_date BETWEEN :from AND :to
UNION ALL
SELECT c.issue_date, c.credit_note_no, 'Credit note', p.name, p.tax_id, p.branch,
       -ROUND(c.subtotal * i.fx_rate, 2), -ROUND(c.vat_amount * i.fx_rate, 2), c.id
FROM credit_note c JOIN invoice i ON i.id = c.invoice_id JOIN party p ON p.id = i.customer_id
WHERE c.vat_amount <> 0 AND c.issue_date BETWEEN :from AND :to
UNION ALL
SELECT t.txn_date, t.doc_no, 'Income', COALESCE(p.name, t.description), p.tax_id, p.branch,
       ROUND(t.net_amount * t.fx_rate, 2), ROUND(t.vat_amount * t.fx_rate, 2), t.id
FROM cash_transaction t LEFT JOIN party p ON p.id = t.party_id
WHERE t.kind = 'INCOME' AND t.vat_amount <> 0 AND t.txn_date BETWEEN :from AND :to
ORDER BY doc_date, doc_no