Files
soft_usite/pkg/models/plantilla_documento.go
T
Lizandro GDandClaude Sonnet 5 516220a8a1 feat: automatización de cotizaciones, contratos, actas y cuentas de cobro con IA
Implementa las 4 fases de la especificación de automatización: módulo de
plantillas/tarifas editable por el equipo, generación de PDF (HTML+JS vía
Chrome headless) para cotizaciones/contratos/arquitecturas/cuentas de cobro,
chat propio en el dashboard reutilizando el mismo motor y tools del bot de
Telegram, y nuevas tools del agente para crear estos documentos end-to-end.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-03 00:45:58 +00:00

75 lines
2.7 KiB
Go

package models
import (
"github.com/sujit-baniya/fiber-boilerplate/app"
"gorm.io/gorm"
)
// PlantillaDocumento es la fuente de verdad de las plantillas base usadas por
// la automatización con IA: cotización, contrato, acta de proyecto y cuenta de cobro.
// Editar una plantilla aquí actualiza automáticamente todos los canales (Telegram,
// chat propio, Claude directo) que generan ese tipo de documento.
type PlantillaDocumento struct {
gorm.Model
Tipo string `json:"tipo" gorm:"column:tipo;size:30;not null;index"` // cotizacion | contrato | acta | cuenta_cobro
Nombre string `json:"nombre" gorm:"column:nombre;size:150;not null"`
ContenidoHTML string `json:"contenido_html" gorm:"column:contenido_html;type:text"` // Go text/template
Version int `json:"version" gorm:"column:version;default:1"`
Activa bool `json:"activa" gorm:"column:activa;default:true"`
Notas string `json:"notas" gorm:"column:notas;type:text"`
}
func (PlantillaDocumento) TableName() string { return "plantillas_documento" }
func GetAllPlantillasDocumento(limit, offset int, search, tipo string) ([]PlantillaDocumento, int64, error) {
var items []PlantillaDocumento
var total int64
db := app.Http.Database.DB.Model(&PlantillaDocumento{})
if search != "" {
db = db.Where("nombre ILIKE ?", "%"+search+"%")
}
if tipo != "" {
db = db.Where("tipo = ?", tipo)
}
if err := db.Count(&total).Error; err != nil {
return nil, 0, err
}
if err := db.Order("tipo ASC, version DESC").Limit(limit).Offset(offset).Find(&items).Error; err != nil {
return nil, 0, err
}
return items, total, nil
}
func GetPlantillaDocumentoByID(id uint) (*PlantillaDocumento, error) {
var item PlantillaDocumento
if err := app.Http.Database.DB.First(&item, id).Error; err != nil {
return nil, err
}
return &item, nil
}
// GetPlantillaDocumentoActiva retorna la plantilla activa más reciente para un tipo dado.
// Es la que usan los endpoints de generación (cotizaciones, contratos, etc).
func GetPlantillaDocumentoActiva(tipo string) (*PlantillaDocumento, error) {
var item PlantillaDocumento
if err := app.Http.Database.DB.
Where("tipo = ? AND activa = ?", tipo, true).
Order("version DESC").
First(&item).Error; err != nil {
return nil, err
}
return &item, nil
}
func CreatePlantillaDocumento(p PlantillaDocumento) error {
return app.Http.Database.DB.Create(&p).Error
}
func UpdatePlantillaDocumento(id uint, updates map[string]interface{}) error {
return app.Http.Database.DB.Model(&PlantillaDocumento{}).Where("id = ?", id).Updates(updates).Error
}
func DeletePlantillaDocumento(id uint) error {
return app.Http.Database.DB.Delete(&PlantillaDocumento{}, id).Error
}