Plant Cerebro
← temas
tema

Auditoría técnica Motor de Compras 2.0

<!-- ESTADO-VIVO:INICIO -->

⚡ ÚLTIMO ESTADO VIVO (Actualizado: 2026-10-30 18:23 · Orden Cronológico Inverso: Más Nuevo Arriba)

<!-- ESTADO-VIVO:FIN -->

Fecha: 2026-10-30. Lectura directa de Google Sheets; no se modificaron las planillas ni sus selectores.

Dictamen

Las siete fórmulas solicitadas son idénticas, carácter por carácter, en Mauro 2.0, Gaspi y Caro. No se identificó dependencia circular en la cadena local revisada. No se certifica ausencia global de ciclos entre todos los libros externos: hay IMPORTRANGE y fuentes adicionales no recorridas exhaustivamente. No corresponde declarar ausencia de bordes ni cero errores generales.

Se leyeron todas las filas existentes de Cálculos (7506 Mauro; 7507 Gaspi/Caro), columnas A:AU. No hubo errores nativos en R/T/U/AE/AF/AU en esta lectura; sí 213 errores por libro en AS (Costo Compra), heredados de la fuente. Un error de costo elimina el piso mediante IFERROR; en O7/P7 se convierte en costo cero, pudiendo distorsionar mínimos monetarios sin alertarlo.

Revisión de las siete reglas

  1. R7: coincide. Base Combinación N, verificada aguas arriba como XLOOKUP a Lista Productos N. Riesgo usa AJ (ABC general), con umbrales estrictos: A LT=1 no suma; LT=1,5 suma 0,3; >1,5 suma 0,5. B LT=1,5 no suma; >1,5 suma 0,3. C no suma. LT viene redondeado hacia arriba a décimas de semana antes de aplicar umbrales.
  2. T7: coincide con MAX(LT, Combinación O) más días manuales N7 y automáticos O7, divididos por siete, solo para entidad N2 y ABC en marca EE distinto de C. Importante: O es FINAL SEMANAS DE STOCK desde Lista Productos Z; el rótulo frecuencia requiere que ese parámetro represente efectivamente frecuencia. Un ABC vacío o inválido también pasa el filtro distinto de C. N7 debe ser numérico; hoy es cero en las tres.
  3. U7: coincide como PISO, no como stock óptimo total. Si hay ventas, se toma el mayor entre piso y cálculo real. Vida útil menor a 90 (si no está vacía) o costo mayor a 3000 anulan el piso; 90 y 3000 exactos lo permiten. A/B reciben MIN(2*uxb,24), resto MIN(uxb,12). Usa AJ, ABC general, no EE en marca. Vida útil vacía permite el piso; costo vacío no se valida explícitamente como ausente. ABC inválido cae en rama C. UxBulto cero/negativo/no numérico carece de validación uniforme.
  4. AE7: coincide: SUMIF por AP suma AC (unidades madre, conversión de packs realizada aguas arriba), agrega V solo cuando es negativo, limita a cero y omite filas de packs NN-CODIGO. El sobrante se descuenta una vez por fila madre; IDs madre duplicados no están protegidos.
  5. AU7: reconstruye T/U/V/AE y el redondeo de AF con O7 automático eliminado, conservando N7 manual y reglas ML. No referencia T/U/V/AE/AF finales. Mantiene Sin Datos si necesidad y stock son cero. Esto rompe el retorno local del automático, pero no significa que sea base sin días manuales. Casos de datos ausentes son reconstruidos con vbase=0 y no constituyen equivalencia textual estricta a AF.
  6. Preparar OC O7: reconoce P/PESO/PESOS; U/UNIDAD/UNIDADES/PACK/PACKS; C/B/CAJA/CAJAS/BULTO/BULTOS; K/KG/KILO/KILOS; resto manual. actualBase=SUM(MAX(AU-pendiente,0)*mult); costo por ID desde Combinación U. tasaActiva usa ABC en marca A/B y rawBase>0; si es cero usa tasaTotal de todos los A/B listados. stepBox suma 0,5*uxb*mult para A/B con rawBase>0 y venta positiva. Días enteros hacia arriba, tope 30; cero para manual, objetivo no positivo, base suficiente o tasa no positiva.
  7. Preparar OC P7: contiene los cinco estados pedidos y verifica el sugerido final T, no AU. AUTO aparece solo si el final alcanza el objetivo y O7>0. Al alcanzar exactamente el objetivo muestra SUPERA (usa >=). Si tipo no reconocido muestra VER MÍNIMO con texto original. Si tipo es válido pero importe parseado es cero, puede mostrar SUPERA, aunque el texto sea inválido.

Bordes relevantes

Dependencias locales

O7 auto -> AU -> tbase (N7 manual, N2, LT, parámetro stock) + S/P/R + AC/AP y fuentes importadas. AU no retorna a O7 auto. T -> O7; U -> T; V -> U; AE -> V; AF -> AE/V; Preparar OC T -> AF; P7 -> Preparar OC T y O7. No hay retorno desde P7 hacia O7.

Los errores REF en AS no prueban circularidad: provienen del costo importado y no se expone mensaje causal completo en esta respuesta del conector.

Estado observado

Mauro: O7=0; SIN MÍNIMO. Gaspi (Zuelo): N3=207000p; O7=0; SUPERA MÍNIMO. Caro: O7=0; SIN MÍNIMO. Son los selectores actuales, no una prueba de todas las marcas ni de las cinco ramas del semáforo.

Evidencia primaria

Fórmulas exactas leídas (iguales en los tres libros)

Cálculos!R7

=ArrayFormula({"Semanas de Seguridad";if(A8:A="";;let(base;'Combinación de Resultados'!N5:N;riesgo;if(AJ8:AJ="A";if(J8:J>1,5;0,5;if(J8:J>1;0,3;0));if(AJ8:AJ="B";if(J8:J>1,5;0,3;0);0));base+riesgo))})

Cálculos!T7

=ArrayFormula({"Semanas de Stock";if(A8:A="";;if(J8:J>'Combinación de Resultados'!O5:O;J8:J;'Combinación de Resultados'!O5:O)+if(((('Preparar OC'!$N$7+IFERROR(VALUE('Preparar OC'!$O$7);0))=0))+('Preparar OC'!$N$2<>E8:E)+('Combinación de Resultados'!EE5:EE="C");0;('Preparar OC'!$N$7+IFERROR(VALUE('Preparar OC'!$O$7);0))/7))})

Cálculos!U7

=ArrayFormula({"Stock Óptimo PLANT";if((A8:A="")+(O8:O="");;let(AB;(AJ8:AJ="A")+(AJ8:AJ="B");piso;if((AL8:AL<>"")*(AL8:AL<90);0;if(iferror((AS8:AS>3000);true);0;if(AB;if(H8:H>=12;24;H8:H*2);if(H8:H>=12;12;H8:H))));if(P8:P=0;piso;iferror(let(calculoreal;IFERROR(roundup(S8:S+P8:P*T8:T;0);"Sin Datos");if(piso>calculoreal;piso;calculoreal));piso))))})

Cálculos!AE7

=ArrayFormula({"Pedir ML";if(A8:A="";;if(mid(A8:A;3;1)="-";;let(resultado;SUMIF(AP8:AP;A8:A;AC8:AC)+if(V8:V<0;V8:V;0);if(resultado<0;0;resultado))))})

Cálculos!AU7

={"Sugerido Base 0d";ArrayFormula(IF((A8:A="")+(O8:O="");;let(tbase;if(J8:J>'Combinación de Resultados'!O5:O;J8:J;'Combinación de Resultados'!O5:O)+if(('Preparar OC'!$N$7=0)+('Preparar OC'!$N$2<>E8:E)+('Combinación de Resultados'!EE5:EE="C");0;'Preparar OC'!$N$7/7);AB;(AJ8:AJ="A")+(AJ8:AJ="B");piso;if((AL8:AL<>"")*(AL8:AL<90);0;if(iferror((AS8:AS>3000);true);0;if(AB;if(H8:H>=12;24;H8:H*2);if(H8:H>=12;12;H8:H))));ubase;if(P8:P=0;piso;iferror(let(calculoreal;IFERROR(roundup(S8:S+P8:P*tbase;0);"Sin Datos");if(piso>calculoreal;piso;calculoreal));piso));vbase;if((mid(A8:A;3;1)="-")+(P8:P="Sin Datos")+(ubase="Sin Datos");0;ubase-(if(Q8:Q-J8:J*P8:P<0;0;Q8:Q-J8:J*P8:P)));necplant;IF(vbase<0;0;vbase);necml;IF(mid(A8:A;3;1)="-";0;let(res;SUMIF(AP8:AP;A8:A;AC8:AC)+if(vbase<0;vbase;0);if(res<0;0;res)));nectotal;necplant+necml;IF(((nectotal=0)*(Q8:Q=0))+((P8:P="Sin Datos")*(nectotal=0));"Sin Datos";IF(nectotal=0;0;IF(nectotal<(H8:H/3*2);roundup(nectotal);IFERROR((nectotal/H8:H-let(resto;MOD(nectotal/H8:H;1);IF(resto<1/3;resto;-1+resto)))*H8:H;roundup(nectotal))))))))}

Preparar OC!O7

=ARRAYFORMULA(IF(OR(N3="";N3="0";N3=0;N3="-");0;LET(raw;UPPER(TRIM(TO_TEXT(N3)));tipo;IF(REGEXMATCH(raw;"^[0-9.,]+\s*(P|PESOS?)$");"P";IF(REGEXMATCH(raw;"^[0-9.,]+\s*(U|UNIDADES?|PACKS?)$");"U";IF(REGEXMATCH(raw;"^[0-9.,]+\s*(C|B|CAJAS?|BULTOS?)$");"C";IF(REGEXMATCH(raw;"^[0-9.,]+\s*(K|KG|KILOS?)$");"K";"M"))));obj;IF(tipo="M";0;IFERROR(VALUE(SUBSTITUTE(SUBSTITUTE(REGEXEXTRACT(raw;"^[0-9.,]+");".";"");",";"."));0));rawBase;IFERROR(VALUE(XLOOKUP(B10:B200;'Cálculos'!A:A;'Cálculos'!AU:AU;0;0));0);pend;IFERROR(VALUE(Z10:Z200);0);uxb;IF(IFERROR(VALUE(X10:X200);1)<=0;1;IFERROR(VALUE(X10:X200);1));sugBase;IF((rawBase-pend)<=0;0;rawBase-pend);costoU;IFERROR(VALUE(XLOOKUP(B10:B200;'Combinación de Resultados'!A:A;'Combinación de Resultados'!U:U;0;0));0);cantU;IFERROR(VALUE(XLOOKUP(B10:B200;'Combinación de Resultados'!A:A;'Combinación de Resultados'!G:G;0;0));0);unidU;UPPER(TRIM(XLOOKUP(B10:B200;'Combinación de Resultados'!A:A;'Combinación de Resultados'!H:H;"";0)));pesoU;IF((unidU="KG")+(unidU="L");cantU;IF((unidU="G")+(unidU="ML")+(unidU="CC");cantU/1000;0));mult;IF(tipo="P";costoU;IF(tipo="U";1;IF(tipo="C";1/uxb;IF(tipo="K";pesoU;0))));actualBase;SUM(sugBase*mult);esAB;(AE10:AE200="A")+(AE10:AE200="B");vtaDia;IF(esAB>0;IFERROR(VALUE(Q10:Q200)/7;0);0);tasaActiva;SUM(IF(rawBase>0;vtaDia*mult;0));tasaTotal;SUM(vtaDia*mult);tasaDia;IF(tasaActiva>0;tasaActiva;tasaTotal);stepBox;SUM(IF((esAB>0)*(rawBase>0)*(vtaDia>0);0,5*uxb*mult;0));IF(OR(tipo="M";obj<=0;actualBase>=obj;tasaDia<=0);0;MIN(30;CEILING((obj-actualBase+stepBox)/tasaDia;1))))))

Preparar OC!P7

=ARRAYFORMULA(IF(OR(N3="";N3="0";N3=0;N3="-");"🟢 SIN MÍNIMO";LET(raw;UPPER(TRIM(TO_TEXT(N3)));tipo;IF(REGEXMATCH(raw;"^[0-9.,]+\s*(P|PESOS?)$");"P";IF(REGEXMATCH(raw;"^[0-9.,]+\s*(U|UNIDADES?|PACKS?)$");"U";IF(REGEXMATCH(raw;"^[0-9.,]+\s*(C|B|CAJAS?|BULTOS?)$");"C";IF(REGEXMATCH(raw;"^[0-9.,]+\s*(K|KG|KILOS?)$");"K";"M"))));obj;IF(tipo="M";0;IFERROR(VALUE(SUBSTITUTE(SUBSTITUTE(REGEXEXTRACT(raw;"^[0-9.,]+");".";"");",";"."));0));sugActual;IFERROR(VALUE(T10:T200);0);uxb;IF(IFERROR(VALUE(X10:X200);1)<=0;1;IFERROR(VALUE(X10:X200);1));costoU;IFERROR(VALUE(XLOOKUP(B10:B200;'Combinación de Resultados'!A:A;'Combinación de Resultados'!U:U;0;0));0);cantU;IFERROR(VALUE(XLOOKUP(B10:B200;'Combinación de Resultados'!A:A;'Combinación de Resultados'!G:G;0;0));0);unidU;UPPER(TRIM(XLOOKUP(B10:B200;'Combinación de Resultados'!A:A;'Combinación de Resultados'!H:H;"";0)));pesoU;IF((unidU="KG")+(unidU="L");cantU;IF((unidU="G")+(unidU="ML")+(unidU="CC");cantU/1000;0));mult;IF(tipo="P";costoU;IF(tipo="U";1;IF(tipo="C";1/uxb;IF(tipo="K";pesoU;0))));actualTotal;SUM(sugActual*mult);IF(tipo="M";"⚪ VER MÍNIMO ("&N3&")";IF(actualTotal>=obj;IF(IFERROR(VALUE(O7);0)>0;"🟡 AUTO +"&O7&"d (LLEGA AL MÍNIMO)";"🟢 SUPERA MÍNIMO");"🔴 NO LLEGA AL MÍNIMO ("&TEXT(actualTotal/IF(obj<=0;1;obj);"0%")&")")))))

Cierre E2E en Vivo (18:22 hs) + Zuelo / Laur + Borrador #D41

Temas/auditoria-tecnica-motor-compras-2-0-2026-10-30