commit 443cdb3981a6ffb1bc7910bc52bc800a1f70a8dc
parent 49d9f25baa88b01f3b472b4ba5340727c1accf68
Author: Carlosokumu <carlosokumu254@gmail.com>
Date: Wed, 25 Mar 2026 21:48:30 +0300
allow setting entry tx datetime
Diffstat:
3 files changed, 65 insertions(+), 1 deletion(-)
diff --git a/dummy/usawa/gui/controllers/entry_controller.py b/dummy/usawa/gui/controllers/entry_controller.py
@@ -1,3 +1,4 @@
+from datetime import datetime
import logging
from typing import Optional
@@ -16,12 +17,27 @@ class EntryController:
def collect_entry_data(self, view) -> Optional[LedgerEntry]:
"""Collect data from the view and create an entry"""
+
+ tx_date_str = view.date_entry.get_text().strip()
+ tx_time_str = view.time_entry.get_text().strip()
+
+ try:
+ if tx_time_str:
+ tx_date = datetime.strptime(
+ f"{tx_date_str} {tx_time_str}", "%Y-%m-%d %H:%M:%S"
+ )
+ else:
+ tx_date = datetime.strptime(tx_date_str, "%Y-%m-%d").date()
+ except ValueError:
+ logg.error("Invalid date/time format")
+ return None
try:
entry = LedgerEntry(
external_reference=view.ref_entry.get_text().strip() or None,
description=view.desc_entry.get_text().strip() or None,
amount=float(view.amount_entry.get_text() or "0"),
source_unit="BTC",
+ tx_date=tx_date,
source_type=view.get_source_type(),
source_path=view.source_path_entry.get_text().strip(),
dest_unit="BTC",
diff --git a/dummy/usawa/gui/core/entry_service.py b/dummy/usawa/gui/core/entry_service.py
@@ -16,7 +16,6 @@ class EntryService:
def save_entry(self, entry: LedgerEntry) -> tuple[bool, str]:
try:
- entry.tx_date = datetime.now()
entry.date_registered = datetime.now()
entry.transaction_ref = self._generate_transaction_ref()
diff --git a/dummy/usawa/gui/views/create_entry_view.py b/dummy/usawa/gui/views/create_entry_view.py
@@ -1,3 +1,4 @@
+from datetime import datetime
import logging
from gi.repository import Gtk, Adw, Gio, Pango
from pathlib import Path
@@ -136,6 +137,38 @@ class CreateEntryView(Gtk.Box):
header.add_css_class("heading")
section_box.append(header)
+ # Transaction date
+ date_label = Gtk.Label(label="Transaction Date")
+ date_label.set_halign(Gtk.Align.START)
+ date_label.add_css_class("dim-label")
+ section_box.append(date_label)
+
+ date_box = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=8)
+
+ self.date_entry = Gtk.Entry()
+ self.date_entry.set_placeholder_text("YYYY-MM-DD")
+ self.date_entry.set_text(datetime.now().strftime("%Y-%m-%d"))
+ self.date_entry.set_hexpand(True)
+ date_box.append(self.date_entry)
+
+ calendar_btn = Gtk.Button()
+ calendar_btn.set_icon_name("x-office-calendar-symbolic")
+ calendar_btn.add_css_class("flat")
+ calendar_btn.connect("clicked", self._on_show_calendar)
+ date_box.append(calendar_btn)
+ section_box.append(date_box)
+
+ # Optional time
+ time_label = Gtk.Label(label="Transaction Time (optional)")
+ time_label.set_halign(Gtk.Align.START)
+ time_label.add_css_class("dim-label")
+ section_box.append(time_label)
+
+ self.time_entry = Gtk.Entry()
+ self.time_entry.set_placeholder_text("HH:MM:SS (optional)")
+ section_box.append(self.time_entry)
+
+ # Amount
amount_label = Gtk.Label(label="Amount")
amount_label.set_halign(Gtk.Align.START)
amount_label.add_css_class("dim-label")
@@ -145,6 +178,7 @@ class CreateEntryView(Gtk.Box):
self.amount_entry.set_placeholder_text("0.00")
section_box.append(self.amount_entry)
+ # Source / Destination cards
ledger_box = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=16)
ledger_box.set_homogeneous(True)
@@ -514,3 +548,18 @@ class CreateEntryView(Gtk.Box):
if parent is not None:
parent.remove(row)
logg.debug("Removed attachment: %s", file_path)
+
+ def _on_show_calendar(self, button):
+ popover = Gtk.Popover()
+ popover.set_parent(button)
+
+ calendar = Gtk.Calendar()
+ calendar.connect("day-selected", lambda c: self._on_date_selected(c, popover))
+ popover.set_child(calendar)
+ popover.popup()
+
+ def _on_date_selected(self, calendar, popover):
+ date = calendar.get_date()
+ date_str = f"{date.get_year():04d}-{date.get_month():02d}-{date.get_day_of_month():02d}"
+ self.date_entry.set_text(date_str)
+ popover.popdown()