From c0fb2dc0897db29a75f04dc60b6ece23fa66197f Mon Sep 17 00:00:00 2001 From: Lizandro Guarnizo <77708265+lizandrogd@users.noreply.github.com> Date: Tue, 4 Aug 2026 20:33:00 -0500 Subject: [PATCH] fix: rechazar rangos de fecha invertidos en ausentismo El analisis de Gemini en Palmas360 marco un ausentismo con fecha final anterior a la inicial: el bot lo dejaba pasar y el error recien aparecia frente al revisor. min_field valida entre campos al guardar, por los dos caminos (opcion de lista y fecha escrita a mano). El aviso se envia aparte para poder volver a mostrar el selector debajo. Co-Authored-By: Claude Sonnet 4.6 --- services/NormalBot.php | 23 +++++++++++++++++++++++ setup/seed_palmas.php | 2 ++ 2 files changed, 25 insertions(+) diff --git a/services/NormalBot.php b/services/NormalBot.php index ae5be14..c3baa62 100644 --- a/services/NormalBot.php +++ b/services/NormalBot.php @@ -947,6 +947,9 @@ class NormalBot $context['from'], $company ); } + if ($err = self::capValidar($field, $value, $cap['collected'])) { + return self::sendText("*{$cap['header']}*\n\n{$err}", $context['from'], $company); + } $cap['collected'][$field['key']] = $value; $cap['collected_labels'][$field['key']] = $value; unset($cap['__awaiting_other']); @@ -1041,6 +1044,11 @@ class NormalBot } // ── 4. Normal save ──────────────────────────────────────────────────── + if ($err = self::capValidar($field, $value, $cap['collected'])) { + // El aviso va aparte para poder volver a mostrar el selector debajo + WhatsAppSender::sendText($context['from'], $err, (string)($context['phone_number_id'] ?? '')); + return self::capAskNext($cap, $context['from'], $company, $ctxId); + } $cap['collected'][$field['key']] = $value; if (($field['type'] ?? 'text') === 'select') { @@ -1226,6 +1234,21 @@ class NormalBot return self::sendText($text, $to, $company); } + /** + * Validación entre campos. min_field evita rangos invertidos (una fecha + * final anterior a la inicial), que el ERP acepta y recién detecta el + * revisor. Las fechas van en YYYY-MM-DD, así que comparar como texto basta. + */ + private static function capValidar(array $field, string $value, array $collected): ?string + { + $min = $field['min_field'] ?? ''; + if ($min === '' || ($collected[$min] ?? '') === '') return null; + if ($value >= $collected[$min]) return null; + + return $field['min_error'] + ?? "⚠️ No puede ser anterior a *{$collected[$min]}*. Elige una fecha igual o posterior:"; + } + // skip_if: {"field":"novedad_id","not_in":["35","41"]} → skip this field if collected[field] not in list private static function capShouldSkip(array $field, array $collected): bool { diff --git a/setup/seed_palmas.php b/setup/seed_palmas.php index 66df8fc..2475bdd 100644 --- a/setup/seed_palmas.php +++ b/setup/seed_palmas.php @@ -445,6 +445,8 @@ $configJson = [ 'prompt' => '📅 ¿Hasta qué fecha? (si es un solo día, elige la misma)', 'other_validate' => 'date', 'other_prompt' => 'Escribe la fecha final (YYYY-MM-DD):', + 'min_field' => 'fecha_inicial', + 'min_error' => '⚠️ La fecha final no puede ser anterior a la inicial. Elige otra:', ], ], ],