diff --git a/app/Http/Livewire/Whatsapp/ShowCorreoConfig.php b/app/Http/Livewire/Whatsapp/ShowCorreoConfig.php index 58e5700..5ed45d5 100644 --- a/app/Http/Livewire/Whatsapp/ShowCorreoConfig.php +++ b/app/Http/Livewire/Whatsapp/ShowCorreoConfig.php @@ -20,6 +20,7 @@ class ShowCorreoConfig extends Component public string $correo_imap_password = ''; public string $correo_imap_folder = 'INBOX'; public string $correo_imap_enabled = '0'; + public string $correo_imap_minutos = '5'; // ventana de tiempo en minutos // ── Estado de prueba ───────────────────────── public bool $testing = false; @@ -33,6 +34,7 @@ class ShowCorreoConfig extends Component 'correo_imap_user' => 'required|email', 'correo_imap_password' => 'required|string', 'correo_imap_folder' => 'required|string|max:100', + 'correo_imap_minutos' => 'required|integer|min:1|max:1440', ]; public function mount(): void @@ -40,7 +42,7 @@ class ShowCorreoConfig extends Component $keys = [ 'correo_imap_host', 'correo_imap_port', 'correo_imap_ssl', 'correo_imap_user', 'correo_imap_password', 'correo_imap_folder', - 'correo_imap_enabled', + 'correo_imap_enabled', 'correo_imap_minutos', ]; foreach ($keys as $key) { $this->{$key} = WhatsappSystemConfig::get($key, $this->{$key}); @@ -54,7 +56,7 @@ class ShowCorreoConfig extends Component $keys = [ 'correo_imap_host', 'correo_imap_port', 'correo_imap_ssl', 'correo_imap_user', 'correo_imap_password', 'correo_imap_folder', - 'correo_imap_enabled', + 'correo_imap_enabled', 'correo_imap_minutos', ]; foreach ($keys as $key) { WhatsappSystemConfig::set($key, (string) $this->{$key}); @@ -83,7 +85,7 @@ class ShowCorreoConfig extends Component timeout: 20 ); - $raw = $service->fetchLatest(5); + $raw = $service->fetchLatest(5, (int) $this->correo_imap_minutos); // Añadir datos parseados de Bancolombia a cada correo $this->emails = array_map(function (array $email) { diff --git a/app/Services/CorreoImapService.php b/app/Services/CorreoImapService.php index 606a54b..2340232 100644 --- a/app/Services/CorreoImapService.php +++ b/app/Services/CorreoImapService.php @@ -37,6 +37,7 @@ class CorreoImapService * luego se filtra por fecha en PHP. * * Cada elemento: [seq, from, subject, date, body] + * El campo 'fuera_de_ventana' indica si el resultado vino del fallback (sin filtro de tiempo). */ public function fetchLatest(int $limit = 5, int $minutesBack = 5): array { @@ -50,7 +51,6 @@ class CorreoImapService } // Descargar un lote suficiente para cubrir la ventana de tiempo. - // 20 mensajes es razonable; si el buzón tiene pocos, se ajusta. $fetchSize = min($total, max($limit * 4, 20)); $from = max(1, $total - $fetchSize + 1); $set = "{$from}:{$total}"; @@ -65,22 +65,29 @@ class CorreoImapService $result = []; foreach ($emails as $email) { - // Parsear la fecha del correo $ts = $email['date'] ? @strtotime($email['date']) : false; - // Si la fecha es válida y el correo es más antiguo que la ventana → parar + // Correo más antiguo que la ventana → parar if ($ts !== false && $ts < $cutoff) { break; } $result[] = $email; - // Límite de cantidad alcanzado → parar if (count($result) >= $limit) { break; } } + // ── Fallback: si la ventana no devolvió nada, mostrar los últimos $limit sin filtro + if (empty($result)) { + $result = array_slice($emails, 0, $limit); + foreach ($result as &$e) { + $e['fuera_de_ventana'] = true; + } + unset($e); + } + return $result; } diff --git a/database/migrations/2026_04_25_000001_add_correo_imap_config.php b/database/migrations/2026_04_25_000001_add_correo_imap_config.php index 2cd66f4..89a2499 100644 --- a/database/migrations/2026_04_25_000001_add_correo_imap_config.php +++ b/database/migrations/2026_04_25_000001_add_correo_imap_config.php @@ -18,6 +18,7 @@ return new class extends Migration ['config_key' => 'correo_imap_password', 'config_value' => '', 'description' => 'Contraseña o App Password'], ['config_key' => 'correo_imap_folder', 'config_value' => 'INBOX', 'description' => 'Carpeta a leer'], ['config_key' => 'correo_imap_enabled', 'config_value' => '0', 'description' => 'Habilitar lectura de correos (1/0)'], + ['config_key' => 'correo_imap_minutos', 'config_value' => '5', 'description' => 'Ventana de tiempo en minutos para leer correos recientes'], ]; foreach ($keys as $key) { @@ -35,7 +36,7 @@ return new class extends Migration ->whereIn('config_key', [ 'correo_imap_host', 'correo_imap_port', 'correo_imap_ssl', 'correo_imap_user', 'correo_imap_password', 'correo_imap_folder', - 'correo_imap_enabled', + 'correo_imap_enabled', 'correo_imap_minutos', ])->delete(); } }; diff --git a/resources/views/livewire/whatsapp/show-correo-config.blade.php b/resources/views/livewire/whatsapp/show-correo-config.blade.php index 738eb3a..00e698d 100644 --- a/resources/views/livewire/whatsapp/show-correo-config.blade.php +++ b/resources/views/livewire/whatsapp/show-correo-config.blade.php @@ -39,8 +39,8 @@ - {{-- SSL --}} -
+ {{-- SSL, Carpeta y Ventana de tiempo --}} +
+ class="border border-gray-300 rounded-lg px-3 py-2 text-sm w-32 focus:outline-none focus:ring-2 focus:ring-blue-400"> @error('correo_imap_folder')

{{ $message }}

@enderror
+
+ +
+ + minutos +
+ @error('correo_imap_minutos')

{{ $message }}

@enderror +

Máx: 1440 (24h). Se traen hasta 5 correos.

+
{{-- Usuario --}} @@ -142,12 +152,15 @@

Conexión exitosa

+ @php $fueraVentana = !empty($emails) && !empty($emails[0]['fuera_de_ventana']); @endphp @if(count($emails) === 0) - No hay correos en los últimos 5 minutos. + No hay correos en la bandeja. + @elseif($fueraVentana) + Sin actividad en los últimos {{ $correo_imap_minutos }} min — mostrando los últimos {{ count($emails) }} correos disponibles. @elseif(count($emails) === 5) Se muestran los últimos 5 correos (límite alcanzado). @else - {{ count($emails) }} correo(s) en los últimos 5 minutos. + {{ count($emails) }} correo(s) en los últimos {{ $correo_imap_minutos }} minutos. @endif