From 92b64887bd045d3ccdaa23a950e23e9d53637c91 Mon Sep 17 00:00:00 2001 From: Juan Felipe Zapata Moreno Date: Sat, 29 Nov 2025 12:49:24 -0600 Subject: [PATCH] fix: Mejorar el manejo de errores en la respuesta del servicio REPUVE --- app/Services/RepuveService.php | 95 +++++++++++++++++++++------------- 1 file changed, 58 insertions(+), 37 deletions(-) diff --git a/app/Services/RepuveService.php b/app/Services/RepuveService.php index bc1a882..73d9a18 100644 --- a/app/Services/RepuveService.php +++ b/app/Services/RepuveService.php @@ -77,7 +77,8 @@ private function parseVehicleResponse(string $soapResponse, string $niv) return [ 'has_error' => true, 'error_code' => '108', - 'error_message' => $errorFromDb ? $errorFromDb->description : 'El resultado que devuelve el Web service es de un formato distinto al esperado', + 'error_name' => $errorFromDb?->name, + 'error_message' => $errorFromDb?->description ?? 'Error al parsear respuesta', 'timestamp' => now()->toDateTimeString(), 'niv' => $niv, 'repuve_response' => null, @@ -86,24 +87,21 @@ private function parseVehicleResponse(string $soapResponse, string $niv) $contenido = trim($matches[1]); - // Verificar si hay error de REPUVE Nacional - if (str_starts_with($contenido, 'ERROR:')) { - $errorMessage = str_replace('ERROR:', '', $contenido); + // Verificar si hay error de REPUVE Nacional (cualquier formato con ERR o ERROR) + if (preg_match('/(ERR|ERROR|err|error):(-?\d+)/i', $contenido, $errorMatch)) { + $errorCode = $errorMatch[2]; - $errorCode = '-1'; - if (preg_match('/^(\d+)\|/', $errorMessage, $codeMatch)) { - $errorCode = $codeMatch[1]; - $errorMessage = substr($errorMessage, strlen($errorCode) + 1); - } + // Buscar el error completo en la base de datos + $errorFromDb = Error::where('code', $errorCode)->first(); - // Mensaje directo de REPUVE Nacional return [ 'has_error' => true, 'error_code' => $errorCode, - 'error_message' => trim($errorMessage), // Mensaje directo de REPUVE + 'error_name' => $errorFromDb?->name, + 'error_message' => $errorFromDb?->description ?? "Error código {$errorCode} - no catalogado", 'timestamp' => now()->toDateTimeString(), 'niv' => $niv, - 'repuve_response' => null, + 'repuve_response' => $contenido, ]; } @@ -160,7 +158,8 @@ private function parseVehicleResponse(string $soapResponse, string $niv) return [ 'has_error' => true, 'error_code' => '108', - 'error_message' => $errorFromDb ? $errorFromDb->description : 'El resultado que devuelve el Web service es de un formato distinto al esperado', + 'error_name' => $errorFromDb?->name, + 'error_message' => $errorFromDb?->description ?? 'Error al parsear respuesta', 'timestamp' => now()->toDateTimeString(), 'niv' => $niv, 'repuve_response' => null, @@ -282,7 +281,8 @@ public function inscribirVehiculo(array $datos) return [ 'has_error' => true, 'error_code' => '103', - 'error_message' => $errorFromDb ? $errorFromDb->description : "Error de conexión al Web Service: {$curlError}", + 'error_name' => $errorFromDb?->name, + 'error_message' => $errorFromDb?->description ?? "Error de conexión: {$curlError}", 'timestamp' => now()->toDateTimeString(), 'http_code' => $httpCode, 'raw_response' => $response, @@ -294,7 +294,8 @@ public function inscribirVehiculo(array $datos) return [ 'has_error' => true, 'error_code' => '-1', - 'error_message' => $errorFromDb ? $errorFromDb->description : "Error interno del web service. Código HTTP {$httpCode}", + 'error_name' => $errorFromDb?->name, + 'error_message' => $errorFromDb?->description ?? "Error interno HTTP {$httpCode}", 'timestamp' => now()->toDateTimeString(), 'http_code' => $httpCode, 'raw_response' => $response, @@ -317,7 +318,8 @@ private function parsearRespuestaInscripcion(string $soapResponse) return [ 'has_error' => true, 'error_code' => '108', - 'error_message' => $errorFromDb ? $errorFromDb->description : 'El resultado que devuelve el Web service es de un formato distinto al esperado', + 'error_name' => $errorFromDb?->name, + 'error_message' => $errorFromDb?->description ?? 'Error al parsear respuesta', 'timestamp' => now()->toDateTimeString(), 'raw_response' => $soapResponse, 'repuve_response' => null, @@ -326,26 +328,41 @@ private function parsearRespuestaInscripcion(string $soapResponse) $contenido = trim($matches[1]); - if (str_starts_with($contenido, 'ERROR:')) { - $errorMessage = str_replace('ERROR:', '', $contenido); + // Buscar patrones de error: ERR:, ERROR:, err:, error: + if (preg_match('/(ERR|ERROR|err|error):(-?\d+)/i', $contenido, $errorMatch)) { + $errorCode = $errorMatch[2]; - $errorCode = '-1'; - if (preg_match('/^(\d+)\|/', $errorMessage, $codeMatch)) { - $errorCode = $codeMatch[1]; - $errorMessage = substr($errorMessage, strlen($errorCode) + 1); + // Buscar el error completo en la base de datos + $errorFromDb = Error::where('code', $errorCode)->first(); + + if ($errorFromDb) { + // Retornar nombre y descripción de la BD + return [ + 'has_error' => true, + 'error_code' => $errorCode, + 'error_name' => $errorFromDb->name, + 'error_message' => $errorFromDb->description, + 'timestamp' => now()->toDateTimeString(), + 'raw_response' => $soapResponse, + 'repuve_response' => $contenido, + ]; } - // Mensaje directo de REPUVE Nacional + // Si no existe en BD, retornar el código sin descripción return [ 'has_error' => true, 'error_code' => $errorCode, - 'error_message' => trim($errorMessage), // Mensaje directo de REPUVE + 'error_name' => null, + 'error_message' => "Error código {$errorCode} - no catalogado", 'timestamp' => now()->toDateTimeString(), 'raw_response' => $soapResponse, - 'repuve_response' => null, + 'repuve_response' => $contenido, ]; - } elseif (str_starts_with($contenido, 'OK:')) { - $datos = str_replace('OK:', '', $contenido); + } + + // Si empieza con OK: es éxito + if (preg_match('/^OK:/i', $contenido)) { + $datos = preg_replace('/^OK:/i', '', $contenido); return [ 'has_error' => false, @@ -358,16 +375,20 @@ private function parsearRespuestaInscripcion(string $soapResponse) 'data' => $datos, ], ]; - } else { - $errorFromDb = Error::where('code', '108')->first(); - return [ - 'has_error' => true, - 'error_code' => '108', - 'error_message' => $errorFromDb ? $errorFromDb->description : 'El resultado que devuelve el Web service es de un formato distinto al esperado', - 'timestamp' => now()->toDateTimeString(), - 'raw_response' => $soapResponse, - 'repuve_response' => null, - ]; } + + // Si no hay ERR/ERROR y no es OK, asumir que es respuesta exitosa + return [ + 'has_error' => false, + 'error_code' => null, + 'error_name' => null, + 'error_message' => null, + 'timestamp' => now()->toDateTimeString(), + 'raw_response' => $soapResponse, + 'repuve_response' => [ + 'status' => 'OK', + 'data' => $contenido, + ], + ]; } }