feat: leer comprobantes via OCR externo + Gemini solo-texto
Antes, si Gemini Vision fallaba (cuota/API), el 100% de los comprobantes del chat web quedaban sin poder leerse. Ahora el job intenta primero un servicio OCR externo configurable (imagen -> texto) y le pasa el texto a Gemini para que solo lo estructure en JSON, más barato y sin la cuota de visión. Si el OCR no está habilitado o falla, cae al método anterior (Gemini leyendo la imagen directamente) sin romper nada. Agrega configuración en el panel (URL/token/habilitado + probar conexión) y la spec del servicio OCR a desplegar en docs/ocr-service-spec.md. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Sonnet 5
parent
7f4053ea62
commit
7afd22d581
@@ -8,6 +8,7 @@ use App\Models\Saldo;
|
||||
use App\Models\SolicitudRecarga;
|
||||
use App\Models\User;
|
||||
use App\Services\GeminiVisionService;
|
||||
use App\Services\OcrExtractionService;
|
||||
use App\Services\PagoValidadorService;
|
||||
use Illuminate\Bus\Queueable;
|
||||
use Illuminate\Contracts\Queue\ShouldQueue;
|
||||
@@ -220,12 +221,28 @@ class ValidarPagoWebJob implements ShouldQueue
|
||||
return null;
|
||||
}
|
||||
|
||||
$datos = app(GeminiVisionService::class)->extraerPago(
|
||||
base64_encode(file_get_contents($ruta)),
|
||||
mime_content_type($ruta) ?: 'image/jpeg',
|
||||
$this->usuarioId,
|
||||
'web'
|
||||
);
|
||||
$base64 = base64_encode(file_get_contents($ruta));
|
||||
$mime = mime_content_type($ruta) ?: 'image/jpeg';
|
||||
$gemini = app(GeminiVisionService::class);
|
||||
$datos = null;
|
||||
|
||||
// Camino nuevo: OCR externo (texto) + Gemini solo-texto. Evita depender
|
||||
// de la cuota/estabilidad de Gemini Vision, que es lo que fallaba antes.
|
||||
$ocr = app(OcrExtractionService::class);
|
||||
if ($ocr->habilitado()) {
|
||||
$texto = $ocr->extraerTexto($base64, $mime);
|
||||
if ($texto) {
|
||||
$datos = $gemini->extraerPagoDeTexto($texto, $this->usuarioId, 'web');
|
||||
} else {
|
||||
Log::warning('[ValidarPagoWebJob] OCR no devolvio texto, cae a lectura por vision.');
|
||||
}
|
||||
}
|
||||
|
||||
// Si el OCR no esta habilitado, no respondio, o Gemini no pudo
|
||||
// estructurar su texto: cae al metodo anterior (Gemini lee la imagen).
|
||||
if (! $datos || isset($datos['__error']) || isset($datos['__parse_error'])) {
|
||||
$datos = $gemini->extraerPago($base64, $mime, $this->usuarioId, 'web');
|
||||
}
|
||||
|
||||
if (! $datos || isset($datos['__error']) || isset($datos['__parse_error'])) {
|
||||
Log::warning('[ValidarPagoWebJob] Gemini: ' . ($datos['__error'] ?? $datos['__parse_error'] ?? 'sin respuesta'));
|
||||
|
||||
Reference in New Issue
Block a user