Adaugă solduri în notificările email

- EmailNotifier primește lista de conturi (nu doar count)
- _create_email_body afișează solduri per cont + total RON
- Format tabel HTML frumos cu styling
- send_notifications.py citește date din JSON
- Sincronizare cu TelegramNotifier (deja avea solduri)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
2025-11-06 21:15:52 +02:00
parent 5aa4900b23
commit 2439d0b62a
2 changed files with 57 additions and 18 deletions

View File

@@ -4,6 +4,7 @@ Trimite ultimele fișiere CSV generate pe Email și Telegram
"""
import logging
import sys
import json
from pathlib import Path
from datetime import datetime
from config import Config
@@ -21,27 +22,27 @@ logging.basicConfig(
def find_latest_files(data_dir='./data', time_window_seconds=300):
"""
Găsește ultimele fișiere CSV generate
Găsește ultimele fișiere CSV generate și date despre conturi
Args:
data_dir: Directorul cu fișiere
time_window_seconds: Intervalul de timp (în secunde) pentru a considera fișierele din aceeași sesiune
Returns:
tuple: (solduri_csv_path, list_of_transaction_csvs)
tuple: (solduri_csv_path, list_of_transaction_csvs, accounts_data)
"""
data_path = Path(data_dir)
if not data_path.exists():
logging.error(f"Directorul {data_dir} nu există!")
return None, []
return None, [], []
# Găsește ultimul fișier solduri_*.csv
solduri_files = sorted(data_path.glob('solduri_*.csv'), key=lambda x: x.stat().st_mtime, reverse=True)
if not solduri_files:
logging.error("Nu s-a găsit niciun fișier solduri_*.csv!")
return None, []
return None, [], []
latest_solduri = solduri_files[0]
solduri_time = latest_solduri.stat().st_mtime
@@ -49,6 +50,22 @@ def find_latest_files(data_dir='./data', time_window_seconds=300):
logging.info(f"✓ Găsit fișier solduri: {latest_solduri.name}")
logging.info(f" Timestamp: {datetime.fromtimestamp(solduri_time).strftime('%Y-%m-%d %H:%M:%S')}")
# Găsește fișierul JSON corespunzător
json_filename = latest_solduri.stem + '.json'
json_path = data_path / json_filename
accounts_data = []
if json_path.exists():
try:
with open(json_path, 'r', encoding='utf-8') as f:
json_data = json.load(f)
accounts_data = json_data.get('conturi', [])
logging.info(f"✓ Găsit fișier JSON: {json_filename} ({len(accounts_data)} conturi)")
except Exception as e:
logging.warning(f"Nu s-a putut citi fișierul JSON: {e}")
else:
logging.warning(f"Nu s-a găsit fișierul JSON: {json_filename}")
# Găsește toate fișierele tranzactii_*.csv modificate în ultimele X secunde față de solduri
all_transaction_files = list(data_path.glob('tranzactii_*.csv'))
transaction_files = []
@@ -67,7 +84,7 @@ def find_latest_files(data_dir='./data', time_window_seconds=300):
logging.info(f"✓ Găsite {len(transaction_files)} fișiere tranzacții din aceeași sesiune")
return latest_solduri, transaction_files
return latest_solduri, transaction_files, accounts_data
def send_existing_files():
@@ -86,7 +103,7 @@ def send_existing_files():
return False
# Găsește ultimele fișiere
solduri_csv, transaction_csvs = find_latest_files(Config.OUTPUT_DIR)
solduri_csv, transaction_csvs, accounts_data = find_latest_files(Config.OUTPUT_DIR)
if not solduri_csv:
logging.error("Nu există fișiere de trimis!")
@@ -101,12 +118,14 @@ def send_existing_files():
logging.info(f"Total fișiere de trimis: {len(files_to_send)}")
logging.info("=" * 60)
# Estimează numărul de conturi din numărul de fișiere tranzacții
account_count = len(transaction_csvs)
# Dacă nu avem date despre conturi, creăm o listă goală
if not accounts_data:
logging.warning("Nu s-au găsit date despre conturi din JSON")
accounts_data = []
# Trimite notificările
service = NotificationService(Config)
results = service.send_all(files_to_send, account_count)
results = service.send_all(files_to_send, accounts_data)
# Afișează rezumat
logging.info("=" * 60)