summaryrefslogtreecommitdiff
path: root/src/reports.c
diff options
context:
space:
mode:
authorAnders Betts <anders.betts@gmail.com>2026-09-22 20:01:43 +0200
committerAnders Betts <anders.betts@gmail.com>2026-09-22 20:01:43 +0200
commita11dc0aaf7f99e9b606cf1676a04027f4435c596 (patch)
tree1c89c21bf31c54b567dee741d03500f73f3a9691 /src/reports.c
parent3f07edf64f74cab68cb379e49841fdf6b24674e9 (diff)
downloadbokf-a11dc0aaf7f99e9b606cf1676a04027f4435c596.tar.gz
bokf-a11dc0aaf7f99e9b606cf1676a04027f4435c596.zip
reports: VAT report skips the momsomföring and imported closingsv0.1.65
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Diffstat (limited to 'src/reports.c')
-rw-r--r--src/reports.c21
1 files changed, 18 insertions, 3 deletions
diff --git a/src/reports.c b/src/reports.c
index 96b1344..981d02c 100644
--- a/src/reports.c
+++ b/src/reports.c
@@ -379,6 +379,18 @@ static int vat_box_payable(const char *box)
#define VAT_MAX_BOXES 64
+/* Vouchers left out of the momsdeklaration: the momsomföring itself (any
+ voucher with a 2650 row moves the period's VAT to the redovisningskonto
+ and would zero the boxes) and a source system's imported "Stäng ..." year
+ closings, which zero the P&L underlag. */
+#define VAT_VOUCHER_SQL \
+ " AND NOT EXISTS (SELECT 1 FROM voucher_rows r2 JOIN accounts a2" \
+ " ON a2.org_id = r2.org_id AND a2.id = r2.account_id" \
+ " WHERE r2.org_id = v.org_id AND r2.voucher_id = v.id" \
+ " AND a2.number = '2650')" \
+ " AND NOT (v.source = 'sie_import'" \
+ " AND COALESCE(v.description,'') LIKE 'Stäng%')"
+
yyjson_mut_val *report_vat(yyjson_mut_doc *doc, sqlite3 *db, int64_t org_id,
const char *from, const char *to, char **err)
{
@@ -418,14 +430,16 @@ yyjson_mut_val *report_vat(yyjson_mut_doc *doc, sqlite3 *db, int64_t org_id,
" JOIN vouchers v ON v.org_id=r.org_id AND v.id=r.voucher_id"
" JOIN accounts a ON a.org_id=r.org_id AND a.id=r.account_id"
" WHERE r.org_id=?1 AND a.number=?2 AND v.series <> 'IB'"
- " AND v.series <> ?5 AND v.date BETWEEN ?3 AND ?4";
+ " AND v.series <> ?5 AND v.date BETWEEN ?3 AND ?4"
+ VAT_VOUCHER_SQL;
else if (strcmp(mt, "type") == 0)
sql = "SELECT COALESCE(SUM(r.debit_ore),0),"
"COALESCE(SUM(r.credit_ore),0) FROM voucher_rows r"
" JOIN vouchers v ON v.org_id=r.org_id AND v.id=r.voucher_id"
" JOIN accounts a ON a.org_id=r.org_id AND a.id=r.account_id"
" WHERE r.org_id=?1 AND a.type=?2 AND v.series <> 'IB'"
- " AND v.series <> ?5 AND v.date BETWEEN ?3 AND ?4";
+ " AND v.series <> ?5 AND v.date BETWEEN ?3 AND ?4"
+ VAT_VOUCHER_SQL;
else
sql = "SELECT COALESCE(SUM(r.debit_ore),0),"
"COALESCE(SUM(r.credit_ore),0) FROM voucher_rows r"
@@ -433,7 +447,8 @@ yyjson_mut_val *report_vat(yyjson_mut_doc *doc, sqlite3 *db, int64_t org_id,
" JOIN accounts a ON a.org_id=r.org_id AND a.id=r.account_id"
" WHERE r.org_id=?1 AND CAST(a.number AS INTEGER) BETWEEN ?2"
" AND ?3 AND v.series <> 'IB' AND v.series <> ?6"
- " AND v.date BETWEEN ?4 AND ?5";
+ " AND v.date BETWEEN ?4 AND ?5"
+ VAT_VOUCHER_SQL;
if (sqlite3_prepare_v2(db, sql, -1, &qs, NULL) != SQLITE_OK)
break;
sqlite3_bind_int64(qs, 1, org_id);