diff --git a/backend/core/data_manager.py b/backend/core/data_manager.py index a8a2fd5..4bfd331 100644 --- a/backend/core/data_manager.py +++ b/backend/core/data_manager.py @@ -58,6 +58,11 @@ class DataManager: self.query_cronograma_sql = "" self.query_facturas_sql = "" + # Caché en memoria de las consultas ANUALES de cobranza (evita re-ejecutar + # la consulta del año completo en cada combinación de filtros). + self._cache_cronograma = {} # str(ano) -> filas + self._cache_facturas = {} # str(ano) -> filas + self.cargar_toda_configuracion() # ========================================================================= @@ -645,6 +650,10 @@ class DataManager: return [] def ejecutar_consulta_cronograma_cobranza(self, ano): + clave = str(ano) + en_cache = self._cache_cronograma.get(clave) + if en_cache is not None: + return en_cache try: if not self.query_cronograma_sql: return [] @@ -654,12 +663,17 @@ class DataManager: columns = [col[0] for col in cursor.description] results = [dict(zip(columns, row)) for row in cursor.fetchall()] conn.close() + self._cache_cronograma[clave] = results # cachear SOLO si tuvo éxito return results except Exception as e: print(f"❌ Error cronograma cobranza: {e}") return [] def ejecutar_consulta_facturas_cobranza(self, ano): + clave = str(ano) + en_cache = self._cache_facturas.get(clave) + if en_cache is not None: + return en_cache try: if not self.query_facturas_sql: return [] @@ -669,11 +683,22 @@ class DataManager: columns = [col[0] for col in cursor.description] results = [dict(zip(columns, row)) for row in cursor.fetchall()] conn.close() + self._cache_facturas[clave] = results # cachear SOLO si tuvo éxito return results except Exception as e: print(f"❌ Error facturas cobranza: {e}") return [] + def limpiar_cache_cobranza(self, ano=None): + """Vacía el caché anual de cobranza para forzar re-lectura desde SQL. + Se llama en cada refresco (manual o ciclo de 15 min).""" + if ano is None: + self._cache_cronograma.clear() + self._cache_facturas.clear() + else: + self._cache_cronograma.pop(str(ano), None) + self._cache_facturas.pop(str(ano), None) + def ejecutar_consulta_saldos_anual(self, ano): try: if not self.query_matriculas_sql: