423
Tax
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
| Month | Output | Input | Net |
|---|---|---|---|
| Jan | 52,807.30 | 11,800.60 | 41,006.70 |
| Feb | 40,772.20 | 13,523.30 | 27,248.90 |
| Mar | 33,742.10 | 29,948.80 | 3,793.30 |
| Apr | 63,357.70 | 12,452.30 | 50,905.40 |
| May | 28,857.50 | 12,962.60 | 15,894.90 |
| Jun | 37,224.60 | 13,920.20 | 23,304.40 |
| Jul | 62,088.60 | 13,260.80 | 48,827.80 |
| Aug | 33,116.30 | 22,517.60 | 10,598.70 |
| Sep | 36,829.80 | 15,635.90 | 21,193.90 |
| Oct | 66,652.60 | 11,131.40 | 55,521.20 |
| Nov | 0.00 | 0.00 | 0.00 |
| Dec | 0.00 | 0.00 | 0.00 |
| Year | 455,448.70 | 157,153.50 | 298,295.20 |
Sales tax report - October 2026
| Date | Document | Type | Customer | Tax ID | Branch | Before VAT | VAT |
|---|---|---|---|---|---|---|---|
| 2 Oct 2026 | INV-2026-0051 | Invoice | Siam Retail Co., Ltd. | 0105556012345 | Head office | 233,560.00 | 16,349.20 |
| 5 Oct 2026 | INV-2026-0052 | Invoice | Chao Phraya Logistics PLC | 0107558001234 | Head office | 228,000.00 | 15,960.00 |
| 9 Oct 2026 | INV-2026-0054 | Invoice | Northern Craft Co., Ltd. | 0505559003456 | Branch 00001 | 60,000.00 | 4,200.00 |
| 12 Oct 2026 | INC-2026-0028 | Income | Public workshop tickets | 26,330.00 | 1,843.10 | ||
| 15 Oct 2026 | INV-2026-0056 | Invoice | Andaman Hotels Group Co., Ltd. | 0835560007890 | Head office | 360,000.00 | 25,200.00 |
| 20 Oct 2026 | INV-2026-0057 | Invoice | Napat Wongsakul | 3100500123456 | - | 27,000.00 | 1,890.00 |
| 22 Oct 2026 | INC-2026-0029 | Income | Online software sales | 17,290.00 | 1,210.30 | ||
| Total | 952,180.00 | 66,652.60 | |||||
Purchase tax report - October 2026
| Date | Tax invoice | Type | Vendor | Tax ID | Branch | Before VAT | VAT |
|---|---|---|---|---|---|---|---|
| 1 Oct 2026 | V001/10-370 | Bill | Bangkok Office Tower Co., Ltd. | 0105550099887 | Head office | 85,000.00 | 5,950.00 |
| 5 Oct 2026 | V002/10-868 | Bill | Metropolitan Electricity Authority | 0994000165323 | Head office | 15,580.00 | 1,090.60 |
| 8 Oct 2026 | EXP-2026-0082 | Expense | OfficeMate Supplies Co., Ltd. | 0105547012233 | Branch 00012 | 2,730.00 | 191.10 |
| 10 Oct 2026 | V003/10-957 | Bill | Bright Ads Agency Co., Ltd. | 0105561044556 | Head office | 52,300.00 | 3,661.00 |
| 20 Oct 2026 | EXP-2026-0084 | Expense | Swift Courier Co., Ltd. | 0105563088776 | Head office | 3,410.00 | 238.70 |
| Total | 159,020.00 | 11,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#vatMonthsservice/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