feat: mejorar la asignación de tags a módulos y validaciones en el proceso
This commit is contained in:
parent
901957ff66
commit
ebc4f3c546
@ -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([
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user