feat: mejorar la asignación de tags a módulos y validaciones en el proceso

This commit is contained in:
Juan Felipe Zapata Moreno 2025-12-09 19:21:49 -06:00
parent 901957ff66
commit ebc4f3c546

View File

@ -5,6 +5,7 @@
use App\Http\Controllers\Controller;
use App\Models\CatalogTagStatus;
use App\Models\Module;
use App\Models\Package;
use Illuminate\Http\Request;
use App\Models\Tag;
use Exception;
@ -12,6 +13,8 @@
use Notsoweb\ApiResponse\Enums\ApiResponse;
use Barryvdh\DomPDF\Facade\Pdf;
use Carbon\Carbon;
use Illuminate\Database\Eloquent\ModelNotFoundException;
use Illuminate\Validation\ValidationException;
class TagsController extends Controller
{
@ -81,9 +84,8 @@ public function store(Request $request)
if ($existingTagByFolio) {
return ApiResponse::BAD_REQUEST->response([
'message' => 'No se pudo crear el tag: El folio ya existe en el sistema.',
'error' => 'duplicate_folio',
'error' => 'folio duplicado',
'folio' => $validated['folio'],
'existing_tag_id' => $existingTagByFolio->id,
'existing_tag' => [
'id' => $existingTagByFolio->id,
'folio' => $existingTagByFolio->folio,
@ -385,36 +387,60 @@ public function tagStore(Request $request)
public function assignToModule(Request $request)
{
try {
// Validar parámetros de entrada
$request->validate([
'module_id' => 'required|exists:modules,id',
'module_id' => 'required|integer|exists:modules,id',
'package_id' => 'required|integer|exists:packages,id',
'cantidad' => 'required|integer|min:1',
'package_id' => 'nullable|integer|exists:packages,id',
]);
// Buscar el package
$package = Package::findOrFail($request->package_id);
// Obtener el status "disponible"
$statusAvailable = CatalogTagStatus::where('code', Tag::STATUS_AVAILABLE)->first();
if (!$statusAvailable) {
return ApiResponse::INTERNAL_ERROR->response([
'message' => 'No se encontró el status "disponible" en el catálogo.',
'error' => 'missing_status',
]);
}
DB::beginTransaction();
// Buscar tags disponibles (sin módulo asignado y sin vehículo)
$tags = Tag::whereNull('module_id')
// Buscar tags disponibles en el package específico
$tags = Tag::where('package_id', $package->id)
->where('status_id', $statusAvailable->id)
->whereNull('module_id')
->whereNull('vehicle_id')
->orderBy('id', 'ASC')
->orderBy('folio', 'ASC')
->limit($request->cantidad)
->get();
if ($tags->isEmpty()) {
DB::rollBack();
return ApiResponse::NOT_FOUND->response([
'message' => 'No se encontraron tags disponibles.',
'message' => 'No se encontraron tags disponibles en el paquete especificado.',
'package_id' => $package->id,
'lot' => $package->lot,
'box_number' => $package->box_number,
]);
}
if ($tags->count() < $request->cantidad) {
DB::rollBack();
return ApiResponse::BAD_REQUEST->response([
'message' => "Solo hay {$tags->count()} tags disponibles, pero solicitaste {$request->cantidad}.",
'message' => "Solo hay {$tags->count()} tags disponibles en este paquete, pero solicitaste {$request->cantidad}.",
'package_id' => $package->id,
'lot' => $package->lot,
'box_number' => $package->box_number,
'disponibles' => $tags->count(),
'solicitados' => $request->cantidad,
]);
}
// Asignar módulo a los tags
// Asignar módulo a los tags seleccionados
$tagIds = $tags->pluck('id')->toArray();
Tag::whereIn('id', $tagIds)->update(['module_id' => $request->module_id]);
@ -422,11 +448,24 @@ public function assignToModule(Request $request)
// Generar PDF de Vale de Entrega
$module = Module::with('users')->findOrFail($request->module_id);
$tagsAssigned = Tag::whereIn('id', $tagIds)->orderBy('folio')->get();
$tagsAssigned = Tag::whereIn('id', $tagIds)
->with(['package', 'status'])
->orderBy('folio', 'ASC')
->get();
$pdf = $this->generateValeEntregaPdf($module, $tagsAssigned);
return $pdf->download('vale-entrega-modulo-' . $module->id . '-' . date('YmdHis') . '.pdf');
} catch (ValidationException $e) {
return ApiResponse::BAD_REQUEST->response([
'message' => 'Error de validación.',
'errors' => $e->errors(),
]);
} catch (ModelNotFoundException $e) {
return ApiResponse::NOT_FOUND->response([
'message' => 'No se encontró el paquete especificado.',
'package_id' => $request->package_id ?? null,
]);
} catch (Exception $e) {
DB::rollback();
return ApiResponse::INTERNAL_ERROR->response([