From 9ec5c86f55894a1b9467432d5d21e0b45cd0a57b Mon Sep 17 00:00:00 2001 From: Christopher Lam Date: Sat, 15 Aug 2020 15:51:40 +0800 Subject: [PATCH 1/7] [new-owner-report][api] owner-report-create-with-enddate similar to owner-report-create, accepts enddate argument --- gnucash/report/reports/reports.scm | 5 ++- .../reports/standard/new-owner-report.scm | 32 ++++++++++--------- 2 files changed, 21 insertions(+), 16 deletions(-) diff --git a/gnucash/report/reports/reports.scm b/gnucash/report/reports/reports.scm index 67b2fe51ad..9154a927d2 100644 --- a/gnucash/report/reports/reports.scm +++ b/gnucash/report/reports/reports.scm @@ -38,6 +38,7 @@ (export gnc:payables-report-create) (export gnc:receivables-report-create) (export gnc:owner-report-create) +(export gnc:owner-report-create-with-enddate) (define report-dirs (list '(gnucash reports standard) ; prefix for standard reports included in gnucash @@ -48,7 +49,8 @@ ; and then load all reports found in the given prefixes (let* ((loc (gnc-locale-name)) (loc-spec (if (string-prefix? "de_DE" loc) 'de_DE 'us)) - (all-dirs (append report-dirs (list (list 'gnucash 'reports 'locale-specific loc-spec))))) + (all-dirs (append report-dirs + `((gnucash reports locale-specific ,loc-spec))))) (report-module-loader all-dirs)) (use-modules (gnucash engine)) @@ -86,3 +88,4 @@ (use-modules (gnucash reports standard new-owner-report)) (define gnc:owner-report-create owner-report-create) +(define gnc:owner-report-create-with-enddate owner-report-create-with-enddate) diff --git a/gnucash/report/reports/standard/new-owner-report.scm b/gnucash/report/reports/standard/new-owner-report.scm index a71d812e9d..9771c638b6 100644 --- a/gnucash/report/reports/standard/new-owner-report.scm +++ b/gnucash/report/reports/standard/new-owner-report.scm @@ -29,6 +29,7 @@ (define-module (gnucash reports standard new-owner-report)) (use-modules (srfi srfi-1)) +(use-modules (srfi srfi-2)) (use-modules (srfi srfi-8)) (use-modules (srfi srfi-9)) (use-modules (srfi srfi-11)) ;for let-values @@ -1193,28 +1194,28 @@ invoices and amounts."))))) 'in-menu? #t) -(define (owner-report-create-internal report-guid owner owner-type) +(define (owner-report-create-internal report-guid owner owner-type enddate) (let* ((options (gnc:make-report-options report-guid)) - (owner-op (gnc:lookup-option options owner-page (owner-string owner-type)))) + (owner-op (gnc:lookup-option options owner-page (owner-string owner-type))) + (date-op (gnc:lookup-option options gnc:pagename-general optname-to-date))) (gnc:option-set-value owner-op owner) + (when enddate + (gnc:option-set-value date-op (cons 'absolute enddate))) (gnc:make-report report-guid options))) -(define (owner-report-create owner account) +(define (owner-report-create-with-enddate owner account enddate) ;; note account isn't actually used - (let ((type (gncOwnerGetType (gncOwnerGetEndOwner owner)))) - (cond - ((eqv? type GNC-OWNER-CUSTOMER) - ;; Not sure whether to pass type, or to use the guid in the report function - (owner-report-create-internal customer-report-guid owner type)) + (define guid-alist + (list (cons GNC-OWNER-CUSTOMER customer-report-guid) + (cons GNC-OWNER-VENDOR vendor-report-guid) + (cons GNC-OWNER-EMPLOYEE employee-report-guid))) + (and-let* ((type (gncOwnerGetType (gncOwnerGetEndOwner owner))) + (guid (assv-ref guid-alist type))) + (owner-report-create-internal guid owner type enddate))) - ((eqv? type GNC-OWNER-VENDOR) - (owner-report-create-internal vendor-report-guid owner type)) - - ((eqv? type GNC-OWNER-EMPLOYEE) - (owner-report-create-internal employee-report-guid owner type)) - - (else #f)))) +(define (owner-report-create owner account) + (owner-report-create-with-enddate owner account #f)) (define (gnc:owner-report-create-internal account split query journal? double? title debit-string credit-string) @@ -1229,3 +1230,4 @@ invoices and amounts."))))) (gnc:register-report-hook ACCT-TYPE-RECEIVABLE #t gnc:owner-report-create-internal) (gnc:register-report-hook ACCT-TYPE-PAYABLE #t gnc:owner-report-create-internal) (export owner-report-create) +(export owner-report-create-with-enddate) From 5e0340560a90648da0a1685df84856e2c5d4e7bf Mon Sep 17 00:00:00 2001 From: Christopher Lam Date: Sat, 15 Aug 2020 16:19:37 +0800 Subject: [PATCH 2/7] [html-utilities] gnc:owner-report-text can accepts enddate --- gnucash/report/html-utilities.scm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/gnucash/report/html-utilities.scm b/gnucash/report/html-utilities.scm index 5f44213d23..3967ec5be7 100644 --- a/gnucash/report/html-utilities.scm +++ b/gnucash/report/html-utilities.scm @@ -94,7 +94,7 @@ (else "")))) -(define (gnc:owner-report-text owner acc) +(define* (gnc:owner-report-text owner acc #:optional date) (let* ((end-owner (gncOwnerGetEndOwner owner)) (type (gncOwnerGetType end-owner))) (gnc-build-url @@ -105,6 +105,7 @@ ((eqv? type GNC-OWNER-EMPLOYEE) "owner=e:") (else "unknown-type=")) (gncOwnerReturnGUID end-owner) + (if date (format #f "&enddate=~a" date) "") (if (null? acc) "" (string-append "&acct=" (gncAccountGetGUID acc)))) ""))) From 4aafa1752f6204fb35d7037dca7dd76e207bf428 Mon Sep 17 00:00:00 2001 From: Christopher Lam Date: Sat, 15 Aug 2020 15:51:44 +0800 Subject: [PATCH 3/7] [new-aging] create owner report with end-date --- gnucash/report/reports/standard/new-aging.scm | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/gnucash/report/reports/standard/new-aging.scm b/gnucash/report/reports/standard/new-aging.scm index c6f497749e..c9fbfa3978 100644 --- a/gnucash/report/reports/standard/new-aging.scm +++ b/gnucash/report/reports/standard/new-aging.scm @@ -230,7 +230,9 @@ exist but have no suitable transactions.")) (else (op-num (car aging1) (car aging2))))))))) ;; set default title - (gnc:html-document-set-title! document report-title) + (gnc:html-document-set-title! + document + (format #f "~a - ~a" report-title (qof-print-date report-date))) (cond ((null? accounts) @@ -309,7 +311,7 @@ exist but have no suitable transactions.")) "number-cell" (gnc:make-html-text (gnc:html-markup-anchor - (gnc:owner-report-text owner account) + (gnc:owner-report-text owner account report-date) (gnc:make-gnc-monetary comm aging-total))))) (options->address options receivable owner))))) (sort owners-and-aging sort-aging Date: Mon, 17 Aug 2020 22:35:53 +0800 Subject: [PATCH 4/7] [aging] call owner-report-text with end-date --- gnucash/report/reports/aging.scm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gnucash/report/reports/aging.scm b/gnucash/report/reports/aging.scm index ca9f5f31ec..3f364f8bc2 100644 --- a/gnucash/report/reports/aging.scm +++ b/gnucash/report/reports/aging.scm @@ -807,7 +807,7 @@ copying this report to a spreadsheet for use in a mail merge.") (cons (gnc:make-html-text (gnc:html-markup-anchor - (gnc:owner-report-text owner account) + (gnc:owner-report-text owner account report-date) total)) rest)))) From 17c0c42e0ba008a2677c15003ae87c50e4c0d828 Mon Sep 17 00:00:00 2001 From: Christopher Lam Date: Sat, 15 Aug 2020 15:52:02 +0800 Subject: [PATCH 5/7] [dialog-invoice] gnc_business_call_owner_report_with_enddate --- gnucash/gnome/dialog-invoice.c | 14 +++++++++++++- gnucash/gnome/dialog-invoice.h | 5 +++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/gnucash/gnome/dialog-invoice.c b/gnucash/gnome/dialog-invoice.c index 8eb5c0c056..95ee269d2d 100644 --- a/gnucash/gnome/dialog-invoice.c +++ b/gnucash/gnome/dialog-invoice.c @@ -1161,6 +1161,14 @@ void gnc_invoice_window_new_invoice_cb (GtkWindow *parent, gpointer data) } void gnc_business_call_owner_report (GtkWindow *parent, GncOwner *owner, Account *acc) +{ + gnc_business_call_owner_report_with_enddate (parent, owner, acc, INT64_MAX); +} + +void gnc_business_call_owner_report_with_enddate (GtkWindow *parent, + GncOwner *owner, + Account *acc, + time64 enddate) { int id; SCM args; @@ -1171,9 +1179,13 @@ void gnc_business_call_owner_report (GtkWindow *parent, GncOwner *owner, Account args = SCM_EOL; - func = scm_c_eval_string ("gnc:owner-report-create"); + func = scm_c_eval_string ("gnc:owner-report-create-with-enddate"); g_return_if_fail (scm_is_procedure (func)); + /* set the enddate */ + arg = (enddate != INT64_MAX) ? scm_from_int64 (enddate) : SCM_BOOL_F; + args = scm_cons (arg, args); + if (acc) { swig_type_info * qtype = SWIG_TypeQuery("_p_Account"); diff --git a/gnucash/gnome/dialog-invoice.h b/gnucash/gnome/dialog-invoice.h index 002e4af37d..7b70c0838a 100644 --- a/gnucash/gnome/dialog-invoice.h +++ b/gnucash/gnome/dialog-invoice.h @@ -67,6 +67,11 @@ GNCSearchWindow * gnc_invoice_search (GtkWindow *parent, GncInvoice *start, GncO void gnc_business_call_owner_report (GtkWindow* parent, GncOwner *owner, Account *acc); +void gnc_business_call_owner_report_with_enddate (GtkWindow* parent, + GncOwner *owner, + Account *acc, + time64 enddate); + void gnc_invoice_window_sort (InvoiceWindow *iw, invoice_sort_type_t sort_code); GtkWidget * gnc_invoice_window_create_summary_bar (InvoiceWindow *iw); From 5bf57260aee182717023801c21cbc5f57fe941c7 Mon Sep 17 00:00:00 2001 From: Christopher Lam Date: Sat, 15 Aug 2020 16:19:59 +0800 Subject: [PATCH 6/7] [business-urls] link to owner report with enddate --- gnucash/gnome/business-urls.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/gnucash/gnome/business-urls.c b/gnucash/gnome/business-urls.c index ce1825ad14..e0283a4f37 100644 --- a/gnucash/gnome/business-urls.c +++ b/gnucash/gnome/business-urls.c @@ -213,7 +213,7 @@ ownerreportCB (const char *location, const char *label, GncOwner owner; Account *acc; GHashTable *query_ht; - time64 enddate; + time64 enddate = INT64_MAX; gboolean show_report = TRUE; g_return_val_if_fail (location != NULL, FALSE); @@ -293,7 +293,13 @@ ownerreportCB (const char *location, const char *label, /* Ok, let's run this report */ if (show_report) - gnc_business_call_owner_report (result->parent, &owner, acc); + { + if (enddate != INT64_MAX) + gnc_business_call_owner_report_with_enddate (result->parent, &owner, + acc, enddate); + else + gnc_business_call_owner_report (result->parent, &owner, acc); + } g_hash_table_destroy (query_ht); return show_report; From 2fd2b7bb64e07de4f4319b47b4c1e291af6f0a48 Mon Sep 17 00:00:00 2001 From: Christopher Lam Date: Tue, 18 Aug 2020 22:27:03 +0800 Subject: [PATCH 7/7] Bug 797852 - Error in Accounts Payable Aging re cut off dates Finally the proper fix in aging-report. The aging-report must consider only activity in the report period specified. If an invoice is paid after the report period, it is considered unpaid. --- gnucash/report/report-utilities.scm | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/gnucash/report/report-utilities.scm b/gnucash/report/report-utilities.scm index 1ceb1276d8..f5c2f256e3 100644 --- a/gnucash/report/report-utilities.scm +++ b/gnucash/report/report-utilities.scm @@ -908,7 +908,13 @@ (let* ((invoice (gncInvoiceGetInvoiceFromTxn (xaccSplitGetParent (car splits)))) (lot (gncInvoiceGetPostedLot invoice)) - (bal (gnc-lot-get-balance lot)) + (lot-splits (gnc-lot-get-split-list lot)) + (bal (fold + (lambda (a b) + (if (<= (xaccTransGetDate (xaccSplitGetParent a)) to-date) + (+ (xaccSplitGetAmount a) b) + b)) + 0 lot-splits)) (bal (if receivable? bal (- bal))) (date (if (eq? date-type 'postdate) (gncInvoiceGetDatePosted invoice)