Files
soft_usite/pkg/models/documento_generado.go
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

58 lines
2.3 KiB
Go

package models
import (
"github.com/sujit-baniya/fiber-boilerplate/app"
"gorm.io/gorm"
)
// DocumentoGenerado es el historial de documentos producidos por el motor de
// automatización con IA (cotización, contrato, acta/arquitectura, cuenta de cobro),
// sin importar el canal que los originó (Telegram, chat propio o Claude directo).
type DocumentoGenerado struct {
gorm.Model
Tipo string `json:"tipo" gorm:"column:tipo;size:30;not null;index"` // cotizacion | contrato | acta | cuenta_cobro
ClienteID *uint `json:"cliente_id" gorm:"column:cliente_id;index"`
Cliente *Cliente `json:"cliente,omitempty" gorm:"foreignKey:ClienteID"`
ProyectoID *uint `json:"proyecto_id" gorm:"column:proyecto_id;index"`
PlantillaID *uint `json:"plantilla_id" gorm:"column:plantilla_id"`
Nombre string `json:"nombre" gorm:"column:nombre;size:200"`
Archivo string `json:"archivo" gorm:"column:archivo"` // ruta en disco, ej: uploads/documentos/cotizacion/12/xyz.pdf
TipoMime string `json:"tipo_mime" gorm:"column:tipo_mime;default:'application/pdf'"`
Tamanio int64 `json:"tamanio" gorm:"column:tamanio"`
DatosJSON string `json:"datos_json" gorm:"column:datos_json;type:text"` // input usado para generarlo (auditoría)
GeneradoPor string `json:"generado_por" gorm:"column:generado_por;size:20;default:'web'"` // web | telegram | claude_api
}
func (DocumentoGenerado) TableName() string { return "documentos_generados" }
func CreateDocumentoGenerado(d *DocumentoGenerado) error {
return app.Http.Database.DB.Create(d).Error
}
func GetAllDocumentosGenerados(limit, offset int, tipo string, clienteID uint) ([]DocumentoGenerado, int64, error) {
var items []DocumentoGenerado
var total int64
db := app.Http.Database.DB.Model(&DocumentoGenerado{}).Preload("Cliente")
if tipo != "" {
db = db.Where("tipo = ?", tipo)
}
if clienteID != 0 {
db = db.Where("cliente_id = ?", clienteID)
}
if err := db.Count(&total).Error; err != nil {
return nil, 0, err
}
if err := db.Order("id DESC").Limit(limit).Offset(offset).Find(&items).Error; err != nil {
return nil, 0, err
}
return items, total, nil
}
func GetDocumentoGeneradoByID(id uint) (*DocumentoGenerado, error) {
var item DocumentoGenerado
if err := app.Http.Database.DB.First(&item, id).Error; err != nil {
return nil, err
}
return &item, nil
}