Files
sam-react-prod/claudedocs/item-master/[ANALYSIS-2025-11-26] item-master-notes.md
byeongcheolryu 65a8510c0b fix: 품목기준관리 실시간 동기화 수정
- BOM 항목 추가/수정/삭제 시 섹션탭 즉시 반영
- 섹션 복제 시 UI 즉시 업데이트 (null vs undefined 이슈 해결)
- 항목 수정 기능 추가 (useTemplateManagement)
- 실시간 동기화 문서 추가

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-27 22:19:50 +09:00

55 KiB

<?php namespace App\Swagger\v1; /** * @OA\Tag(name="ItemMaster", description="품목기준관리 API") * * ======================================== * 모델 스키마 * ======================================== * * @OA\Schema( * schema="ItemPage", * type="object", * * @OA\Property(property="id", type="integer", example=1), * @OA\Property(property="tenant_id", type="integer", example=1), * @OA\Property(property="page_name", type="string", example="기본 정보"), * @OA\Property(property="item_type", type="string", enum={"FG","PT","SM","RM","CS"}, example="FG"), * @OA\Property(property="absolute_path", type="string", nullable=true, example="/items/fg/basic"), * @OA\Property(property="is_active", type="boolean", example=true), * @OA\Property(property="created_at", type="string", example="2025-11-20 10:00:00"), * @OA\Property(property="updated_at", type="string", example="2025-11-20 10:00:00"), * @OA\Property( * property="sections", * type="array", * * @OA\Items(ref="#/components/schemas/ItemSection") * ) * ) * * @OA\Schema( * schema="ItemSection", * type="object", * * @OA\Property(property="id", type="integer", example=1), * @OA\Property(property="tenant_id", type="integer", example=1), * @OA\Property(property="group_id", type="integer", nullable=true, example=1), * @OA\Property(property="page_id", type="integer", nullable=true, example=1), * @OA\Property(property="title", type="string", example="제품 상세"), * @OA\Property(property="type", type="string", enum={"fields","bom"}, example="fields"), * @OA\Property(property="order_no", type="integer", example=0), * @OA\Property(property="is_template", type="boolean", example=false, description="템플릿 여부"), * @OA\Property(property="is_default", type="boolean", example=false, description="기본 템플릿 여부"), * @OA\Property(property="description", type="string", nullable=true, example="섹션 설명"), * @OA\Property(property="created_at", type="string", example="2025-11-20 10:00:00"), * @OA\Property(property="updated_at", type="string", example="2025-11-20 10:00:00"), * @OA\Property( * property="fields", * type="array", * * @OA\Items(ref="#/components/schemas/ItemField") * ), * * @OA\Property( * property="bomItems", * type="array", * * @OA\Items(ref="#/components/schemas/ItemBomItem") * ) * ) * * @OA\Schema( * schema="ItemField", * type="object", * * @OA\Property(property="id", type="integer", example=1), * @OA\Property(property="tenant_id", type="integer", example=1), * @OA\Property(property="section_id", type="integer", example=1), * @OA\Property(property="field_name", type="string", example="제품명"), * @OA\Property(property="field_type", type="string", enum={"textbox","number","dropdown","checkbox","date","textarea"}, example="textbox"), * @OA\Property(property="order_no", type="integer", example=0), * @OA\Property(property="is_required", type="boolean", example=true), * @OA\Property(property="default_value", type="string", nullable=true, example=null), * @OA\Property(property="placeholder", type="string", nullable=true, example="제품명을 입력하세요"), * @OA\Property(property="display_condition", type="object", nullable=true, example=null), * @OA\Property(property="validation_rules", type="object", nullable=true, example=null), * @OA\Property(property="options", type="object", nullable=true, example=null), * @OA\Property(property="properties", type="object", nullable=true, example=null), * @OA\Property(property="created_at", type="string", example="2025-11-20 10:00:00"), * @OA\Property(property="updated_at", type="string", example="2025-11-20 10:00:00") * ) * * @OA\Schema( * schema="ItemBomItem", * type="object", * * @OA\Property(property="id", type="integer", example=1), * @OA\Property(property="tenant_id", type="integer", example=1), * @OA\Property(property="section_id", type="integer", example=1), * @OA\Property(property="item_code", type="string", nullable=true, example="ITEM001"), * @OA\Property(property="item_name", type="string", example="부품 A"), * @OA\Property(property="quantity", type="number", format="float", example=1.5), * @OA\Property(property="unit", type="string", nullable=true, example="EA"), * @OA\Property(property="unit_price", type="number", format="float", nullable=true, example=10000), * @OA\Property(property="total_price", type="number", format="float", nullable=true, example=15000), * @OA\Property(property="spec", type="string", nullable=true, example="규격 정보"), * @OA\Property(property="note", type="string", nullable=true, example="비고"), * @OA\Property(property="created_at", type="string", example="2025-11-20 10:00:00"), * @OA\Property(property="updated_at", type="string", example="2025-11-20 10:00:00") * ) * * @OA\Schema( * schema="SectionTemplate", * type="object", * * @OA\Property(property="id", type="integer", example=1), * @OA\Property(property="tenant_id", type="integer", example=1), * @OA\Property(property="title", type="string", example="기본 템플릿"), * @OA\Property(property="type", type="string", enum={"fields","bom"}, example="fields"), * @OA\Property(property="description", type="string", nullable=true, example="설명"), * @OA\Property(property="is_default", type="boolean", example=false), * @OA\Property(property="created_at", type="string", example="2025-11-20 10:00:00"), * @OA\Property(property="updated_at", type="string", example="2025-11-20 10:00:00") * ) * * @OA\Schema( * schema="ItemMasterField", * type="object", * * @OA\Property(property="id", type="integer", example=1), * @OA\Property(property="tenant_id", type="integer", example=1), * @OA\Property(property="field_name", type="string", example="제품명"), * @OA\Property(property="field_type", type="string", enum={"textbox","number","dropdown","checkbox","date","textarea"}, example="textbox"), * @OA\Property(property="category", type="string", nullable=true, example="basic"), * @OA\Property(property="description", type="string", nullable=true, example="설명"), * @OA\Property(property="is_common", type="boolean", example=true), * @OA\Property(property="default_value", type="string", nullable=true, example=null), * @OA\Property(property="options", type="object", nullable=true, example=null), * @OA\Property(property="validation_rules", type="object", nullable=true, example=null), * @OA\Property(property="properties", type="object", nullable=true, example=null), * @OA\Property(property="created_at", type="string", example="2025-11-20 10:00:00"), * @OA\Property(property="updated_at", type="string", example="2025-11-20 10:00:00") * ) * * @OA\Schema( * schema="CustomTab", * type="object", * * @OA\Property(property="id", type="integer", example=1), * @OA\Property(property="tenant_id", type="integer", example=1), * @OA\Property(property="label", type="string", example="커스텀 탭"), * @OA\Property(property="icon", type="string", nullable=true, example="icon-name"), * @OA\Property(property="is_default", type="boolean", example=false), * @OA\Property(property="order_no", type="integer", example=0), * @OA\Property(property="created_at", type="string", example="2025-11-20 10:00:00"), * @OA\Property(property="updated_at", type="string", example="2025-11-20 10:00:00"), * @OA\Property(property="columnSetting", type="object", nullable=true) * ) * * @OA\Schema( * schema="UnitOption", * type="object", * * @OA\Property(property="id", type="integer", example=1), * @OA\Property(property="tenant_id", type="integer", example=1), * @OA\Property(property="label", type="string", example="개"), * @OA\Property(property="value", type="string", example="EA"), * @OA\Property(property="created_at", type="string", example="2025-11-20 10:00:00"), * @OA\Property(property="updated_at", type="string", example="2025-11-20 10:00:00") * ) * * ======================================== * Request 스키마 * ======================================== * * @OA\Schema( * schema="ItemPageStoreRequest", * type="object", * required={"page_name","item_type"}, * * @OA\Property(property="page_name", type="string", maxLength=255, example="기본 정보"), * @OA\Property(property="item_type", type="string", enum={"FG","PT","SM","RM","CS"}, example="FG"), * @OA\Property(property="absolute_path", type="string", nullable=true, maxLength=500, example="/items/fg/basic") * ) * * @OA\Schema( * schema="ItemPageUpdateRequest", * type="object", * * @OA\Property(property="page_name", type="string", maxLength=255, example="기본 정보"), * @OA\Property(property="absolute_path", type="string", nullable=true, maxLength=500, example="/items/fg/basic") * ) * * @OA\Schema( * schema="ItemSectionStoreRequest", * type="object", * required={"title","type"}, * * @OA\Property(property="title", type="string", maxLength=255, example="제품 상세"), * @OA\Property(property="type", type="string", enum={"fields","bom"}, example="fields") * ) * * @OA\Schema( * schema="IndependentSectionStoreRequest", * type="object", * required={"title","type"}, * * @OA\Property(property="group_id", type="integer", nullable=true, example=1), * @OA\Property(property="title", type="string", maxLength=255, example="독립 섹션"), * @OA\Property(property="type", type="string", enum={"fields","bom"}, example="fields"), * @OA\Property(property="is_template", type="boolean", example=false), * @OA\Property(property="is_default", type="boolean", example=false), * @OA\Property(property="description", type="string", nullable=true, example="섹션 설명") * ) * * @OA\Schema( * schema="IndependentFieldStoreRequest", * type="object", * required={"field_name","field_type"}, * * @OA\Property(property="group_id", type="integer", nullable=true, example=1), * @OA\Property(property="field_name", type="string", maxLength=255, example="제품명"), * @OA\Property(property="field_type", type="string", enum={"textbox","number","dropdown","checkbox","date","textarea"}, example="textbox"), * @OA\Property(property="is_required", type="boolean", example=false), * @OA\Property(property="default_value", type="string", nullable=true, example=null), * @OA\Property(property="placeholder", type="string", nullable=true, maxLength=255, example="입력하세요"), * @OA\Property(property="display_condition", type="object", nullable=true, example=null), * @OA\Property(property="validation_rules", type="object", nullable=true, example=null), * @OA\Property(property="options", type="object", nullable=true, example=null), * @OA\Property(property="properties", type="object", nullable=true, example=null) * ) * * @OA\Schema( * schema="IndependentBomItemStoreRequest", * type="object", * required={"item_name"}, * * @OA\Property(property="group_id", type="integer", nullable=true, example=1), * @OA\Property(property="item_code", type="string", nullable=true, maxLength=100, example="ITEM001"), * @OA\Property(property="item_name", type="string", maxLength=255, example="부품 A"), * @OA\Property(property="quantity", type="number", format="float", example=1), * @OA\Property(property="unit", type="string", nullable=true, maxLength=50, example="EA"), * @OA\Property(property="unit_price", type="number", format="float", nullable=true, example=10000), * @OA\Property(property="total_price", type="number", format="float", nullable=true, example=10000), * @OA\Property(property="spec", type="string", nullable=true, example="규격"), * @OA\Property(property="note", type="string", nullable=true, example="비고") * ) * * @OA\Schema( * schema="SectionUsageResponse", * type="object", * * @OA\Property(property="section_id", type="integer", example=1), * @OA\Property(property="direct_page", type="object", nullable=true), * @OA\Property(property="linked_pages", type="array", @OA\Items(type="object")), * @OA\Property(property="total_usage_count", type="integer", example=2) * ) * * @OA\Schema( * schema="FieldUsageResponse", * type="object", * * @OA\Property(property="field_id", type="integer", example=1), * @OA\Property(property="direct_section", type="object", nullable=true), * @OA\Property(property="linked_sections", type="array", @OA\Items(type="object")), * @OA\Property(property="linked_pages", type="array", @OA\Items(type="object")), * @OA\Property(property="total_usage_count", type="integer", example=3) * ) * * @OA\Schema( * schema="ItemSectionUpdateRequest", * type="object", * * @OA\Property(property="title", type="string", maxLength=255, example="제품 상세") * ) * * @OA\Schema( * schema="ItemFieldStoreRequest", * type="object", * required={"field_name","field_type"}, * * @OA\Property(property="field_name", type="string", maxLength=255, example="제품명"), * @OA\Property(property="field_type", type="string", enum={"textbox","number","dropdown","checkbox","date","textarea"}, example="textbox"), * @OA\Property(property="is_required", type="boolean", example=true), * @OA\Property(property="default_value", type="string", nullable=true, example=null), * @OA\Property(property="placeholder", type="string", nullable=true, maxLength=255, example="제품명을 입력하세요"), * @OA\Property(property="display_condition", type="object", nullable=true, example=null), * @OA\Property(property="validation_rules", type="object", nullable=true, example=null), * @OA\Property(property="options", type="object", nullable=true, example=null), * @OA\Property(property="properties", type="object", nullable=true, example=null) * ) * * @OA\Schema( * schema="ItemFieldUpdateRequest", * type="object", * * @OA\Property(property="field_name", type="string", maxLength=255, example="제품명"), * @OA\Property(property="field_type", type="string", enum={"textbox","number","dropdown","checkbox","date","textarea"}, example="textbox"), * @OA\Property(property="is_required", type="boolean", example=true), * @OA\Property(property="default_value", type="string", nullable=true, example=null), * @OA\Property(property="placeholder", type="string", nullable=true, maxLength=255, example="제품명을 입력하세요"), * @OA\Property(property="display_condition", type="object", nullable=true, example=null), * @OA\Property(property="validation_rules", type="object", nullable=true, example=null), * @OA\Property(property="options", type="object", nullable=true, example=null), * @OA\Property(property="properties", type="object", nullable=true, example=null) * ) * * @OA\Schema( * schema="ItemBomItemStoreRequest", * type="object", * required={"item_name"}, * * @OA\Property(property="item_code", type="string", nullable=true, maxLength=100, example="ITEM001"), * @OA\Property(property="item_name", type="string", maxLength=255, example="부품 A"), * @OA\Property(property="quantity", type="number", format="float", example=1.5), * @OA\Property(property="unit", type="string", nullable=true, maxLength=50, example="EA"), * @OA\Property(property="unit_price", type="number", format="float", nullable=true, example=10000), * @OA\Property(property="total_price", type="number", format="float", nullable=true, example=15000), * @OA\Property(property="spec", type="string", nullable=true, example="규격 정보"), * @OA\Property(property="note", type="string", nullable=true, example="비고") * ) * * @OA\Schema( * schema="ItemBomItemUpdateRequest", * type="object", * * @OA\Property(property="item_code", type="string", nullable=true, maxLength=100, example="ITEM001"), * @OA\Property(property="item_name", type="string", maxLength=255, example="부품 A"), * @OA\Property(property="quantity", type="number", format="float", example=1.5), * @OA\Property(property="unit", type="string", nullable=true, maxLength=50, example="EA"), * @OA\Property(property="unit_price", type="number", format="float", nullable=true, example=10000), * @OA\Property(property="total_price", type="number", format="float", nullable=true, example=15000), * @OA\Property(property="spec", type="string", nullable=true, example="규격 정보"), * @OA\Property(property="note", type="string", nullable=true, example="비고") * ) * * @OA\Schema( * schema="SectionTemplateStoreRequest", * type="object", * required={"title","type"}, * * @OA\Property(property="title", type="string", maxLength=255, example="기본 템플릿"), * @OA\Property(property="type", type="string", enum={"fields","bom"}, example="fields"), * @OA\Property(property="description", type="string", nullable=true, example="설명"), * @OA\Property(property="is_default", type="boolean", example=false) * ) * * @OA\Schema( * schema="SectionTemplateUpdateRequest", * type="object", * * @OA\Property(property="title", type="string", maxLength=255, example="기본 템플릿"), * @OA\Property(property="type", type="string", enum={"fields","bom"}, example="fields"), * @OA\Property(property="description", type="string", nullable=true, example="설명"), * @OA\Property(property="is_default", type="boolean", example=false) * ) * * @OA\Schema( * schema="ItemMasterFieldStoreRequest", * type="object", * required={"field_name","field_type"}, * * @OA\Property(property="field_name", type="string", maxLength=255, example="제품명"), * @OA\Property(property="field_type", type="string", enum={"textbox","number","dropdown","checkbox","date","textarea"}, example="textbox"), * @OA\Property(property="category", type="string", nullable=true, maxLength=100, example="basic"), * @OA\Property(property="description", type="string", nullable=true, example="설명"), * @OA\Property(property="is_common", type="boolean", example=true), * @OA\Property(property="default_value", type="string", nullable=true, example=null), * @OA\Property(property="options", type="object", nullable=true, example=null), * @OA\Property(property="validation_rules", type="object", nullable=true, example=null), * @OA\Property(property="properties", type="object", nullable=true, example=null) * ) * * @OA\Schema( * schema="ItemMasterFieldUpdateRequest", * type="object", * * @OA\Property(property="field_name", type="string", maxLength=255, example="제품명"), * @OA\Property(property="field_type", type="string", enum={"textbox","number","dropdown","checkbox","date","textarea"}, example="textbox"), * @OA\Property(property="category", type="string", nullable=true, maxLength=100, example="basic"), * @OA\Property(property="description", type="string", nullable=true, example="설명"), * @OA\Property(property="is_common", type="boolean", example=true), * @OA\Property(property="default_value", type="string", nullable=true, example=null), * @OA\Property(property="options", type="object", nullable=true, example=null), * @OA\Property(property="validation_rules", type="object", nullable=true, example=null), * @OA\Property(property="properties", type="object", nullable=true, example=null) * ) * * @OA\Schema( * schema="CustomTabStoreRequest", * type="object", * required={"label"}, * * @OA\Property(property="label", type="string", maxLength=255, example="커스텀 탭"), * @OA\Property(property="icon", type="string", nullable=true, maxLength=100, example="icon-name"), * @OA\Property(property="is_default", type="boolean", example=false) * ) * * @OA\Schema( * schema="CustomTabUpdateRequest", * type="object", * * @OA\Property(property="label", type="string", maxLength=255, example="커스텀 탭"), * @OA\Property(property="icon", type="string", nullable=true, maxLength=100, example="icon-name"), * @OA\Property(property="is_default", type="boolean", example=false) * ) * * @OA\Schema( * schema="UnitOptionStoreRequest", * type="object", * required={"label","value"}, * * @OA\Property(property="label", type="string", maxLength=100, example="개"), * @OA\Property(property="value", type="string", maxLength=50, example="EA") * ) * * @OA\Schema( * schema="ReorderRequest", * type="object", * required={"items"}, * * @OA\Property( * property="items", * type="array", * * @OA\Items( * type="object", * required={"id","order_no"}, * * @OA\Property(property="id", type="integer", example=1), * @OA\Property(property="order_no", type="integer", example=0) * ), * example={{"id":1,"order_no":0},{"id":2,"order_no":1}} * ) * ) * * ======================================== * Response 스키마 * ======================================== * * @OA\Schema( * schema="ItemMasterInitResponse", * type="object", * * @OA\Property( * property="pages", * type="array", * * @OA\Items(ref="#/components/schemas/ItemPage") * ), * * @OA\Property( * property="sectionTemplates", * type="array", * * @OA\Items(ref="#/components/schemas/SectionTemplate") * ), * * @OA\Property( * property="masterFields", * type="array", * * @OA\Items(ref="#/components/schemas/ItemMasterField") * ), * * @OA\Property( * property="customTabs", * type="array", * * @OA\Items(ref="#/components/schemas/CustomTab") * ), * * @OA\Property( * property="unitOptions", * type="array", * * @OA\Items(ref="#/components/schemas/UnitOption") * ) * ) */ class ItemMasterApi { /** * @OA\Get( * path="/api/v1/item-master/init", * tags={"ItemMaster"}, * summary="품목기준관리 초기 데이터 로드", * security={{"ApiKeyAuth":{}},{"BearerAuth":{}}}, * * @OA\Response(response=200, description="조회 성공", * * @OA\JsonContent(allOf={ * * @OA\Schema(ref="#/components/schemas/ApiResponse"), * @OA\Schema(@OA\Property(property="data", ref="#/components/schemas/ItemMasterInitResponse")) * }) * ), * * @OA\Response(response=401, description="인증 실패", @OA\JsonContent(ref="#/components/schemas/ErrorResponse")) * ) */ public function init() {} /** * @OA\Get( * path="/api/v1/item-master/pages", * tags={"ItemMaster"}, * summary="페이지 목록 조회", * security={{"ApiKeyAuth":{}},{"BearerAuth":{}}}, * * @OA\Parameter(name="item_type", in="query", description="품목 유형 필터", @OA\Schema(type="string", enum={"FG","PT","SM","RM","CS"})), * * @OA\Response(response=200, description="조회 성공", * * @OA\JsonContent(allOf={ * * @OA\Schema(ref="#/components/schemas/ApiResponse"), * @OA\Schema(@OA\Property(property="data", type="array", @OA\Items(ref="#/components/schemas/ItemPage"))) * }) * ), * * @OA\Response(response=401, description="인증 실패", @OA\JsonContent(ref="#/components/schemas/ErrorResponse")) * ) */ public function indexPages() {} /** * @OA\Post( * path="/api/v1/item-master/pages", * tags={"ItemMaster"}, * summary="페이지 생성", * security={{"ApiKeyAuth":{}},{"BearerAuth":{}}}, * * @OA\RequestBody(required=true, @OA\JsonContent(ref="#/components/schemas/ItemPageStoreRequest")), * * @OA\Response(response=200, description="생성 성공", * * @OA\JsonContent(allOf={ * * @OA\Schema(ref="#/components/schemas/ApiResponse"), * @OA\Schema(@OA\Property(property="data", ref="#/components/schemas/ItemPage")) * }) * ), * * @OA\Response(response=422, description="검증 실패", @OA\JsonContent(ref="#/components/schemas/ErrorResponse")) * ) */ public function storePages() {} /** * @OA\Put( * path="/api/v1/item-master/pages/{id}", * tags={"ItemMaster"}, * summary="페이지 수정", * security={{"ApiKeyAuth":{}},{"BearerAuth":{}}}, * * @OA\Parameter(name="id", in="path", required=true, @OA\Schema(type="integer")), * * @OA\RequestBody(required=true, @OA\JsonContent(ref="#/components/schemas/ItemPageUpdateRequest")), * * @OA\Response(response=200, description="수정 성공", * * @OA\JsonContent(allOf={ * * @OA\Schema(ref="#/components/schemas/ApiResponse"), * @OA\Schema(@OA\Property(property="data", ref="#/components/schemas/ItemPage")) * }) * ), * * @OA\Response(response=404, description="데이터 없음", @OA\JsonContent(ref="#/components/schemas/ErrorResponse")) * ) */ public function updatePages() {} /** * @OA\Delete( * path="/api/v1/item-master/pages/{id}", * tags={"ItemMaster"}, * summary="페이지 삭제 (Cascade)", * security={{"ApiKeyAuth":{}},{"BearerAuth":{}}}, * * @OA\Parameter(name="id", in="path", required=true, @OA\Schema(type="integer")), * * @OA\Response(response=200, description="삭제 성공", @OA\JsonContent(ref="#/components/schemas/ApiResponse")), * @OA\Response(response=404, description="데이터 없음", @OA\JsonContent(ref="#/components/schemas/ErrorResponse")) * ) */ public function destroyPages() {} /** * @OA\Get( * path="/api/v1/item-master/sections", * tags={"ItemMaster"}, * summary="독립 섹션 목록 조회", * description="페이지와 연결되지 않은 독립 섹션 목록을 조회합니다. is_template 파라미터로 템플릿 필터링이 가능합니다.", * security={{"ApiKeyAuth":{}},{"BearerAuth":{}}}, * * @OA\Parameter(name="is_template", in="query", description="템플릿 여부 필터", @OA\Schema(type="boolean")), * * @OA\Response(response=200, description="조회 성공", * * @OA\JsonContent(allOf={ * * @OA\Schema(ref="#/components/schemas/ApiResponse"), * @OA\Schema(@OA\Property(property="data", type="array", @OA\Items(ref="#/components/schemas/ItemSection"))) * }) * ), * * @OA\Response(response=401, description="인증 실패", @OA\JsonContent(ref="#/components/schemas/ErrorResponse")) * ) */ public function indexSections() {} /** * @OA\Post( * path="/api/v1/item-master/sections", * tags={"ItemMaster"}, * summary="독립 섹션 생성", * description="페이지와 연결되지 않은 독립 섹션을 생성합니다.", * security={{"ApiKeyAuth":{}},{"BearerAuth":{}}}, * * @OA\RequestBody(required=true, @OA\JsonContent(ref="#/components/schemas/IndependentSectionStoreRequest")), * * @OA\Response(response=200, description="생성 성공", * * @OA\JsonContent(allOf={ * * @OA\Schema(ref="#/components/schemas/ApiResponse"), * @OA\Schema(@OA\Property(property="data", ref="#/components/schemas/ItemSection")) * }) * ), * * @OA\Response(response=422, description="검증 실패", @OA\JsonContent(ref="#/components/schemas/ErrorResponse")) * ) */ public function storeIndependentSection() {} /** * @OA\Post( * path="/api/v1/item-master/sections/{id}/clone", * tags={"ItemMaster"}, * summary="섹션 복제", * description="기존 섹션을 복제하여 새 독립 섹션을 생성합니다. 하위 필드와 BOM 항목도 함께 복제됩니다.", * security={{"ApiKeyAuth":{}},{"BearerAuth":{}}}, * * @OA\Parameter(name="id", in="path", required=true, description="복제할 섹션 ID", @OA\Schema(type="integer")), * * @OA\Response(response=200, description="복제 성공", * * @OA\JsonContent(allOf={ * * @OA\Schema(ref="#/components/schemas/ApiResponse"), * @OA\Schema(@OA\Property(property="data", ref="#/components/schemas/ItemSection")) * }) * ), * * @OA\Response(response=404, description="데이터 없음", @OA\JsonContent(ref="#/components/schemas/ErrorResponse")) * ) */ public function cloneSection() {} /** * @OA\Get( * path="/api/v1/item-master/sections/{id}/usage", * tags={"ItemMaster"}, * summary="섹션 사용처 조회", * description="섹션이 어떤 페이지에 연결되어 있는지 조회합니다. FK 기반 연결과 entity_relationships 기반 연결 모두 조회됩니다.", * security={{"ApiKeyAuth":{}},{"BearerAuth":{}}}, * * @OA\Parameter(name="id", in="path", required=true, description="섹션 ID", @OA\Schema(type="integer")), * * @OA\Response(response=200, description="조회 성공", * * @OA\JsonContent(allOf={ * * @OA\Schema(ref="#/components/schemas/ApiResponse"), * @OA\Schema(@OA\Property(property="data", ref="#/components/schemas/SectionUsageResponse")) * }) * ), * * @OA\Response(response=404, description="데이터 없음", @OA\JsonContent(ref="#/components/schemas/ErrorResponse")) * ) */ public function getSectionUsage() {} /** * @OA\Get( * path="/api/v1/item-master/fields", * tags={"ItemMaster"}, * summary="독립 필드 목록 조회", * description="섹션과 연결되지 않은 독립 필드 목록을 조회합니다.", * security={{"ApiKeyAuth":{}},{"BearerAuth":{}}}, * * @OA\Response(response=200, description="조회 성공", * * @OA\JsonContent(allOf={ * * @OA\Schema(ref="#/components/schemas/ApiResponse"), * @OA\Schema(@OA\Property(property="data", type="array", @OA\Items(ref="#/components/schemas/ItemField"))) * }) * ), * * @OA\Response(response=401, description="인증 실패", @OA\JsonContent(ref="#/components/schemas/ErrorResponse")) * ) */ public function indexFields() {} /** * @OA\Post( * path="/api/v1/item-master/fields", * tags={"ItemMaster"}, * summary="독립 필드 생성", * description="섹션과 연결되지 않은 독립 필드를 생성합니다.", * security={{"ApiKeyAuth":{}},{"BearerAuth":{}}}, * * @OA\RequestBody(required=true, @OA\JsonContent(ref="#/components/schemas/IndependentFieldStoreRequest")), * * @OA\Response(response=200, description="생성 성공", * * @OA\JsonContent(allOf={ * * @OA\Schema(ref="#/components/schemas/ApiResponse"), * @OA\Schema(@OA\Property(property="data", ref="#/components/schemas/ItemField")) * }) * ), * * @OA\Response(response=422, description="검증 실패", @OA\JsonContent(ref="#/components/schemas/ErrorResponse")) * ) */ public function storeIndependentField() {} /** * @OA\Post( * path="/api/v1/item-master/fields/{id}/clone", * tags={"ItemMaster"}, * summary="필드 복제", * description="기존 필드를 복제하여 새 독립 필드를 생성합니다.", * security={{"ApiKeyAuth":{}},{"BearerAuth":{}}}, * * @OA\Parameter(name="id", in="path", required=true, description="복제할 필드 ID", @OA\Schema(type="integer")), * * @OA\Response(response=200, description="복제 성공", * * @OA\JsonContent(allOf={ * * @OA\Schema(ref="#/components/schemas/ApiResponse"), * @OA\Schema(@OA\Property(property="data", ref="#/components/schemas/ItemField")) * }) * ), * * @OA\Response(response=404, description="데이터 없음", @OA\JsonContent(ref="#/components/schemas/ErrorResponse")) * ) */ public function cloneField() {} /** * @OA\Get( * path="/api/v1/item-master/fields/{id}/usage", * tags={"ItemMaster"}, * summary="필드 사용처 조회", * description="필드가 어떤 섹션/페이지에 연결되어 있는지 조회합니다.", * security={{"ApiKeyAuth":{}},{"BearerAuth":{}}}, * * @OA\Parameter(name="id", in="path", required=true, description="필드 ID", @OA\Schema(type="integer")), * * @OA\Response(response=200, description="조회 성공", * * @OA\JsonContent(allOf={ * * @OA\Schema(ref="#/components/schemas/ApiResponse"), * @OA\Schema(@OA\Property(property="data", ref="#/components/schemas/FieldUsageResponse")) * }) * ), * * @OA\Response(response=404, description="데이터 없음", @OA\JsonContent(ref="#/components/schemas/ErrorResponse")) * ) */ public function getFieldUsage() {} /** * @OA\Get( * path="/api/v1/item-master/bom-items", * tags={"ItemMaster"}, * summary="독립 BOM 목록 조회", * description="섹션과 연결되지 않은 독립 BOM 항목 목록을 조회합니다.", * security={{"ApiKeyAuth":{}},{"BearerAuth":{}}}, * * @OA\Response(response=200, description="조회 성공", * * @OA\JsonContent(allOf={ * * @OA\Schema(ref="#/components/schemas/ApiResponse"), * @OA\Schema(@OA\Property(property="data", type="array", @OA\Items(ref="#/components/schemas/ItemBomItem"))) * }) * ), * * @OA\Response(response=401, description="인증 실패", @OA\JsonContent(ref="#/components/schemas/ErrorResponse")) * ) */ public function indexBomItems() {} /** * @OA\Post( * path="/api/v1/item-master/bom-items", * tags={"ItemMaster"}, * summary="독립 BOM 생성", * description="섹션과 연결되지 않은 독립 BOM 항목을 생성합니다.", * security={{"ApiKeyAuth":{}},{"BearerAuth":{}}}, * * @OA\RequestBody(required=true, @OA\JsonContent(ref="#/components/schemas/IndependentBomItemStoreRequest")), * * @OA\Response(response=200, description="생성 성공", * * @OA\JsonContent(allOf={ * * @OA\Schema(ref="#/components/schemas/ApiResponse"), * @OA\Schema(@OA\Property(property="data", ref="#/components/schemas/ItemBomItem")) * }) * ), * * @OA\Response(response=422, description="검증 실패", @OA\JsonContent(ref="#/components/schemas/ErrorResponse")) * ) */ public function storeIndependentBomItem() {} /** * @OA\Post( * path="/api/v1/item-master/pages/{pageId}/sections", * tags={"ItemMaster"}, * summary="섹션 생성 (페이지 연결)", * security={{"ApiKeyAuth":{}},{"BearerAuth":{}}}, * * @OA\Parameter(name="pageId", in="path", required=true, @OA\Schema(type="integer")), * * @OA\RequestBody(required=true, @OA\JsonContent(ref="#/components/schemas/ItemSectionStoreRequest")), * * @OA\Response(response=200, description="생성 성공", * * @OA\JsonContent(allOf={ * * @OA\Schema(ref="#/components/schemas/ApiResponse"), * @OA\Schema(@OA\Property(property="data", ref="#/components/schemas/ItemSection")) * }) * ), * * @OA\Response(response=422, description="검증 실패", @OA\JsonContent(ref="#/components/schemas/ErrorResponse")) * ) */ public function storeSections() {} /** * @OA\Put( * path="/api/v1/item-master/sections/{id}", * tags={"ItemMaster"}, * summary="섹션 수정", * security={{"ApiKeyAuth":{}},{"BearerAuth":{}}}, * * @OA\Parameter(name="id", in="path", required=true, @OA\Schema(type="integer")), * * @OA\RequestBody(required=true, @OA\JsonContent(ref="#/components/schemas/ItemSectionUpdateRequest")), * * @OA\Response(response=200, description="수정 성공", * * @OA\JsonContent(allOf={ * * @OA\Schema(ref="#/components/schemas/ApiResponse"), * @OA\Schema(@OA\Property(property="data", ref="#/components/schemas/ItemSection")) * }) * ), * * @OA\Response(response=404, description="데이터 없음", @OA\JsonContent(ref="#/components/schemas/ErrorResponse")) * ) */ public function updateSections() {} /** * @OA\Delete( * path="/api/v1/item-master/sections/{id}", * tags={"ItemMaster"}, * summary="섹션 삭제 (Cascade)", * security={{"ApiKeyAuth":{}},{"BearerAuth":{}}}, * * @OA\Parameter(name="id", in="path", required=true, @OA\Schema(type="integer")), * * @OA\Response(response=200, description="삭제 성공", @OA\JsonContent(ref="#/components/schemas/ApiResponse")), * @OA\Response(response=404, description="데이터 없음", @OA\JsonContent(ref="#/components/schemas/ErrorResponse")) * ) */ public function destroySections() {} /** * @OA\Put( * path="/api/v1/item-master/pages/{pageId}/sections/reorder", * tags={"ItemMaster"}, * summary="섹션 순서 변경", * security={{"ApiKeyAuth":{}},{"BearerAuth":{}}}, * * @OA\Parameter(name="pageId", in="path", required=true, @OA\Schema(type="integer")), * * @OA\RequestBody(required=true, @OA\JsonContent(ref="#/components/schemas/ReorderRequest")), * * @OA\Response(response=200, description="순서 변경 성공", @OA\JsonContent(ref="#/components/schemas/ApiResponse")), * @OA\Response(response=422, description="검증 실패", @OA\JsonContent(ref="#/components/schemas/ErrorResponse")) * ) */ public function reorderSections() {} /** * @OA\Post( * path="/api/v1/item-master/sections/{sectionId}/fields", * tags={"ItemMaster"}, * summary="필드 생성", * security={{"ApiKeyAuth":{}},{"BearerAuth":{}}}, * * @OA\Parameter(name="sectionId", in="path", required=true, @OA\Schema(type="integer")), * * @OA\RequestBody(required=true, @OA\JsonContent(ref="#/components/schemas/ItemFieldStoreRequest")), * * @OA\Response(response=200, description="생성 성공", * * @OA\JsonContent(allOf={ * * @OA\Schema(ref="#/components/schemas/ApiResponse"), * @OA\Schema(@OA\Property(property="data", ref="#/components/schemas/ItemField")) * }) * ), * * @OA\Response(response=422, description="검증 실패", @OA\JsonContent(ref="#/components/schemas/ErrorResponse")) * ) */ public function storeFields() {} /** * @OA\Put( * path="/api/v1/item-master/fields/{id}", * tags={"ItemMaster"}, * summary="필드 수정", * security={{"ApiKeyAuth":{}},{"BearerAuth":{}}}, * * @OA\Parameter(name="id", in="path", required=true, @OA\Schema(type="integer")), * * @OA\RequestBody(required=true, @OA\JsonContent(ref="#/components/schemas/ItemFieldUpdateRequest")), * * @OA\Response(response=200, description="수정 성공", * * @OA\JsonContent(allOf={ * * @OA\Schema(ref="#/components/schemas/ApiResponse"), * @OA\Schema(@OA\Property(property="data", ref="#/components/schemas/ItemField")) * }) * ), * * @OA\Response(response=404, description="데이터 없음", @OA\JsonContent(ref="#/components/schemas/ErrorResponse")) * ) */ public function updateFields() {} /** * @OA\Delete( * path="/api/v1/item-master/fields/{id}", * tags={"ItemMaster"}, * summary="필드 삭제", * security={{"ApiKeyAuth":{}},{"BearerAuth":{}}}, * * @OA\Parameter(name="id", in="path", required=true, @OA\Schema(type="integer")), * * @OA\Response(response=200, description="삭제 성공", @OA\JsonContent(ref="#/components/schemas/ApiResponse")), * @OA\Response(response=404, description="데이터 없음", @OA\JsonContent(ref="#/components/schemas/ErrorResponse")) * ) */ public function destroyFields() {} /** * @OA\Put( * path="/api/v1/item-master/sections/{sectionId}/fields/reorder", * tags={"ItemMaster"}, * summary="필드 순서 변경", * security={{"ApiKeyAuth":{}},{"BearerAuth":{}}}, * * @OA\Parameter(name="sectionId", in="path", required=true, @OA\Schema(type="integer")), * * @OA\RequestBody(required=true, @OA\JsonContent(ref="#/components/schemas/ReorderRequest")), * * @OA\Response(response=200, description="순서 변경 성공", @OA\JsonContent(ref="#/components/schemas/ApiResponse")), * @OA\Response(response=422, description="검증 실패", @OA\JsonContent(ref="#/components/schemas/ErrorResponse")) * ) */ public function reorderFields() {} /** * @OA\Post( * path="/api/v1/item-master/sections/{sectionId}/bom-items", * tags={"ItemMaster"}, * summary="BOM 항목 생성", * security={{"ApiKeyAuth":{}},{"BearerAuth":{}}}, * * @OA\Parameter(name="sectionId", in="path", required=true, @OA\Schema(type="integer")), * * @OA\RequestBody(required=true, @OA\JsonContent(ref="#/components/schemas/ItemBomItemStoreRequest")), * * @OA\Response(response=200, description="생성 성공", * * @OA\JsonContent(allOf={ * * @OA\Schema(ref="#/components/schemas/ApiResponse"), * @OA\Schema(@OA\Property(property="data", ref="#/components/schemas/ItemBomItem")) * }) * ), * * @OA\Response(response=422, description="검증 실패", @OA\JsonContent(ref="#/components/schemas/ErrorResponse")) * ) */ public function storeBomItems() {} /** * @OA\Put( * path="/api/v1/item-master/bom-items/{id}", * tags={"ItemMaster"}, * summary="BOM 항목 수정", * security={{"ApiKeyAuth":{}},{"BearerAuth":{}}}, * * @OA\Parameter(name="id", in="path", required=true, @OA\Schema(type="integer")), * * @OA\RequestBody(required=true, @OA\JsonContent(ref="#/components/schemas/ItemBomItemUpdateRequest")), * * @OA\Response(response=200, description="수정 성공", * * @OA\JsonContent(allOf={ * * @OA\Schema(ref="#/components/schemas/ApiResponse"), * @OA\Schema(@OA\Property(property="data", ref="#/components/schemas/ItemBomItem")) * }) * ), * * @OA\Response(response=404, description="데이터 없음", @OA\JsonContent(ref="#/components/schemas/ErrorResponse")) * ) */ public function updateBomItems() {} /** * @OA\Delete( * path="/api/v1/item-master/bom-items/{id}", * tags={"ItemMaster"}, * summary="BOM 항목 삭제", * security={{"ApiKeyAuth":{}},{"BearerAuth":{}}}, * * @OA\Parameter(name="id", in="path", required=true, @OA\Schema(type="integer")), * * @OA\Response(response=200, description="삭제 성공", @OA\JsonContent(ref="#/components/schemas/ApiResponse")), * @OA\Response(response=404, description="데이터 없음", @OA\JsonContent(ref="#/components/schemas/ErrorResponse")) * ) */ public function destroyBomItems() {} /** * @OA\Get( * path="/api/v1/item-master/section-templates", * tags={"ItemMaster"}, * summary="섹션 템플릿 목록", * security={{"ApiKeyAuth":{}},{"BearerAuth":{}}}, * * @OA\Response(response=200, description="조회 성공", * * @OA\JsonContent(allOf={ * * @OA\Schema(ref="#/components/schemas/ApiResponse"), * @OA\Schema(@OA\Property(property="data", type="array", @OA\Items(ref="#/components/schemas/SectionTemplate"))) * }) * ), * * @OA\Response(response=401, description="인증 실패", @OA\JsonContent(ref="#/components/schemas/ErrorResponse")) * ) */ public function indexSectionTemplates() {} /** * @OA\Post( * path="/api/v1/item-master/section-templates", * tags={"ItemMaster"}, * summary="섹션 템플릿 생성", * security={{"ApiKeyAuth":{}},{"BearerAuth":{}}}, * * @OA\RequestBody(required=true, @OA\JsonContent(ref="#/components/schemas/SectionTemplateStoreRequest")), * * @OA\Response(response=200, description="생성 성공", * * @OA\JsonContent(allOf={ * * @OA\Schema(ref="#/components/schemas/ApiResponse"), * @OA\Schema(@OA\Property(property="data", ref="#/components/schemas/SectionTemplate")) * }) * ), * * @OA\Response(response=422, description="검증 실패", @OA\JsonContent(ref="#/components/schemas/ErrorResponse")) * ) */ public function storeSectionTemplates() {} /** * @OA\Put( * path="/api/v1/item-master/section-templates/{id}", * tags={"ItemMaster"}, * summary="섹션 템플릿 수정", * security={{"ApiKeyAuth":{}},{"BearerAuth":{}}}, * * @OA\Parameter(name="id", in="path", required=true, @OA\Schema(type="integer")), * * @OA\RequestBody(required=true, @OA\JsonContent(ref="#/components/schemas/SectionTemplateUpdateRequest")), * * @OA\Response(response=200, description="수정 성공", * * @OA\JsonContent(allOf={ * * @OA\Schema(ref="#/components/schemas/ApiResponse"), * @OA\Schema(@OA\Property(property="data", ref="#/components/schemas/SectionTemplate")) * }) * ), * * @OA\Response(response=404, description="데이터 없음", @OA\JsonContent(ref="#/components/schemas/ErrorResponse")) * ) */ public function updateSectionTemplates() {} /** * @OA\Delete( * path="/api/v1/item-master/section-templates/{id}", * tags={"ItemMaster"}, * summary="섹션 템플릿 삭제", * security={{"ApiKeyAuth":{}},{"BearerAuth":{}}}, * * @OA\Parameter(name="id", in="path", required=true, @OA\Schema(type="integer")), * * @OA\Response(response=200, description="삭제 성공", @OA\JsonContent(ref="#/components/schemas/ApiResponse")), * @OA\Response(response=404, description="데이터 없음", @OA\JsonContent(ref="#/components/schemas/ErrorResponse")) * ) */ public function destroySectionTemplates() {} /** * @OA\Get( * path="/api/v1/item-master/master-fields", * tags={"ItemMaster"}, * summary="마스터 필드 목록", * security={{"ApiKeyAuth":{}},{"BearerAuth":{}}}, * * @OA\Response(response=200, description="조회 성공", * * @OA\JsonContent(allOf={ * * @OA\Schema(ref="#/components/schemas/ApiResponse"), * @OA\Schema(@OA\Property(property="data", type="array", @OA\Items(ref="#/components/schemas/ItemMasterField"))) * }) * ), * * @OA\Response(response=401, description="인증 실패", @OA\JsonContent(ref="#/components/schemas/ErrorResponse")) * ) */ public function indexMasterFields() {} /** * @OA\Post( * path="/api/v1/item-master/master-fields", * tags={"ItemMaster"}, * summary="마스터 필드 생성", * security={{"ApiKeyAuth":{}},{"BearerAuth":{}}}, * * @OA\RequestBody(required=true, @OA\JsonContent(ref="#/components/schemas/ItemMasterFieldStoreRequest")), * * @OA\Response(response=200, description="생성 성공", * * @OA\JsonContent(allOf={ * * @OA\Schema(ref="#/components/schemas/ApiResponse"), * @OA\Schema(@OA\Property(property="data", ref="#/components/schemas/ItemMasterField")) * }) * ), * * @OA\Response(response=422, description="검증 실패", @OA\JsonContent(ref="#/components/schemas/ErrorResponse")) * ) */ public function storeMasterFields() {} /** * @OA\Put( * path="/api/v1/item-master/master-fields/{id}", * tags={"ItemMaster"}, * summary="마스터 필드 수정", * security={{"ApiKeyAuth":{}},{"BearerAuth":{}}}, * * @OA\Parameter(name="id", in="path", required=true, @OA\Schema(type="integer")), * * @OA\RequestBody(required=true, @OA\JsonContent(ref="#/components/schemas/ItemMasterFieldUpdateRequest")), * * @OA\Response(response=200, description="수정 성공", * * @OA\JsonContent(allOf={ * * @OA\Schema(ref="#/components/schemas/ApiResponse"), * @OA\Schema(@OA\Property(property="data", ref="#/components/schemas/ItemMasterField")) * }) * ), * * @OA\Response(response=404, description="데이터 없음", @OA\JsonContent(ref="#/components/schemas/ErrorResponse")) * ) */ public function updateMasterFields() {} /** * @OA\Delete( * path="/api/v1/item-master/master-fields/{id}", * tags={"ItemMaster"}, * summary="마스터 필드 삭제", * security={{"ApiKeyAuth":{}},{"BearerAuth":{}}}, * * @OA\Parameter(name="id", in="path", required=true, @OA\Schema(type="integer")), * * @OA\Response(response=200, description="삭제 성공", @OA\JsonContent(ref="#/components/schemas/ApiResponse")), * @OA\Response(response=404, description="데이터 없음", @OA\JsonContent(ref="#/components/schemas/ErrorResponse")) * ) */ public function destroyMasterFields() {} /** * @OA\Get( * path="/api/v1/item-master/custom-tabs", * tags={"ItemMaster"}, * summary="커스텀 탭 목록", * security={{"ApiKeyAuth":{}},{"BearerAuth":{}}}, * * @OA\Response(response=200, description="조회 성공", * * @OA\JsonContent(allOf={ * * @OA\Schema(ref="#/components/schemas/ApiResponse"), * @OA\Schema(@OA\Property(property="data", type="array", @OA\Items(ref="#/components/schemas/CustomTab"))) * }) * ), * * @OA\Response(response=401, description="인증 실패", @OA\JsonContent(ref="#/components/schemas/ErrorResponse")) * ) */ public function indexCustomTabs() {} /** * @OA\Post( * path="/api/v1/item-master/custom-tabs", * tags={"ItemMaster"}, * summary="커스텀 탭 생성", * security={{"ApiKeyAuth":{}},{"BearerAuth":{}}}, * * @OA\RequestBody(required=true, @OA\JsonContent(ref="#/components/schemas/CustomTabStoreRequest")), * * @OA\Response(response=200, description="생성 성공", * * @OA\JsonContent(allOf={ * * @OA\Schema(ref="#/components/schemas/ApiResponse"), * @OA\Schema(@OA\Property(property="data", ref="#/components/schemas/CustomTab")) * }) * ), * * @OA\Response(response=422, description="검증 실패", @OA\JsonContent(ref="#/components/schemas/ErrorResponse")) * ) */ public function storeCustomTabs() {} /** * @OA\Put( * path="/api/v1/item-master/custom-tabs/{id}", * tags={"ItemMaster"}, * summary="커스텀 탭 수정", * security={{"ApiKeyAuth":{}},{"BearerAuth":{}}}, * * @OA\Parameter(name="id", in="path", required=true, @OA\Schema(type="integer")), * * @OA\RequestBody(required=true, @OA\JsonContent(ref="#/components/schemas/CustomTabUpdateRequest")), * * @OA\Response(response=200, description="수정 성공", * * @OA\JsonContent(allOf={ * * @OA\Schema(ref="#/components/schemas/ApiResponse"), * @OA\Schema(@OA\Property(property="data", ref="#/components/schemas/CustomTab")) * }) * ), * * @OA\Response(response=404, description="데이터 없음", @OA\JsonContent(ref="#/components/schemas/ErrorResponse")) * ) */ public function updateCustomTabs() {} /** * @OA\Delete( * path="/api/v1/item-master/custom-tabs/{id}", * tags={"ItemMaster"}, * summary="커스텀 탭 삭제", * security={{"ApiKeyAuth":{}},{"BearerAuth":{}}}, * * @OA\Parameter(name="id", in="path", required=true, @OA\Schema(type="integer")), * * @OA\Response(response=200, description="삭제 성공", @OA\JsonContent(ref="#/components/schemas/ApiResponse")), * @OA\Response(response=404, description="데이터 없음", @OA\JsonContent(ref="#/components/schemas/ErrorResponse")) * ) */ public function destroyCustomTabs() {} /** * @OA\Put( * path="/api/v1/item-master/custom-tabs/reorder", * tags={"ItemMaster"}, * summary="커스텀 탭 순서 변경", * security={{"ApiKeyAuth":{}},{"BearerAuth":{}}}, * * @OA\RequestBody(required=true, @OA\JsonContent(ref="#/components/schemas/ReorderRequest")), * * @OA\Response(response=200, description="순서 변경 성공", @OA\JsonContent(ref="#/components/schemas/ApiResponse")), * @OA\Response(response=422, description="검증 실패", @OA\JsonContent(ref="#/components/schemas/ErrorResponse")) * ) */ public function reorderCustomTabs() {} /** * @OA\Get( * path="/api/v1/item-master/unit-options", * tags={"ItemMaster"}, * summary="단위 옵션 목록", * security={{"ApiKeyAuth":{}},{"BearerAuth":{}}}, * * @OA\Response(response=200, description="조회 성공", * * @OA\JsonContent(allOf={ * * @OA\Schema(ref="#/components/schemas/ApiResponse"), * @OA\Schema(@OA\Property(property="data", type="array", @OA\Items(ref="#/components/schemas/UnitOption"))) * }) * ), * * @OA\Response(response=401, description="인증 실패", @OA\JsonContent(ref="#/components/schemas/ErrorResponse")) * ) */ public function indexUnitOptions() {} /** * @OA\Post( * path="/api/v1/item-master/unit-options", * tags={"ItemMaster"}, * summary="단위 옵션 생성", * security={{"ApiKeyAuth":{}},{"BearerAuth":{}}}, * * @OA\RequestBody(required=true, @OA\JsonContent(ref="#/components/schemas/UnitOptionStoreRequest")), * * @OA\Response(response=200, description="생성 성공", * * @OA\JsonContent(allOf={ * * @OA\Schema(ref="#/components/schemas/ApiResponse"), * @OA\Schema(@OA\Property(property="data", ref="#/components/schemas/UnitOption")) * }) * ), * * @OA\Response(response=422, description="검증 실패", @OA\JsonContent(ref="#/components/schemas/ErrorResponse")) * ) */ public function storeUnitOptions() {} /** * @OA\Delete( * path="/api/v1/item-master/unit-options/{id}", * tags={"ItemMaster"}, * summary="단위 옵션 삭제", * security={{"ApiKeyAuth":{}},{"BearerAuth":{}}}, * * @OA\Parameter(name="id", in="path", required=true, @OA\Schema(type="integer")), * * @OA\Response(response=200, description="삭제 성공", @OA\JsonContent(ref="#/components/schemas/ApiResponse")), * @OA\Response(response=404, description="데이터 없음", @OA\JsonContent(ref="#/components/schemas/ErrorResponse")) * ) */ public function destroyUnitOptions() {}