REFACTOR: Mejorar la lógica de filtrado en ExcelController y optimizar la creación de tags en PackageController

This commit is contained in:
Juan Felipe Zapata Moreno 2025-12-06 12:55:00 -06:00
parent 74dedc32df
commit c56e3b1435
5 changed files with 80 additions and 25 deletions

View File

@ -456,11 +456,6 @@ public function excelGeneral(Request $request)
'cancellationReason' 'cancellationReason'
]) ])
->whereIn('action_type', ['inscripcion', 'sustitucion', 'cancelacion']) ->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) { ->where(function ($query) use ($fechaInicio, $fechaFin) {
$query->where(function ($q) use ($fechaInicio, $fechaFin) { $query->where(function ($q) use ($fechaInicio, $fechaFin) {
$q->whereIn('action_type', ['inscripcion', 'sustitucion']) $q->whereIn('action_type', ['inscripcion', 'sustitucion'])
@ -470,23 +465,31 @@ public function excelGeneral(Request $request)
$q->where('action_type', 'cancelacion') $q->where('action_type', 'cancelacion')
->whereBetween('cancellation_at', [$fechaInicio, $fechaFin]); ->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([ $logsT = TagCancellationLog::with([
'tag.module', 'tag.module',
'tag.vehicle', 'tag.vehicle',
'cancellationReason' 'cancellationReason'
])->when($moduleId, function ($query) use ($moduleId) { ])
$query->whereHas('tag', function ($q) use ($moduleId) {
$q->where('module_id', $moduleId);
});
})
->whereBetween('cancellation_at', [$fechaInicio, $fechaFin]) ->whereBetween('cancellation_at', [$fechaInicio, $fechaFin])
->when($moduleId, function ($query) use ($moduleId) {
$query->whereHas('tag', function ($q) use ($moduleId) {
$q->where('module_id', $moduleId);
});
})
->get(); ->get();
if ($logs->isEmpty() && $logsT->isEmpty()) { if ($logs->isEmpty() && $logsT->isEmpty()) {
return ApiResponse::NOT_FOUND->response([ 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_inicio' => $fechaInicio->format('Y-m-d'),
'fecha_fin' => $fechaFin->format('Y-m-d'), 'fecha_fin' => $fechaFin->format('Y-m-d'),
'module_id' => $moduleId, 'module_id' => $moduleId,
@ -665,10 +668,10 @@ private function prepareExcelDataGeneral($logs)
$data = []; $data = [];
$no = 1; $no = 1;
foreach($logs as $log){ foreach ($logs as $log) {
$isVehicleTagLog = isset($log->action_type); $isVehicleTagLog = isset($log->action_type);
if($isVehicleTagLog){ if ($isVehicleTagLog) {
$vehicle = $log->vehicle; $vehicle = $log->vehicle;
$tag = $log->tag; $tag = $log->tag;
$actionType = strtoupper($log->action_type); $actionType = strtoupper($log->action_type);
@ -676,10 +679,10 @@ private function prepareExcelDataGeneral($logs)
$moduleName = $vehicle->records->first()?->module?->name ?? 'SIN MODULO ASIGNADO'; $moduleName = $vehicle->records->first()?->module?->name ?? 'SIN MODULO ASIGNADO';
$fecha = $log->action_type == 'cancelacion' $fecha = $log->action_type == 'cancelacion'
? $log->cancellation_at?->format('d/m/Y') ? $log->cancellation_at?->format('d/m/Y')
: $log->created_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', 'inscripcion' => 'INSCRIPCIÓN',
'sustitucion' => 'SUSTITUCIÓN DE CONSTANCIA', 'sustitucion' => 'SUSTITUCIÓN DE CONSTANCIA',
'cancelacion' => $log->cancellationReason?->name ?? 'N/A', 'cancelacion' => $log->cancellationReason?->name ?? 'N/A',

View File

@ -6,10 +6,12 @@
use App\Http\Controllers\Controller; use App\Http\Controllers\Controller;
use App\Http\Requests\Repuve\PackageStoreRequest; use App\Http\Requests\Repuve\PackageStoreRequest;
use App\Http\Requests\Repuve\PackageUpdateRequest; use App\Http\Requests\Repuve\PackageUpdateRequest;
use App\Models\CatalogTagStatus;
use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\DB;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Database\QueryException; use Illuminate\Database\QueryException;
use App\Models\Package; use App\Models\Package;
use App\Models\Tag;
class PackageController extends Controller class PackageController extends Controller
{ {
@ -50,13 +52,29 @@ public function store(PackageStoreRequest $request)
'ending_page' => $request->ending_page, '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(); DB::commit();
return ApiResponse::CREATED->response([ return ApiResponse::CREATED->response([
'message' => 'Paquete registrado exitosamente', 'message' => 'Paquete registrado exitosamente con sus tags',
'package' => $package, 'package' => $package->load('tags'),
'expected_tags' => $package->ending_page - $package->starting_page + 1, 'tags_created' => $package->tags()->count(),
'actual_tags' => $package->tags()->count(),
]); ]);
} catch (QueryException $e) { } catch (QueryException $e) {
DB::rollBack(); DB::rollBack();

View File

@ -44,12 +44,14 @@ public function tagSubstitution(Request $request)
$request->validate([ $request->validate([
'folio' => 'required|string|exists:records,folio', 'folio' => 'required|string|exists:records,folio',
'new_tag_folio' => 'required|string|exists:tags,folio', 'new_tag_folio' => 'required|string|exists:tags,folio',
'new_tag_folio' => 'required|string',
'cancellation_reason_id' => 'nullable|exists:catalog_cancellation_reasons,id', 'cancellation_reason_id' => 'nullable|exists:catalog_cancellation_reasons,id',
'cancellation_observations' => 'nullable|string|max:500', 'cancellation_observations' => 'nullable|string|max:500',
]); ]);
$folio = $request->input('folio'); $folio = $request->input('folio');
$newTagFolio = $request->input('new_tag_folio'); $newTagFolio = $request->input('new_tag_folio');
$newTagNumber = $request->input('new_tag_number');
$cancellationReasonId = $request->input('cancellation_reason_id'); $cancellationReasonId = $request->input('cancellation_reason_id');
$cancellationObservations = $request->input('cancellation_observations'); $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 // Verificar robo del vehículo
$isStolen = $this->checkIfStolen($vehicle->niv); $isStolen = $this->checkIfStolen($vehicle->niv);
@ -125,6 +146,8 @@ public function tagSubstitution(Request $request)
VehicleTagLog::create([ VehicleTagLog::create([
'vehicle_id' => $vehicle->id, 'vehicle_id' => $vehicle->id,
'tag_id' => $oldTag->id, 'tag_id' => $oldTag->id,
'new_tag_folio' => $newTagFolio,
'new_tag_number' => $newTagNumber,
'action_type' => 'sustitucion', 'action_type' => 'sustitucion',
'cancellation_reason_id' => $cancellationReasonId, 'cancellation_reason_id' => $cancellationReasonId,
'cancellation_observations' => $cancellationObservations, 'cancellation_observations' => $cancellationObservations,
@ -138,6 +161,11 @@ public function tagSubstitution(Request $request)
'folio' => $newTagFolio 'folio' => $newTagFolio
]); ]);
if (!$newTag->tag_number) {
$newTag->tag_number = $newTagNumber;
$newTag->save();
}
// Asignar el nuevo TAG al vehículo (usa el nuevo folio) // Asignar el nuevo TAG al vehículo (usa el nuevo folio)
$newTag->markAsAssigned($vehicle->id, $newTagFolio); $newTag->markAsAssigned($vehicle->id, $newTagFolio);
@ -145,6 +173,7 @@ public function tagSubstitution(Request $request)
VehicleTagLog::create([ VehicleTagLog::create([
'vehicle_id' => $vehicle->id, 'vehicle_id' => $vehicle->id,
'tag_id' => $newTag->id, 'tag_id' => $newTag->id,
'old_tag_folio' => $oldTag->folio,
'action_type' => 'sustitucion', 'action_type' => 'sustitucion',
'performed_by' => Auth::id(), 'performed_by' => Auth::id(),
]); ]);
@ -170,7 +199,7 @@ public function tagSubstitution(Request $request)
], ],
'new_tag' => [ 'new_tag' => [
'folio' => $newTag->folio, 'folio' => $newTag->folio,
'tag_number' => $newTag->tag_number, 'tag_number' => $newTagNumber,
'status' => 'assigned', 'status' => 'assigned',
], ],
'performed_by' => Auth::user()->name, '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); return $this->repuveService->verificarRobo($niv);
} }

View File

@ -15,7 +15,7 @@ public function rules(): array
{ {
return [ return [
'lot' => ['required', 'string'], 'lot' => ['required', 'string'],
'box_number' => ['required', 'string'], 'box_number' => ['required', 'integer'],
'starting_page' => ['required', 'integer', 'min:1'], 'starting_page' => ['required', 'integer', 'min:1'],
'ending_page' => ['required', 'integer', 'min:1', 'gte:starting_page'], 'ending_page' => ['required', 'integer', 'min:1', 'gte:starting_page'],
]; ];

View File

@ -169,7 +169,12 @@ public function verificarRobo(?string $niv = null, ?string $placa = null): array
try { try {
$url = $this->baseUrl . $this->roboEndpoint; $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 = <<<XML $soapBody = <<<XML
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:wsdl="http://consultaRpv.org/wsdl"> <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:wsdl="http://consultaRpv.org/wsdl">