"""Application configuration (env-overridable). No third-party data egress.""" from __future__ import annotations import os from pathlib import Path from urllib.parse import quote_plus from dotenv import load_dotenv # Load ar-aging-app/.env (or cwd) before reading settings. _APP_ROOT = Path(__file__).resolve().parent.parent.parent # .../ar-aging-app load_dotenv(_APP_ROOT / ".env") load_dotenv() # also allow cwd overrides BASE_DIR = Path(__file__).resolve().parent.parent # .../backend DATA_DIR = Path(os.environ.get("AR_DATA_DIR", str(BASE_DIR / "data"))) UPLOAD_DIR = DATA_DIR / "uploads" EXPORT_DIR = DATA_DIR / "exports" # MySQL (required) MYSQL_HOST = os.environ.get("MYSQL_HOST", "") MYSQL_PORT = int(os.environ.get("MYSQL_PORT", "3306")) MYSQL_USER = os.environ.get("MYSQL_USER", "") MYSQL_PASSWORD = os.environ.get("MYSQL_PASSWORD", "") MYSQL_DATABASE = os.environ.get("MYSQL_DATABASE", "") MYSQL_SLOW_QUERY_MS = int(os.environ.get("MYSQL_SLOW_QUERY_MS", "500")) MYSQL_POOL_SIZE = int(os.environ.get("MYSQL_POOL_SIZE", "10")) MYSQL_POOL_RECYCLE = int(os.environ.get("MYSQL_POOL_RECYCLE", "3600")) def mysql_url() -> str: if not all((MYSQL_HOST, MYSQL_USER, MYSQL_DATABASE)): raise RuntimeError( "MYSQL_HOST, MYSQL_USER, and MYSQL_DATABASE are required. " "Copy example.env to .env and fill in credentials." ) user = quote_plus(MYSQL_USER) password = quote_plus(MYSQL_PASSWORD) return ( f"mysql+pymysql://{user}:{password}" f"@{MYSQL_HOST}:{MYSQL_PORT}/{MYSQL_DATABASE}" f"?charset=utf8mb4" ) # Retention: temp uploads/exports older than this are purged (0 = keep forever). RETENTION_DAYS = int(os.environ.get("AR_RETENTION_DAYS", "30")) # Defaults DEFAULT_CLEARING_LAG_DAYS = int(os.environ.get("AR_CLEARING_LAG_DAYS", "2")) DEFAULT_TOLERANCE = float(os.environ.get("AR_TOLERANCE", "0.01")) MAX_UPLOAD_BYTES = int(os.environ.get("AR_MAX_UPLOAD_BYTES", str(2 * 1024 * 1024 * 1024))) # 2 GB ALLOWED_EXTENSIONS = {".xlsx", ".xls", ".csv"} # CORS (frontend dev server) CORS_ORIGINS = os.environ.get( "AR_CORS_ORIGINS", "http://localhost:5173,http://127.0.0.1:5173" ).split(",") def ensure_dirs() -> None: for d in (DATA_DIR, UPLOAD_DIR, EXPORT_DIR): d.mkdir(parents=True, exist_ok=True)