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
|
$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'][$field['key']] = $value;
|
||||||
$cap['collected_labels'][$field['key']] = $value;
|
$cap['collected_labels'][$field['key']] = $value;
|
||||||
unset($cap['__awaiting_other']);
|
unset($cap['__awaiting_other']);
|
||||||
@@ -1041,6 +1044,11 @@ class NormalBot
|
|||||||
}
|
}
|
||||||
|
|
||||||
// ── 4. Normal save ────────────────────────────────────────────────────
|
// ── 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;
|
$cap['collected'][$field['key']] = $value;
|
||||||
|
|
||||||
if (($field['type'] ?? 'text') === 'select') {
|
if (($field['type'] ?? 'text') === 'select') {
|
||||||
@@ -1226,6 +1234,21 @@ class NormalBot
|
|||||||
return self::sendText($text, $to, $company);
|
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
|
// 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
|
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)',
|
'prompt' => '📅 ¿Hasta qué fecha? (si es un solo día, elige la misma)',
|
||||||
'other_validate' => 'date',
|
'other_validate' => 'date',
|
||||||
'other_prompt' => 'Escribe la fecha final (YYYY-MM-DD):',
|
'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