Files
sam-docs/history/2025-11/item-master-archived/[ANALYSIS-2025-11-21] item-master-notes.md
hskwon ceae830e41 docs: 2025-11 문서 아카이브 이동
- history/2025-11/front-requests/ 프론트 요청 문서 이동
- history/2025-11/item-master-archived/ Item Master 구버전 문서 이동
2025-12-09 20:30:39 +09:00

42 KiB

/**

  • @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="page_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="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="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="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\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() {} }