when($params['item_sep'] ?? null, fn ($q, $v) => $q->where('item_sep', $v)) ->when($params['item_bending'] ?? null, fn ($q, $v) => $q->where('item_bending', $v)) ->when($params['material'] ?? null, fn ($q, $v) => $q->where('material', 'like', "%{$v}%")) ->when($params['model_UA'] ?? null, fn ($q, $v) => $q->where('model_UA', $v)) ->when($params['model_name'] ?? null, fn ($q, $v) => $q->where('model_name', $v)) ->when($params['legacy_bending_num'] ?? $params['legacy_bending_id'] ?? null, fn ($q, $v) => $q->where('legacy_bending_id', (int) $v)) ->when($params['search'] ?? null, fn ($q, $v) => $q->where( fn ($q2) => $q2 ->where('item_name', 'like', "%{$v}%") ->orWhere('code', 'like', "%{$v}%") ->orWhere('item_spec', 'like', "%{$v}%") ->orWhere('legacy_code', 'like', "%{$v}%") )) ->orderByDesc('id') ->paginate($params['size'] ?? 50); } public function filters(): array { return [ 'item_sep' => BendingItem::whereNotNull('item_sep')->distinct()->pluck('item_sep')->sort()->values(), 'item_bending' => BendingItem::whereNotNull('item_bending')->distinct()->pluck('item_bending')->sort()->values(), 'material' => BendingItem::whereNotNull('material')->distinct()->pluck('material')->sort()->values(), 'model_UA' => BendingItem::whereNotNull('model_UA')->distinct()->pluck('model_UA')->sort()->values(), 'model_name' => BendingItem::whereNotNull('model_name')->distinct()->pluck('model_name')->sort()->values(), ]; } public function find(int $id): BendingItem { return BendingItem::findOrFail($id); } public function create(array $data): BendingItem { return BendingItem::create([ 'tenant_id' => $this->tenantId(), 'code' => $data['code'], 'legacy_code' => $data['legacy_code'] ?? null, 'legacy_bending_id' => $data['legacy_bending_id'] ?? null, 'item_name' => $data['item_name'] ?? $data['name'] ?? '', 'item_sep' => $data['item_sep'] ?? null, 'item_bending' => $data['item_bending'] ?? null, 'material' => $data['material'] ?? null, 'item_spec' => $data['item_spec'] ?? null, 'model_name' => $data['model_name'] ?? null, 'model_UA' => $data['model_UA'] ?? null, 'rail_width' => $data['rail_width'] ?? null, 'exit_direction' => $data['exit_direction'] ?? null, 'box_width' => $data['box_width'] ?? null, 'box_height' => $data['box_height'] ?? null, 'front_bottom' => $data['front_bottom'] ?? $data['front_bottom_width'] ?? null, 'inspection_door' => $data['inspection_door'] ?? null, 'length_code' => $data['length_code'] ?? null, 'length_mm' => $data['length_mm'] ?? null, 'bending_data' => $data['bendingData'] ?? null, 'options' => $this->buildOptions($data), 'is_active' => true, 'created_by' => $this->apiUserId(), ]); } public function update(int $id, array $data): BendingItem { $item = BendingItem::findOrFail($id); $columns = [ 'code', 'item_name', 'item_sep', 'item_bending', 'material', 'item_spec', 'model_name', 'model_UA', 'rail_width', 'exit_direction', 'box_width', 'box_height', 'front_bottom', 'inspection_door', 'length_code', 'length_mm', ]; foreach ($columns as $col) { if (array_key_exists($col, $data)) { $item->{$col} = $data[$col]; } } if (array_key_exists('front_bottom_width', $data) && ! array_key_exists('front_bottom', $data)) { $item->front_bottom = $data['front_bottom_width']; } // 전개도 (JSON 직접 저장) if (array_key_exists('bendingData', $data)) { $item->bending_data = $data['bendingData']; } // 비정형 속성 foreach (self::OPTION_KEYS as $key) { if (array_key_exists($key, $data)) { $item->setOption($key, $data[$key]); } } $item->updated_by = $this->apiUserId(); $item->save(); return $item; } public function delete(int $id): bool { $item = BendingItem::findOrFail($id); $item->deleted_by = $this->apiUserId(); $item->save(); return $item->delete(); } private function buildOptions(array $data): ?array { $options = []; foreach (self::OPTION_KEYS as $key) { if (isset($data[$key])) { $options[$key] = $data[$key]; } } return empty($options) ? null : $options; } private const OPTION_KEYS = [ 'search_keyword', 'registration_date', 'author', 'memo', 'parent_num', 'modified_by', ]; }