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\Http\Controllers\Controller;
|
||||||
use App\Models\CatalogTagStatus;
|
use App\Models\CatalogTagStatus;
|
||||||
use App\Models\Module;
|
use App\Models\Module;
|
||||||
|
use App\Models\Package;
|
||||||
use Illuminate\Http\Request;
|
use Illuminate\Http\Request;
|
||||||
use App\Models\Tag;
|
use App\Models\Tag;
|
||||||
use Exception;
|
use Exception;
|
||||||
@ -12,6 +13,8 @@
|
|||||||
use Notsoweb\ApiResponse\Enums\ApiResponse;
|
use Notsoweb\ApiResponse\Enums\ApiResponse;
|
||||||
use Barryvdh\DomPDF\Facade\Pdf;
|
use Barryvdh\DomPDF\Facade\Pdf;
|
||||||
use Carbon\Carbon;
|
use Carbon\Carbon;
|
||||||
|
use Illuminate\Database\Eloquent\ModelNotFoundException;
|
||||||
|
use Illuminate\Validation\ValidationException;
|
||||||
|
|
||||||
class TagsController extends Controller
|
class TagsController extends Controller
|
||||||
{
|
{
|
||||||
@ -81,9 +84,8 @@ public function store(Request $request)
|
|||||||
if ($existingTagByFolio) {
|
if ($existingTagByFolio) {
|
||||||
return ApiResponse::BAD_REQUEST->response([
|
return ApiResponse::BAD_REQUEST->response([
|
||||||
'message' => 'No se pudo crear el tag: El folio ya existe en el sistema.',
|
'message' => 'No se pudo crear el tag: El folio ya existe en el sistema.',
|
||||||
'error' => 'duplicate_folio',
|
'error' => 'folio duplicado',
|
||||||
'folio' => $validated['folio'],
|
'folio' => $validated['folio'],
|
||||||
'existing_tag_id' => $existingTagByFolio->id,
|
|
||||||
'existing_tag' => [
|
'existing_tag' => [
|
||||||
'id' => $existingTagByFolio->id,
|
'id' => $existingTagByFolio->id,
|
||||||
'folio' => $existingTagByFolio->folio,
|
'folio' => $existingTagByFolio->folio,
|
||||||
@ -385,36 +387,60 @@ public function tagStore(Request $request)
|
|||||||
public function assignToModule(Request $request)
|
public function assignToModule(Request $request)
|
||||||
{
|
{
|
||||||
try {
|
try {
|
||||||
|
// Validar parámetros de entrada
|
||||||
$request->validate([
|
$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',
|
'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();
|
DB::beginTransaction();
|
||||||
|
|
||||||
// Buscar tags disponibles (sin módulo asignado y sin vehículo)
|
// Buscar tags disponibles en el package específico
|
||||||
$tags = Tag::whereNull('module_id')
|
$tags = Tag::where('package_id', $package->id)
|
||||||
|
->where('status_id', $statusAvailable->id)
|
||||||
|
->whereNull('module_id')
|
||||||
->whereNull('vehicle_id')
|
->whereNull('vehicle_id')
|
||||||
->orderBy('id', 'ASC')
|
->orderBy('folio', 'ASC')
|
||||||
->limit($request->cantidad)
|
->limit($request->cantidad)
|
||||||
->get();
|
->get();
|
||||||
|
|
||||||
if ($tags->isEmpty()) {
|
if ($tags->isEmpty()) {
|
||||||
|
DB::rollBack();
|
||||||
return ApiResponse::NOT_FOUND->response([
|
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) {
|
if ($tags->count() < $request->cantidad) {
|
||||||
|
DB::rollBack();
|
||||||
return ApiResponse::BAD_REQUEST->response([
|
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(),
|
'disponibles' => $tags->count(),
|
||||||
'solicitados' => $request->cantidad,
|
'solicitados' => $request->cantidad,
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Asignar módulo a los tags
|
// Asignar módulo a los tags seleccionados
|
||||||
$tagIds = $tags->pluck('id')->toArray();
|
$tagIds = $tags->pluck('id')->toArray();
|
||||||
Tag::whereIn('id', $tagIds)->update(['module_id' => $request->module_id]);
|
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
|
// Generar PDF de Vale de Entrega
|
||||||
$module = Module::with('users')->findOrFail($request->module_id);
|
$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);
|
$pdf = $this->generateValeEntregaPdf($module, $tagsAssigned);
|
||||||
|
|
||||||
return $pdf->download('vale-entrega-modulo-' . $module->id . '-' . date('YmdHis') . '.pdf');
|
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) {
|
} catch (Exception $e) {
|
||||||
DB::rollback();
|
DB::rollback();
|
||||||
return ApiResponse::INTERNAL_ERROR->response([
|
return ApiResponse::INTERNAL_ERROR->response([
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user