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 <noreply@anthropic.com>
This commit is contained in:
Lizandro Guarnizo
2026-08-04 20:33:00 -05:00
co-authored by Claude Sonnet 4.6
parent 76ee42b96e
commit c0fb2dc089
2 changed files with 25 additions and 0 deletions
+23
View File
@@ -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
{
+2
View File
@@ -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:',
],
],
],