feat: carga de ciclos — apertura y cierre de lotes con seleccion multiple
Ultimo flujo de Fase 1. Pregunta ciclo, accion, fecha y lotes, y postea a
ciclos_{ciclo}_up con lote_ids[], que es el contrato que quedo en el ERP.
Pieza nueva del motor, multi_select: la lista acumula, cada toque marca o
desmarca con un check en la etiqueta, y "Listo" cierra. WhatsApp no tiene
casillas, asi que el estado se muestra redibujando. De las 10 filas, dos van
para "Ver mas" y "Listo".
Tambien resolverPorCampos(), que reemplaza {campo} con lo ya elegido tanto en
la clave del endpoint como en la URL del POST. Con eso los seis tipos de ciclo
y las dos acciones comparten tres entradas de endpoint en vez de dieciocho:
apertura ofrece los lotes de la finca y cierre solo los que estan abiertos.
Mantenimiento no aparece: no tiene tabla de ciclos ni apertura/cierre, es una
labor y va con Fase 2.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Sonnet 4.6
parent
576ea7de40
commit
e5326bda8c
@@ -406,6 +406,59 @@ check('la última página no ofrece "ver más"',
|
||||
check('10 opciones entran sin paginar',
|
||||
$paginar(array_slice($novedades, 0, 10), 0), array_slice($novedades, 0, 10));
|
||||
|
||||
echo "\nCiclos — apertura y cierre (POST)\n";
|
||||
|
||||
$cic = $flows['registrar_ciclo'] ?? [];
|
||||
$cf = array_column($cic['fields'] ?? [], null, 'key');
|
||||
|
||||
check('pregunta ciclo, acción, fecha y lotes',
|
||||
array_keys($cf), ['ciclo', 'accion', 'fecha', 'lote_ids']);
|
||||
check('los seis ciclos, sin mantenimiento',
|
||||
array_column($cf['ciclo']['options'], 'id'),
|
||||
['cosecha', 'polinizacion', 'sanidad', 'censo', 'palm', 'tratamiento']);
|
||||
check('apertura y cierre',
|
||||
array_column($cf['accion']['options'], 'id'), ['apertura', 'cierre']);
|
||||
check('los lotes se eligen de a varios', $cf['lote_ids']['type'], 'multi_select');
|
||||
|
||||
// El catálogo de lotes depende de la acción: todos vs solo los abiertos
|
||||
$resolver = function (string $tpl, array $col): string {
|
||||
foreach ($col as $k => $v) $tpl = str_replace('{' . $k . '}', (string)$v, $tpl);
|
||||
return $tpl;
|
||||
};
|
||||
check('apertura ofrece los lotes de la finca',
|
||||
$resolver($cf['lote_ids']['source_endpoint_key'], ['accion' => 'apertura']), 'lotes_apertura_dn');
|
||||
check('cierre ofrece solo los abiertos',
|
||||
$resolver($cf['lote_ids']['source_endpoint_key'], ['accion' => 'cierre']), 'lotes_cierre_dn');
|
||||
|
||||
// Un solo endpoint registrado sirve para los seis tipos
|
||||
foreach (['ciclos_up', 'lotes_apertura_dn', 'lotes_cierre_dn'] as $k) {
|
||||
check("endpoint {$k} registrado", isset($eps[$k]), true);
|
||||
}
|
||||
$urlCiclos = $BASE_TEST = '?peticion=ciclos_{ciclo}_up';
|
||||
check('la URL del POST resuelve por ciclo',
|
||||
$resolver($urlCiclos, ['ciclo' => 'censo']), '?peticion=ciclos_censo_up');
|
||||
check('y coincide con los tipos del ERP',
|
||||
array_map(fn($o) => $resolver($urlCiclos, ['ciclo' => $o['id']]), $cf['ciclo']['options']),
|
||||
['?peticion=ciclos_cosecha_up', '?peticion=ciclos_polinizacion_up', '?peticion=ciclos_sanidad_up',
|
||||
'?peticion=ciclos_censo_up', '?peticion=ciclos_palm_up', '?peticion=ciclos_tratamiento_up']);
|
||||
|
||||
// Espejo del acumulador de multi_select
|
||||
$alternar = function (array $elegidos, string $id, array $catalogo): array {
|
||||
if (isset($elegidos[$id])) unset($elegidos[$id]);
|
||||
else $elegidos[$id] = $catalogo[$id];
|
||||
return $elegidos;
|
||||
};
|
||||
$catalogo = ['4' => 'REPOSO 1A', '7' => 'REPOSO 1B', '9' => 'REPOSO 2A'];
|
||||
$e = [];
|
||||
$e = $alternar($e, '4', $catalogo);
|
||||
$e = $alternar($e, '7', $catalogo);
|
||||
check('acumula varios lotes', array_map('strval', array_keys($e)), ['4', '7']);
|
||||
$e = $alternar($e, '4', $catalogo);
|
||||
check('y desmarca al volver a tocar', array_map('strval', array_keys($e)), ['7']);
|
||||
check('el POST manda un array de ids', array_map('strval', array_keys($alternar($e, '9', $catalogo))), ['7', '9']);
|
||||
|
||||
check('accesible desde enviar información', $enMenu($config, '3', 'registrar_ciclo'), true);
|
||||
|
||||
echo "\nask_finca\n";
|
||||
$af = $flows['ask_finca'];
|
||||
check('no repregunta si ya hay finca', $af['skip_if_set'] ?? false, true);
|
||||
|
||||
Reference in New Issue
Block a user