only(['type', 'search', 'q', 'category_id']); $perPage = (int) ($request->input('size') ?? 20); return $this->service->getItems($filters, $perPage); }, __('message.fetched')); } /** * 단일 품목 조회 * * GET /api/v1/items/{id}?item_type=PRODUCT|MATERIAL&include_price=true&client_id=1&price_date=2025-01-10 */ public function show(Request $request, int $id) { return ApiResponse::handle(function () use ($request, $id) { $itemType = strtoupper($request->input('item_type', 'PRODUCT')); $includePrice = filter_var($request->input('include_price', false), FILTER_VALIDATE_BOOLEAN); $clientId = $request->input('client_id') ? (int) $request->input('client_id') : null; $priceDate = $request->input('price_date'); return $this->service->getItem($itemType, $id, $includePrice, $clientId, $priceDate); }, __('message.fetched')); } /** * 품목 상세 조회 (code 기반, BOM 포함 옵션) * * GET /api/v1/items/code/{code}?include_bom=true */ public function showByCode(Request $request, string $code) { return ApiResponse::handle(function () use ($request, $code) { $includeBom = filter_var($request->input('include_bom', false), FILTER_VALIDATE_BOOLEAN); return $this->service->getItemByCode($code, $includeBom); }, __('message.item.fetched')); } /** * 품목 생성 * * POST /api/v1/items */ public function store(ItemStoreRequest $request) { return ApiResponse::handle(function () use ($request) { return $this->service->createItem($request->validated()); }, __('message.item.created')); } /** * 품목 수정 * * PUT /api/v1/items/{code} */ public function update(string $code, ItemUpdateRequest $request) { return ApiResponse::handle(function () use ($code, $request) { return $this->service->updateItem($code, $request->validated()); }, __('message.item.updated')); } /** * 품목 삭제 (Soft Delete) * * DELETE /api/v1/items/{code} */ public function destroy(string $code) { return ApiResponse::handle(function () use ($code) { $this->service->deleteItem($code); return 'success'; }, __('message.item.deleted')); } }