-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmain.py
More file actions
145 lines (119 loc) · 5.02 KB
/
main.py
File metadata and controls
145 lines (119 loc) · 5.02 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
from datetime import datetime
import os
import sys
from utils.data_loader import load_and_validate_data
from utils.analyzer import DataAnalyzer, analyze_data
from utils.visualizer import generate_visualizations
from utils.whatsapp_sender import WhatsAppSender, send_whatsapp_report, send_whatsapp_report_simulated
# create directories if not exist
def setup_directories():
directories = ['data', 'outputs/graphs', 'utils']
for directory in directories:
os.makedirs(directory, exist_ok=True)
print(f"Carpeta '{directory}' creada/verificada")
# load enviroment variables
def load_env_variables():
try:
from dotenv import load_dotenv
# load default .env first
load_dotenv()
# if a project-specific env file exists, load it (whatsapp_config.env)
env_file = 'whatsapp_config.env'
if os.path.exists(env_file):
load_dotenv(env_file, override=True)
print(f"Variables de entorno cargadas desde {env_file}.")
else:
print("Variables de entorno cargadas (desde .env si existe).")
except ImportError:
print("python-dotenv no está instalado. Asegúrese de que las variables de entorno estén configuradas manualmente.")
def main():
print("Iniciando RPA")
print("="*50)
print(f"Iniciado: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")
print("=" * 60)
# setup directories and load env variables
setup_directories()
load_env_variables()
# verify if file exists
data_file = 'data/Ventas_Fundamentos.xlsx'
if not os.path.exists(data_file):
print(f"Archivo de datos no encontrado: {data_file}")
print("Por favor, ejecute 'create_sample_data.py' para generar el archivo de datos de muestra.")
sys.exit(1)
print("="*50)
# load and validate data
print("Cargando y validando datos...")
print("="*50)
df, validation = load_and_validate_data(data_file)
if df is not None and validation['is_valid']:
print("Datos cargados y validados exitosamente.")
print(f"Total registros: {len(df)}")
print(f"Sedes: {df['Headquarter'].nunique()}")
print(f"Modelos: {df['Model'].nunique()}")
print(f'Clientes Únicos: {df["Client_ID"].nunique()}')
else:
print("Error en la carga de datos")
if 'error' in validation:
print(f"Error: {validation['error']}")
sys.exit(1)
# analyze data
print("="*50)
print("Iniciando análisis de datos...")
print("="*50)
try:
analyzer = DataAnalyzer(df)
results = analyzer.full_analysis()
# show summary
print("\n" + "="*50)
print("Resumen del Análisis:")
print("="*50)
metrics = results['summary_metrics']
print(f"Clientes Únicos: {metrics['unique_clients']:,}")
print(f"Total de Ventas: {metrics['total_sales']:,}")
print(f"Ventas Totales sin IGV: ${metrics['total_sales_without_igv']:,.2f}")
print(f"Ventas Totales con IGV: ${metrics['total_sales_with_igv']:,.2f}")
print(f"Ventas Promedio: ${metrics['average_sales_without_igv']:,.2f}")
print(f"Modelo Más Vendido: {results['top_models'].index[0]}")
print(f"Sede con Más Ventas: {results['sales_by_headquarter'].index[0]}")
print(f"Canal con Más Ventas: {results['sales_by_channel'].index[0]}")
except Exception as e:
print(f"Error durante el análisis de datos: {str(e)}")
sys.exit(1)
# generate graphs
print("Generando visualizaciones...")
try:
generate_visualizations(results)
print("Visualizaciones generadas exitosamente en 'outputs/graphs'.")
except Exception as e:
print(f"Error durante la generación de visualizaciones: {str(e)}")
sys.exit(1)
# send whatsapp report
# detect simulate mode from CLI or env
simulate = ('--simulate' in sys.argv) or (os.getenv('WHATSAPP_SIMULATE', 'false').strip().lower() in {'1','true','yes','y'})
print("Enviando reporte por WhatsApp (Simulado)" if simulate else "Enviando reporte por WhatsApp (Twilio)...")
try:
# get whatsapp destiny
destiny = os.getenv("WHATSAPP_DESTINY")
print("Metodo de envío: SIMULADO" if simulate else "Metodo de envío: TWILIO")
if destiny:
print(f"Número de destino: {destiny}")
else:
print("Número de destino no encontrado.")
# normalize destiny (strip whitespace) before using
if destiny:
destiny = destiny.strip()
# send report
if simulate:
ok = send_whatsapp_report_simulated(results, destiny)
else:
ok = send_whatsapp_report(results, destiny)
if ok:
print("Reporte enviado exitosamente por WhatsApp.")
else:
print("Error al enviar el reporte por WhatsApp.")
except Exception as e:
print(f"Error durante el envío del reporte por WhatsApp: {e}")
# exit program
print("PROCESO COMPLETADO")
if __name__ == "__main__":
main()