$request->input('size', 20), 'q' => $request->input('q') ?? $request->input('search'), 'category_id' => $request->input('category_id'), 'item_type' => $request->input('type') ?? $request->input('item_type'), 'active' => $request->input('is_active') ?? $request->input('active'), ]; return $this->service->index($params); }, __('message.fetched')); } /** * 단일 품목 조회 (동적 테이블 라우팅) * * GET /api/v1/items/{id}?item_type=FG&include_price=true&client_id=1&price_date=2025-01-10 * * @param string item_type 품목 유형 (필수 - 동적 테이블 라우팅) */ public function show(Request $request, int $id) { return ApiResponse::handle(function () use ($request, $id) { // item_type 필수 (동적 테이블 라우팅에 사용) $itemType = strtoupper($request->input('item_type', '')); $includePrice = filter_var($request->input('include_price', false), FILTER_VALIDATE_BOOLEAN); if ($includePrice) { $clientId = $request->input('client_id') ? (int) $request->input('client_id') : null; $priceDate = $request->input('price_date'); return $this->service->showWithPrice($id, $itemType, $clientId, $priceDate); } return $this->service->show($id, $itemType); }, __('message.fetched')); } /** * 품목 상세 조회 (동적 테이블 라우팅, code 기반, BOM 포함 옵션) * * GET /api/v1/items/code/{code}?item_type=FG&include_bom=true * * @param string item_type 품목 유형 (필수 - 동적 테이블 라우팅) */ public function showByCode(Request $request, string $code) { return ApiResponse::handle(function () use ($request, $code) { // item_type 필수 (동적 테이블 라우팅에 사용) $itemType = strtoupper($request->input('item_type', '')); $includeBom = filter_var($request->input('include_bom', false), FILTER_VALIDATE_BOOLEAN); return $this->service->showByCode($code, $itemType, $includeBom); }, __('message.item.fetched')); } /** * 품목 생성 * * POST /api/v1/items */ public function store(ItemStoreRequest $request) { return ApiResponse::handle(function () use ($request) { return $this->service->store($request->all()); }, __('message.item.created')); } /** * 품목 수정 * * PUT /api/v1/items/{id} */ public function update(int $id, ItemUpdateRequest $request) { return ApiResponse::handle(function () use ($id, $request) { return $this->service->update($id, $request->all()); }, __('message.item.updated')); } /** * 품목 삭제 (동적 테이블 라우팅, Soft Delete) * * DELETE /api/v1/items/{id}?item_type=FG * * @param string item_type 품목 유형 (필수 - 동적 테이블 라우팅) */ public function destroy(Request $request, int $id) { return ApiResponse::handle(function () use ($request, $id) { // item_type 필수 (동적 테이블 라우팅에 사용) $itemType = strtoupper($request->input('item_type', '')); $this->service->destroy($id, $itemType); return 'success'; }, __('message.item.deleted')); } /** * 품목 일괄 삭제 (동적 테이블 라우팅, Soft Delete) * * DELETE /api/v1/items/batch?item_type=FG * * @param string item_type 품목 유형 (필수 - 동적 테이블 라우팅) */ public function batchDestroy(ItemBatchDeleteRequest $request) { return ApiResponse::handle(function () use ($request) { $validated = $request->validated(); // item_type 필수 (동적 테이블 라우팅에 사용) $itemType = strtoupper($validated['item_type'] ?? ''); $deletedCount = $this->service->batchDestroy($validated['ids'], $itemType); return ['deleted_count' => $deletedCount]; }, __('message.item.batch_deleted')); } }