diff --git a/app/Http/Controllers/Repuve/TagsController.php b/app/Http/Controllers/Repuve/TagsController.php index b2c4815..19a24ee 100644 --- a/app/Http/Controllers/Repuve/TagsController.php +++ b/app/Http/Controllers/Repuve/TagsController.php @@ -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([