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>
This commit is contained in:
co-authored by
Claude Sonnet 5
parent
772a4a5656
commit
516220a8a1
@@ -0,0 +1,57 @@
|
||||
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
|
||||
}
|
||||
Reference in New Issue
Block a user