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:
co-authored by
Claude Sonnet 4.6
parent
76ee42b96e
commit
c0fb2dc089
@@ -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
|
||||
{
|
||||
|
||||
@@ -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:',
|
||||
],
|
||||
],
|
||||
],
|
||||
|
||||
Reference in New Issue
Block a user