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,61 @@
|
||||
package services
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"time"
|
||||
|
||||
"github.com/sujit-baniya/fiber-boilerplate/pkg/models"
|
||||
)
|
||||
|
||||
// GenerarDocumentoCuentaCobro produce el PDF de solicitud de cuenta de cobro para
|
||||
// una cuenta ya existente, usando la plantilla activa tipo 'cuenta_cobro' + los
|
||||
// datos fiscales de U-SITE (DatosBaseDocumento), para que salga correcta sin
|
||||
// revisión manual.
|
||||
func GenerarDocumentoCuentaCobro(cuentaCobroID uint, generadoPor string) (*models.DocumentoGenerado, error) {
|
||||
cc, err := models.GetCuentaCobroByID(cuentaCobroID)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("cuenta de cobro no encontrada: %w", err)
|
||||
}
|
||||
|
||||
datos := DatosBaseDocumento(map[string]interface{}{
|
||||
"CuentaCobro": cc,
|
||||
"Cliente": cc.Cliente,
|
||||
"Descripcion": cc.Descripcion,
|
||||
"Valor": cc.Valor,
|
||||
"FechaCuenta": cc.Fecha.Format("02/01/2006"),
|
||||
"Notas": cc.Notas,
|
||||
})
|
||||
|
||||
doc, _, err := GenerarDocumento("cuenta_cobro", datos, &cc.ClienteID, nil, generadoPor)
|
||||
return doc, err
|
||||
}
|
||||
|
||||
// CrearCuentaCobroConDocumento crea el registro de cuenta de cobro y de una vez
|
||||
// genera su PDF, para el flujo "proyecto, monto, periodo" de la automatización con IA.
|
||||
func CrearCuentaCobroConDocumento(clienteID uint, descripcion string, valor float64, fechaVencimiento *time.Time, notas, generadoPor string) (*models.CuentaCobro, *models.DocumentoGenerado, error) {
|
||||
if clienteID == 0 {
|
||||
return nil, nil, fmt.Errorf("cliente_id requerido")
|
||||
}
|
||||
if valor <= 0 {
|
||||
return nil, nil, fmt.Errorf("valor debe ser mayor a cero")
|
||||
}
|
||||
|
||||
cc := &models.CuentaCobro{
|
||||
ClienteID: clienteID,
|
||||
Fecha: time.Now(),
|
||||
Descripcion: descripcion,
|
||||
Valor: valor,
|
||||
Estado: "pendiente",
|
||||
FechaVencimiento: fechaVencimiento,
|
||||
Notas: notas,
|
||||
}
|
||||
if err := models.CreateCuentaCobro(cc); err != nil {
|
||||
return nil, nil, fmt.Errorf("no se pudo crear la cuenta de cobro: %w", err)
|
||||
}
|
||||
|
||||
doc, err := GenerarDocumentoCuentaCobro(cc.ID, generadoPor)
|
||||
if err != nil {
|
||||
return cc, nil, err
|
||||
}
|
||||
return cc, doc, nil
|
||||
}
|
||||
Reference in New Issue
Block a user