feat: Fase 3 con campos condicionales; fix del monitor del ERP

Cosecha, polinizacion y fertilizacion en un solo flujo en vez de tres: skip_if
muestra el producto solo a las dos que lo llevan y el pase solo a polinizacion.
El lote se pregunta antes que el producto porque la dosis depende de los dos —
sale de la fertilizacion que se autorizo en su modulo, no la elige el usuario.

ErpMonitor construia api_base_url + /health, que no existe en el ERP: la ruta
correcta es ?peticion=ping y la URL sale de company_endpoints como el resto. Por
eso el panel mostraba el ERP caido. Tampoco mandaba el Bearer.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Lizandro Guarnizo
2026-08-19 21:01:38 -05:00
co-authored by Claude Sonnet 4.6
parent 8399a86972
commit 42adeb64d0
3 changed files with 156 additions and 3 deletions
+42
View File
@@ -580,6 +580,48 @@ foreach (['novedades_labor_dn', 'lotes_finca_dn', 'empleados_labor_dn', 'labores
check("endpoint {$k} registrado", isset($eps[$k]), true);
}
echo "\nFase 3 — campos según el tipo\n";
$f3 = $flows['registrar_labor_validada'] ?? [];
$c3 = array_column($f3['fields'] ?? [], null, 'key');
check('ofrece los tres tipos',
array_column($c3['tipo']['options'], 'id'), ['cosecha', 'polinizacion', 'fertilizacion']);
check('el producto sale de la fertilización autorizada del lote',
$c3['producto_id']['source_endpoint_key'] ?? null, 'productos_fertilizacion_dn');
/** Espejo de capShouldSkip() */
$saltear = function (array $campo, array $col): bool {
$si = $campo['skip_if'] ?? null;
if (!$si) return false;
$v = (string)($col[$si['field']] ?? '');
if (isset($si['not_in'])) return !in_array($v, array_map('strval', $si['not_in']), true);
if (isset($si['equals'])) return $v !== (string)$si['equals'];
return false;
};
$pedidos = function (array $campos, string $tipo) use ($saltear): array {
$col = ['tipo' => $tipo];
return array_values(array_filter(array_keys($campos),
fn($k) => !$saltear($campos[$k], $col)));
};
// Los tres formularios del pedido, sin escribir tres flujos
check('cosecha: sin producto ni pase',
$pedidos($c3, 'cosecha'), ['tipo', 'novedad_id', 'fecha', 'lote_id', 'empleados', 'cantidad']);
check('fertilización: con producto, sin pase',
$pedidos($c3, 'fertilizacion'), ['tipo', 'novedad_id', 'fecha', 'lote_id', 'producto_id', 'empleados', 'cantidad']);
check('polinización: con producto y pase',
$pedidos($c3, 'polinizacion'), ['tipo', 'novedad_id', 'fecha', 'lote_id', 'producto_id', 'empleados', 'cantidad', 'fase_polinizacion']);
// El producto se pregunta despues del lote: la dosis depende de los dos
$orden = array_keys($c3);
check('el lote se pregunta antes que el producto',
array_search('lote_id', $orden) < array_search('producto_id', $orden), true);
foreach (['novedades_labor3_dn', 'productos_fertilizacion_dn'] as $k) {
check("endpoint {$k} registrado", isset($eps[$k]), true);
}
echo "\nAlcance de fincas por número\n";
/**