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 }