up
This commit is contained in:
@@ -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) {
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
};
|
||||
|
||||
@@ -39,8 +39,8 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{{-- SSL --}}
|
||||
<div class="flex items-center gap-4">
|
||||
{{-- SSL, Carpeta y Ventana de tiempo --}}
|
||||
<div class="flex items-center gap-4 flex-wrap">
|
||||
<div>
|
||||
<label class="block text-xs font-medium text-gray-600 mb-1">Seguridad</label>
|
||||
<select wire:model="correo_imap_ssl"
|
||||
@@ -52,9 +52,19 @@
|
||||
<div>
|
||||
<label class="block text-xs font-medium text-gray-600 mb-1">Carpeta</label>
|
||||
<input wire:model="correo_imap_folder" type="text" placeholder="INBOX"
|
||||
class="border border-gray-300 rounded-lg px-3 py-2 text-sm w-36 focus:outline-none focus:ring-2 focus:ring-blue-400">
|
||||
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') <p class="text-red-500 text-xs mt-1">{{ $message }}</p> @enderror
|
||||
</div>
|
||||
<div>
|
||||
<label class="block text-xs font-medium text-gray-600 mb-1">Leer correos de los últimos</label>
|
||||
<div class="flex items-center gap-2">
|
||||
<input wire:model="correo_imap_minutos" type="number" min="1" max="1440"
|
||||
class="border border-gray-300 rounded-lg px-3 py-2 text-sm w-24 focus:outline-none focus:ring-2 focus:ring-blue-400">
|
||||
<span class="text-sm text-gray-500">minutos</span>
|
||||
</div>
|
||||
@error('correo_imap_minutos') <p class="text-red-500 text-xs mt-1">{{ $message }}</p> @enderror
|
||||
<p class="text-xs text-gray-400 mt-1">Máx: 1440 (24h). Se traen hasta 5 correos.</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{{-- Usuario --}}
|
||||
@@ -142,12 +152,15 @@
|
||||
<div>
|
||||
<p class="font-semibold text-green-700 text-sm">Conexión exitosa</p>
|
||||
<p class="text-green-600 text-xs mt-1">
|
||||
@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 <strong>{{ $correo_imap_minutos }} min</strong> — mostrando los últimos {{ count($emails) }} correos disponibles.
|
||||
@elseif(count($emails) === 5)
|
||||
Se muestran los últimos <strong>5</strong> correos (límite alcanzado).
|
||||
@else
|
||||
<strong>{{ count($emails) }}</strong> correo(s) en los últimos 5 minutos.
|
||||
<strong>{{ count($emails) }}</strong> correo(s) en los últimos {{ $correo_imap_minutos }} minutos.
|
||||
@endif
|
||||
</p>
|
||||
</div>
|
||||
|
||||
Reference in New Issue
Block a user