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 services
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"github.com/sujit-baniya/fiber-boilerplate/pkg/models"
|
||||
)
|
||||
|
||||
// GenerarArquitectura produce el PDF de una propuesta técnica a partir de un
|
||||
// requerimiento en texto libre. Quien llama (Claude) ya consultó
|
||||
// listar_arquitecturas_referencia para reutilizar patrones ya resueltos en vez de
|
||||
// improvisar, y trae la propuesta ya armada; el backend solo la renderiza a PDF y,
|
||||
// si aplica, la deja guardada como nueva referencia reutilizable.
|
||||
func GenerarArquitectura(requerimiento, propuesta, nombre string, clienteID *uint, guardarComoReferencia bool, generadoPor string) (*models.DocumentoGenerado, error) {
|
||||
if requerimiento == "" {
|
||||
return nil, fmt.Errorf("requerimiento requerido")
|
||||
}
|
||||
if propuesta == "" {
|
||||
return nil, fmt.Errorf("propuesta requerida")
|
||||
}
|
||||
if nombre == "" {
|
||||
nombre = "Propuesta técnica"
|
||||
}
|
||||
|
||||
var cliente *models.Cliente
|
||||
if clienteID != nil {
|
||||
c, err := models.GetClienteByID(*clienteID)
|
||||
if err == nil {
|
||||
cliente = c
|
||||
}
|
||||
}
|
||||
|
||||
datos := DatosBaseDocumento(map[string]interface{}{
|
||||
"Nombre": nombre,
|
||||
"Requerimiento": requerimiento,
|
||||
"Propuesta": propuesta,
|
||||
"Cliente": cliente,
|
||||
})
|
||||
|
||||
doc, _, err := GenerarDocumento("arquitectura", datos, clienteID, nil, generadoPor)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if guardarComoReferencia {
|
||||
ref := &models.Arquitectura{
|
||||
Nombre: nombre,
|
||||
Descripcion: requerimiento,
|
||||
ContenidoHTML: propuesta,
|
||||
EsReferencia: true,
|
||||
ClienteID: clienteID,
|
||||
}
|
||||
_ = models.CreateArquitectura(ref) // no bloquea la generación del documento si falla
|
||||
}
|
||||
|
||||
return doc, nil
|
||||
}
|
||||
Reference in New Issue
Block a user