From 356c15781153525407cf9ec797b87e6094c2ddda Mon Sep 17 00:00:00 2001 From: Lizandro Guarnizo <77708265+lizandrogd@users.noreply.github.com> Date: Wed, 19 Aug 2026 18:28:15 -0500 Subject: [PATCH] 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 --- setup/seed_palmas.php | 53 ++++++++++++++++++++++++++++++++++++--- setup/test_navegacion.php | 20 +++++++++++++++ 2 files changed, 69 insertions(+), 4 deletions(-) diff --git a/setup/seed_palmas.php b/setup/seed_palmas.php index bc7f1d7..a45e298 100644 --- a/setup/seed_palmas.php +++ b/setup/seed_palmas.php @@ -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}'], diff --git a/setup/test_navegacion.php b/setup/test_navegacion.php index afaa223..34db8dc 100644 --- a/setup/test_navegacion.php +++ b/setup/test_navegacion.php @@ -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"; /**