diff --git a/pkg/models/proyecto_ticket.go b/pkg/models/proyecto_ticket.go index 45bdbd2..ac0dce9 100644 --- a/pkg/models/proyecto_ticket.go +++ b/pkg/models/proyecto_ticket.go @@ -9,7 +9,8 @@ import ( type ProyectoTicket struct { gorm.Model - ProyectoID uint `json:"proyecto_id" gorm:"column:proyecto_id;index"` + ProyectoID uint `json:"proyecto_id" gorm:"column:proyecto_id;index"` + Proyecto Proyecto `json:"proyecto" gorm:"foreignKey:ProyectoID"` PortalUserID uint `json:"portal_user_id" gorm:"column:portal_user_id;index"` AutorNombre string `json:"autor_nombre" gorm:"column:autor_nombre"` Titulo string `json:"titulo" gorm:"column:titulo"` @@ -67,3 +68,13 @@ func GetTicketsByPortalUser(portalUserID uint) ([]ProyectoTicket, error) { Preload("Mensajes").Order("created_at DESC").Find(&items).Error return items, err } + +func GetAllTickets(estado string) ([]ProyectoTicket, error) { + var items []ProyectoTicket + db := app.Http.Database.DB.Preload("Proyecto").Preload("Mensajes").Order("created_at DESC") + if estado != "" && estado != "todos" { + db = db.Where("estado = ?", estado) + } + err := db.Find(&items).Error + return items, err +} diff --git a/resources/views/tickets_admin.html b/resources/views/tickets_admin.html new file mode 100644 index 0000000..6cdc60f --- /dev/null +++ b/resources/views/tickets_admin.html @@ -0,0 +1,169 @@ +
+ +
+
+

Tickets de soporte

+

Todos los tickets abiertos por clientes del portal

+
+ +
+ +
+
+ + +
Cargando tickets...
+ + +
+ No hay tickets con este filtro. +
+ + +
+ +
+ +
+ + diff --git a/rest/controllers/proyecto_controller.go b/rest/controllers/proyecto_controller.go index 50b0297..f268de6 100644 --- a/rest/controllers/proyecto_controller.go +++ b/rest/controllers/proyecto_controller.go @@ -500,3 +500,21 @@ func mimeFromHeader(fh *multipart.FileHeader) string { } return ct } + +// ─── Tickets global (admin) ─────────────────────────────────────────────────── + +func TicketsAdminIndex(c *fiber.Ctx) error { + return c.Render("tickets_admin", fiber.Map{ + "user": c.Locals("user"), + "modules": c.Locals("userModules"), + }, "layouts/main") +} + +func GetAllTicketsAdmin(c *fiber.Ctx) error { + estado := c.Query("estado", "todos") + items, err := models.GetAllTickets(estado) + if err != nil { + return c.Status(500).JSON(fiber.Map{"error": err.Error()}) + } + return c.JSON(items) +} diff --git a/rest/routes/user.go b/rest/routes/user.go index 5eafd6a..2f223d9 100755 --- a/rest/routes/user.go +++ b/rest/routes/user.go @@ -247,6 +247,12 @@ func UserRoutes(app fiber.Router) { protected.Put("/proyectos/:id/tickets/:ticketID/estado", controllers.UpdateTicketEstadoAdmin) protected.Post("/proyectos/:id/tickets/:ticketID/mensaje", controllers.AdminResponderTicket) + // Tickets global (todos los proyectos) + protected.Get("/tickets", middlewares.MenuMiddleware, controllers.TicketsAdminIndex) + protected.Get("/tickets/data", controllers.GetAllTicketsAdmin) + protected.Put("/tickets/:ticketID/estado", controllers.UpdateTicketEstadoAdmin) + protected.Post("/tickets/:ticketID/mensaje", controllers.AdminResponderTicket) + protected.Get("/portal-usuarios", middlewares.MenuMiddleware, controllers.PortalUsuariosIndex) protected.Get("/loadportalusuarios", controllers.LoadPortalUsuarios) protected.Post("/portal-usuarios", controllers.CreatePortalUsuario)