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.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 📁
+
+
+
+
+ Por: ·
+
+ 💬
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
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)