This commit is contained in:
Lizandro Guarnizo
2026-06-18 16:48:49 -05:00
parent fd410b3afc
commit ca6a44f64e
3 changed files with 29 additions and 0 deletions
+15
View File
@@ -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,
+8
View File
@@ -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,
+6
View File
@@ -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)
}