repuve-backend-v1/app/Services/RepuveService.php
2025-11-21 12:33:50 -06:00

162 lines
4.8 KiB
PHP

<?php
namespace App\Services;
use Exception;
class RepuveService
{
private string $apiUrl;
private string $username;
private string $password;
public function __construct()
{
$this->apiUrl = config('services.repuve_federal.soap_url');
$this->username = config('services.repuve_federal.username');
$this->password = config('services.repuve_federal.password');
}
public function consultarPadron(string $niv)
{
$arg2 = $niv . '|||||||';
$soapBody = <<<XML
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:wsdl="http://consultaRpv.org/wsdl">
<soapenv:Header/>
<soapenv:Body>
<wsdl:doConsPadron>
<arg0>{$this->username}</arg0>
<arg1>{$this->password}</arg1>
<arg2>{$arg2}</arg2>
</wsdl:doConsPadron>
</soapenv:Body>
</soapenv:Envelope>
XML;
$ch = curl_init($this->apiUrl);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $soapBody);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Content-Type: text/xml; charset=utf-8',
'SOAPAction: "doConsPadron"',
'Content-Length: ' . strlen($soapBody),
]);
// Ejecutar la solicitud
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
$error = curl_error($ch);
curl_close($ch);
if ($error) {
throw new Exception("Error en la petición SOAP: {$error}");
}
if ($httpCode !== 200) {
throw new Exception("Error al consultar REPUVE: Código HTTP {$httpCode}");
}
return $this->parseVehicleResponse($response, $niv);
}
private function parseVehicleResponse(string $soapResponse, string $niv): array
{
preg_match('/<return>(.*?)<\/return>/s', $soapResponse, $matches);
if (!isset($matches[1])) {
throw new Exception("No se pudo extraer la respuesta del SOAP");
}
$contenido = trim($matches[1]);
// Verificar si hay error
if (str_starts_with($contenido, 'ERROR:')) {
$errorMessage = str_replace('ERROR:', '', $contenido);
return [
'has_error' => true,
'error_code' => 'REPUVE_ERROR',
'error_message' => $errorMessage,
'timestamp' => now()->toDateTimeString(),
'niv' => $niv,
'repuve_response' => null,
];
}
// Si empieza con OK:, parsear los datos
if (str_starts_with($contenido, 'OK:')) {
$datos = str_replace('OK:', '', $contenido);
$valores = explode('|', $datos);
$campos = [
'marca',
'submarca',
'tipo_vehiculo',
'fecha_expedicion',
'oficina',
'niv',
'placa',
'motor',
'modelo',
'color',
'version',
'entidad',
'marca_padron',
'submarca_padron',
'tipo_uso_padron',
'tipo_vehiculo_padron',
'estatus_registro',
'aduana',
'nombre_aduana',
'patente',
'pedimento',
'fecha_pedimento',
'clave_importador',
'folio_ci',
'identificador_ci',
'observaciones'
];
$jsonResponse = [];
foreach ($campos as $i => $campo) {
$jsonResponse[$campo] = $valores[$i] ?? null;
}
return [
'has_error' => false,
'error_code' => null,
'error_message' => null,
'timestamp' => now()->toDateTimeString(),
'niv' => $niv,
'repuve_response' => $jsonResponse,
];
}
throw new Exception("Formato de respuesta desconocido: {$contenido}");
}
/**
* Verifica si un vehículo está reportado como robado
*/
public function verificarRobo(string $niv): bool
{
try {
$resultado = $this->consultarPadron($niv);
if ($resultado['has_error']) {
return false;
}
$estatus = $resultado['repuve_response']['estatus_registro'] ?? null;
return in_array(strtoupper($estatus), ['ROBADO', 'ROBO']);
} catch (Exception $e) {
logger()->error("Error al verificar robo en REPUVE: " . $e->getMessage());
return false;
}
}
}