diff --git a/app/Http/Controllers/Repuve/InscriptionController.php b/app/Http/Controllers/Repuve/InscriptionController.php index b491fa0..dc945fc 100644 --- a/app/Http/Controllers/Repuve/InscriptionController.php +++ b/app/Http/Controllers/Repuve/InscriptionController.php @@ -95,7 +95,7 @@ public function vehicleInscription(VehicleStoreRequest $request) $ownerData = $this->padronEstatalService->extraerDatosPropietario($datosCompletosRaw); // Obtener NIV de los datos del vehículo para verificar robo - /* $niv = $vehicleData['niv']; + $niv = $vehicleData['niv']; // Verificar robo (API Repuve Nacional) $resultadoRobo = $this->checkIfStolen($niv, $placa); @@ -107,12 +107,12 @@ public function vehicleInscription(VehicleStoreRequest $request) 'folio' => $folio, 'tag_number' => $tagNumber, 'placa' => $placa, - 'niv'=> $niv, + 'niv' => $niv, 'stolen' => true, 'detalle_robo' => $resultadoRobo, 'message' => 'El vehículo reporta robo. No se puede continuar con la inscripción.', ]); - } */ + } // Crear propietario $owner = Owner::updateOrCreate( @@ -329,7 +329,10 @@ public function searchRecord(Request $request) // Log de acciones 'vehicle.vehicleTagLogs' => function ($q) { - $q->orderBy('created_at', 'DESC'); + $q->with([ + 'tag:id,folio,tag_number,status_id', + 'tag.status:id,code,name' + ])->orderBy('created_at', 'DESC'); }, ])->orderBy('id', 'ASC'); @@ -419,24 +422,6 @@ public function searchRecord(Request $request) // Vehículo 'vehicle' => $record->vehicle, - // Propietario - 'owner' => $record->vehicle->owner, - - // Tag y Paquete - 'tag' => $record->vehicle->tag ? [ - 'id' => $record->vehicle->tag->id, - 'folio' => $record->vehicle->tag->folio, - 'tag_number' => $record->vehicle->tag->tag_number, - 'status' => $record->vehicle->tag->status?->name, - - // Paquete - 'package' => $record->vehicle->tag->package ? [ - 'id' => $record->vehicle->tag->package->id, - 'lot' => $record->vehicle->tag->package->lot, - 'box_number' => $record->vehicle->tag->package->box_number, - ] : null, - ] : null, - // Archivos 'files' => $record->files->map(function ($file) { return [ diff --git a/app/Http/Controllers/Repuve/PackageController.php b/app/Http/Controllers/Repuve/PackageController.php index ab8d9c3..f261a43 100644 --- a/app/Http/Controllers/Repuve/PackageController.php +++ b/app/Http/Controllers/Repuve/PackageController.php @@ -9,7 +9,6 @@ use App\Models\CatalogTagStatus; use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Auth; -use Illuminate\Support\Facades\Log; use Illuminate\Http\Request; use Illuminate\Database\QueryException; use App\Models\Package; @@ -21,10 +20,6 @@ class PackageController extends Controller public function index(Request $request) { try { - Log::info('PackageController@index - Iniciando consulta de paquetes', [ - 'filters' => $request->all() - ]); - // Si NO hay filtro de caja, no cargar las relaciones de tags para optimizar $shouldLoadTags = $request->filled('caja') || $request->filled('box_number'); @@ -54,14 +49,8 @@ public function index(Request $request) $packages->where('box_number', 'LIKE', '%' . trim($cajaValue) . '%'); } - Log::info('PackageController@index - Ejecutando paginación'); $paginatedPackages = $packages->paginate(config('app.pagination')); - Log::info('PackageController@index - Paginación completada', [ - 'total' => $paginatedPackages->total(), - 'count' => $paginatedPackages->count() - ]); - // Validación si no hay resultados if ($paginatedPackages->isEmpty()) { return ApiResponse::NOT_FOUND->response([ @@ -123,20 +112,10 @@ public function index(Request $request) ]; }); } - - Log::info('PackageController@index - Retornando respuesta exitosa'); - return ApiResponse::OK->response([ 'Paquetes' => $paginatedPackages, ]); } catch (\Exception $e) { - Log::error('PackageController@index - Error capturado', [ - 'message' => $e->getMessage(), - 'file' => $e->getFile(), - 'line' => $e->getLine(), - 'trace' => $e->getTraceAsString() - ]); - return ApiResponse::INTERNAL_ERROR->response([ 'message' => 'Error al obtener los paquetes', 'error' => $e->getMessage(), diff --git a/app/Http/Controllers/Repuve/RecordController.php b/app/Http/Controllers/Repuve/RecordController.php index 8e449d5..5e04350 100644 --- a/app/Http/Controllers/Repuve/RecordController.php +++ b/app/Http/Controllers/Repuve/RecordController.php @@ -280,26 +280,52 @@ public function pdfCancelledTag(Tag $tag) } } - public function pdfSubstitutedTag(Tag $tag) + public function pdfSubstitutedTag($recordId) { try { // Validar que el tag tenga una sustitución registrada - $hasSubstitution = $tag->vehicleTagLogs() - ->where('action_type', 'sustitucion') - ->whereNotNull('cancellation_at') - ->exists(); + $record = Record::with([ + 'vehicle.vehicleTagLogs' => function ($query){ + $query->where('action_type', 'sustitucion') + ->whereNotNull('cancellation_at') + ->latest(); + } + ])->findOrFail($recordId); - if (!$hasSubstitution) { + $oldTagLog = $record->vehicle->vehicleTagLogs->first(); + + if (!$oldTagLog) { return ApiResponse::BAD_REQUEST->response([ - 'message' => 'Solo se puede generar PDF para tags sustituidos.', - 'tag_folio' => $tag->folio, + 'message' => 'No se encontró una sustitución registrada para este expediente.', + 'record' => $recordId, ]); } // Obtener datos de sustitución - $substitutionData = $this->substitutionData($tag); + $oldTag = Tag::with([ + 'vehicleTagLogs' => function($query){ + $query->where('action_type', 'sustitucion') + ->whereNotNull('cancellation_at') + ->with(['cancellationReason', 'cancelledBy', 'vehicle']) + ->latest(); + } + ])->findOrFail($oldTagLog->tag_id); - $pdf = Pdf::loadView('pdfs.tag_substituted', [ + $hasSubstitution = $oldTag->vehicleTagLogs() + ->where('action_type', 'sustitucion') + ->whereNotNull('cancellation_at') + ->exists(); + + if(!$hasSubstitution){ + return ApiResponse::BAD_REQUEST->response([ + 'message' => 'El tag no tiene sustitución registrada.', + 'tag' => $oldTag->folio, + ]); + } + + $substitutionData = $this->substitutionData($oldTag); + + $pdf = Pdf::loadView('pdfs.tag_sustitution', [ 'substitution' => $substitutionData, ]) ->setPaper('a4', 'portrait') @@ -309,10 +335,10 @@ public function pdfSubstitutedTag(Tag $tag) 'isRemoteEnabled' => true, ]); - return $pdf->stream('constancia_sustituida_' . $tag->folio . '.pdf'); + return $pdf->stream('constancia_sustituida_' . $oldTag->folio . '.pdf'); } catch (\Exception $e) { return ApiResponse::INTERNAL_ERROR->response([ - 'message' => 'Error al generar el PDF.', + 'message' => 'Error al generar el PDF del tag sustituido.', 'error' => $e->getMessage(), ]); } diff --git a/app/Http/Controllers/Repuve/TagsController.php b/app/Http/Controllers/Repuve/TagsController.php index b99ccb0..51b96e3 100644 --- a/app/Http/Controllers/Repuve/TagsController.php +++ b/app/Http/Controllers/Repuve/TagsController.php @@ -232,7 +232,7 @@ public function store(Request $request) } return ApiResponse::CREATED->response($response); - } catch (\Illuminate\Validation\ValidationException $e) { + } catch (ValidationException $e) { return ApiResponse::BAD_REQUEST->response([ 'message' => 'No se pudo crear el tag: Datos de validación incorrectos.', 'error' => 'validation_error', diff --git a/app/Http/Controllers/Repuve/UpdateController.php b/app/Http/Controllers/Repuve/UpdateController.php index 322a842..a7c1720 100644 --- a/app/Http/Controllers/Repuve/UpdateController.php +++ b/app/Http/Controllers/Repuve/UpdateController.php @@ -129,14 +129,14 @@ public function tagSubstitution(Request $request) } // Verificar robo del vehículo - /* $isStolen = $this->checkIfStolen($vehicle->niv); + $isStolen = $this->checkIfStolen($vehicle->niv); if ($isStolen) { return ApiResponse::FORBIDDEN->response([ 'message' => 'El vehículo reporta robo. No se puede continuar con la sustitución.', 'niv' => $vehicle->niv, ]); - } */ + } DB::beginTransaction(); @@ -376,7 +376,7 @@ public function vehicleUpdate(Request $request) ]); // REPUVE Nacional - /* ProcessRepuveResponse::dispatch($record->id, $datosCompletosRaw); */ + ProcessRepuveResponse::dispatch($record->id, $datosCompletosRaw); DB::commit(); @@ -473,7 +473,7 @@ public function vehicleUpdate(Request $request) ]); } - /* $isStolen = $this->checkIfStolen($vehicle->niv, $placa); + $isStolen = $this->checkIfStolen($vehicle->niv, $placa); if ($isStolen) { return ApiResponse::FORBIDDEN->response([ @@ -482,7 +482,7 @@ public function vehicleUpdate(Request $request) 'niv' => $vehicle->niv, 'stolen' => true, ]); - } */ + } $vehicleChangedFields = $this->detectVehicleChanges($vehicle, $vehicleDataEstatal); $ownerChangedFields = $this->detectOwnerChanges($vehicle->owner, $ownerDataEstatal); diff --git a/app/Jobs/ProcessRepuveResponse.php b/app/Jobs/ProcessRepuveResponse.php index 61bc516..f835570 100644 --- a/app/Jobs/ProcessRepuveResponse.php +++ b/app/Jobs/ProcessRepuveResponse.php @@ -40,7 +40,7 @@ public function handle(RepuveService $repuveService): void $apiResponse = $repuveService->inscribirVehiculo($this->responseData); - Log::info('📥 ProcessRepuveResponse: Respuesta recibida de REPUVE', [ + Log::info('ProcessRepuveResponse: Respuesta recibida de REPUVE', [ 'has_error' => $apiResponse['has_error'], 'error_code' => $apiResponse['error_code'] ?? null, 'timestamp' => $apiResponse['timestamp'] ?? null, @@ -61,7 +61,7 @@ public function handle(RepuveService $repuveService): void 'error_occurred_at' => now(), ]); - Log::warning('💾 ProcessRepuveResponse: Record actualizado con error', [ + Log::warning('ProcessRepuveResponse: Record actualizado con error', [ 'record_id' => $record->id, 'error_id' => $error?->id, ]); @@ -87,7 +87,7 @@ public function failed(\Throwable $exception): void $record = Record::find($this->recordId); if($record){ - Log::info('🔍 ProcessRepuveResponse: Buscando error genérico código -1'); + Log::info('ProcessRepuveResponse: Buscando error genérico código -1'); $error = Error::where('code', '-1')->first(); diff --git a/routes/api.php b/routes/api.php index d5ac4eb..0d983ef 100644 --- a/routes/api.php +++ b/routes/api.php @@ -43,7 +43,7 @@ Route::get('expediente/{id}/pdfConstancia', [RecordController::class, 'generatePdfConstancia']); Route::get('expediente/{id}/pdfImagenes', [RecordController::class, 'generatePdfImages']); Route::get('tags/{tag}/pdfTag-cancelado', [RecordController::class, 'pdfCancelledTag']); - Route::get('tags/{tag}/pdfTag-sustituido', [RecordController::class, 'pdfSubstitutedTag']); + Route::get('tags/{id}/pdfTag-sustituido', [RecordController::class, 'pdfSubstitutedTag']); Route::get('expediente/{id}/pdfFormulario', [RecordController::class, 'generatePdfForm']); Route::get('RecordErrors', [RecordController::class, 'errors']);