feat: mantenimiento cierra Fase 1; sin Flows, todo en chat

Mantenimiento no abre ni cierra ciclos porque no tiene tabla de ciclos: se
registra avance sobre lotes que ya tienen cantidad pendiente de asignar. Va
como flujo aparte y no dentro de ciclos, con la cantidad faltante en la
etiqueta para poder decidir sin salir de la lista.

Se descarta el camino de WhatsApp Flows: pluviometria y ciclos se quedan en
chat, que ya funcionan. Se quitan del menu las descripciones que prometian
formulario.

FLOWS-META.txt se conserva como referencia por si la decision cambia.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Lizandro Guarnizo
2026-08-19 18:28:15 -05:00
co-authored by Claude Sonnet 4.6
parent e3399cca9e
commit 356c157811
2 changed files with 69 additions and 4 deletions
+49 -4
View File
@@ -247,8 +247,9 @@ $configJson = [
'title' => 'Opciones',
'rows' => [
['id' => 'registrar_ausentismo', 'modulo' => 'ausentismos', 'title' => '👥 Ausentismo', 'description' => 'Registrar falta, incapacidad o permiso'],
['id' => 'registrar_pluviometria','modulo' => 'pluviometria', 'title' => '🌧️ Pluviometría', 'description' => 'Milímetros por finca · pronto formulario'],
['id' => 'registrar_ciclo', 'modulo' => 'ciclos', 'title' => '🔄 Ciclos', 'description' => 'Abrir o cerrar lotes · pronto formulario'],
['id' => 'registrar_pluviometria','modulo' => 'pluviometria', 'title' => '🌧️ Pluviometría', 'description' => 'Milímetros de lluvia por finca'],
['id' => 'registrar_ciclo', 'modulo' => 'ciclos', 'title' => '🔄 Ciclos', 'description' => 'Abrir o cerrar lotes'],
['id' => 'registrar_mantenimiento','modulo' => 'mantenimiento', 'title' => '🔧 Mantenimiento', 'description' => 'Avance sobre lotes pendientes'],
],
],
],
@@ -551,6 +552,46 @@ $configJson = [
],
],
// Mantenimiento no abre ni cierra ciclos —no tiene tabla de ciclos—:
// se registra avance sobre lotes que ya tienen cantidad pendiente.
'registrar_mantenimiento' => [
'type' => 'collect_and_post',
'endpoint_key' => 'labores_up',
'header' => '🔧 Mantenimiento',
'confirm' => true,
'success_text' => '✅ Enviado a Palmas360.',
'back' => 'enviar_informacion',
'requires' => ['grupo_mant' => 'grupo_id'],
'resolver' => 'ciclo_mantenimiento',
'nlu_description' => 'Registrar avance de mantenimiento: plateo, corona, poda',
'fields' => [
[
'key' => 'fecha',
'label' => 'Fecha',
'type' => 'date_quick',
'prompt' => '📅 ¿De qué fecha?',
'other_validate' => 'date',
'other_prompt' => 'Escribe la fecha (YYYY-MM-DD):',
],
[
'key' => 'lote_id',
'label' => 'Lote',
'type' => 'select',
'prompt' => 'Elige el lote (entre paréntesis va lo que falta):',
'source_endpoint_key' => 'lotes_mantenimiento_dn',
'value_field' => 'id',
'label_field' => 'label',
'empty_text' => '⚠️ No hay lotes con cantidad pendiente para ese grupo.',
],
[
'key' => 'cantidad',
'label' => 'Cantidad',
'type' => 'text',
'prompt' => '¿Qué cantidad avanzaste?',
],
],
],
// Upload
'enviar_informacion' => ['type' => 'menu', 'menu' => 'submenu_subir_ciclos', 'nlu_skip' => true, 'back' => 'show_main_menu'],
@@ -581,8 +622,9 @@ $configJson = [
'title' => 'Opciones',
'rows' => [
['id' => 'registrar_ausentismo', 'modulo' => 'ausentismos', 'title' => '👥 Ausentismo', 'description' => 'Registrar falta, incapacidad o permiso'],
['id' => 'registrar_pluviometria','modulo' => 'pluviometria', 'title' => '🌧️ Pluviometría', 'description' => 'Milímetros por finca · pronto formulario'],
['id' => 'registrar_ciclo', 'modulo' => 'ciclos', 'title' => '🔄 Ciclos', 'description' => 'Abrir o cerrar lotes · pronto formulario'],
['id' => 'registrar_pluviometria','modulo' => 'pluviometria', 'title' => '🌧️ Pluviometría', 'description' => 'Milímetros de lluvia por finca'],
['id' => 'registrar_ciclo', 'modulo' => 'ciclos', 'title' => '🔄 Ciclos', 'description' => 'Abrir o cerrar lotes'],
['id' => 'registrar_mantenimiento','modulo' => 'mantenimiento', 'title' => '🔧 Mantenimiento', 'description' => 'Avance sobre lotes pendientes'],
],
],
],
@@ -699,6 +741,9 @@ $endpoints = [
['key' => 'lotes_apertura_todos_dn', 'dir' => 'download', 'url' => $BASE . '?peticion=lotes_apertura_dn&ciclo={ciclo}&finca_id={finca_id}&todos=1'],
['key' => 'lotes_cierre_todos_dn', 'dir' => 'download', 'url' => $BASE . '?peticion=lotes_abiertos_dn&ciclo={ciclo}&finca_id={finca_id}&todos=1'],
['key' => 'ciclos_up', 'dir' => 'upload', 'url' => $BASE . '?peticion=ciclos_{ciclo}_up'],
// Mantenimiento: lotes con cantidad pendiente de asignar, no apertura/cierre
['key' => 'lotes_mantenimiento_dn', 'dir' => 'download', 'url' => $BASE . '?peticion=lotes_mantenimiento_dn&grupo={grupo_id}&finca_id={finca_id}'],
['key' => 'lotes_mantenimiento_todos_dn', 'dir' => 'download', 'url' => $BASE . '?peticion=lotes_mantenimiento_dn&grupo={grupo_id}&finca_id={finca_id}&todos=1'],
// Todos los lotes (PDF) por ciclo
['key' => 'cosecha_todos_dn', 'dir' => 'download', 'url' => $BASE . '?peticion=ciclos_cosecha_dn&finca_id={finca_id}'],
['key' => 'polinizacion_todos_dn', 'dir' => 'download', 'url' => $BASE . '?peticion=ciclos_polinizacion_dn&finca_id={finca_id}'],
+20
View File
@@ -542,6 +542,26 @@ $filas = function (int $total, bool $verTodos): int {
check('la lista corta entra en el límite de WhatsApp', $filas(10, true) <= 10, true);
check('el listado completo también', $filas(40, false) <= 10, true);
echo "\nMantenimiento (POST)\n";
$mto = $flows['registrar_mantenimiento'] ?? [];
$mf = array_column($mto['fields'] ?? [], null, 'key');
check('pide fecha, lote y cantidad', array_keys($mf), ['fecha', 'lote_id', 'cantidad']);
check('los lotes salen de los que tienen pendiente',
$mf['lote_id']['source_endpoint_key'] ?? null, 'lotes_mantenimiento_dn');
check('endpoint registrado', isset($eps['lotes_mantenimiento_dn']), true);
check('postea como labor diaria', $mto['endpoint_key'] ?? null, 'labores_up');
// El grupo se pide antes, con la misma intencion pendiente de los informes
check('pide el grupo si falta', $mto['requires'] ?? null, ['grupo_mant' => 'grupo_id']);
check('y lo resuelve con el selector', $mto['resolver'] ?? null, 'ciclo_mantenimiento');
// No va en el flujo de ciclos: no tiene apertura ni cierre
$cic = array_column($flows['registrar_ciclo']['fields'], null, 'key');
check('mantenimiento no está entre los ciclos',
in_array('mantenimiento', array_column($cic['ciclo']['options'], 'id'), true), false);
echo "\nAlcance de fincas por número\n";
/**