fix: pdf tag sustituido ahora con id del record

This commit is contained in:
Juan Felipe Zapata Moreno 2025-12-11 14:39:48 -06:00
parent c4643c60d4
commit 0ec75bc0ba
7 changed files with 55 additions and 65 deletions

View File

@ -95,7 +95,7 @@ public function vehicleInscription(VehicleStoreRequest $request)
$ownerData = $this->padronEstatalService->extraerDatosPropietario($datosCompletosRaw); $ownerData = $this->padronEstatalService->extraerDatosPropietario($datosCompletosRaw);
// Obtener NIV de los datos del vehículo para verificar robo // Obtener NIV de los datos del vehículo para verificar robo
/* $niv = $vehicleData['niv']; $niv = $vehicleData['niv'];
// Verificar robo (API Repuve Nacional) // Verificar robo (API Repuve Nacional)
$resultadoRobo = $this->checkIfStolen($niv, $placa); $resultadoRobo = $this->checkIfStolen($niv, $placa);
@ -112,7 +112,7 @@ public function vehicleInscription(VehicleStoreRequest $request)
'detalle_robo' => $resultadoRobo, 'detalle_robo' => $resultadoRobo,
'message' => 'El vehículo reporta robo. No se puede continuar con la inscripción.', 'message' => 'El vehículo reporta robo. No se puede continuar con la inscripción.',
]); ]);
} */ }
// Crear propietario // Crear propietario
$owner = Owner::updateOrCreate( $owner = Owner::updateOrCreate(
@ -329,7 +329,10 @@ public function searchRecord(Request $request)
// Log de acciones // Log de acciones
'vehicle.vehicleTagLogs' => function ($q) { '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'); ])->orderBy('id', 'ASC');
@ -419,24 +422,6 @@ public function searchRecord(Request $request)
// Vehículo // Vehículo
'vehicle' => $record->vehicle, '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 // Archivos
'files' => $record->files->map(function ($file) { 'files' => $record->files->map(function ($file) {
return [ return [

View File

@ -9,7 +9,6 @@
use App\Models\CatalogTagStatus; use App\Models\CatalogTagStatus;
use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Log;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Database\QueryException; use Illuminate\Database\QueryException;
use App\Models\Package; use App\Models\Package;
@ -21,10 +20,6 @@ class PackageController extends Controller
public function index(Request $request) public function index(Request $request)
{ {
try { 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 // Si NO hay filtro de caja, no cargar las relaciones de tags para optimizar
$shouldLoadTags = $request->filled('caja') || $request->filled('box_number'); $shouldLoadTags = $request->filled('caja') || $request->filled('box_number');
@ -54,14 +49,8 @@ public function index(Request $request)
$packages->where('box_number', 'LIKE', '%' . trim($cajaValue) . '%'); $packages->where('box_number', 'LIKE', '%' . trim($cajaValue) . '%');
} }
Log::info('PackageController@index - Ejecutando paginación');
$paginatedPackages = $packages->paginate(config('app.pagination')); $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 // Validación si no hay resultados
if ($paginatedPackages->isEmpty()) { if ($paginatedPackages->isEmpty()) {
return ApiResponse::NOT_FOUND->response([ 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([ return ApiResponse::OK->response([
'Paquetes' => $paginatedPackages, 'Paquetes' => $paginatedPackages,
]); ]);
} catch (\Exception $e) { } 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([ return ApiResponse::INTERNAL_ERROR->response([
'message' => 'Error al obtener los paquetes', 'message' => 'Error al obtener los paquetes',
'error' => $e->getMessage(), 'error' => $e->getMessage(),

View File

@ -280,26 +280,52 @@ public function pdfCancelledTag(Tag $tag)
} }
} }
public function pdfSubstitutedTag(Tag $tag) public function pdfSubstitutedTag($recordId)
{ {
try { try {
// Validar que el tag tenga una sustitución registrada // Validar que el tag tenga una sustitución registrada
$hasSubstitution = $tag->vehicleTagLogs() $record = Record::with([
'vehicle.vehicleTagLogs' => function ($query){
$query->where('action_type', 'sustitucion')
->whereNotNull('cancellation_at')
->latest();
}
])->findOrFail($recordId);
$oldTagLog = $record->vehicle->vehicleTagLogs->first();
if (!$oldTagLog) {
return ApiResponse::BAD_REQUEST->response([
'message' => 'No se encontró una sustitución registrada para este expediente.',
'record' => $recordId,
]);
}
// Obtener datos de sustitución
$oldTag = Tag::with([
'vehicleTagLogs' => function($query){
$query->where('action_type', 'sustitucion')
->whereNotNull('cancellation_at')
->with(['cancellationReason', 'cancelledBy', 'vehicle'])
->latest();
}
])->findOrFail($oldTagLog->tag_id);
$hasSubstitution = $oldTag->vehicleTagLogs()
->where('action_type', 'sustitucion') ->where('action_type', 'sustitucion')
->whereNotNull('cancellation_at') ->whereNotNull('cancellation_at')
->exists(); ->exists();
if(!$hasSubstitution){ if(!$hasSubstitution){
return ApiResponse::BAD_REQUEST->response([ return ApiResponse::BAD_REQUEST->response([
'message' => 'Solo se puede generar PDF para tags sustituidos.', 'message' => 'El tag no tiene sustitución registrada.',
'tag_folio' => $tag->folio, 'tag' => $oldTag->folio,
]); ]);
} }
// Obtener datos de sustitución $substitutionData = $this->substitutionData($oldTag);
$substitutionData = $this->substitutionData($tag);
$pdf = Pdf::loadView('pdfs.tag_substituted', [ $pdf = Pdf::loadView('pdfs.tag_sustitution', [
'substitution' => $substitutionData, 'substitution' => $substitutionData,
]) ])
->setPaper('a4', 'portrait') ->setPaper('a4', 'portrait')
@ -309,10 +335,10 @@ public function pdfSubstitutedTag(Tag $tag)
'isRemoteEnabled' => true, 'isRemoteEnabled' => true,
]); ]);
return $pdf->stream('constancia_sustituida_' . $tag->folio . '.pdf'); return $pdf->stream('constancia_sustituida_' . $oldTag->folio . '.pdf');
} catch (\Exception $e) { } catch (\Exception $e) {
return ApiResponse::INTERNAL_ERROR->response([ return ApiResponse::INTERNAL_ERROR->response([
'message' => 'Error al generar el PDF.', 'message' => 'Error al generar el PDF del tag sustituido.',
'error' => $e->getMessage(), 'error' => $e->getMessage(),
]); ]);
} }

View File

@ -232,7 +232,7 @@ public function store(Request $request)
} }
return ApiResponse::CREATED->response($response); return ApiResponse::CREATED->response($response);
} catch (\Illuminate\Validation\ValidationException $e) { } catch (ValidationException $e) {
return ApiResponse::BAD_REQUEST->response([ return ApiResponse::BAD_REQUEST->response([
'message' => 'No se pudo crear el tag: Datos de validación incorrectos.', 'message' => 'No se pudo crear el tag: Datos de validación incorrectos.',
'error' => 'validation_error', 'error' => 'validation_error',

View File

@ -129,14 +129,14 @@ public function tagSubstitution(Request $request)
} }
// Verificar robo del vehículo // Verificar robo del vehículo
/* $isStolen = $this->checkIfStolen($vehicle->niv); $isStolen = $this->checkIfStolen($vehicle->niv);
if ($isStolen) { if ($isStolen) {
return ApiResponse::FORBIDDEN->response([ return ApiResponse::FORBIDDEN->response([
'message' => 'El vehículo reporta robo. No se puede continuar con la sustitución.', 'message' => 'El vehículo reporta robo. No se puede continuar con la sustitución.',
'niv' => $vehicle->niv, 'niv' => $vehicle->niv,
]); ]);
} */ }
DB::beginTransaction(); DB::beginTransaction();
@ -376,7 +376,7 @@ public function vehicleUpdate(Request $request)
]); ]);
// REPUVE Nacional // REPUVE Nacional
/* ProcessRepuveResponse::dispatch($record->id, $datosCompletosRaw); */ ProcessRepuveResponse::dispatch($record->id, $datosCompletosRaw);
DB::commit(); 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) { if ($isStolen) {
return ApiResponse::FORBIDDEN->response([ return ApiResponse::FORBIDDEN->response([
@ -482,7 +482,7 @@ public function vehicleUpdate(Request $request)
'niv' => $vehicle->niv, 'niv' => $vehicle->niv,
'stolen' => true, 'stolen' => true,
]); ]);
} */ }
$vehicleChangedFields = $this->detectVehicleChanges($vehicle, $vehicleDataEstatal); $vehicleChangedFields = $this->detectVehicleChanges($vehicle, $vehicleDataEstatal);
$ownerChangedFields = $this->detectOwnerChanges($vehicle->owner, $ownerDataEstatal); $ownerChangedFields = $this->detectOwnerChanges($vehicle->owner, $ownerDataEstatal);

View File

@ -40,7 +40,7 @@ public function handle(RepuveService $repuveService): void
$apiResponse = $repuveService->inscribirVehiculo($this->responseData); $apiResponse = $repuveService->inscribirVehiculo($this->responseData);
Log::info('📥 ProcessRepuveResponse: Respuesta recibida de REPUVE', [ Log::info('ProcessRepuveResponse: Respuesta recibida de REPUVE', [
'has_error' => $apiResponse['has_error'], 'has_error' => $apiResponse['has_error'],
'error_code' => $apiResponse['error_code'] ?? null, 'error_code' => $apiResponse['error_code'] ?? null,
'timestamp' => $apiResponse['timestamp'] ?? null, 'timestamp' => $apiResponse['timestamp'] ?? null,
@ -61,7 +61,7 @@ public function handle(RepuveService $repuveService): void
'error_occurred_at' => now(), 'error_occurred_at' => now(),
]); ]);
Log::warning('💾 ProcessRepuveResponse: Record actualizado con error', [ Log::warning('ProcessRepuveResponse: Record actualizado con error', [
'record_id' => $record->id, 'record_id' => $record->id,
'error_id' => $error?->id, 'error_id' => $error?->id,
]); ]);
@ -87,7 +87,7 @@ public function failed(\Throwable $exception): void
$record = Record::find($this->recordId); $record = Record::find($this->recordId);
if($record){ 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(); $error = Error::where('code', '-1')->first();

View File

@ -43,7 +43,7 @@
Route::get('expediente/{id}/pdfConstancia', [RecordController::class, 'generatePdfConstancia']); Route::get('expediente/{id}/pdfConstancia', [RecordController::class, 'generatePdfConstancia']);
Route::get('expediente/{id}/pdfImagenes', [RecordController::class, 'generatePdfImages']); Route::get('expediente/{id}/pdfImagenes', [RecordController::class, 'generatePdfImages']);
Route::get('tags/{tag}/pdfTag-cancelado', [RecordController::class, 'pdfCancelledTag']); 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('expediente/{id}/pdfFormulario', [RecordController::class, 'generatePdfForm']);
Route::get('RecordErrors', [RecordController::class, 'errors']); Route::get('RecordErrors', [RecordController::class, 'errors']);