perioada luna anterioara finalizata
This commit is contained in:
74
main.py
74
main.py
@@ -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',
|
||||
|
||||
Reference in New Issue
Block a user