salomonsky commited on
Commit
0e5a555
·
verified ·
1 Parent(s): 504ccf4

Upload data_manager.py with huggingface_hub

Browse files
Files changed (1) hide show
  1. data_manager.py +156 -0
data_manager.py ADDED
@@ -0,0 +1,156 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from utils.csv_manager import CSVManager
2
+ from datetime import datetime
3
+ import os
4
+ import logging
5
+
6
+ class DataManager(CSVManager):
7
+ def __init__(self, csv_file='data/clientes.csv'):
8
+ # Asegurar que el directorio data existe
9
+ os.makedirs('data', exist_ok=True)
10
+
11
+ super().__init__(
12
+ csv_file=csv_file,
13
+ headers=['Nombre', 'Teléfono', 'Edad', 'Empleo', 'Fecha', 'Modo']
14
+ )
15
+ self.data_collection_state = None
16
+ self.customer_data = {
17
+ 'nombre': None,
18
+ 'telefono': None,
19
+ 'edad': None,
20
+ 'empleo': None,
21
+ 'modo': None
22
+ }
23
+
24
+ # Configurar logging
25
+ self.logger = logging.getLogger('data_manager')
26
+ self.logger.setLevel(logging.INFO)
27
+ handler = logging.FileHandler('logs/data_collection.log')
28
+ handler.setFormatter(logging.Formatter('%(asctime)s - %(levelname)s - %(message)s'))
29
+ self.logger.addHandler(handler)
30
+
31
+ def handle_data_collection(self, response, mode, get_data_collection_steps):
32
+ """Manejar la recolección de datos según el modo"""
33
+ if not response:
34
+ return "No pude entender eso. ¿Podría repetirlo?"
35
+
36
+ try:
37
+ current_state = self.data_collection_state
38
+ next_prompts = get_data_collection_steps(mode)
39
+
40
+ self.logger.info(f"Procesando dato para {current_state}: {response}")
41
+
42
+ # Validar el dato actual
43
+ is_valid, value = self.validate_data(current_state, response)
44
+ if not is_valid:
45
+ self.logger.warning(f"Dato inválido para {current_state}: {response}")
46
+ return f"{value}. Por favor, inténtelo de nuevo."
47
+
48
+ # Guardar el dato validado
49
+ self.customer_data[current_state] = value
50
+ self.customer_data['modo'] = mode
51
+ self.logger.info(f"Dato guardado para {current_state}: {value}")
52
+
53
+ # Obtener siguiente estado y prompt
54
+ next_state, next_prompt = next_prompts[current_state]
55
+
56
+ if next_state is None:
57
+ self.logger.info("Finalizando recolección de datos")
58
+ success = self.save_customer_data()
59
+ self.data_collection_state = None
60
+ return "Error al guardar los datos. Por favor, intente de nuevo." if not success else next_prompt
61
+ else:
62
+ self.data_collection_state = next_state
63
+ self.logger.info(f"Siguiente estado: {next_state}")
64
+ return next_prompt
65
+
66
+ except Exception as e:
67
+ self.logger.error(f"Error en handle_data_collection: {e}")
68
+ return "Hubo un error procesando su información. ¿Podríamos comenzar de nuevo?"
69
+
70
+ def save_customer_data(self):
71
+ """Guardar datos del cliente en CSV"""
72
+ try:
73
+ row_data = [
74
+ self.customer_data['nombre'],
75
+ self.customer_data['telefono'],
76
+ self.customer_data['edad'],
77
+ self.customer_data['empleo'],
78
+ datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
79
+ self.customer_data['modo']
80
+ ]
81
+
82
+ self.logger.info(f"Guardando datos: {row_data}")
83
+ success = self.write_row(row_data)
84
+
85
+ if success:
86
+ self.logger.info("Datos guardados exitosamente")
87
+ self.customer_data = {key: None for key in self.customer_data}
88
+ else:
89
+ self.logger.error("Error al guardar datos en CSV")
90
+
91
+ return success
92
+
93
+ except Exception as e:
94
+ self.logger.error(f"Error en save_customer_data: {e}")
95
+ return False
96
+
97
+ def start_data_collection(self):
98
+ """Iniciar recolección de datos"""
99
+ self.data_collection_state = 'nombre'
100
+ self.logger.info("Iniciando recolección de datos")
101
+
102
+ def is_collecting_data(self):
103
+ """Verificar si está en modo recolección"""
104
+ return self.data_collection_state is not None
105
+
106
+ def get_current_state(self):
107
+ """Obtener estado actual de recolección"""
108
+ return self.data_collection_state
109
+
110
+ def validate_data(self, data_type, value):
111
+ """Validar datos según su tipo"""
112
+ if not value:
113
+ return False, "El valor no puede estar vacío"
114
+
115
+ try:
116
+ if data_type == 'nombre':
117
+ # Validar que solo contenga letras y espacios
118
+ value = value.strip()
119
+ if not all(c.isalpha() or c.isspace() for c in value):
120
+ return False, "El nombre solo debe contener letras"
121
+ if len(value.split()) < 2:
122
+ return False, "Por favor proporcione nombre y apellido"
123
+ return True, value.title() # Convertir a formato título
124
+
125
+ elif data_type == 'telefono':
126
+ # Limpiar y validar número telefónico
127
+ clean_number = ''.join(filter(str.isdigit, value))
128
+ if len(clean_number) != 10:
129
+ return False, "El número debe tener 10 dígitos"
130
+ # Formatear número: (123) 456-7890
131
+ formatted_number = f"({clean_number[:3]}) {clean_number[3:6]}-{clean_number[6:]}"
132
+ return True, formatted_number
133
+
134
+ elif data_type == 'edad':
135
+ # Validar edad
136
+ try:
137
+ edad = int(''.join(filter(str.isdigit, value)))
138
+ if not (18 <= edad <= 99):
139
+ return False, "La edad debe estar entre 18 y 99 años"
140
+ return True, str(edad)
141
+ except ValueError:
142
+ return False, "La edad debe ser un número"
143
+
144
+ elif data_type == 'empleo':
145
+ # Validar empleo
146
+ value = value.strip()
147
+ if len(value) < 3:
148
+ return False, "Por favor proporcione un empleo válido"
149
+ # Capitalizar primera letra de cada palabra
150
+ return True, value.title()
151
+
152
+ return True, value
153
+
154
+ except Exception as e:
155
+ self.logger.error(f"Error validando dato {data_type}: {e}")
156
+ return False, "Error validando el dato. Por favor, inténtelo de nuevo."