From 351454c018480ea7dba184bf67caa287c2d8d1c6 Mon Sep 17 00:00:00 2001 From: Lizandro Guarnizo <77708265+lizandrogd@users.noreply.github.com> Date: Sat, 15 Aug 2026 20:47:24 -0500 Subject: [PATCH] =?UTF-8?q?fix(contabilidad):=20"sin=20datos"=20ya=20no=20?= =?UTF-8?q?se=20ve=20igual=20que=20"se=20rompi=C3=B3"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit En /app/contabilidad/cuentas-cobro la petición respondía bien pero la tabla quedaba en blanco, sin nada que dijera qué había pasado. Probando la vista real con axios simulado quedó claro que el problema no era el renderizado: con datos pinta bien, y que falle /clientes/select tampoco la rompe. Lo que faltaba era distinguir el caso vacío. Dos arreglos, uno en cada punta: - Las 8 consultas de contabilidad declaraban `var items []T`, que sin filas se serializa como null y no como []. La vista hacía x-for sobre null y no pintaba nada; peor, con null se colaba además una fila basura. - Ninguna de las 5 tablas tenía estado vacío. Ahora dicen "No hay ... registradas", así que cero filas se lee como cero filas. El x-for además queda blindado con (items || []) para no depender de que todos los endpoints devuelvan siempre una lista. Verificado con la vista real en tres escenarios: con datos pinta la fila, vacío y null muestran el mensaje y ninguna fila de más. Si la pantalla sigue sin traer registros después de esto, ya no es la vista: es que la consulta no encuentra filas, y el mensaje lo va a decir. Co-Authored-By: Claude Sonnet 5 --- pkg/models/contabilidad.go | 32 ++++++++++++++----- resources/views/contabilidad/cuentas.html | 5 ++- .../views/contabilidad/cuentas_cobro.html | 5 ++- .../views/contabilidad/cuentas_pagar.html | 5 ++- resources/views/contabilidad/entidades.html | 5 ++- .../views/contabilidad/transacciones.html | 5 ++- 6 files changed, 44 insertions(+), 13 deletions(-) diff --git a/pkg/models/contabilidad.go b/pkg/models/contabilidad.go index 717d955..1ad2ae4 100644 --- a/pkg/models/contabilidad.go +++ b/pkg/models/contabilidad.go @@ -122,7 +122,9 @@ func (ConsolidadoMensual) TableName() string { return "contab_consolidado" } // ============================================================================= func GetAllCuentas(limit, offset int, search string) ([]Cuenta, int64, error) { - var items []Cuenta + // Inicializado para que sin filas el JSON sea [] y no null: null obliga + // a cada vista a defenderse y hace que "vacío" y "roto" se vean igual. + items := []Cuenta{} var total int64 db := app.Http.Database.DB.Model(&Cuenta{}) if search != "" { @@ -138,7 +140,9 @@ func GetAllCuentas(limit, offset int, search string) ([]Cuenta, int64, error) { } func GetAllCuentasSelect() ([]Cuenta, error) { - var items []Cuenta + // Inicializado para que sin filas el JSON sea [] y no null: null obliga + // a cada vista a defenderse y hace que "vacío" y "roto" se vean igual. + items := []Cuenta{} if err := app.Http.Database.DB.Where("activo = ?", true).Order("nombre ASC").Find(&items).Error; err != nil { return nil, err } @@ -168,7 +172,9 @@ func DeleteCuenta(id uint) error { // ============================================================================= func GetAllEntidades(limit, offset int, search string) ([]Entidad, int64, error) { - var items []Entidad + // Inicializado para que sin filas el JSON sea [] y no null: null obliga + // a cada vista a defenderse y hace que "vacío" y "roto" se vean igual. + items := []Entidad{} var total int64 db := app.Http.Database.DB.Model(&Entidad{}) if search != "" { @@ -185,7 +191,9 @@ func GetAllEntidades(limit, offset int, search string) ([]Entidad, int64, error) } func GetAllEntidadesSelect() ([]Entidad, error) { - var items []Entidad + // Inicializado para que sin filas el JSON sea [] y no null: null obliga + // a cada vista a defenderse y hace que "vacío" y "roto" se vean igual. + items := []Entidad{} if err := app.Http.Database.DB.Where("activo = ?", true).Order("nombre ASC").Find(&items).Error; err != nil { return nil, err } @@ -238,7 +246,9 @@ func DeleteEntidad(id uint) error { // ============================================================================= func GetAllTransacciones(limit, offset int, search string, filtroTipo string, mes int, anio int) ([]Transaccion, int64, error) { - var items []Transaccion + // Inicializado para que sin filas el JSON sea [] y no null: null obliga + // a cada vista a defenderse y hace que "vacío" y "roto" se vean igual. + items := []Transaccion{} var total int64 db := app.Http.Database.DB.Model(&Transaccion{}).Preload("Cuenta").Preload("Entidad") if search != "" { @@ -326,7 +336,9 @@ func recomputarConsolidadoDeFecha(fecha time.Time) { // ============================================================================= func GetAllCuentasCobro(limit, offset int, search string, estado string) ([]CuentaCobro, int64, error) { - var items []CuentaCobro + // Inicializado para que sin filas el JSON sea [] y no null: null obliga + // a cada vista a defenderse y hace que "vacío" y "roto" se vean igual. + items := []CuentaCobro{} var total int64 db := app.Http.Database.DB.Model(&CuentaCobro{}).Preload("Cliente").Preload("Entidad").Preload("Transaccion") if search != "" { @@ -617,7 +629,9 @@ func GetCuentaPagarByID(id uint) (*CuentaPagar, error) { } func GetAllCuentasPagar(limit, offset int, search string, estado string) ([]CuentaPagar, int64, error) { - var items []CuentaPagar + // Inicializado para que sin filas el JSON sea [] y no null: null obliga + // a cada vista a defenderse y hace que "vacío" y "roto" se vean igual. + items := []CuentaPagar{} var total int64 db := app.Http.Database.DB.Model(&CuentaPagar{}).Preload("Entidad").Preload("Transaccion") if search != "" { @@ -750,7 +764,9 @@ func CalcularYGuardarConsolidado(mes, anio int) (*ConsolidadoMensual, error) { } func ListConsolidados(anio int) ([]ConsolidadoMensual, error) { - var items []ConsolidadoMensual + // Inicializado para que sin filas el JSON sea [] y no null: null obliga + // a cada vista a defenderse y hace que "vacío" y "roto" se vean igual. + items := []ConsolidadoMensual{} db := app.Http.Database.DB.Model(&ConsolidadoMensual{}).Order("anio DESC, mes DESC") if anio > 0 { db = db.Where("anio = ?", anio) diff --git a/resources/views/contabilidad/cuentas.html b/resources/views/contabilidad/cuentas.html index ba0d84b..5331cdf 100644 --- a/resources/views/contabilidad/cuentas.html +++ b/resources/views/contabilidad/cuentas.html @@ -24,7 +24,10 @@ -