package services import ( "fmt" "strings" "github.com/sujit-baniya/fiber-boilerplate/pkg/models" ) // variablesPorTipo documenta, para la IA, qué campos recibe cada plantilla al // renderizarse. Sale de DatosBaseDocumento + lo que arma cada generador // (ver CrearCotizacion, contrato_documento_service, cuenta_cobro_documento_service). var variablesPorTipo = map[string]string{ "cotizacion": `{{.Cliente.Nombre}}, {{.Cliente.Documento}}, {{.Cliente.Email}}, {{.Cliente.Telefono}}, {{.Alcance}}, {{.TipoProyecto}}, {{.Total}}, {{range .Items}} … {{.Descripcion}} {{.Cantidad}} {{.Unidad}} {{.ValorUnitario}} … {{end}}`, "contrato": `{{.Cliente.Nombre}}, {{.Cliente.Documento}}, {{.Alcance}}, {{.Total}}, {{.Servicio}}, {{.Periodicidad}}`, "acta": `{{.Cliente.Nombre}}, {{.Proyecto}}, {{.Alcance}}, {{.Entregables}}`, "cuenta_cobro": `{{.Cliente.Nombre}}, {{.Cliente.Documento}}, {{.Concepto}}, {{.Total}}, {{.Numero}}`, } const variablesComunes = `{{.Fecha}}, {{.EmpresaNombre}}, {{.EmpresaWeb}}` // ExtraerTextoDePlantilla lee el archivo que subió el admin como referencia. // agenteID 0: es una acción del staff, no se le cobra a ningún cliente. func ExtraerTextoDePlantilla(nombreArchivo string, datos []byte) (string, error) { return ExtraerTextoDeArchivo(0, nombreArchivo, datos) } // ConvertirEnPlantilla le pide a la IA que rearme el documento como plantilla // HTML con las variables Go que usa el generador. Lo que devuelve va al editor // para que el admin lo revise antes de guardar: no se guarda solo. func ConvertirEnPlantilla(tipo, textoDocumento string) (string, error) { if strings.TrimSpace(textoDocumento) == "" { return "", fmt.Errorf("no se pudo leer texto del archivo") } if len(textoDocumento) > 20000 { textoDocumento = textoDocumento[:20000] } vars := variablesPorTipo[tipo] if vars == "" { vars = variablesComunes } sistema := `Sos un asistente que convierte documentos en plantillas HTML para Go text/template. Reglas: - Devolvé SOLO el HTML de la plantilla, sin explicaciones y sin bloques de código markdown. - Reemplazá los datos concretos del documento (nombres, NITs, fechas, montos, ítems) por las variables de la lista. Lo que sea texto fijo del formato se deja tal cual. - Si el documento tiene una tabla de ítems, usá {{range .Items}}…{{end}} para las filas. - Usá estilos inline (style="…"), sin CSS externo ni