perioada luna anterioara finalizata

This commit is contained in:
2026-02-16 14:12:03 +02:00
parent bc05d02319
commit 85423cfe94
5 changed files with 299 additions and 157 deletions

74
main.py
View File

@@ -48,11 +48,12 @@ check_dependencies()
import oracledb
import pandas as pd
from dateutil.relativedelta import relativedelta
from datetime import timedelta
from config import (
ORACLE_CONFIG, get_dsn, OUTPUT_DIR, COMPANY_NAME,
ANALYSIS_MONTHS, MIN_SALES_FOR_ANALYSIS, LOW_MARGIN_THRESHOLD,
RECOMMENDATION_THRESHOLDS
RECOMMENDATION_THRESHOLDS, REPORT_END_MONTH
)
from queries import QUERIES
from report_generator import (
@@ -279,6 +280,41 @@ class PerformanceLogger:
print(f"\n📝 Log saved to: {log_file}")
def compute_data_referinta(end_month_str: str = None) -> datetime:
"""
Compute reference date (first day of month AFTER the last reporting month).
If end_month_str is None: default to first day of current month
(i.e., report through end of previous month).
If end_month_str is 'YYYY-MM': parse it and return first day of next month.
"""
if end_month_str:
parsed = datetime.strptime(end_month_str, '%Y-%m')
if parsed.month == 12:
return datetime(parsed.year + 1, 1, 1)
else:
return datetime(parsed.year, parsed.month + 1, 1)
else:
today = datetime.now()
return datetime(today.year, today.month, 1)
def resolve_dynamic_tables(sql: str, data_referinta: datetime, months: int = 12) -> str:
"""
Replace vjv2025/vjc2025 with correct year (or UNION ALL if spanning years).
"""
end_year = (data_referinta - timedelta(days=1)).year
start_year = (data_referinta - relativedelta(months=months)).year
if start_year == end_year:
sql = sql.replace('vjv2025', f'vjv{end_year}')
sql = sql.replace('vjc2025', f'vjc{end_year}')
else:
sql = sql.replace('vjv2025', f'(SELECT * FROM vjv{start_year} UNION ALL SELECT * FROM vjv{end_year})')
sql = sql.replace('vjc2025', f'(SELECT * FROM vjc{start_year} UNION ALL SELECT * FROM vjc{end_year})')
return sql
class OracleConnection:
"""Context manager for Oracle database connection"""
@@ -315,6 +351,11 @@ def execute_query(connection, query_name: str, query_info: dict) -> pd.DataFrame
try:
sql = query_info['sql']
params = query_info.get('params', {})
# Resolve dynamic table names (vjv/vjc year-specific tables)
if 'data_referinta' in params:
months = params.get('months', 12)
sql = resolve_dynamic_tables(sql, params['data_referinta'], months)
print(f" 📊 Executare: {query_name}...", end=" ")
@@ -334,27 +375,31 @@ def execute_query(connection, query_name: str, query_info: dict) -> pd.DataFrame
def generate_reports(args):
"""Main function to generate all reports"""
timestamp = datetime.now().strftime('%Y%m%d_%H%M%S')
excel_path = OUTPUT_DIR / f"data_intelligence_report_{timestamp}.xlsx"
pdf_path = OUTPUT_DIR / f"data_intelligence_report_{timestamp}.pdf"
# Compute reference date
data_referinta = compute_data_referinta(args.end_month)
end_date = data_referinta - timedelta(days=1) # last day of reporting period
start_date = data_referinta - relativedelta(months=args.months)
period_str = f"Perioada: {start_date.strftime('%d.%m.%Y')} - {end_date.strftime('%d.%m.%Y')}"
print("\n" + "="*60)
print(" DATA INTELLIGENCE REPORT GENERATOR")
print("="*60)
print(f" Perioada: Ultimele {args.months} luni")
print(f" {period_str} ({args.months} luni)")
print(f" Output: {OUTPUT_DIR}")
print("="*60 + "\n")
# Update parameters with command line arguments
# Update parameters with command line arguments and inject data_referinta
for query_info in QUERIES.values():
if 'months' in query_info.get('params', {}):
query_info['params']['months'] = args.months
# Calculate reporting period string
end_date = datetime.now()
start_date = end_date - relativedelta(months=args.months)
period_str = f"Perioada: {start_date.strftime('%d.%m.%Y')} - {end_date.strftime('%d.%m.%Y')}"
# Inject data_referinta into ALL queries
query_info.setdefault('params', {})
query_info['params']['data_referinta'] = data_referinta
# Add period to descriptions for queries with months parameter
for query_name, query_info in QUERIES.items():
@@ -1101,6 +1146,13 @@ Exemple:
default=ANALYSIS_MONTHS,
help=f'Numărul de luni pentru analiză (default: {ANALYSIS_MONTHS})'
)
parser.add_argument(
'--end-month', '-e',
type=str,
default=REPORT_END_MONTH,
help='Luna finala de raportare YYYY-MM (default: luna completa anterioara). Ex: 2026-01'
)
parser.add_argument(
'--output-dir', '-o',