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.")