withCount('tags')->orderBy('id', 'ASC'); if ($request->filled('package')) { $boxes->where('package_id', $request->input('package')); } if ($request->filled('box_number')) { $boxes->where('box_number', 'LIKE', '%' . $request->box_number . '%'); } if ($request->filled('lote')) { $boxes->whereHas('package', function ($query) use ($request) { $query->where('lot', 'LIKE', '%' . $request->lot . '%'); }); } return ApiResponse::OK->response([ 'boxes' => $boxes->paginate(config('app.pagination')) ]); } catch (\Exception $e) { return ApiResponse::INTERNAL_ERROR->response([ 'message' => 'Error al obtener las cajas', 'error' => $e->getMessage(), ]); } } public function store(BoxStoreRequest $request) { try { DB::beginTransaction(); $box = Box::create([ 'box_number' => $request->input('box_number'), 'package_id' => $request->input('package_id'), 'starting_page' => $request->input('starting_page'), 'ending_page' => $request->input('ending_page'), ]); $package = Package::find($request->input('package_id')); if ($package) { $package->increment('total_boxes'); } DB::commit(); return ApiResponse::CREATED->response([ 'message' => 'Caja creada exitosamente', 'box' => $box, ]); } catch (\Exception $e) { return ApiResponse::INTERNAL_ERROR->response([ 'message' => 'Error al crear la caja', 'error' => $e->getMessage(), ]); } } public function show($id) { try { $box = Box::with(['package:id,lot,description,total_boxes', 'tags' => function ($query) { $query->with(['status:id,name', 'module:id,name']) ->orderBy('folio', 'ASC'); }])->withCount('tags')->findOrFail($id); return ApiResponse::OK->response([ 'box' => $box ]); } catch (\Exception $e) { return ApiResponse::INTERNAL_ERROR->response([ 'message' => 'Error al obtener la caja', 'error' => $e->getMessage(), ]); } } public function update(BoxUpdateRequest $request, $id) { try { $box = Box::findOrFail($id); DB::beginTransaction(); $oldPackageId = $box->package_id; $newPackageId = $request->input('package_id'); $box->update($request->validated()); if ($oldPackageId != $newPackageId) { Package::find($oldPackageId)?->decrement('total_boxes'); Package::find($newPackageId)?->increment('total_boxes'); } DB::commit(); return ApiResponse::OK->response([ 'message' => 'Caja actualizada exitosamente', 'box' => $box, ]); } catch (\Exception $e) { return ApiResponse::INTERNAL_ERROR->response([ 'message' => 'Error al actualizar la caja', 'error' => $e->getMessage(), ]); } } public function destroy($id) { try { DB::beginTransaction(); $box = Box::findOrFail($id); // Verificar si tiene tags antes de eliminar if ($box->tags()->count() > 0) { return ApiResponse::BAD_REQUEST->response([ 'message' => 'No se puede eliminar la caja porque tiene tags asociados.', 'tags_count' => $box->tags()->count(), ]); } $packageId = $box->package_id; $box->delete(); // Decrementar el contador de cajas del paquete Package::find($packageId)?->decrement('total_boxes'); DB::commit(); return ApiResponse::OK->response([ 'message' => 'Caja eliminada exitosamente.', ]); } catch (\Exception $e) { DB::rollBack(); return ApiResponse::INTERNAL_ERROR->response([ 'message' => 'Error al eliminar la caja.', 'error' => $e->getMessage(), ]); } } }