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 [
'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,
],
];
}
}