diff --git a/app/Http/Controllers/Repuve/ExcelController.php b/app/Http/Controllers/Repuve/ExcelController.php index aca9d54..7e7b5db 100644 --- a/app/Http/Controllers/Repuve/ExcelController.php +++ b/app/Http/Controllers/Repuve/ExcelController.php @@ -456,11 +456,6 @@ public function excelGeneral(Request $request) 'cancellationReason' ]) ->whereIn('action_type', ['inscripcion', 'sustitucion', 'cancelacion']) - ->when($moduleId, function ($query) use ($moduleId) { - $query->whereHas('vehicle.records', function ($q) use ($moduleId) { - $q->where('module_id', $moduleId); - }); - }) ->where(function ($query) use ($fechaInicio, $fechaFin) { $query->where(function ($q) use ($fechaInicio, $fechaFin) { $q->whereIn('action_type', ['inscripcion', 'sustitucion']) @@ -470,23 +465,31 @@ public function excelGeneral(Request $request) $q->where('action_type', 'cancelacion') ->whereBetween('cancellation_at', [$fechaInicio, $fechaFin]); }); - })->get(); + }) + // DESPUÉS: Aplicar filtro de módulo + ->when($moduleId, function ($query) use ($moduleId) { + $query->whereHas('vehicle.records', function ($q) use ($moduleId) { + $q->where('module_id', $moduleId); + }); + }) + ->get(); $logsT = TagCancellationLog::with([ 'tag.module', 'tag.vehicle', 'cancellationReason' - ])->when($moduleId, function ($query) use ($moduleId) { - $query->whereHas('tag', function ($q) use ($moduleId) { - $q->where('module_id', $moduleId); - }); - }) + ]) ->whereBetween('cancellation_at', [$fechaInicio, $fechaFin]) + ->when($moduleId, function ($query) use ($moduleId) { + $query->whereHas('tag', function ($q) use ($moduleId) { + $q->where('module_id', $moduleId); + }); + }) ->get(); if ($logs->isEmpty() && $logsT->isEmpty()) { return ApiResponse::NOT_FOUND->response([ - 'message' => 'No se encontraron constancias canceladas en el periodo especificado', + 'message' => 'No se encontraron registros en el periodo especificado', 'fecha_inicio' => $fechaInicio->format('Y-m-d'), 'fecha_fin' => $fechaFin->format('Y-m-d'), 'module_id' => $moduleId, @@ -665,10 +668,10 @@ private function prepareExcelDataGeneral($logs) $data = []; $no = 1; - foreach($logs as $log){ + foreach ($logs as $log) { $isVehicleTagLog = isset($log->action_type); - if($isVehicleTagLog){ + if ($isVehicleTagLog) { $vehicle = $log->vehicle; $tag = $log->tag; $actionType = strtoupper($log->action_type); @@ -676,10 +679,10 @@ private function prepareExcelDataGeneral($logs) $moduleName = $vehicle->records->first()?->module?->name ?? 'SIN MODULO ASIGNADO'; $fecha = $log->action_type == 'cancelacion' - ? $log->cancellation_at?->format('d/m/Y') - : $log->created_at->format('d/m/Y'); + ? $log->cancellation_at?->format('d/m/Y') + : $log->created_at->format('d/m/Y'); - $motivo = match($log->action_type){ + $motivo = match ($log->action_type) { 'inscripcion' => 'INSCRIPCIÓN', 'sustitucion' => 'SUSTITUCIÓN DE CONSTANCIA', 'cancelacion' => $log->cancellationReason?->name ?? 'N/A', diff --git a/app/Http/Controllers/Repuve/PackageController.php b/app/Http/Controllers/Repuve/PackageController.php index 086ba14..2d708e8 100644 --- a/app/Http/Controllers/Repuve/PackageController.php +++ b/app/Http/Controllers/Repuve/PackageController.php @@ -6,10 +6,12 @@ use App\Http\Controllers\Controller; use App\Http\Requests\Repuve\PackageStoreRequest; use App\Http\Requests\Repuve\PackageUpdateRequest; +use App\Models\CatalogTagStatus; use Illuminate\Support\Facades\DB; use Illuminate\Http\Request; use Illuminate\Database\QueryException; use App\Models\Package; +use App\Models\Tag; class PackageController extends Controller { @@ -50,13 +52,29 @@ public function store(PackageStoreRequest $request) 'ending_page' => $request->ending_page, ]); + // Obtener el status "available" para los tags + $statusAvailable = CatalogTagStatus::where('code', 'available')->first(); + + if (!$statusAvailable) { + throw new \Exception('No se encontró el status "available" para los tags'); + } + + // Crear los tags según el rango de páginas + for ($page = $request->starting_page; $page <= $request->ending_page; $page++) { + Tag::create([ + 'folio' => $page, + 'tag_number' => null, + 'package_id' => $package->id, + 'status_id' => $statusAvailable->id, + ]); + } + DB::commit(); return ApiResponse::CREATED->response([ - 'message' => 'Paquete registrado exitosamente', - 'package' => $package, - 'expected_tags' => $package->ending_page - $package->starting_page + 1, - 'actual_tags' => $package->tags()->count(), + 'message' => 'Paquete registrado exitosamente con sus tags', + 'package' => $package->load('tags'), + 'tags_created' => $package->tags()->count(), ]); } catch (QueryException $e) { DB::rollBack(); diff --git a/app/Http/Controllers/Repuve/UpdateController.php b/app/Http/Controllers/Repuve/UpdateController.php index b147f02..e8fd1e9 100644 --- a/app/Http/Controllers/Repuve/UpdateController.php +++ b/app/Http/Controllers/Repuve/UpdateController.php @@ -44,12 +44,14 @@ public function tagSubstitution(Request $request) $request->validate([ 'folio' => 'required|string|exists:records,folio', 'new_tag_folio' => 'required|string|exists:tags,folio', + 'new_tag_folio' => 'required|string', 'cancellation_reason_id' => 'nullable|exists:catalog_cancellation_reasons,id', 'cancellation_observations' => 'nullable|string|max:500', ]); $folio = $request->input('folio'); $newTagFolio = $request->input('new_tag_folio'); + $newTagNumber = $request->input('new_tag_number'); $cancellationReasonId = $request->input('cancellation_reason_id'); $cancellationObservations = $request->input('cancellation_observations'); @@ -106,6 +108,25 @@ public function tagSubstitution(Request $request) ]); } + if (!$newTag->tag_number) { + $existingTag = Tag::where('tag_number', $newTagNumber)->first(); + if ($existingTag && $existingTag->id !== $newTag->id) { + return ApiResponse::BAD_REQUEST->response([ + 'message' => 'El tag_number ya está asignado a otro folio.', + 'tag_number' => $newTagNumber, + 'folio_existente' => $existingTag->folio, + ]); + } + } elseif ($newTag->tag_number !== $newTagNumber) { + // Si el tag ya tiene un tag_number diferente + return ApiResponse::BAD_REQUEST->response([ + 'message' => 'El folio del nuevo TAG ya tiene un tag_number diferente asignado.', + 'new_tag_folio' => $newTagFolio, + 'tag_number_actual' => $newTag->tag_number, + 'tag_number_enviado' => $newTagNumber, + ]); + } + // Verificar robo del vehículo $isStolen = $this->checkIfStolen($vehicle->niv); @@ -125,6 +146,8 @@ public function tagSubstitution(Request $request) VehicleTagLog::create([ 'vehicle_id' => $vehicle->id, 'tag_id' => $oldTag->id, + 'new_tag_folio' => $newTagFolio, + 'new_tag_number' => $newTagNumber, 'action_type' => 'sustitucion', 'cancellation_reason_id' => $cancellationReasonId, 'cancellation_observations' => $cancellationObservations, @@ -138,6 +161,11 @@ public function tagSubstitution(Request $request) 'folio' => $newTagFolio ]); + if (!$newTag->tag_number) { + $newTag->tag_number = $newTagNumber; + $newTag->save(); + } + // Asignar el nuevo TAG al vehículo (usa el nuevo folio) $newTag->markAsAssigned($vehicle->id, $newTagFolio); @@ -145,6 +173,7 @@ public function tagSubstitution(Request $request) VehicleTagLog::create([ 'vehicle_id' => $vehicle->id, 'tag_id' => $newTag->id, + 'old_tag_folio' => $oldTag->folio, 'action_type' => 'sustitucion', 'performed_by' => Auth::id(), ]); @@ -170,7 +199,7 @@ public function tagSubstitution(Request $request) ], 'new_tag' => [ 'folio' => $newTag->folio, - 'tag_number' => $newTag->tag_number, + 'tag_number' => $newTagNumber, 'status' => 'assigned', ], 'performed_by' => Auth::user()->name, @@ -479,7 +508,7 @@ public function vehicleUpdate(VehicleUpdateRequest $request) } } - private function checkIfStolen(string $niv): bool + private function checkIfStolen(string $niv) { return $this->repuveService->verificarRobo($niv); } diff --git a/app/Http/Requests/Repuve/PackageUpdateRequest.php b/app/Http/Requests/Repuve/PackageUpdateRequest.php index bf539b2..f0f8d90 100644 --- a/app/Http/Requests/Repuve/PackageUpdateRequest.php +++ b/app/Http/Requests/Repuve/PackageUpdateRequest.php @@ -15,7 +15,7 @@ public function rules(): array { return [ 'lot' => ['required', 'string'], - 'box_number' => ['required', 'string'], + 'box_number' => ['required', 'integer'], 'starting_page' => ['required', 'integer', 'min:1'], 'ending_page' => ['required', 'integer', 'min:1', 'gte:starting_page'], ]; diff --git a/app/Services/RepuveService.php b/app/Services/RepuveService.php index 44fcb86..cc1b0ad 100644 --- a/app/Services/RepuveService.php +++ b/app/Services/RepuveService.php @@ -169,7 +169,12 @@ public function verificarRobo(?string $niv = null, ?string $placa = null): array try { $url = $this->baseUrl . $this->roboEndpoint; - $arg2 = ($niv ?? '') . '|' . ($placa ?? '') . str_repeat('|', 7); + $campo1 = $niv ?? ''; + $campo2 = ''; + $campo3 = $placa ?? ''; + $campo4_8 = str_repeat('|', 5); + + $arg2 = $campo1 . '|' . $campo2 . '|' . $campo3 . '|' . $campo4_8; $soapBody = <<