package controllers import ( "fmt" "math" "path/filepath" "strconv" "strings" "github.com/gofiber/fiber/v2" "github.com/sujit-baniya/fiber-boilerplate/pkg/models" ) // GetDocumentosGenerados lista el historial de documentos producidos por la // automatización con IA (cotizaciones, contratos, actas, cuentas de cobro), // sin importar el canal que los generó. func GetDocumentosGenerados(c *fiber.Ctx) error { page, _ := strconv.Atoi(c.Query("page", "1")) limit, _ := strconv.Atoi(c.Query("limit", "20")) if page < 1 { page = 1 } offset := (page - 1) * limit clienteID, _ := strconv.ParseUint(c.Query("cliente_id", "0"), 10, 32) records, total, err := models.GetAllDocumentosGenerados(limit, offset, c.Query("tipo"), uint(clienteID)) if err != nil { return c.Status(500).JSON(fiber.Map{"error": err.Error()}) } return c.JSON(fiber.Map{ "registros": records, "total": total, "totalPages": int(math.Ceil(float64(total) / float64(limit))), "page": page, }) } // DownloadDocumentoGenerado sirve el PDF ya generado. func DownloadDocumentoGenerado(c *fiber.Ctx) error { id, err := strconv.ParseUint(c.Params("id"), 10, 32) if err != nil { return c.Status(400).JSON(fiber.Map{"error": "ID inválido"}) } doc, err := models.GetDocumentoGeneradoByID(uint(id)) if err != nil || doc.Archivo == "" { return c.Status(404).JSON(fiber.Map{"error": "Documento no encontrado"}) } clean := filepath.Clean(doc.Archivo) if !strings.HasPrefix(clean, "uploads/") { return c.Status(403).JSON(fiber.Map{"error": "Acceso denegado"}) } c.Set("Content-Disposition", fmt.Sprintf(`inline; filename="%s"`, doc.Nombre)) return c.SendFile(clean) }