fix: Mejorar el manejo de errores en la respuesta del servicio REPUVE

This commit is contained in:
Juan Felipe Zapata Moreno 2025-11-29 12:49:24 -06:00
parent 9ebc3f4167
commit 92b64887bd

View File

@ -77,7 +77,8 @@ private function parseVehicleResponse(string $soapResponse, string $niv)
return [ return [
'has_error' => true, 'has_error' => true,
'error_code' => '108', '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(), 'timestamp' => now()->toDateTimeString(),
'niv' => $niv, 'niv' => $niv,
'repuve_response' => null, 'repuve_response' => null,
@ -86,24 +87,21 @@ private function parseVehicleResponse(string $soapResponse, string $niv)
$contenido = trim($matches[1]); $contenido = trim($matches[1]);
// Verificar si hay error de REPUVE Nacional // Verificar si hay error de REPUVE Nacional (cualquier formato con ERR o ERROR)
if (str_starts_with($contenido, 'ERROR:')) { if (preg_match('/(ERR|ERROR|err|error):(-?\d+)/i', $contenido, $errorMatch)) {
$errorMessage = str_replace('ERROR:', '', $contenido); $errorCode = $errorMatch[2];
$errorCode = '-1'; // Buscar el error completo en la base de datos
if (preg_match('/^(\d+)\|/', $errorMessage, $codeMatch)) { $errorFromDb = Error::where('code', $errorCode)->first();
$errorCode = $codeMatch[1];
$errorMessage = substr($errorMessage, strlen($errorCode) + 1);
}
// Mensaje directo de REPUVE Nacional
return [ return [
'has_error' => true, 'has_error' => true,
'error_code' => $errorCode, '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(), 'timestamp' => now()->toDateTimeString(),
'niv' => $niv, 'niv' => $niv,
'repuve_response' => null, 'repuve_response' => $contenido,
]; ];
} }
@ -160,7 +158,8 @@ private function parseVehicleResponse(string $soapResponse, string $niv)
return [ return [
'has_error' => true, 'has_error' => true,
'error_code' => '108', '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(), 'timestamp' => now()->toDateTimeString(),
'niv' => $niv, 'niv' => $niv,
'repuve_response' => null, 'repuve_response' => null,
@ -282,7 +281,8 @@ public function inscribirVehiculo(array $datos)
return [ return [
'has_error' => true, 'has_error' => true,
'error_code' => '103', '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(), 'timestamp' => now()->toDateTimeString(),
'http_code' => $httpCode, 'http_code' => $httpCode,
'raw_response' => $response, 'raw_response' => $response,
@ -294,7 +294,8 @@ public function inscribirVehiculo(array $datos)
return [ return [
'has_error' => true, 'has_error' => true,
'error_code' => '-1', '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(), 'timestamp' => now()->toDateTimeString(),
'http_code' => $httpCode, 'http_code' => $httpCode,
'raw_response' => $response, 'raw_response' => $response,
@ -317,7 +318,8 @@ private function parsearRespuestaInscripcion(string $soapResponse)
return [ return [
'has_error' => true, 'has_error' => true,
'error_code' => '108', '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(), 'timestamp' => now()->toDateTimeString(),
'raw_response' => $soapResponse, 'raw_response' => $soapResponse,
'repuve_response' => null, 'repuve_response' => null,
@ -326,26 +328,41 @@ private function parsearRespuestaInscripcion(string $soapResponse)
$contenido = trim($matches[1]); $contenido = trim($matches[1]);
if (str_starts_with($contenido, 'ERROR:')) { // Buscar patrones de error: ERR:, ERROR:, err:, error:
$errorMessage = str_replace('ERROR:', '', $contenido); if (preg_match('/(ERR|ERROR|err|error):(-?\d+)/i', $contenido, $errorMatch)) {
$errorCode = $errorMatch[2];
$errorCode = '-1'; // Buscar el error completo en la base de datos
if (preg_match('/^(\d+)\|/', $errorMessage, $codeMatch)) { $errorFromDb = Error::where('code', $errorCode)->first();
$errorCode = $codeMatch[1];
$errorMessage = substr($errorMessage, strlen($errorCode) + 1); 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 [ return [
'has_error' => true, 'has_error' => true,
'error_code' => $errorCode, '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(), 'timestamp' => now()->toDateTimeString(),
'raw_response' => $soapResponse, '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 [ return [
'has_error' => false, 'has_error' => false,
@ -358,16 +375,20 @@ private function parsearRespuestaInscripcion(string $soapResponse)
'data' => $datos, '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,
],
];
} }
} }