fix: los lotes para abrir ciclo salian en orden alfabetico
El pedido es mostrar los 10 con los ciclos mas largos —los que toca abrir— y una opcion para ver el resto. La apertura ofrecia todos los lotes de la finca por nombre, sin señal de cual estaba mas atrasado. Ahora apertura y cierre traen 10 ordenados por dias, con los dias en la etiqueta, y "Otro lote" cambia al listado completo sin perder lo ya marcado. Si ningun lote tiene historial la consulta cae sola en alfabetico, porque el DATEDIFF queda nulo y desempata por nombre. Solo toca el flujo de carga; los informes quedan como estaban. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Sonnet 4.6
parent
d6bedfba54
commit
673c15dae3
+24
-3
@@ -623,7 +623,7 @@ class NormalBot
|
||||
$lf = $cfg['label_field'] ?? 'label';
|
||||
$pagina = max(0, (int)($cfg['__page'] ?? 0));
|
||||
|
||||
$porPagina = self::LISTA_MAX_FILAS - 2;
|
||||
$porPagina = self::LISTA_MAX_FILAS - (empty($cfg['__ver_todos']) ? 2 : 3);
|
||||
$hayMas = count($items) > $porPagina;
|
||||
$visibles = $hayMas ? array_slice($items, $pagina * $porPagina, $porPagina) : $items;
|
||||
|
||||
@@ -640,6 +640,10 @@ class NormalBot
|
||||
$rows[] = ['id' => '__mas', 'title' => '➕ Ver más', 'description' => "Faltan {$restantes}"];
|
||||
}
|
||||
|
||||
if (!empty($cfg['__ver_todos'])) {
|
||||
$rows[] = ['id' => '__todos', 'title' => '🔎 Otro lote', 'description' => 'Ver el listado completo'];
|
||||
}
|
||||
|
||||
$n = count($elegidos);
|
||||
$rows[] = [
|
||||
'id' => '__listo',
|
||||
@@ -1145,6 +1149,14 @@ class NormalBot
|
||||
$key = $field['key'];
|
||||
$elegidos = $cap['__multi'][$key] ?? [];
|
||||
|
||||
if ($value === '__todos') {
|
||||
$cap['__todos'][$key] = true;
|
||||
$cap['__page'][$key] = 0;
|
||||
$meta['__cap'] = $cap;
|
||||
ConversationContext::updateMetadata($ctxId, $meta);
|
||||
return self::capAskNext($cap, $context['from'], $company, $ctxId);
|
||||
}
|
||||
|
||||
if ($value === '__listo') {
|
||||
if (empty($elegidos)) {
|
||||
WhatsAppSender::sendText($context['from'], '⚠️ Elige al menos una opción.', (string)($context['phone_number_id'] ?? ''));
|
||||
@@ -1153,7 +1165,7 @@ class NormalBot
|
||||
// strval explícito: PHP convierte a int las claves numéricas
|
||||
$cap['collected'][$key] = array_map('strval', array_keys($elegidos));
|
||||
$cap['collected_labels'][$key] = implode(', ', array_values($elegidos));
|
||||
unset($cap['__multi'][$key], $cap['__page'][$key]);
|
||||
unset($cap['__multi'][$key], $cap['__page'][$key], $cap['__todos'][$key]);
|
||||
$cap['index'] = $idx + 1;
|
||||
while ($cap['index'] < count($fields) && self::capShouldSkip($fields[$cap['index']], $cap['collected'])) { $cap['index']++; }
|
||||
$meta['__cap'] = $cap;
|
||||
@@ -1375,8 +1387,16 @@ class NormalBot
|
||||
|
||||
// ── multi_select: acumula varias opciones antes de continuar ─────────
|
||||
if ($type === 'multi_select') {
|
||||
// Por defecto llega una lista corta con los mas relevantes; "Otro"
|
||||
// cambia al catalogo completo sin perder lo ya marcado.
|
||||
$verTodos = !empty($cap['__todos'][$field['key']]);
|
||||
$claveSrc = $verTodos && !empty($field['full_endpoint_key'])
|
||||
? $field['full_endpoint_key']
|
||||
: ($field['source_endpoint_key'] ?? '');
|
||||
|
||||
$items = self::fetchDynamicList(
|
||||
self::resolverPorCampos($field['source_endpoint_key'] ?? '', $cap['collected'] ?? []),
|
||||
self::resolverPorCampos($claveSrc,
|
||||
$cap['collected'] ?? []),
|
||||
$company,
|
||||
['__ep_vars_combined' => $cap['collected'] ?? []],
|
||||
$to
|
||||
@@ -1402,6 +1422,7 @@ class NormalBot
|
||||
'body' => $field['prompt'] ?? 'Puedes elegir varios:',
|
||||
'section_title' => $field['label'] ?? $field['key'],
|
||||
'__page' => (int)($cap['__page'][$field['key']] ?? 0),
|
||||
'__ver_todos' => !$verTodos && !empty($field['full_endpoint_key']),
|
||||
], $cap['__multi'][$field['key']] ?? [], $to, $company);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user