## 잠금 기능 (Lock Feature) - entity_relationships 테이블에 is_locked, locked_by, locked_at 컬럼 추가 - EntityRelationship 모델에 잠금 관련 헬퍼 메서드 추가 - LockCheckTrait 생성 (destroy 시 잠금 체크 공통 로직) - 각 Service의 destroy() 메서드에 잠금 체크 적용 - API 응답에 is_locked 필드 포함 - 한국어 에러 메시지 추가 ## FK 레거시 코드 정리 - ItemMasterSeeder: entity_relationships 기반으로 전환 - ItemPage 모델: FK 기반 sections() 관계 제거 - ItemSectionService: clone() 메서드 FK 제거 - SectionTemplateService: page_id 컬럼 참조 제거 - EntityRelationship::link() 파라미터 순서 통일 ## 기타 - Swagger 스키마에 is_locked 속성 추가 - 프론트엔드 가이드 문서 추가
1247 lines
50 KiB
PHP
1247 lines
50 KiB
PHP
<?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",
|
|
* description="독립 엔티티 - 관계는 entity_relationships로 관리",
|
|
*
|
|
* @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, description="계층번호"),
|
|
* @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="is_locked", type="boolean", example=false, description="연결 잠금 여부 (init API 응답 시 포함)"),
|
|
* @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="bom_items",
|
|
* type="array",
|
|
*
|
|
* @OA\Items(ref="#/components/schemas/ItemBomItem")
|
|
* )
|
|
* )
|
|
*
|
|
* @OA\Schema(
|
|
* schema="ItemField",
|
|
* type="object",
|
|
* description="독립 엔티티 - 관계는 entity_relationships로 관리",
|
|
*
|
|
* @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, description="계층번호"),
|
|
* @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="is_locked", type="boolean", example=false, description="연결 잠금 여부 (init API 응답 시 포함)"),
|
|
* @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="category", type="string", nullable=true, example="basic", description="필드 카테고리"),
|
|
* @OA\Property(property="description", type="string", nullable=true, example="필드 설명"),
|
|
* @OA\Property(property="is_common", type="boolean", example=false, description="공통 필드 여부"),
|
|
* @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",
|
|
* description="독립 엔티티 - 관계는 entity_relationships로 관리",
|
|
*
|
|
* @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, description="계층번호"),
|
|
* @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="is_locked", type="boolean", example=false, description="연결 잠금 여부 (init API 응답 시 포함)"),
|
|
* @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="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="group_id", type="integer", nullable=true, example=1, description="계층번호"),
|
|
* @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, description="계층번호"),
|
|
* @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, description="계층번호"),
|
|
* @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, description="계층번호"),
|
|
* @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",
|
|
* description="섹션 사용처 응답 (entity_relationships 기반)",
|
|
*
|
|
* @OA\Property(property="section_id", type="integer", example=1),
|
|
* @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",
|
|
* description="필드 사용처 응답 (entity_relationships 기반)",
|
|
*
|
|
* @OA\Property(property="field_id", type="integer", example=1),
|
|
* @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="group_id", type="integer", nullable=true, example=1, description="계층번호"),
|
|
* @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="group_id", type="integer", nullable=true, example=1, description="계층번호"),
|
|
* @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="page_id", type="integer", nullable=true, example=1, description="연결할 페이지 ID (선택, 있으면 즉시 링크 연결)"),
|
|
* @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="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",
|
|
* description="페이지 목록 (linkedSections 기반)",
|
|
*
|
|
* @OA\Items(ref="#/components/schemas/ItemPage")
|
|
* ),
|
|
*
|
|
* @OA\Property(
|
|
* property="sections",
|
|
* type="array",
|
|
* description="모든 독립 섹션 목록 (재사용 가능)",
|
|
*
|
|
* @OA\Items(ref="#/components/schemas/ItemSection")
|
|
* ),
|
|
*
|
|
* @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="페이지 삭제",
|
|
* description="페이지를 삭제합니다. 연결된 섹션/필드는 삭제되지 않고 관계만 해제됩니다.",
|
|
* 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="섹션이 어떤 페이지에 연결되어 있는지 조회합니다 (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="섹션 삭제",
|
|
* description="섹션을 삭제합니다. 연결된 필드/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 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/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() {}
|
|
}
|