From 0ec59a0dfce8d350f26783ccc2456e5cb68c37a5 Mon Sep 17 00:00:00 2001 From: Anders Betts Date: Fri, 18 Sep 2026 21:07:38 +0200 Subject: reports: huvudbok and verifikationslista; fiscal_year.reopen MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit report.general_ledger lists every account with activity or IB, its postings in date order with a running saldo, and Omslutning/Utgående saldo; accounts?/from?/to? narrow it. report.voucher_list lists the year's vouchers with rows and totals, with an optional series filter. fiscal_year.reopen undoes a close (owner-only, confirm:true, audited) so the Räkenskapsår screen can toggle the status. --- tests/test_core.c | 88 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 88 insertions(+) (limited to 'tests') diff --git a/tests/test_core.c b/tests/test_core.c index 27948d6..5740db3 100644 --- a/tests/test_core.c +++ b/tests/test_core.c @@ -771,6 +771,55 @@ int main(void) CHECK(vat_box(d, "10") == 25000); yyjson_doc_free(d); + /* huvudbok: one account block per account with activity or IB */ + d = call(reqf("{\"v\":1,\"id\":\"54a\",\"cmd\":\"report.general_ledger\"" + ",\"session\":\"%s\",\"org\":%d,\"args\":" + "{\"fiscal_year\":%lld}}", + g_session, (int)org_id, (long long)fy1)); + CHECK_OK(d); + CHECK(yyjson_arr_size(jget(d, "result.accounts")) == 3); + CHECK(find_amount(d, "result.accounts", "account", "1930", "debit_ore") == + 125000); + CHECK(find_amount(d, "result.accounts", "account", "1930", "ub_ore") == + 125000); + CHECK(find_amount(d, "result.accounts", "account", "3001", "ub_ore") == + -100000); + CHECK(yyjson_arr_size(jget(d, "result.accounts.0.rows")) == 1); + CHECK(jint(d, "result.accounts.0.rows.0.saldo_ore") == 125000); + CHECK_STR(d, "result.last_voucher.series", "A"); + CHECK(jint(d, "result.last_voucher.number") == 1); + yyjson_doc_free(d); + + d = call(reqf("{\"v\":1,\"id\":\"54b\",\"cmd\":\"report.general_ledger\"" + ",\"session\":\"%s\",\"org\":%d,\"args\":" + "{\"fiscal_year\":%lld,\"accounts\":[\"1930\"]}}", + g_session, (int)org_id, (long long)fy1)); + CHECK_OK(d); + CHECK(yyjson_arr_size(jget(d, "result.accounts")) == 1); + yyjson_doc_free(d); + + /* verifikationslista: vouchers with their rows and totals */ + d = call(reqf("{\"v\":1,\"id\":\"54c\",\"cmd\":\"report.voucher_list\"," + "\"session\":\"%s\",\"org\":%d,\"args\":" + "{\"fiscal_year\":%lld}}", + g_session, (int)org_id, (long long)fy1)); + CHECK_OK(d); + CHECK(yyjson_arr_size(jget(d, "result.vouchers")) == 1); + CHECK_STR(d, "result.vouchers.0.series", "A"); + CHECK(jint(d, "result.vouchers.0.number") == 1); + CHECK(yyjson_arr_size(jget(d, "result.vouchers.0.rows")) == 3); + CHECK(jint(d, "result.totals.debit_ore") == 125000); + CHECK(jint(d, "result.totals.credit_ore") == 125000); + yyjson_doc_free(d); + + d = call(reqf("{\"v\":1,\"id\":\"54d\",\"cmd\":\"report.voucher_list\"," + "\"session\":\"%s\",\"org\":%d,\"args\":" + "{\"fiscal_year\":%lld,\"series\":\"ZZ\"}}", + g_session, (int)org_id, (long long)fy1)); + CHECK_OK(d); + CHECK(yyjson_arr_size(jget(d, "result.vouchers")) == 0); + yyjson_doc_free(d); + d = call(reqf("{\"v\":1,\"id\":\"54\",\"cmd\":\"report.trial_balance\"," "\"session\":\"%s\",\"org\":%d}", g_session, (int)org_id)); @@ -1389,6 +1438,45 @@ int main(void) CHECK_STR(d, "error.code", "FISCAL_YEAR_CLOSED"); yyjson_doc_free(d); + /* reopen is the owner-only undo */ + d = call(reqf("{\"v\":1,\"id\":\"76\",\"cmd\":\"fiscal_year.reopen\"," + "\"session\":\"%s\",\"org\":%d,\"dry_run\":true," + "\"args\":{\"id\":%lld,\"confirm\":true}}", + g_session, (int)org_id, (long long)fy1)); + CHECK_OK(d); + CHECK(jbool(d, "result.dry_run")); + yyjson_doc_free(d); + + d = call(reqf("{\"v\":1,\"id\":\"77\",\"cmd\":\"fiscal_year.reopen\"," + "\"session\":\"%s\",\"org\":%d,\"args\":{\"id\":%lld," + "\"confirm\":true}}", + g_session, (int)org_id, (long long)fy1)); + CHECK_OK(d); + yyjson_doc_free(d); + + d = call(reqf("{\"v\":1,\"id\":\"78\",\"cmd\":\"fiscal_year.get\"," + "\"session\":\"%s\",\"org\":%d,\"args\":{\"id\":%lld}}", + g_session, (int)org_id, (long long)fy1)); + CHECK_OK(d); + CHECK_STR(d, "result.status", "open"); + yyjson_doc_free(d); + + d = call(reqf("{\"v\":1,\"id\":\"79\",\"cmd\":\"voucher.post\"," + "\"session\":\"%s\",\"org\":%d,\"dry_run\":true," + "\"args\":{\"date\":\"2026-03-01\",\"description\":\"Öppet\"," + "\"rows\":[{\"account\":\"1930\",\"debit_ore\":100}," + "{\"account\":\"3001\",\"credit_ore\":100}]}}", + g_session, (int)org_id)); + CHECK_OK(d); + yyjson_doc_free(d); + + d = call(reqf("{\"v\":1,\"id\":\"79b\",\"cmd\":\"fiscal_year.reopen\"," + "\"session\":\"%s\",\"org\":%d,\"args\":{\"id\":%lld," + "\"confirm\":true}}", + g_session, (int)org_id, (long long)fy1)); + CHECK_STR(d, "error.code", "NOT_FOUND"); + yyjson_doc_free(d); + d = call(reqf("{\"v\":1,\"id\":\"75\",\"cmd\":\"audit.verify\"," "\"session\":\"%s\"}", g_session)); -- cgit v1.3