From 4a60e01fcd6b3fae6acaa2547b60d5aeb74f0dc4 Mon Sep 17 00:00:00 2001 From: Christopher Lam Date: Tue, 13 Jun 2023 21:00:58 +0800 Subject: [PATCH] bugfix xaccTransGetTxnType: avoid returning TXN_TYPE_LINK incorrectly A TXN_TYPE_PAYMENT will have non-APAR splits; a TXN_TYPE_LINK will not have non-APAR splits. This bug manifests as a regular TXN_TYPE_PAYMENT transaction being later voided being incorrectly changed to TXN_TYPE_LINK. --- libgnucash/engine/Transaction.c | 9 ++++----- libgnucash/engine/test/utest-Invoice.c | 6 ++++++ 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/libgnucash/engine/Transaction.c b/libgnucash/engine/Transaction.c index 3ba90bb0d2..46caf5b5d5 100644 --- a/libgnucash/engine/Transaction.c +++ b/libgnucash/engine/Transaction.c @@ -2484,7 +2484,7 @@ xaccTransRetDateDue(const Transaction *trans) char xaccTransGetTxnType (Transaction *trans) { - gboolean has_nonAPAR_amount = FALSE; + gboolean has_nonAPAR_split = FALSE; if (!trans) return TXN_TYPE_NONE; @@ -2499,9 +2499,8 @@ xaccTransGetTxnType (Transaction *trans) if (!acc) continue; - if (!xaccAccountIsAPARType (xaccAccountGetType (acc)) && - !gnc_numeric_zero_p (xaccSplitGetValue (n->data))) - has_nonAPAR_amount = TRUE; + if (!xaccAccountIsAPARType (xaccAccountGetType (acc))) + has_nonAPAR_split = TRUE; else if (trans->txn_type == TXN_TYPE_NONE) { GNCLot *lot = xaccSplitGetLot (n->data); @@ -2515,7 +2514,7 @@ xaccTransGetTxnType (Transaction *trans) } } - if (!has_nonAPAR_amount && (trans->txn_type == TXN_TYPE_PAYMENT)) + if (!has_nonAPAR_split && (trans->txn_type == TXN_TYPE_PAYMENT)) trans->txn_type = TXN_TYPE_LINK; return trans->txn_type; diff --git a/libgnucash/engine/test/utest-Invoice.c b/libgnucash/engine/test/utest-Invoice.c index 4d0c561e31..5a0eb2ded3 100644 --- a/libgnucash/engine/test/utest-Invoice.c +++ b/libgnucash/engine/test/utest-Invoice.c @@ -369,6 +369,12 @@ test_xaccTransGetTxnTypeInvoice (Fixture *fixture, gconstpointer pData) g_assert_cmpint (TXN_TYPE_INVOICE, ==, xaccTransGetTxnType (fixture->trans)); g_assert_cmpint (TXN_TYPE_PAYMENT, ==, xaccTransGetTxnType (fixture->trans2)); + + xaccTransVoid (fixture->trans2, "Cancel payment"); + + g_assert_cmpint (TXN_TYPE_PAYMENT, ==, xaccTransGetTxnType (fixture->trans2)); + + xaccTransUnvoid (fixture->trans2); }