gnucash maint: [lot-viewer] don't show Open & Close dates when not applicable

Christopher Lam clam at code.gnucash.org
Wed Aug 31 10:35:50 EDT 2022


Updated	 via  https://github.com/Gnucash/gnucash/commit/f3b3ccb8 (commit)
	from  https://github.com/Gnucash/gnucash/commit/0d0ab002 (commit)



commit f3b3ccb8d891eeb4571b3036a2e5ea96c33d5137
Author: Christopher Lam <christopher.lck at gmail.com>
Date:   Mon Aug 29 10:50:51 2022 +0800

    [lot-viewer] don't show Open & Close dates when not applicable
    
    Bug: an empty lot would show "Opened" date as 01/01/1970.
    
    Fix on lot editor UI:
    Empty lots have opening date "Empty", blank closing date.
    Open lots have appropriate opening date, closing date "Open"
    Closed lots have appropriate opening and closing dates.

diff --git a/gnucash/gnome/dialog-lot-viewer.c b/gnucash/gnome/dialog-lot-viewer.c
index ae237c4a8..7f7681364 100644
--- a/gnucash/gnome/dialog-lot-viewer.c
+++ b/gnucash/gnome/dialog-lot-viewer.c
@@ -365,8 +365,6 @@ gnc_lot_viewer_fill (GNCLotViewer *lv)
         char gain_buff[200];
         GNCLot *lot = node->data;
         Split *esplit = gnc_lot_get_earliest_split (lot);
-        Transaction *etrans = xaccSplitGetParent (esplit);
-        time64 open_date = xaccTransGetDate (etrans);
         gnc_numeric amt_baln = gnc_lot_get_balance (lot);
         gnc_commodity *currency = find_first_currency (lot);
         gnc_numeric gains_baln = get_realized_gains (lot, currency);
@@ -389,7 +387,14 @@ gnc_lot_viewer_fill (GNCLotViewer *lv)
         gtk_list_store_set(store, &iter, LOT_COL_TYPE, type_buff, -1);
 
         /* Opening date */
-        gtk_list_store_set(store, &iter, LOT_COL_OPEN, open_date, -1);
+        if (esplit)
+        {
+            Transaction *etrans = xaccSplitGetParent (esplit);
+            time64 open_date = xaccTransGetDate (etrans);
+            gtk_list_store_set(store, &iter, LOT_COL_OPEN, open_date, -1);
+        }
+        else
+            gtk_list_store_set(store, &iter, LOT_COL_OPEN, G_MININT64, -1);
 
         /* Closing date */
         if (gnc_lot_is_closed (lot))
@@ -804,6 +809,49 @@ lv_response_cb (GtkDialog *dialog, gint response, gpointer data)
 
 /* ======================================================================== */
 
+static gchar* lot_get_open_date (GNCLot *lot)
+{
+    g_return_val_if_fail (lot, NULL);
+
+    if (!gnc_lot_get_split_list (lot))
+        return g_strdup (_("Empty"));
+    else
+        return qof_print_date (xaccTransGetDate (xaccSplitGetParent (gnc_lot_get_earliest_split (lot))));
+}
+
+static gchar* lot_get_closing_date (GNCLot *lot)
+{
+    g_return_val_if_fail (lot, NULL);
+
+    if (!gnc_lot_get_split_list (lot))
+        return NULL;
+    else if (!gnc_lot_is_closed (lot))
+        return g_strdup (_("Open"));
+    else
+        return qof_print_date (xaccTransGetDate (xaccSplitGetParent (gnc_lot_get_latest_split (lot))));
+}
+
+typedef gchar* (*LotToDateFunc) (GNCLot *lot);
+
+static void lot_print_date (GtkTreeViewColumn *tree_column,
+                            GtkCellRenderer *cell,
+                            GtkTreeModel *tree_model,
+                            GtkTreeIter *iter,
+                            LotToDateFunc lot_to_date)
+{
+    GNCLot *lot;
+    gchar *str = NULL;
+
+    g_return_if_fail (cell && iter && tree_model);
+    gtk_tree_model_get (tree_model, iter, LOT_COL_PNTR, &lot, -1);
+
+    if (lot)
+        str = lot_to_date (lot);
+
+    g_object_set (G_OBJECT (cell), "text", str, NULL);
+    g_free (str);
+}
+
 static void print_date (GtkTreeViewColumn *tree_column,
                         GtkCellRenderer *cell,
                         GtkTreeModel *tree_model,
@@ -811,18 +859,14 @@ static void print_date (GtkTreeViewColumn *tree_column,
                         gpointer data)
 {
     time64 doc_date_time;
-    gchar *doc_date_str = g_strdup (_("Open"));
+    gchar *doc_date_str;
     gint col = GPOINTER_TO_INT(data);
 
     g_return_if_fail (cell && iter && tree_model);
 
     gtk_tree_model_get (tree_model, iter, col, &doc_date_time, -1);
 
-    if (doc_date_time != G_MAXINT64) /* assumes INT64_MAX represents an invalid date/time */
-    {
-        g_free (doc_date_str);
-        doc_date_str = qof_print_date (doc_date_time);
-    }
+    doc_date_str = qof_print_date (doc_date_time);
     g_object_set (G_OBJECT (cell), "text", doc_date_str, NULL);
     g_free (doc_date_str);
 }
@@ -871,8 +915,8 @@ lv_init_lot_view (GNCLotViewer *lv)
     gtk_tree_view_column_set_sort_column_id(column, LOT_COL_OPEN);
     tree_view_column_set_default_width (view, column, "31-12-2013");
     gtk_tree_view_column_set_cell_data_func (column, renderer,
-                                             (GtkTreeCellDataFunc) print_date,
-                                             GINT_TO_POINTER (LOT_COL_OPEN), NULL);
+                                             (GtkTreeCellDataFunc) lot_print_date,
+                                             lot_get_open_date, NULL);
     gtk_tree_view_append_column(view, column);
 
     renderer = gtk_cell_renderer_text_new();
@@ -881,8 +925,8 @@ lv_init_lot_view (GNCLotViewer *lv)
     gtk_tree_view_column_set_sort_column_id(column, LOT_COL_CLOSE);
     tree_view_column_set_default_width (view, column, "31-12-2013");
     gtk_tree_view_column_set_cell_data_func (column, renderer,
-                                             (GtkTreeCellDataFunc) print_date,
-                                             GINT_TO_POINTER (LOT_COL_CLOSE), NULL);
+                                             (GtkTreeCellDataFunc) lot_print_date,
+                                             lot_get_closing_date, NULL);
     gtk_tree_view_append_column(view, column);
 
     renderer = gtk_cell_renderer_text_new();



Summary of changes:
 gnucash/gnome/dialog-lot-viewer.c | 70 +++++++++++++++++++++++++++++++--------
 1 file changed, 57 insertions(+), 13 deletions(-)



More information about the gnucash-changes mailing list