first commit

This commit is contained in:
kaaduu
2025-08-19 15:00:00 +02:00
parent c55d3d6cee
commit 06685c855a
59 changed files with 10610 additions and 0 deletions

169
src/cli.py Normal file
View File

@@ -0,0 +1,169 @@
import argparse
import sys
import os
from datetime import datetime
# 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 data_fetcher
import database
import rate_finder
import rate_reporter
def check_and_update_yearly_data():
"""
Zkontroluje konzistenci ročních dat pro aktuální rok a případně je aktualizuje.
"""
current_year = datetime.now().year
print(f"Kontroluji konzistenci ročních dat pro rok {current_year}...")
# Zkontrolujeme konzistenci dat
is_consistent = data_fetcher.check_yearly_data_consistency(current_year, output_dir="data")
if not is_consistent:
print(f"Roční data pro rok {current_year} nejsou konzistentní. Stahuji aktualizovaná data...")
# Ujistěme se, že adresář data existuje
os.makedirs("data", exist_ok=True)
# Stáhneme roční data znovu
data_fetcher.download_yearly_data(current_year, output_dir="data", force=True)
else:
print(f"Roční data pro rok {current_year} jsou aktuální.")
def main():
# Inicializace databáze
database.init_db()
# Kontrola a případná aktualizace ročních dat pro aktuální rok
check_and_update_yearly_data()
parser = argparse.ArgumentParser(description="Stahování a správa kurzů měn z ČNB.")
parser.add_argument(
"--year",
type=int,
help="Rok, pro který se mají stáhnout data (např. 2020)."
)
parser.add_argument(
"-c", "--currency",
type=str,
help="Kód měny (např. USD) pro měsíční stahování, vyhledání kurzu nebo generování reportu."
)
parser.add_argument(
"--start-date",
type=str,
help="Počáteční datum pro měsíční stahování nebo generování reportu ve formátu DD.MM.YYYY."
)
parser.add_argument(
"--end-date",
type=str,
help="Koncové datum pro měsíční stahování nebo generování reportu ve formátu DD.MM.YYYY."
)
parser.add_argument(
"--date",
type=str,
help="Datum pro stažení denních kurzů ve formátu DD.MM.YYYY."
)
parser.add_argument(
"--get-rate",
type=str,
help="Vyhledá kurz pro zadané datum. Formát: DD.MM.YYYY"
)
parser.add_argument(
"--auto-download",
action="store_true",
help="Automaticky stáhne denní data, pokud je po 14:30 a kurz pro dnešní datum není k dispozici."
)
parser.add_argument(
"--report-year",
type=int,
help="Rok, pro který se má vygenerovat report kurzů."
)
parser.add_argument(
"--report-month",
type=int,
help="Měsíc, pro který se má vygenerovat report kurzů (1-12). Vyžaduje --report-year."
)
parser.add_argument(
"--report-period",
nargs=2,
metavar=('START_DATE', 'END_DATE'),
help="Období, pro které se má vygenerovat report kurzů. Formát: DD.MM.YYYY DD.MM.YYYY"
)
args = parser.parse_args()
# Zde bude logika pro zpracování argumentů
if args.year:
print(f"Stahuji roční data pro rok {args.year}...")
# Ujistěme se, že adresář data existuje
os.makedirs("data", exist_ok=True)
# Volání funkce pro stažení ročních dat
data_fetcher.download_yearly_data(args.year, output_dir="data")
elif args.currency and args.start_date and args.end_date and not args.report_period:
# Měsíční stahování dat
print(f"Stahuji měsíční data pro měnu {args.currency} od {args.start_date} do {args.end_date}...")
# Ujistěme se, že adresář data existuje
os.makedirs("data", exist_ok=True)
# Volání funkce pro stažení měsíčních dat
data_fetcher.download_monthly_data(args.currency, args.start_date, args.end_date, output_dir="data")
elif args.date:
print(f"Stahuji denní data pro datum {args.date}...")
# Ujistěme se, že adresář data existuje
os.makedirs("data", exist_ok=True)
# Volání funkce pro stažení denních dat
data_fetcher.download_daily_data(args.date, output_dir="data")
elif args.get_rate and args.currency:
date_str = args.get_rate
currency_code = args.currency
print(f"Vyhledávám kurz pro {currency_code} na datum {date_str}...")
rate = rate_finder.get_rate_for_date(date_str, currency_code)
if rate:
print(f"Kurz {currency_code} na datum {date_str} (nebo nejbližší pracovní den): {rate}")
else:
# Pokud nebyl kurz nalezen a je aktivní přepínač --auto-download, zkusíme stáhnout denní data
if args.auto_download:
try:
requested_date = datetime.strptime(date_str, "%d.%m.%Y")
today = datetime.now()
# Zkontrolujeme, zda je požadované datum dnešní
if requested_date.date() == today.date():
# Zkontrolujeme, zda je čas po 14:30
if today.time() >= datetime.strptime("14:30", "%H:%M").time():
print("Automaticky stahuji denní data...")
# Ujistěme se, že adresář data existuje
os.makedirs("data", exist_ok=True)
# Stáhneme denní data pro dnešní datum
today_str = today.strftime("%d.%m.%Y")
data_fetcher.download_daily_data(today_str, output_dir="data")
# Zkusíme znovu vyhledat kurz
rate = rate_finder.get_rate_for_date(date_str, currency_code)
if rate:
print(f"Kurz {currency_code} na datum {date_str} (nebo nejbližší pracovní den): {rate}")
else:
print(f"Kurz {currency_code} na datum {date_str} (ani v předchozích dnech) nebyl nalezen ani po stažení denních dat.")
else:
print(f"Chyba: Automatické stahování nelze provést, protože čas ještě není po 14:30. Aktuální čas je {today.strftime('%H:%M')}.")
else:
print("Automatické stahování denních dat je možné pouze pro dnešní datum.")
except ValueError:
print(f"Neplatný formát data: {date_str}")
else:
print(f"Kurz {currency_code} na datum {date_str} (ani v předchozích dnech) nebyl nalezen.")
elif args.report_year and args.currency:
if args.report_month:
# Generování měsíčního reportu
rate_reporter.generate_monthly_report(args.report_year, args.report_month, args.currency, output_dir="data")
else:
# Generování ročního reportu
rate_reporter.generate_yearly_report(args.report_year, args.currency, output_dir="data")
elif args.report_period and args.currency:
# Generování reportu za období
start_date, end_date = args.report_period
rate_reporter.generate_period_report(start_date, end_date, args.currency, output_dir="data")
else:
parser.print_help()
sys.exit(1)
if __name__ == "__main__":
main()