From ca6a44f64ede519425a6b10ae18bc8e2feb17ec6 Mon Sep 17 00:00:00 2001 From: Lizandro Guarnizo <77708265+lizandrogd@users.noreply.github.com> Date: Thu, 18 Jun 2026 16:48:49 -0500 Subject: [PATCH] up --- pkg/models/proyecto.go | 15 +++++++++++++++ rest/controllers/portal_controller.go | 8 ++++++++ rest/controllers/proyecto_controller.go | 6 ++++++ 3 files changed, 29 insertions(+) diff --git a/pkg/models/proyecto.go b/pkg/models/proyecto.go index e89016a..1fda52b 100644 --- a/pkg/models/proyecto.go +++ b/pkg/models/proyecto.go @@ -148,6 +148,21 @@ func CreateProyecto(p *Proyecto) error { return app.Http.Database.DB.Create(p).Error } +func CalcularProgresoDesdeFases(proyectoID uint) int { + var total, completados int64 + app.Http.Database.DB.Model(&ProyectoFase{}).Where("proyecto_id = ?", proyectoID).Count(&total) + if total == 0 { + return 0 + } + app.Http.Database.DB.Model(&ProyectoFase{}).Where("proyecto_id = ? AND estado = ?", proyectoID, "completado").Count(&completados) + return int((completados * 100) / total) +} + +func ActualizarProgresoProyecto(proyectoID uint) error { + nuevo := CalcularProgresoDesdeFases(proyectoID) + return app.Http.Database.DB.Model(&Proyecto{}).Where("id = ?", proyectoID).Update("progreso", nuevo).Error +} + func UpdateProyecto(p *Proyecto) error { return app.Http.Database.DB.Model(&Proyecto{}).Where("id = ?", p.ID).Updates(map[string]interface{}{ "nombre": p.Nombre, diff --git a/rest/controllers/portal_controller.go b/rest/controllers/portal_controller.go index 5198f80..8badc68 100644 --- a/rest/controllers/portal_controller.go +++ b/rest/controllers/portal_controller.go @@ -150,6 +150,9 @@ func PortalDashboard(c *fiber.Ctx) error { clienteIDs := models.GetClienteIDsForPortalUser(fullUser) proyectos, _ := models.GetProyectosByClienteIDs(clienteIDs) + for i := range proyectos { + _ = models.ActualizarProgresoProyecto(proyectos[i].ID) + } // Si partner: agrupar proyectos por cliente type ClienteProyectos struct { @@ -208,6 +211,7 @@ func PortalProyecto(c *fiber.Ctx) error { avances, _ := models.GetAvancesByProyecto(proy.ID, true) entregables, _ := models.GetEntregablesByProyecto(proy.ID, true) tickets, _ := models.GetTicketsByPortalUser(u.ID) + _ = models.ActualizarProgresoProyecto(proy.ID) return c.Render("portal/proyecto", fiber.Map{ "portalUser": fullUser, @@ -230,6 +234,9 @@ func PortalGetProyectos(c *fiber.Ctx) error { fullUser, _ := models.GetPortalUserByID(u.ID) clienteIDs := models.GetClienteIDsForPortalUser(fullUser) proyectos, _ := models.GetProyectosByClienteIDs(clienteIDs) + for i := range proyectos { + _ = models.ActualizarProgresoProyecto(proyectos[i].ID) + } return c.JSON(proyectos) } @@ -265,6 +272,7 @@ func PortalGetProyectoData(c *fiber.Ctx) error { facturas, _ := models.GetFacturasByCliente(proy.ClienteID, true) facturasNoLeidas := models.CountUnreadFacturaNotifs(u.ID) documentos, _ := models.GetDocumentosByProyecto(proy.ID) + _ = models.ActualizarProgresoProyecto(proy.ID) return c.JSON(fiber.Map{ "proyecto": proy, diff --git a/rest/controllers/proyecto_controller.go b/rest/controllers/proyecto_controller.go index 3b9f38f..d61766d 100644 --- a/rest/controllers/proyecto_controller.go +++ b/rest/controllers/proyecto_controller.go @@ -195,11 +195,13 @@ func CreateFase(c *fiber.Ctx) error { return c.Status(500).JSON(fiber.Map{"error": err.Error()}) } f.ParseEntregables() + _ = models.ActualizarProgresoProyecto(uint(proyID)) return c.Status(201).JSON(f) } func UpdateFase(c *fiber.Ctx) error { faseID, _ := strconv.ParseUint(c.Params("faseID"), 10, 32) + proyID, _ := strconv.ParseUint(c.Params("id"), 10, 32) type Req struct { Nombre string `json:"nombre"` Descripcion string `json:"descripcion"` @@ -241,14 +243,17 @@ func UpdateFase(c *fiber.Ctx) error { if err := models.UpdateProyectoFase(f); err != nil { return c.Status(500).JSON(fiber.Map{"error": err.Error()}) } + _ = models.ActualizarProgresoProyecto(uint(proyID)) return c.JSON(fiber.Map{"ok": true}) } func DeleteFase(c *fiber.Ctx) error { faseID, _ := strconv.ParseUint(c.Params("faseID"), 10, 32) + proyID, _ := strconv.ParseUint(c.Params("id"), 10, 32) if err := models.DeleteProyectoFase(uint(faseID)); err != nil { return c.Status(500).JSON(fiber.Map{"error": err.Error()}) } + _ = models.ActualizarProgresoProyecto(uint(proyID)) return c.JSON(fiber.Map{"ok": true}) } @@ -257,6 +262,7 @@ func ApplyTemplate(c *fiber.Ctx) error { if err := models.ApplyFaseTemplate(uint(id)); err != nil { return c.Status(500).JSON(fiber.Map{"error": err.Error()}) } + _ = models.ActualizarProgresoProyecto(uint(id)) fases, _ := models.GetFasesByProyecto(uint(id)) return c.JSON(fases) }