- Added --debug switch to show detailed information - Normal output (--get-rate) now shows only the rate value or 'Kurz nenalezen' - Debug output shows all processing steps and detailed information - All modules updated to support debug mode - Fixed imports and module initialization - Maintains backward compatibility - Reports are generated silently in normal mode, with details in debug mode
134 lines
5.2 KiB
Python
134 lines
5.2 KiB
Python
import sys
|
|
import os
|
|
from datetime import datetime, timedelta
|
|
import sqlite3
|
|
|
|
# Přidání adresáře src do sys.path, aby bylo možné importovat moduly
|
|
sys.path.insert(0, os.path.join(os.path.dirname(__file__)))
|
|
|
|
import database
|
|
import holidays
|
|
import data_fetcher
|
|
|
|
# Global debug flag
|
|
DEBUG = False
|
|
|
|
def debug_print(*args, **kwargs):
|
|
"""Print debug messages only if debug mode is enabled."""
|
|
if DEBUG:
|
|
print(*args, **kwargs)
|
|
|
|
def set_debug_mode(debug):
|
|
"""Set the debug mode for this module."""
|
|
global DEBUG
|
|
DEBUG = debug
|
|
|
|
def check_year_data_in_db(year):
|
|
"""
|
|
Zkontroluje, zda databáze obsahuje data pro zadaný rok.
|
|
|
|
:param year: Rok, který se má zkontrolovat.
|
|
:return: True pokud databáze obsahuje data pro daný rok, jinak False.
|
|
"""
|
|
conn = sqlite3.connect(database.DB_PATH)
|
|
cursor = conn.cursor()
|
|
|
|
# Zkontrolujeme, zda existuje alespoň jeden záznam pro daný rok
|
|
cursor.execute('''
|
|
SELECT COUNT(*) FROM exchange_rates
|
|
WHERE strftime('%Y', date) = ?
|
|
''', (str(year),))
|
|
|
|
count = cursor.fetchone()[0]
|
|
conn.close()
|
|
|
|
return count > 0
|
|
|
|
def get_rate_for_date(date_str, currency_code):
|
|
"""
|
|
Vyhledá kurz pro zadané datum a měnu. Pokud kurz pro dané datum neexistuje,
|
|
aplikuje pravidla pro víkendy a státní svátky. Zahrnuje kontrolu data a času.
|
|
Pokud data pro daný rok neexistují, automaticky stáhne roční data.
|
|
|
|
:param date_str: Datum ve formátu DD.MM.YYYY.
|
|
:param currency_code: Kód měny (např. USD).
|
|
:return: Kurz jako desetinné číslo, nebo None pokud není nalezen.
|
|
"""
|
|
try:
|
|
requested_date = datetime.strptime(date_str, "%d.%m.%Y")
|
|
except ValueError:
|
|
debug_print(f"Neplatný formát data: {date_str}")
|
|
return None
|
|
|
|
year = requested_date.year
|
|
today = datetime.now()
|
|
|
|
# Kontrola, zda je datum v budoucnosti
|
|
if requested_date.date() > today.date():
|
|
debug_print(f"Chyba: Kurzy pro datum {date_str} ještě nebyly vydány, protože toto datum je v budoucnosti.")
|
|
return None
|
|
|
|
# Kontrola, zda je dnešní datum a čas je před 14:30
|
|
if requested_date.date() == today.date() and today.time() < datetime.strptime("14:30", "%H:%M").time():
|
|
debug_print(f"Chyba: Kurzy pro dnešní datum ({date_str}) jsou vyhlašovány po 14:30. Aktuální čas je {today.strftime('%H:%M')}.")
|
|
return None
|
|
|
|
# Kontrola, zda databáze obsahuje data pro daný rok
|
|
if not check_year_data_in_db(year):
|
|
debug_print(f"Databáze neobsahuje data pro rok {year}. Stahuji roční data...")
|
|
# Stáhneme roční data s vynuceným stažením
|
|
os.makedirs("data", exist_ok=True)
|
|
data_fetcher.download_yearly_data(year, output_dir="data", force=True)
|
|
|
|
# 1. Zkusíme najít kurz pro přesné datum
|
|
rate = database.get_rate(date_str, currency_code)
|
|
if rate is not None:
|
|
return rate
|
|
|
|
debug_print(f"Kurz pro {currency_code} na datum {date_str} nebyl nalezen. Hledám nejbližší pracovní den...")
|
|
|
|
# 2. Pokud kurz neexistuje, aplikujeme pravidla
|
|
# Zkontrolujeme, zda je datum víkend nebo svátek
|
|
if holidays.is_weekend(date_str) or holidays.is_holiday(date_str):
|
|
debug_print(f"Datum {date_str} je víkend nebo státní svátek. Hledám předchozí pracovní den...")
|
|
# Pro víkendy a svátky použijeme kurz z předchozího pracovního dne
|
|
previous_workday = holidays.get_previous_working_day(date_str)
|
|
if previous_workday:
|
|
debug_print(f"Používám kurz z předchozího pracovního dne: {previous_workday}")
|
|
return database.get_rate(previous_workday, currency_code)
|
|
else:
|
|
debug_print("Nepodařilo se najít předchozí pracovní den.")
|
|
return None
|
|
else:
|
|
# Pro běžné dny hledáme zpět po pracovních dnech
|
|
debug_print(f"Datum {date_str} je běžný den. Hledám kurz zpětně po pracovních dnech...")
|
|
# Odečítáme dny, dokud nenajdeme pracovní den s kurzem
|
|
# Omezení na 10 dní zpět
|
|
current_date = requested_date
|
|
for _ in range(10):
|
|
current_date -= timedelta(days=1)
|
|
check_date_str = current_date.strftime("%d.%m.%Y")
|
|
|
|
# Zkontrolujeme, zda je to pracovní den
|
|
if not holidays.is_weekend(check_date_str) and not holidays.is_holiday(check_date_str):
|
|
rate = database.get_rate(check_date_str, currency_code)
|
|
if rate is not None:
|
|
debug_print(f"Nalezen kurz z pracovního dne {check_date_str}")
|
|
return rate
|
|
|
|
debug_print("Nepodařilo se najít kurz v posledních 10 pracovních dnech.")
|
|
return None
|
|
|
|
# Příklad použití
|
|
if __name__ == "__main__":
|
|
# Inicializace databáze (pro případ spuštění samostatně)
|
|
database.init_db()
|
|
|
|
# Test
|
|
test_date = "01.01.2025" # Svátek
|
|
test_currency = "USD"
|
|
rate = get_rate_for_date(test_date, test_currency)
|
|
if rate:
|
|
print(f"Kurz {test_currency} na datum {test_date} (nebo nejbližší pracovní den): {rate}")
|
|
else:
|
|
print(f"Kurz {test_currency} na datum {test_date} (ani v předchozích dnech) nebyl nalezen.") |