withCount('tags')->orderBy('id', 'ASC'); if ($request->filled('lote')) { $packages->where('lot', 'LIKE', '%' . $request->lote . '%'); } if ($request->filled('caja')) { $packages->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->lot, 'box_number' => $request->box_number, 'starting_page' => $request->starting_page, 'ending_page' => $request->ending_page, ]); DB::commit(); return ApiResponse::CREATED->response([ 'message' => 'Paquete registrado exitosamente', 'package' => $package, 'expected_tags' => $package->ending_page - $package->starting_page + 1, 'actual_tags' => $package->tags()->count(), ]); } catch (QueryException $e) { DB::rollBack(); if ($e->getCode() == 23000 && str_contains($e->getMessage(), 'packages_lot_box_unique')) { return ApiResponse::BAD_REQUEST->response([ 'message' => "Ya existe un paquete con el lote '{$request->lot}' y caja nĂºmero '{$request->box_number}'.", ]); } return ApiResponse::INTERNAL_ERROR->response([ 'message' => 'Error al crear el paquete', 'error' => $e->getMessage(), ]); } 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(['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, 'box_number' => $package->box_number, 'starting_page' => $package->starting_page, 'ending_page' => $package->ending_page, '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->tags()->count() > 0) { return ApiResponse::BAD_REQUEST->response([ 'message' => 'No se puede eliminar el paquete porque tiene tags asociados.', 'tags_count' => $package->tags()->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(), ]); } } }