From 6b9b74b007cb60fb93850955ddd3795c9aa87c6e Mon Sep 17 00:00:00 2001 From: shaygol Date: Mon, 15 Jun 2026 13:37:26 +0300 Subject: [PATCH 1/2] feat: enhance conflict dialog to show detailed conflicting data --- gui_app.py | 45 ++++++++++++-- output/budget.log | 130 ++++++++++++++++++++++++++++++++++++++++ src/dashboard_writer.py | 43 ++++++++++++- 3 files changed, 210 insertions(+), 8 deletions(-) diff --git a/gui_app.py b/gui_app.py index 354b349..8f33780 100644 --- a/gui_app.py +++ b/gui_app.py @@ -504,7 +504,7 @@ def accept(self): class ConflictDialog(QDialog): """Dialog for resolving data conflicts.""" - def __init__(self, month_key: str, translations: Translations, parent=None): + def __init__(self, month_key: str, translations: Translations, parent=None, conflicts_info: list = None): """ Initialize conflict resolution dialog. @@ -512,6 +512,7 @@ def __init__(self, month_key: str, translations: Translations, parent=None): month_key: Month identifier string (e.g., "2024-01") translations: Translations object for localized UI text parent: Parent widget (optional) + conflicts_info: Optional list of conflict dictionaries """ super().__init__(parent) self.month_key = month_key @@ -520,15 +521,48 @@ def __init__(self, month_key: str, translations: Translations, parent=None): self.setWindowTitle(self.translations.get('conflict_title')) self.setModal(True) - self.resize(400, 200) + self.resize(500, 300) layout = QVBoxLayout() + # Format month_key + try: + year, month = month_key.split('-') + formatted_month = f"{int(month):02d}/{year}" + except: + formatted_month = month_key + # Message - msg = QLabel(self.translations.get('conflict_message', month_key=month_key)) + msg = QLabel(self.translations.get('conflict_message', month_key=formatted_month)) msg.setFont(QFont('Arial', 11)) layout.addWidget(msg) + if conflicts_info: + conflicts_text = QTextEdit() + conflicts_text.setReadOnly(True) + + # Format conflicts for display + text_lines = [] + for c in conflicts_info: + text_lines.append(f"• {c['category']} ➔ {c['subcat']}:") + try: + text_lines.append(f" {self.translations.get('existing', 'Existing')}: ₪{float(c['existing']):,.2f}") + except (ValueError, TypeError): + text_lines.append(f" {self.translations.get('existing', 'Existing')}: {c['existing']}") + try: + text_lines.append(f" {self.translations.get('new_amount', 'New')}: ₪{float(c['new']):,.2f}") + except (ValueError, TypeError): + text_lines.append(f" {self.translations.get('new_amount', 'New')}: {c['new']}") + text_lines.append("") + + conflicts_text.setText("\n".join(text_lines)) + + # Adjust alignment based on RTL + if self.translations.is_rtl(): + conflicts_text.setAlignment(Qt.AlignmentFlag.AlignRight) + + layout.addWidget(conflicts_text) + # Buttons override_btn = QPushButton(self.translations.get('override_btn')) override_btn.clicked.connect(lambda: self.set_decision("override")) @@ -2250,7 +2284,7 @@ def update_progress(self, message: str): """ self.statusBar().showMessage(message) - def resolve_conflict(self, month_key: str) -> str: + def resolve_conflict(self, month_key: str, conflicts_info: list = None) -> str: """ Resolve data conflict via GUI dialog. @@ -2258,11 +2292,12 @@ def resolve_conflict(self, month_key: str) -> str: Args: month_key: Month identifier string (e.g., "2024-01") + conflicts_info: Optional list of conflict details Returns: User's decision: "override", "add", or "skip" """ - dialog = ConflictDialog(month_key, self.translations, self) + dialog = ConflictDialog(month_key, self.translations, self, conflicts_info) dialog.exec() return dialog.decision diff --git a/output/budget.log b/output/budget.log index e69de29..a53435a 100644 --- a/output/budget.log +++ b/output/budget.log @@ -0,0 +1,130 @@ +2026-01-31 15:24:02 [DEBUG] Logging initialized taskName=None log_file=C:\Users\shayg\Code\Badjet Tracker\output\budget.log max_size_mb=10 backup_count=5 asctime=2026-01-31 15:24:02 +2026-01-31 15:24:02 [DEBUG] Loading dashboard data from C:\Users\shayg\Code\Badjet Tracker\UserFiles\dashboard.xlsx taskName=None asctime=2026-01-31 15:24:02 +2026-01-31 15:24:02 [DEBUG] File exists, loading... taskName=None asctime=2026-01-31 15:24:02 +2026-01-31 15:24:02 [DEBUG] Workbook loaded. Sheets: ['Template'] taskName=None asctime=2026-01-31 15:24:02 +2026-01-31 15:24:02 [DEBUG] Total records found: 0 taskName=None asctime=2026-01-31 15:24:02 +2026-01-31 15:24:02 [DEBUG] Total amount loaded: 0.00 taskName=None asctime=2026-01-31 15:24:02 +2026-01-31 15:24:03 [DEBUG] Loaded 212 default categories from C:\Users\shayg\Code\Badjet Tracker\src\default_categories.json taskName=None asctime=2026-01-31 15:24:03 +2026-01-31 15:24:03 [INFO] Loaded 212 default categories and 0 user categories taskName=None asctime=2026-01-31 15:24:03 +2026-01-31 15:24:03 [WARNING] Template validation warnings: taskName=None asctime=2026-01-31 15:24:03 +2026-01-31 15:24:03 [WARNING] - Category 'בנק' has only one subcategory (might be a mistake) taskName=None asctime=2026-01-31 15:24:03 +2026-01-31 15:24:03 [WARNING] - Category 'מתנות' has only one subcategory (might be a mistake) taskName=None asctime=2026-01-31 15:24:03 +2026-01-31 15:24:03 [WARNING] - Category 'מזומן' has only one subcategory (might be a mistake) taskName=None asctime=2026-01-31 15:24:03 +2026-01-31 15:24:03 [WARNING] - Category 'שונות' has only one subcategory (might be a mistake) taskName=None asctime=2026-01-31 15:24:03 +2026-01-31 15:24:03 [WARNING] - Category 'סיכום' has no subcategories taskName=None asctime=2026-01-31 15:24:03 +2026-01-31 15:24:03 [INFO] === Current category structure from Template === taskName=None asctime=2026-01-31 15:24:03 +2026-01-31 15:24:03 [INFO] רכב: ['דלק', 'ביטוח חובה', 'ביטוח מקיף', 'טיפולים', 'אגרה וטסט', 'כבישי אגרה', 'חניה', 'תחב"צ', 'רכב: שונות'] taskName=None asctime=2026-01-31 15:24:03 +2026-01-31 15:24:03 [INFO] דירה: ['שכירות\\משכנתא', 'ועד בית', 'ארנונה', 'חשמל', 'מים', 'גז', 'תיקונים'] taskName=None asctime=2026-01-31 15:24:03 +2026-01-31 15:24:03 [INFO] בילוי: ['חופשות וטיולים', 'מסעדות', 'הופעות'] taskName=None asctime=2026-01-31 15:24:03 +2026-01-31 15:24:03 [INFO] מזון ומחיה: ['קניות', 'אוכל בעבודה', 'תמי 4'] taskName=None asctime=2026-01-31 15:24:03 +2026-01-31 15:24:03 [INFO] תקשורת: ['סטרימינג', 'סלולר', 'אינטרנט'] taskName=None asctime=2026-01-31 15:24:03 +2026-01-31 15:24:03 [INFO] בנק: ['עמלות'] taskName=None asctime=2026-01-31 15:24:03 +2026-01-31 15:24:03 [INFO] ביטוחים: ['ביטוחי חיים', 'ביטוחי בריאות'] taskName=None asctime=2026-01-31 15:24:03 +2026-01-31 15:24:03 [INFO] בריאות: ['בית מרקחת', 'טיפולים'] taskName=None asctime=2026-01-31 15:24:03 +2026-01-31 15:24:03 [INFO] אופנה: ['חנויות', 'אונליין'] taskName=None asctime=2026-01-31 15:24:03 +2026-01-31 15:24:03 [INFO] מתנות: ['מתנות'] taskName=None asctime=2026-01-31 15:24:03 +2026-01-31 15:24:03 [INFO] מזומן: ['מזומן'] taskName=None asctime=2026-01-31 15:24:03 +2026-01-31 15:24:03 [INFO] שונות: ['שונות'] taskName=None asctime=2026-01-31 15:24:03 +2026-01-31 15:24:03 [INFO] סיכום: [] taskName=None asctime=2026-01-31 15:24:03 +2026-01-31 15:24:03 [INFO] =============================================== taskName=None asctime=2026-01-31 15:24:03 +2026-01-31 15:24:03 [DEBUG] Template structure cached taskName=None asctime=2026-01-31 15:24:03 +2026-01-31 15:24:16 [INFO] Loaded file: excelNewBank (6).xlsx (rows: 72, header row at: 26) taskName=None asctime=2026-01-31 15:24:16 +2026-01-31 15:24:16 [DEBUG] Archived file 'excelNewBank (6).xlsx' taskName=None asctime=2026-01-31 15:24:16 +2026-01-31 15:24:16 [INFO] Archived excelNewBank (6).xlsx taskName=None asctime=2026-01-31 15:24:16 +2026-01-31 15:24:16 [INFO] Loaded file: excelNewBank (7).xlsx (rows: 99, header row at: 27) taskName=None asctime=2026-01-31 15:24:16 +2026-01-31 15:24:16 [DEBUG] Archived file 'excelNewBank (7).xlsx' taskName=None asctime=2026-01-31 15:24:16 +2026-01-31 15:24:16 [INFO] Archived excelNewBank (7).xlsx taskName=None asctime=2026-01-31 15:24:16 +2026-01-31 15:24:16 [DEBUG] Cleaned columns: ['שם כרטיס', 'חיוב לתאריך', 'תאריך', 'שם בית עסק', 'סכום קנייה', 'סכום חיוב בשח', 'אסמכתא', 'סכום הנחה על העסקה', 'אחוז הנחה על העסקה', 'תיאור אופן ההצמדה', 'מדד או שער בסיס', 'המדד או השער בו בוצע החיוב השוטף בעסקה', 'תאור סוג עסקת אשראי', 'Unnamed: 13', 'source_file'] taskName=None asctime=2026-01-31 15:24:16 +2026-01-31 15:24:16 [DEBUG] Mapped columns: ['card', 'charge_due_date', 'transaction_date', 'merchant', 'purchase_amount', 'amount', 'אסמכתא', 'סכום הנחה על העסקה', 'אחוז הנחה על העסקה', 'תיאור אופן ההצמדה', 'מדד או שער בסיס', 'המדד או השער בו בוצע החיוב השוטף בעסקה', 'תאור סוג עסקת אשראי', 'Unnamed: 13', 'source_file'] taskName=None asctime=2026-01-31 15:24:16 +2026-01-31 15:24:16 [WARNING] Dropped 28 rows missing mandatory fields taskName=None asctime=2026-01-31 15:24:16 +2026-01-31 15:24:16 [WARNING] Dropped 6 rows with invalid dates taskName=None asctime=2026-01-31 15:24:16 +2026-01-31 15:24:16 [WARNING] Dropped 38 rows with invalid amounts taskName=None asctime=2026-01-31 15:24:16 +2026-01-31 15:24:16 [INFO] Normalization complete: 99 rows taskName=None asctime=2026-01-31 15:24:16 +2026-01-31 15:24:16 [DEBUG] Loaded 212 default categories from C:\Users\shayg\Code\Badjet Tracker\src\default_categories.json taskName=None asctime=2026-01-31 15:24:16 +2026-01-31 15:24:16 [INFO] Loaded 212 default categories and 0 user categories taskName=None asctime=2026-01-31 15:24:16 +2026-01-31 15:24:16 [WARNING] Template validation warnings: taskName=None asctime=2026-01-31 15:24:16 +2026-01-31 15:24:16 [WARNING] - Category 'בנק' has only one subcategory (might be a mistake) taskName=None asctime=2026-01-31 15:24:16 +2026-01-31 15:24:16 [WARNING] - Category 'מתנות' has only one subcategory (might be a mistake) taskName=None asctime=2026-01-31 15:24:16 +2026-01-31 15:24:16 [WARNING] - Category 'מזומן' has only one subcategory (might be a mistake) taskName=None asctime=2026-01-31 15:24:16 +2026-01-31 15:24:16 [WARNING] - Category 'שונות' has only one subcategory (might be a mistake) taskName=None asctime=2026-01-31 15:24:16 +2026-01-31 15:24:16 [WARNING] - Category 'סיכום' has no subcategories taskName=None asctime=2026-01-31 15:24:16 +2026-01-31 15:24:16 [INFO] === Current category structure from Template === taskName=None asctime=2026-01-31 15:24:16 +2026-01-31 15:24:16 [INFO] רכב: ['דלק', 'ביטוח חובה', 'ביטוח מקיף', 'טיפולים', 'אגרה וטסט', 'כבישי אגרה', 'חניה', 'תחב"צ', 'רכב: שונות'] taskName=None asctime=2026-01-31 15:24:16 +2026-01-31 15:24:16 [INFO] דירה: ['שכירות\\משכנתא', 'ועד בית', 'ארנונה', 'חשמל', 'מים', 'גז', 'תיקונים'] taskName=None asctime=2026-01-31 15:24:16 +2026-01-31 15:24:16 [INFO] בילוי: ['חופשות וטיולים', 'מסעדות', 'הופעות'] taskName=None asctime=2026-01-31 15:24:16 +2026-01-31 15:24:16 [INFO] מזון ומחיה: ['קניות', 'אוכל בעבודה', 'תמי 4'] taskName=None asctime=2026-01-31 15:24:16 +2026-01-31 15:24:16 [INFO] תקשורת: ['סטרימינג', 'סלולר', 'אינטרנט'] taskName=None asctime=2026-01-31 15:24:16 +2026-01-31 15:24:16 [INFO] בנק: ['עמלות'] taskName=None asctime=2026-01-31 15:24:16 +2026-01-31 15:24:16 [INFO] ביטוחים: ['ביטוחי חיים', 'ביטוחי בריאות'] taskName=None asctime=2026-01-31 15:24:16 +2026-01-31 15:24:16 [INFO] בריאות: ['בית מרקחת', 'טיפולים'] taskName=None asctime=2026-01-31 15:24:16 +2026-01-31 15:24:16 [INFO] אופנה: ['חנויות', 'אונליין'] taskName=None asctime=2026-01-31 15:24:16 +2026-01-31 15:24:16 [INFO] מתנות: ['מתנות'] taskName=None asctime=2026-01-31 15:24:16 +2026-01-31 15:24:16 [INFO] מזומן: ['מזומן'] taskName=None asctime=2026-01-31 15:24:16 +2026-01-31 15:24:16 [INFO] שונות: ['שונות'] taskName=None asctime=2026-01-31 15:24:16 +2026-01-31 15:24:16 [INFO] סיכום: [] taskName=None asctime=2026-01-31 15:24:16 +2026-01-31 15:24:16 [INFO] =============================================== taskName=None asctime=2026-01-31 15:24:16 +2026-01-31 15:24:16 [DEBUG] Template structure cached taskName=None asctime=2026-01-31 15:24:16 +2026-01-31 15:24:16 [DEBUG] Loaded 212 default categories from C:\Users\shayg\Code\Badjet Tracker\src\default_categories.json taskName=None asctime=2026-01-31 15:24:16 +2026-01-31 15:24:25 [DEBUG] Found substring match for 'הייטקזון - מתנות ואתר' with 'יינות ביתן' (length 4): מזון ומחיה > קניות taskName=None asctime=2026-01-31 15:24:25 +2026-01-31 15:24:30 [DEBUG] Found prefix match for 'שטראוס מים בע"מ' with 'שטראוס מים' (length 10): מזון ומחיה > תמי 4 taskName=None asctime=2026-01-31 15:24:30 +2026-01-31 15:24:31 [DEBUG] Found substring match for '9 ביטוח חובה' with 'ביטוח חובה' (length 10): רכב > ביטוח חובה taskName=None asctime=2026-01-31 15:24:31 +2026-03-18 15:30:20 [DEBUG] Logging initialized taskName=None log_file=C:\Users\shayg\Code\Badjet Tracker\output\budget.log max_size_mb=10 backup_count=5 asctime=2026-03-18 15:30:20 +2026-03-18 15:30:20 [DEBUG] Loading dashboard data from C:\Users\shayg\Code\Badjet Tracker\UserFiles\dashboard.xlsx taskName=None asctime=2026-03-18 15:30:20 +2026-03-18 15:30:20 [DEBUG] File exists, loading... taskName=None asctime=2026-03-18 15:30:20 +2026-03-18 15:30:20 [DEBUG] Workbook loaded. Sheets: ['Template'] taskName=None asctime=2026-03-18 15:30:20 +2026-03-18 15:30:20 [DEBUG] Total records found: 0 taskName=None asctime=2026-03-18 15:30:20 +2026-03-18 15:30:20 [DEBUG] Total amount loaded: 0.00 taskName=None asctime=2026-03-18 15:30:20 +2026-03-18 15:30:21 [DEBUG] Loaded 212 default categories from C:\Users\shayg\Code\Badjet Tracker\src\default_categories.json taskName=None asctime=2026-03-18 15:30:21 +2026-03-18 15:30:21 [INFO] Loaded 212 default categories and 0 user categories taskName=None asctime=2026-03-18 15:30:21 +2026-03-18 15:30:21 [WARNING] Template validation warnings: taskName=None asctime=2026-03-18 15:30:21 +2026-03-18 15:30:21 [WARNING] - Category 'בנק' has only one subcategory (might be a mistake) taskName=None asctime=2026-03-18 15:30:21 +2026-03-18 15:30:21 [WARNING] - Category 'מתנות' has only one subcategory (might be a mistake) taskName=None asctime=2026-03-18 15:30:21 +2026-03-18 15:30:21 [WARNING] - Category 'מזומן' has only one subcategory (might be a mistake) taskName=None asctime=2026-03-18 15:30:21 +2026-03-18 15:30:21 [WARNING] - Category 'שונות' has only one subcategory (might be a mistake) taskName=None asctime=2026-03-18 15:30:21 +2026-03-18 15:30:21 [WARNING] - Category 'סיכום' has no subcategories taskName=None asctime=2026-03-18 15:30:21 +2026-03-18 15:30:21 [INFO] === Current category structure from Template === taskName=None asctime=2026-03-18 15:30:21 +2026-03-18 15:30:21 [INFO] רכב: ['דלק', 'ביטוח חובה', 'ביטוח מקיף', 'טיפולים', 'אגרה וטסט', 'כבישי אגרה', 'חניה', 'תחב"צ', 'רכב: שונות'] taskName=None asctime=2026-03-18 15:30:21 +2026-03-18 15:30:21 [INFO] דירה: ['שכירות\\משכנתא', 'ועד בית', 'ארנונה', 'חשמל', 'מים', 'גז', 'תיקונים'] taskName=None asctime=2026-03-18 15:30:21 +2026-03-18 15:30:21 [INFO] בילוי: ['חופשות וטיולים', 'מסעדות', 'הופעות'] taskName=None asctime=2026-03-18 15:30:21 +2026-03-18 15:30:21 [INFO] מזון ומחיה: ['קניות', 'אוכל בעבודה', 'תמי 4'] taskName=None asctime=2026-03-18 15:30:21 +2026-03-18 15:30:21 [INFO] תקשורת: ['סטרימינג', 'סלולר', 'אינטרנט'] taskName=None asctime=2026-03-18 15:30:21 +2026-03-18 15:30:21 [INFO] בנק: ['עמלות'] taskName=None asctime=2026-03-18 15:30:21 +2026-03-18 15:30:21 [INFO] ביטוחים: ['ביטוחי חיים', 'ביטוחי בריאות'] taskName=None asctime=2026-03-18 15:30:21 +2026-03-18 15:30:21 [INFO] בריאות: ['בית מרקחת', 'טיפולים'] taskName=None asctime=2026-03-18 15:30:21 +2026-03-18 15:30:21 [INFO] אופנה: ['חנויות', 'אונליין'] taskName=None asctime=2026-03-18 15:30:21 +2026-03-18 15:30:21 [INFO] מתנות: ['מתנות'] taskName=None asctime=2026-03-18 15:30:21 +2026-03-18 15:30:21 [INFO] מזומן: ['מזומן'] taskName=None asctime=2026-03-18 15:30:21 +2026-03-18 15:30:21 [INFO] שונות: ['שונות'] taskName=None asctime=2026-03-18 15:30:21 +2026-03-18 15:30:21 [INFO] סיכום: [] taskName=None asctime=2026-03-18 15:30:21 +2026-03-18 15:30:21 [INFO] =============================================== taskName=None asctime=2026-03-18 15:30:21 +2026-03-18 15:30:21 [DEBUG] Template structure cached taskName=None asctime=2026-03-18 15:30:21 +2026-03-18 15:30:26 [DEBUG] Logging initialized taskName=None log_file=C:\Users\shayg\Code\Badjet Tracker\output\budget.log max_size_mb=10 backup_count=5 asctime=2026-03-18 15:30:26 +2026-03-18 15:30:27 [DEBUG] Loading dashboard data from C:\Users\shayg\Code\Badjet Tracker\UserFiles\dashboard.xlsx taskName=None asctime=2026-03-18 15:30:27 +2026-03-18 15:30:27 [DEBUG] File exists, loading... taskName=None asctime=2026-03-18 15:30:27 +2026-03-18 15:30:27 [DEBUG] Workbook loaded. Sheets: ['Template'] taskName=None asctime=2026-03-18 15:30:27 +2026-03-18 15:30:27 [DEBUG] Total records found: 0 taskName=None asctime=2026-03-18 15:30:27 +2026-03-18 15:30:27 [DEBUG] Total amount loaded: 0.00 taskName=None asctime=2026-03-18 15:30:27 +2026-03-18 15:30:27 [DEBUG] Loaded 212 default categories from C:\Users\shayg\Code\Badjet Tracker\src\default_categories.json taskName=None asctime=2026-03-18 15:30:27 +2026-03-18 15:30:27 [INFO] Loaded 212 default categories and 0 user categories taskName=None asctime=2026-03-18 15:30:27 +2026-03-18 15:30:27 [WARNING] Template validation warnings: taskName=None asctime=2026-03-18 15:30:27 +2026-03-18 15:30:27 [WARNING] - Category 'בנק' has only one subcategory (might be a mistake) taskName=None asctime=2026-03-18 15:30:27 +2026-03-18 15:30:27 [WARNING] - Category 'מתנות' has only one subcategory (might be a mistake) taskName=None asctime=2026-03-18 15:30:27 +2026-03-18 15:30:27 [WARNING] - Category 'מזומן' has only one subcategory (might be a mistake) taskName=None asctime=2026-03-18 15:30:27 +2026-03-18 15:30:27 [WARNING] - Category 'שונות' has only one subcategory (might be a mistake) taskName=None asctime=2026-03-18 15:30:27 +2026-03-18 15:30:27 [WARNING] - Category 'סיכום' has no subcategories taskName=None asctime=2026-03-18 15:30:27 +2026-03-18 15:30:27 [INFO] === Current category structure from Template === taskName=None asctime=2026-03-18 15:30:27 +2026-03-18 15:30:27 [INFO] רכב: ['דלק', 'ביטוח חובה', 'ביטוח מקיף', 'טיפולים', 'אגרה וטסט', 'כבישי אגרה', 'חניה', 'תחב"צ', 'רכב: שונות'] taskName=None asctime=2026-03-18 15:30:27 +2026-03-18 15:30:27 [INFO] דירה: ['שכירות\\משכנתא', 'ועד בית', 'ארנונה', 'חשמל', 'מים', 'גז', 'תיקונים'] taskName=None asctime=2026-03-18 15:30:27 +2026-03-18 15:30:27 [INFO] בילוי: ['חופשות וטיולים', 'מסעדות', 'הופעות'] taskName=None asctime=2026-03-18 15:30:27 +2026-03-18 15:30:27 [INFO] מזון ומחיה: ['קניות', 'אוכל בעבודה', 'תמי 4'] taskName=None asctime=2026-03-18 15:30:27 +2026-03-18 15:30:27 [INFO] תקשורת: ['סטרימינג', 'סלולר', 'אינטרנט'] taskName=None asctime=2026-03-18 15:30:27 +2026-03-18 15:30:27 [INFO] בנק: ['עמלות'] taskName=None asctime=2026-03-18 15:30:27 +2026-03-18 15:30:27 [INFO] ביטוחים: ['ביטוחי חיים', 'ביטוחי בריאות'] taskName=None asctime=2026-03-18 15:30:27 +2026-03-18 15:30:27 [INFO] בריאות: ['בית מרקחת', 'טיפולים'] taskName=None asctime=2026-03-18 15:30:27 +2026-03-18 15:30:27 [INFO] אופנה: ['חנויות', 'אונליין'] taskName=None asctime=2026-03-18 15:30:27 +2026-03-18 15:30:27 [INFO] מתנות: ['מתנות'] taskName=None asctime=2026-03-18 15:30:27 +2026-03-18 15:30:27 [INFO] מזומן: ['מזומן'] taskName=None asctime=2026-03-18 15:30:27 +2026-03-18 15:30:27 [INFO] שונות: ['שונות'] taskName=None asctime=2026-03-18 15:30:27 +2026-03-18 15:30:27 [INFO] סיכום: [] taskName=None asctime=2026-03-18 15:30:27 +2026-03-18 15:30:27 [INFO] =============================================== taskName=None asctime=2026-03-18 15:30:27 +2026-03-18 15:30:27 [DEBUG] Template structure cached taskName=None asctime=2026-03-18 15:30:27 diff --git a/src/dashboard_writer.py b/src/dashboard_writer.py index 0396bfd..cb452fc 100644 --- a/src/dashboard_writer.py +++ b/src/dashboard_writer.py @@ -181,6 +181,31 @@ def _update_sheet(self, year: int, df: pd.DataFrame) -> None: category_ranges = self._get_category_row_ranges(ws) existing_map = self._build_subcat_location_map(ws, category_ranges) + # Pre-calculate conflicts for the whole year + conflicts_by_month = {} + for _, row in df.iterrows(): + cat = row['category'] + subcat = row['subcat'] + month = str(int(row['month'])) + amount = row['monthly_amount'] + col = month_columns.get(month) + if not col: + continue + + if (cat, subcat) in existing_map: + row_idx = existing_map[(cat, subcat)] + cell_value = ws.cell(row=row_idx, column=col + 1).value + if cell_value is not None and cell_value != 0: + month_key = f"{year}-{month}" + if month_key not in conflicts_by_month: + conflicts_by_month[month_key] = [] + conflicts_by_month[month_key].append({ + 'category': cat, + 'subcat': subcat, + 'existing': cell_value, + 'new': amount + }) + for _, row in df.iterrows(): cat = row['category'] subcat = row['subcat'] @@ -205,7 +230,8 @@ def _update_sheet(self, year: int, df: pd.DataFrame) -> None: if existing_value is not None and existing_value != 0: month_key = f"{year}-{month}" if month_key not in self.user_decisions: - decision = self._prompt_user_decision(month_key, self.conflict_resolver) + conflicts = conflicts_by_month.get(month_key, []) + decision = self._prompt_user_decision(month_key, self.conflict_resolver, conflicts) self.user_decisions[month_key] = decision else: decision = self.user_decisions[month_key] @@ -237,12 +263,23 @@ def _update_sheet(self, year: int, df: pd.DataFrame) -> None: logger.info(f"Dashboard sheet updated for year {year}") - def _prompt_user_decision(self, month_key: str, conflict_resolver: Optional[Callable[[str], str]] = None) -> str: + def _prompt_user_decision(self, month_key: str, conflict_resolver: Optional[Callable] = None, conflicts_info: list = None) -> str: # Use callback if provided (GUI mode), otherwise use input (CLI mode) if conflict_resolver: - return conflict_resolver(month_key) + import inspect + sig = inspect.signature(conflict_resolver) + if len(sig.parameters) >= 2: + return conflict_resolver(month_key, conflicts_info) + else: + return conflict_resolver(month_key) print(f"\nData already exists for {month_key}. Choose how to handle it:") + if conflicts_info: + print(f"Conflicts ({len(conflicts_info)} found):") + for c in conflicts_info[:3]: + print(f" {c['category']} -> {c['subcat']}: Existing {c['existing']}, New {c['new']}") + if len(conflicts_info) > 3: + print(f" ... and {len(conflicts_info) - 3} more") print("1. Override existing data") print("2. Add to existing data") print("3. Skip this month") From 7efbd7a1fde35d3967839e041b3ed47976bfa9fe Mon Sep 17 00:00:00 2001 From: Shay <83375796+shaygol@users.noreply.github.com> Date: Tue, 14 Jul 2026 22:56:47 +0300 Subject: [PATCH 2/2] Delete output/budget.log --- output/budget.log | 130 ---------------------------------------------- 1 file changed, 130 deletions(-) delete mode 100644 output/budget.log diff --git a/output/budget.log b/output/budget.log deleted file mode 100644 index a53435a..0000000 --- a/output/budget.log +++ /dev/null @@ -1,130 +0,0 @@ -2026-01-31 15:24:02 [DEBUG] Logging initialized taskName=None log_file=C:\Users\shayg\Code\Badjet Tracker\output\budget.log max_size_mb=10 backup_count=5 asctime=2026-01-31 15:24:02 -2026-01-31 15:24:02 [DEBUG] Loading dashboard data from C:\Users\shayg\Code\Badjet Tracker\UserFiles\dashboard.xlsx taskName=None asctime=2026-01-31 15:24:02 -2026-01-31 15:24:02 [DEBUG] File exists, loading... taskName=None asctime=2026-01-31 15:24:02 -2026-01-31 15:24:02 [DEBUG] Workbook loaded. Sheets: ['Template'] taskName=None asctime=2026-01-31 15:24:02 -2026-01-31 15:24:02 [DEBUG] Total records found: 0 taskName=None asctime=2026-01-31 15:24:02 -2026-01-31 15:24:02 [DEBUG] Total amount loaded: 0.00 taskName=None asctime=2026-01-31 15:24:02 -2026-01-31 15:24:03 [DEBUG] Loaded 212 default categories from C:\Users\shayg\Code\Badjet Tracker\src\default_categories.json taskName=None asctime=2026-01-31 15:24:03 -2026-01-31 15:24:03 [INFO] Loaded 212 default categories and 0 user categories taskName=None asctime=2026-01-31 15:24:03 -2026-01-31 15:24:03 [WARNING] Template validation warnings: taskName=None asctime=2026-01-31 15:24:03 -2026-01-31 15:24:03 [WARNING] - Category 'בנק' has only one subcategory (might be a mistake) taskName=None asctime=2026-01-31 15:24:03 -2026-01-31 15:24:03 [WARNING] - Category 'מתנות' has only one subcategory (might be a mistake) taskName=None asctime=2026-01-31 15:24:03 -2026-01-31 15:24:03 [WARNING] - Category 'מזומן' has only one subcategory (might be a mistake) taskName=None asctime=2026-01-31 15:24:03 -2026-01-31 15:24:03 [WARNING] - Category 'שונות' has only one subcategory (might be a mistake) taskName=None asctime=2026-01-31 15:24:03 -2026-01-31 15:24:03 [WARNING] - Category 'סיכום' has no subcategories taskName=None asctime=2026-01-31 15:24:03 -2026-01-31 15:24:03 [INFO] === Current category structure from Template === taskName=None asctime=2026-01-31 15:24:03 -2026-01-31 15:24:03 [INFO] רכב: ['דלק', 'ביטוח חובה', 'ביטוח מקיף', 'טיפולים', 'אגרה וטסט', 'כבישי אגרה', 'חניה', 'תחב"צ', 'רכב: שונות'] taskName=None asctime=2026-01-31 15:24:03 -2026-01-31 15:24:03 [INFO] דירה: ['שכירות\\משכנתא', 'ועד בית', 'ארנונה', 'חשמל', 'מים', 'גז', 'תיקונים'] taskName=None asctime=2026-01-31 15:24:03 -2026-01-31 15:24:03 [INFO] בילוי: ['חופשות וטיולים', 'מסעדות', 'הופעות'] taskName=None asctime=2026-01-31 15:24:03 -2026-01-31 15:24:03 [INFO] מזון ומחיה: ['קניות', 'אוכל בעבודה', 'תמי 4'] taskName=None asctime=2026-01-31 15:24:03 -2026-01-31 15:24:03 [INFO] תקשורת: ['סטרימינג', 'סלולר', 'אינטרנט'] taskName=None asctime=2026-01-31 15:24:03 -2026-01-31 15:24:03 [INFO] בנק: ['עמלות'] taskName=None asctime=2026-01-31 15:24:03 -2026-01-31 15:24:03 [INFO] ביטוחים: ['ביטוחי חיים', 'ביטוחי בריאות'] taskName=None asctime=2026-01-31 15:24:03 -2026-01-31 15:24:03 [INFO] בריאות: ['בית מרקחת', 'טיפולים'] taskName=None asctime=2026-01-31 15:24:03 -2026-01-31 15:24:03 [INFO] אופנה: ['חנויות', 'אונליין'] taskName=None asctime=2026-01-31 15:24:03 -2026-01-31 15:24:03 [INFO] מתנות: ['מתנות'] taskName=None asctime=2026-01-31 15:24:03 -2026-01-31 15:24:03 [INFO] מזומן: ['מזומן'] taskName=None asctime=2026-01-31 15:24:03 -2026-01-31 15:24:03 [INFO] שונות: ['שונות'] taskName=None asctime=2026-01-31 15:24:03 -2026-01-31 15:24:03 [INFO] סיכום: [] taskName=None asctime=2026-01-31 15:24:03 -2026-01-31 15:24:03 [INFO] =============================================== taskName=None asctime=2026-01-31 15:24:03 -2026-01-31 15:24:03 [DEBUG] Template structure cached taskName=None asctime=2026-01-31 15:24:03 -2026-01-31 15:24:16 [INFO] Loaded file: excelNewBank (6).xlsx (rows: 72, header row at: 26) taskName=None asctime=2026-01-31 15:24:16 -2026-01-31 15:24:16 [DEBUG] Archived file 'excelNewBank (6).xlsx' taskName=None asctime=2026-01-31 15:24:16 -2026-01-31 15:24:16 [INFO] Archived excelNewBank (6).xlsx taskName=None asctime=2026-01-31 15:24:16 -2026-01-31 15:24:16 [INFO] Loaded file: excelNewBank (7).xlsx (rows: 99, header row at: 27) taskName=None asctime=2026-01-31 15:24:16 -2026-01-31 15:24:16 [DEBUG] Archived file 'excelNewBank (7).xlsx' taskName=None asctime=2026-01-31 15:24:16 -2026-01-31 15:24:16 [INFO] Archived excelNewBank (7).xlsx taskName=None asctime=2026-01-31 15:24:16 -2026-01-31 15:24:16 [DEBUG] Cleaned columns: ['שם כרטיס', 'חיוב לתאריך', 'תאריך', 'שם בית עסק', 'סכום קנייה', 'סכום חיוב בשח', 'אסמכתא', 'סכום הנחה על העסקה', 'אחוז הנחה על העסקה', 'תיאור אופן ההצמדה', 'מדד או שער בסיס', 'המדד או השער בו בוצע החיוב השוטף בעסקה', 'תאור סוג עסקת אשראי', 'Unnamed: 13', 'source_file'] taskName=None asctime=2026-01-31 15:24:16 -2026-01-31 15:24:16 [DEBUG] Mapped columns: ['card', 'charge_due_date', 'transaction_date', 'merchant', 'purchase_amount', 'amount', 'אסמכתא', 'סכום הנחה על העסקה', 'אחוז הנחה על העסקה', 'תיאור אופן ההצמדה', 'מדד או שער בסיס', 'המדד או השער בו בוצע החיוב השוטף בעסקה', 'תאור סוג עסקת אשראי', 'Unnamed: 13', 'source_file'] taskName=None asctime=2026-01-31 15:24:16 -2026-01-31 15:24:16 [WARNING] Dropped 28 rows missing mandatory fields taskName=None asctime=2026-01-31 15:24:16 -2026-01-31 15:24:16 [WARNING] Dropped 6 rows with invalid dates taskName=None asctime=2026-01-31 15:24:16 -2026-01-31 15:24:16 [WARNING] Dropped 38 rows with invalid amounts taskName=None asctime=2026-01-31 15:24:16 -2026-01-31 15:24:16 [INFO] Normalization complete: 99 rows taskName=None asctime=2026-01-31 15:24:16 -2026-01-31 15:24:16 [DEBUG] Loaded 212 default categories from C:\Users\shayg\Code\Badjet Tracker\src\default_categories.json taskName=None asctime=2026-01-31 15:24:16 -2026-01-31 15:24:16 [INFO] Loaded 212 default categories and 0 user categories taskName=None asctime=2026-01-31 15:24:16 -2026-01-31 15:24:16 [WARNING] Template validation warnings: taskName=None asctime=2026-01-31 15:24:16 -2026-01-31 15:24:16 [WARNING] - Category 'בנק' has only one subcategory (might be a mistake) taskName=None asctime=2026-01-31 15:24:16 -2026-01-31 15:24:16 [WARNING] - Category 'מתנות' has only one subcategory (might be a mistake) taskName=None asctime=2026-01-31 15:24:16 -2026-01-31 15:24:16 [WARNING] - Category 'מזומן' has only one subcategory (might be a mistake) taskName=None asctime=2026-01-31 15:24:16 -2026-01-31 15:24:16 [WARNING] - Category 'שונות' has only one subcategory (might be a mistake) taskName=None asctime=2026-01-31 15:24:16 -2026-01-31 15:24:16 [WARNING] - Category 'סיכום' has no subcategories taskName=None asctime=2026-01-31 15:24:16 -2026-01-31 15:24:16 [INFO] === Current category structure from Template === taskName=None asctime=2026-01-31 15:24:16 -2026-01-31 15:24:16 [INFO] רכב: ['דלק', 'ביטוח חובה', 'ביטוח מקיף', 'טיפולים', 'אגרה וטסט', 'כבישי אגרה', 'חניה', 'תחב"צ', 'רכב: שונות'] taskName=None asctime=2026-01-31 15:24:16 -2026-01-31 15:24:16 [INFO] דירה: ['שכירות\\משכנתא', 'ועד בית', 'ארנונה', 'חשמל', 'מים', 'גז', 'תיקונים'] taskName=None asctime=2026-01-31 15:24:16 -2026-01-31 15:24:16 [INFO] בילוי: ['חופשות וטיולים', 'מסעדות', 'הופעות'] taskName=None asctime=2026-01-31 15:24:16 -2026-01-31 15:24:16 [INFO] מזון ומחיה: ['קניות', 'אוכל בעבודה', 'תמי 4'] taskName=None asctime=2026-01-31 15:24:16 -2026-01-31 15:24:16 [INFO] תקשורת: ['סטרימינג', 'סלולר', 'אינטרנט'] taskName=None asctime=2026-01-31 15:24:16 -2026-01-31 15:24:16 [INFO] בנק: ['עמלות'] taskName=None asctime=2026-01-31 15:24:16 -2026-01-31 15:24:16 [INFO] ביטוחים: ['ביטוחי חיים', 'ביטוחי בריאות'] taskName=None asctime=2026-01-31 15:24:16 -2026-01-31 15:24:16 [INFO] בריאות: ['בית מרקחת', 'טיפולים'] taskName=None asctime=2026-01-31 15:24:16 -2026-01-31 15:24:16 [INFO] אופנה: ['חנויות', 'אונליין'] taskName=None asctime=2026-01-31 15:24:16 -2026-01-31 15:24:16 [INFO] מתנות: ['מתנות'] taskName=None asctime=2026-01-31 15:24:16 -2026-01-31 15:24:16 [INFO] מזומן: ['מזומן'] taskName=None asctime=2026-01-31 15:24:16 -2026-01-31 15:24:16 [INFO] שונות: ['שונות'] taskName=None asctime=2026-01-31 15:24:16 -2026-01-31 15:24:16 [INFO] סיכום: [] taskName=None asctime=2026-01-31 15:24:16 -2026-01-31 15:24:16 [INFO] =============================================== taskName=None asctime=2026-01-31 15:24:16 -2026-01-31 15:24:16 [DEBUG] Template structure cached taskName=None asctime=2026-01-31 15:24:16 -2026-01-31 15:24:16 [DEBUG] Loaded 212 default categories from C:\Users\shayg\Code\Badjet Tracker\src\default_categories.json taskName=None asctime=2026-01-31 15:24:16 -2026-01-31 15:24:25 [DEBUG] Found substring match for 'הייטקזון - מתנות ואתר' with 'יינות ביתן' (length 4): מזון ומחיה > קניות taskName=None asctime=2026-01-31 15:24:25 -2026-01-31 15:24:30 [DEBUG] Found prefix match for 'שטראוס מים בע"מ' with 'שטראוס מים' (length 10): מזון ומחיה > תמי 4 taskName=None asctime=2026-01-31 15:24:30 -2026-01-31 15:24:31 [DEBUG] Found substring match for '9 ביטוח חובה' with 'ביטוח חובה' (length 10): רכב > ביטוח חובה taskName=None asctime=2026-01-31 15:24:31 -2026-03-18 15:30:20 [DEBUG] Logging initialized taskName=None log_file=C:\Users\shayg\Code\Badjet Tracker\output\budget.log max_size_mb=10 backup_count=5 asctime=2026-03-18 15:30:20 -2026-03-18 15:30:20 [DEBUG] Loading dashboard data from C:\Users\shayg\Code\Badjet Tracker\UserFiles\dashboard.xlsx taskName=None asctime=2026-03-18 15:30:20 -2026-03-18 15:30:20 [DEBUG] File exists, loading... taskName=None asctime=2026-03-18 15:30:20 -2026-03-18 15:30:20 [DEBUG] Workbook loaded. Sheets: ['Template'] taskName=None asctime=2026-03-18 15:30:20 -2026-03-18 15:30:20 [DEBUG] Total records found: 0 taskName=None asctime=2026-03-18 15:30:20 -2026-03-18 15:30:20 [DEBUG] Total amount loaded: 0.00 taskName=None asctime=2026-03-18 15:30:20 -2026-03-18 15:30:21 [DEBUG] Loaded 212 default categories from C:\Users\shayg\Code\Badjet Tracker\src\default_categories.json taskName=None asctime=2026-03-18 15:30:21 -2026-03-18 15:30:21 [INFO] Loaded 212 default categories and 0 user categories taskName=None asctime=2026-03-18 15:30:21 -2026-03-18 15:30:21 [WARNING] Template validation warnings: taskName=None asctime=2026-03-18 15:30:21 -2026-03-18 15:30:21 [WARNING] - Category 'בנק' has only one subcategory (might be a mistake) taskName=None asctime=2026-03-18 15:30:21 -2026-03-18 15:30:21 [WARNING] - Category 'מתנות' has only one subcategory (might be a mistake) taskName=None asctime=2026-03-18 15:30:21 -2026-03-18 15:30:21 [WARNING] - Category 'מזומן' has only one subcategory (might be a mistake) taskName=None asctime=2026-03-18 15:30:21 -2026-03-18 15:30:21 [WARNING] - Category 'שונות' has only one subcategory (might be a mistake) taskName=None asctime=2026-03-18 15:30:21 -2026-03-18 15:30:21 [WARNING] - Category 'סיכום' has no subcategories taskName=None asctime=2026-03-18 15:30:21 -2026-03-18 15:30:21 [INFO] === Current category structure from Template === taskName=None asctime=2026-03-18 15:30:21 -2026-03-18 15:30:21 [INFO] רכב: ['דלק', 'ביטוח חובה', 'ביטוח מקיף', 'טיפולים', 'אגרה וטסט', 'כבישי אגרה', 'חניה', 'תחב"צ', 'רכב: שונות'] taskName=None asctime=2026-03-18 15:30:21 -2026-03-18 15:30:21 [INFO] דירה: ['שכירות\\משכנתא', 'ועד בית', 'ארנונה', 'חשמל', 'מים', 'גז', 'תיקונים'] taskName=None asctime=2026-03-18 15:30:21 -2026-03-18 15:30:21 [INFO] בילוי: ['חופשות וטיולים', 'מסעדות', 'הופעות'] taskName=None asctime=2026-03-18 15:30:21 -2026-03-18 15:30:21 [INFO] מזון ומחיה: ['קניות', 'אוכל בעבודה', 'תמי 4'] taskName=None asctime=2026-03-18 15:30:21 -2026-03-18 15:30:21 [INFO] תקשורת: ['סטרימינג', 'סלולר', 'אינטרנט'] taskName=None asctime=2026-03-18 15:30:21 -2026-03-18 15:30:21 [INFO] בנק: ['עמלות'] taskName=None asctime=2026-03-18 15:30:21 -2026-03-18 15:30:21 [INFO] ביטוחים: ['ביטוחי חיים', 'ביטוחי בריאות'] taskName=None asctime=2026-03-18 15:30:21 -2026-03-18 15:30:21 [INFO] בריאות: ['בית מרקחת', 'טיפולים'] taskName=None asctime=2026-03-18 15:30:21 -2026-03-18 15:30:21 [INFO] אופנה: ['חנויות', 'אונליין'] taskName=None asctime=2026-03-18 15:30:21 -2026-03-18 15:30:21 [INFO] מתנות: ['מתנות'] taskName=None asctime=2026-03-18 15:30:21 -2026-03-18 15:30:21 [INFO] מזומן: ['מזומן'] taskName=None asctime=2026-03-18 15:30:21 -2026-03-18 15:30:21 [INFO] שונות: ['שונות'] taskName=None asctime=2026-03-18 15:30:21 -2026-03-18 15:30:21 [INFO] סיכום: [] taskName=None asctime=2026-03-18 15:30:21 -2026-03-18 15:30:21 [INFO] =============================================== taskName=None asctime=2026-03-18 15:30:21 -2026-03-18 15:30:21 [DEBUG] Template structure cached taskName=None asctime=2026-03-18 15:30:21 -2026-03-18 15:30:26 [DEBUG] Logging initialized taskName=None log_file=C:\Users\shayg\Code\Badjet Tracker\output\budget.log max_size_mb=10 backup_count=5 asctime=2026-03-18 15:30:26 -2026-03-18 15:30:27 [DEBUG] Loading dashboard data from C:\Users\shayg\Code\Badjet Tracker\UserFiles\dashboard.xlsx taskName=None asctime=2026-03-18 15:30:27 -2026-03-18 15:30:27 [DEBUG] File exists, loading... taskName=None asctime=2026-03-18 15:30:27 -2026-03-18 15:30:27 [DEBUG] Workbook loaded. Sheets: ['Template'] taskName=None asctime=2026-03-18 15:30:27 -2026-03-18 15:30:27 [DEBUG] Total records found: 0 taskName=None asctime=2026-03-18 15:30:27 -2026-03-18 15:30:27 [DEBUG] Total amount loaded: 0.00 taskName=None asctime=2026-03-18 15:30:27 -2026-03-18 15:30:27 [DEBUG] Loaded 212 default categories from C:\Users\shayg\Code\Badjet Tracker\src\default_categories.json taskName=None asctime=2026-03-18 15:30:27 -2026-03-18 15:30:27 [INFO] Loaded 212 default categories and 0 user categories taskName=None asctime=2026-03-18 15:30:27 -2026-03-18 15:30:27 [WARNING] Template validation warnings: taskName=None asctime=2026-03-18 15:30:27 -2026-03-18 15:30:27 [WARNING] - Category 'בנק' has only one subcategory (might be a mistake) taskName=None asctime=2026-03-18 15:30:27 -2026-03-18 15:30:27 [WARNING] - Category 'מתנות' has only one subcategory (might be a mistake) taskName=None asctime=2026-03-18 15:30:27 -2026-03-18 15:30:27 [WARNING] - Category 'מזומן' has only one subcategory (might be a mistake) taskName=None asctime=2026-03-18 15:30:27 -2026-03-18 15:30:27 [WARNING] - Category 'שונות' has only one subcategory (might be a mistake) taskName=None asctime=2026-03-18 15:30:27 -2026-03-18 15:30:27 [WARNING] - Category 'סיכום' has no subcategories taskName=None asctime=2026-03-18 15:30:27 -2026-03-18 15:30:27 [INFO] === Current category structure from Template === taskName=None asctime=2026-03-18 15:30:27 -2026-03-18 15:30:27 [INFO] רכב: ['דלק', 'ביטוח חובה', 'ביטוח מקיף', 'טיפולים', 'אגרה וטסט', 'כבישי אגרה', 'חניה', 'תחב"צ', 'רכב: שונות'] taskName=None asctime=2026-03-18 15:30:27 -2026-03-18 15:30:27 [INFO] דירה: ['שכירות\\משכנתא', 'ועד בית', 'ארנונה', 'חשמל', 'מים', 'גז', 'תיקונים'] taskName=None asctime=2026-03-18 15:30:27 -2026-03-18 15:30:27 [INFO] בילוי: ['חופשות וטיולים', 'מסעדות', 'הופעות'] taskName=None asctime=2026-03-18 15:30:27 -2026-03-18 15:30:27 [INFO] מזון ומחיה: ['קניות', 'אוכל בעבודה', 'תמי 4'] taskName=None asctime=2026-03-18 15:30:27 -2026-03-18 15:30:27 [INFO] תקשורת: ['סטרימינג', 'סלולר', 'אינטרנט'] taskName=None asctime=2026-03-18 15:30:27 -2026-03-18 15:30:27 [INFO] בנק: ['עמלות'] taskName=None asctime=2026-03-18 15:30:27 -2026-03-18 15:30:27 [INFO] ביטוחים: ['ביטוחי חיים', 'ביטוחי בריאות'] taskName=None asctime=2026-03-18 15:30:27 -2026-03-18 15:30:27 [INFO] בריאות: ['בית מרקחת', 'טיפולים'] taskName=None asctime=2026-03-18 15:30:27 -2026-03-18 15:30:27 [INFO] אופנה: ['חנויות', 'אונליין'] taskName=None asctime=2026-03-18 15:30:27 -2026-03-18 15:30:27 [INFO] מתנות: ['מתנות'] taskName=None asctime=2026-03-18 15:30:27 -2026-03-18 15:30:27 [INFO] מזומן: ['מזומן'] taskName=None asctime=2026-03-18 15:30:27 -2026-03-18 15:30:27 [INFO] שונות: ['שונות'] taskName=None asctime=2026-03-18 15:30:27 -2026-03-18 15:30:27 [INFO] סיכום: [] taskName=None asctime=2026-03-18 15:30:27 -2026-03-18 15:30:27 [INFO] =============================================== taskName=None asctime=2026-03-18 15:30:27 -2026-03-18 15:30:27 [DEBUG] Template structure cached taskName=None asctime=2026-03-18 15:30:27