withCount('boxes')->orderBy('id', 'ASC'); if ($request->filled('lote')) { $packages->where('lot', 'LIKE', '%' . $request->lote . '%'); } if ($request->filled('caja')) { $packages->whereHas('boxes', function ($q) use ($request) { $q->where('box_number', 'LIKE', '%' . $request->caja . '%'); }); } return ApiResponse::OK->response([ 'packages' => $packages->paginate(config('app.pagination')) ]); } catch (\Exception $e) { return ApiResponse::INTERNAL_ERROR->response([ 'message' => 'Error al obtener los paquetes', 'error' => $e->getMessage(), ]); } } public function store(PackageStoreRequest $request) { try { DB::beginTransaction(); $package = Package::create([ 'lot' => $request->input('lot'), 'total_boxes' => $request->input('total_boxes'), 'description' => $request->input('description'), ]); DB::commit(); return ApiResponse::CREATED->response([ 'message' => 'Paquete creado exitosamente', 'package' => [ 'id' => $package->id, 'lot' => $package->lot, 'total_boxes' => $package->total_boxes, 'description' => $package->description, 'created_at' => $package->created_at->format('Y-m-d H:i:s'), ], ]); } catch (\Exception $e) { DB::rollBack(); return ApiResponse::INTERNAL_ERROR->response([ 'message' => 'Error al crear el paquete', 'error' => $e->getMessage(), ]); } } public function show($id) { try { $package = Package::with([ 'boxes.tags' ])->findOrFail($id); return ApiResponse::OK->response([ 'package' => $package, ]); } catch (\Exception $e) { return ApiResponse::INTERNAL_ERROR->response([ 'message' => 'Error al obtener el paquete', 'error' => $e->getMessage(), ]); } } public function update(PackageUpdateRequest $request, $id) { try { $package = Package::findOrFail($id); DB::beginTransaction(); $package->update($request->validated()); DB::commit(); return ApiResponse::OK->response([ 'message' => 'Paquete actualizado exitosamente', 'package' => [ 'id' => $package->id, 'lot' => $package->lot, 'total_boxes' => $package->total_boxes, 'description' => $package->description, 'updated_at' => $package->updated_at->format('Y-m-d H:i:s'), ], ]); } catch (\Exception $e) { DB::rollBack(); return ApiResponse::INTERNAL_ERROR->response([ 'message' => 'Error al actualizar el paquete', 'error' => $e->getMessage(), ]); } } public function destroy($id) { try { DB::beginTransaction(); $package = Package::findOrFail($id); if ($package->boxes()->count() > 0) { return ApiResponse::BAD_REQUEST->response([ 'message' => 'No se puede eliminar el paquete porque tiene cajas asociadas.', 'boxes_count' => $package->boxes()->count(), ]); } $package->delete(); DB::commit(); return ApiResponse::OK->response([ 'message' => 'Paquete eliminado exitosamente.', ]); } catch (\Exception $e) { DB::rollBack(); return ApiResponse::INTERNAL_ERROR->response([ 'message' => 'Error al eliminar el paquete.', 'error' => $e->getMessage(), ]); } } }