Propuesta IA: corregir lo que encontro la auditoria de herramientas y plantillas
La auditoria confirma lo que se pedia verificar: la IA SOLO puede usar las tres herramientas internas. Una por llamada, ninguna se ejecuta jamas (el input del modelo solo va a schema.safeParse, no hay despachador), y no se envia ningun tool del proveedor, web search, ejecucion de codigo, MCP ni beta. Lo que NO cumplia era la otra mitad, la correspondencia con las plantillas: CRITICO - el documento cobraba un IVA que la cotizacion no cobra. Cada partida se imprimia a precio SIN IVA y debajo un unico total CON IVA, rematado con "Importes con IVA incluido", mientras el PDF economico del mismo correo dice "los precios no incluyen IVA" sobre las mismas cifras. Las lineas no sumaban su propio total. Ahora la caja de totales desglosa subtotal / IVA / total como la plantilla autorizada, las lineas siguen sin IVA igual que el otro documento, y la nota al pie dice lo que de verdad hacen las lineas. CRITICO - los avisos bloqueantes no bloqueaban nada. hayBloqueantes() no se llamaba en ningun sitio y la ruta del PDF nunca leia avisos: el documento del cliente se descargaba igual con una fuga de notas internas dentro. Ahora devuelve 409 con la lista de lo que hay que corregir. El anexo interno si se permite: es justo el que el asesor necesita para arreglarlo. ALTO - seis campos que SI se imprimen al cliente no pasaban por los filtros de marca, moneda, garantias y PII: el texto y el autor de la cita destacada, la metrica y el periodo de cada resultado, quien decide cada pendiente, y el momento del backlog. textoVisible ahora los cubre y queda documentado que debe seguir a lo que dibuja el PDF. ALTO - el plan Bucefalo se caia del documento y de sus totales, aunque si aparece en el PDF economico y en el Excel: cargarEconomia nunca leia la relacion. El cliente recibia dos documentos con alcances distintos. Co-Authored-By: Claude Opus 5 (1M context) <[email protected]>
This commit is contained in:
co-authored by
Claude Opus 5
parent
3f46d8a734
commit
bdd9319fd0
@@ -55,6 +55,7 @@ const econ: DatosEconomicos = {
|
||||
],
|
||||
totales: { subtotalUnico: 12000, subtotalMensual: 8000, ivaUnico: 1920, ivaMensual: 1280, totalUnico: 13920, totalMensual: 9280, totalPrimerAnio: 125280, incluyeIva: true },
|
||||
moneda: "MXN",
|
||||
planBucefalo: null,
|
||||
};
|
||||
|
||||
const propuesta: PropuestaConsultiva = {
|
||||
@@ -127,15 +128,29 @@ async function main() {
|
||||
check("imprime el precio de P02", txt.includes("8,000"));
|
||||
check("imprime el total unico con IVA", txt.includes("13,920"));
|
||||
check("imprime la mensualidad con IVA", txt.includes("9,280"));
|
||||
check("declara que los importes llevan IVA", txt.includes("IVA incluido"));
|
||||
// El desglose debe cuadrar: lineas sin IVA + IVA como renglon propio.
|
||||
check("imprime el subtotal sin IVA", txt.includes("Subtotal pago unico") && txt.includes("12,000"));
|
||||
check("imprime el IVA como renglon propio", txt.includes("IVA 16%") && txt.includes("1,920"));
|
||||
check("imprime el total con IVA", txt.includes("Total pago unico"));
|
||||
check("la nota NO dice que las lineas incluyan IVA", !txt.includes("Importes con IVA incluido"));
|
||||
check("la nota aclara que las partidas van sin IVA", txt.includes("no incluyen IVA"));
|
||||
|
||||
check("etiqueta el semaforo", txt.includes("Problema critico") && txt.includes("Ventaja existente"));
|
||||
check("etiqueta la confianza", txt.includes("Confirmado") && txt.includes("Estimado"));
|
||||
check("el backlog se marca como no comprometido", txt.includes("No comprometido"));
|
||||
|
||||
// Sin IVA la nota cambia.
|
||||
// Sin IVA no debe aparecer el renglon de IVA.
|
||||
const sinIva = await generarPropuestaPDF({ ...datos, economia: { ...econ, totales: { ...econ.totales, incluyeIva: false } } });
|
||||
check("sin IVA la nota legal cambia", textoDePdf(sinIva).includes("sin IVA"));
|
||||
const txtSinIva = textoDePdf(sinIva);
|
||||
check("sin IVA no se imprime el renglon de IVA", !txtSinIva.includes("IVA 16%"));
|
||||
check("sin IVA el total lo declara", txtSinIva.includes("sin IVA"));
|
||||
|
||||
// El plan Bucefalo tiene que aparecer: esta en la cotizacion y en los otros dos exportadores.
|
||||
const conPlan = await generarPropuestaPDF({ ...datos, economia: { ...econ, planBucefalo: { nivel: "premium", precio: 4500 } } });
|
||||
const txtPlan = textoDePdf(conPlan);
|
||||
check("el plan Bucefalo aparece en el documento", txtPlan.includes("Bucefalo"));
|
||||
check("el plan aparece con su nivel", txtPlan.includes("Premium"));
|
||||
check("el plan aparece con su precio mensual", txtPlan.includes("4,500"));
|
||||
|
||||
// Una partida que la IA invento no se dibuja (R2 ya la marco).
|
||||
const conFantasma = await generarPropuestaPDF({
|
||||
|
||||
Reference in New Issue
Block a user