1000, 'H0' => 800, 'installation_type' => 'A', 'power_source' => '220V' ], description: 'Input parameter values for BOM resolution' ), new OA\Property(property: 'bom_template_id', type: 'integer', minimum: 1, nullable: true, example: 1), new OA\Property(property: 'include_calculated_values', type: 'boolean', example: true), new OA\Property(property: 'include_bom_items', type: 'boolean', example: true) ] )] class ResolvePreviewRequest {} #[OA\Schema( schema: 'CreateProductFromModelRequest', description: 'Request schema for creating product from model', required: ['model_id', 'input_parameters', 'product_code', 'product_name'], properties: [ new OA\Property(property: 'model_id', type: 'integer', minimum: 1, example: 1), new OA\Property( property: 'input_parameters', type: 'object', additionalProperties: new OA\Property(oneOf: [ new OA\Schema(type: 'number'), new OA\Schema(type: 'string'), new OA\Schema(type: 'boolean') ]), example: [ 'W0' => 1000, 'H0' => 800, 'installation_type' => 'A', 'power_source' => '220V' ], description: 'Input parameter values for BOM resolution' ), new OA\Property(property: 'bom_template_id', type: 'integer', minimum: 1, nullable: true, example: 1), new OA\Property( property: 'product_code', type: 'string', maxLength: 50, example: 'KSS01-1000x800-A', description: 'Product code (uppercase letters, numbers, underscore, hyphen only)' ), new OA\Property(property: 'product_name', type: 'string', maxLength: 100, example: 'KSS01 스크린 1000x800 A타입'), new OA\Property(property: 'category_id', type: 'integer', minimum: 1, nullable: true, example: 1), new OA\Property(property: 'description', type: 'string', maxLength: 1000, nullable: true, example: '매개변수 기반으로 생성된 맞춤형 스크린'), new OA\Property(property: 'unit', type: 'string', maxLength: 20, nullable: true, example: 'EA'), new OA\Property(property: 'min_order_qty', type: 'number', minimum: 0, nullable: true, example: 1), new OA\Property(property: 'lead_time_days', type: 'integer', minimum: 0, nullable: true, example: 7), new OA\Property(property: 'is_active', type: 'boolean', example: true), new OA\Property(property: 'create_bom_items', type: 'boolean', example: true), new OA\Property(property: 'validate_bom', type: 'boolean', example: true) ] )] class CreateProductFromModelRequest {} #[OA\Schema( schema: 'BomPreviewResponse', description: 'BOM preview resolution response', properties: [ new OA\Property( property: 'input_parameters', type: 'object', additionalProperties: new OA\Property(oneOf: [ new OA\Schema(type: 'number'), new OA\Schema(type: 'string'), new OA\Schema(type: 'boolean') ]), example: [ 'W0' => 1000, 'H0' => 800, 'installation_type' => 'A', 'power_source' => '220V' ] ), new OA\Property( property: 'calculated_values', type: 'object', additionalProperties: new OA\Property(type: 'number'), example: [ 'W1' => 1050, 'H1' => 850, 'area' => 892500, 'weight' => 25.5, 'motor_power' => 120 ] ), new OA\Property( property: 'bom_items', type: 'array', items: new OA\Items(ref: '#/components/schemas/BomItemPreview') ), new OA\Property( property: 'summary', type: 'object', properties: [ new OA\Property(property: 'total_materials', type: 'integer', example: 15), new OA\Property(property: 'total_cost', type: 'number', example: 125000.50), new OA\Property(property: 'estimated_weight', type: 'number', example: 25.5) ] ), new OA\Property( property: 'validation_warnings', type: 'array', items: new OA\Items( properties: [ new OA\Property(property: 'type', type: 'string', example: 'PARAMETER_OUT_OF_RANGE'), new OA\Property(property: 'message', type: 'string', example: 'W0 값이 권장 범위를 벗어났습니다'), new OA\Property(property: 'parameter', type: 'string', example: 'W0'), new OA\Property(property: 'current_value', type: 'number', example: 1000), new OA\Property(property: 'recommended_range', type: 'string', example: '600-900') ], type: 'object' ) ) ] )] class BomPreviewResponse {} #[OA\Schema( schema: 'BomItemPreview', description: 'BOM item preview', properties: [ new OA\Property(property: 'ref_type', type: 'string', enum: ['MATERIAL', 'PRODUCT'], example: 'MATERIAL'), new OA\Property(property: 'ref_id', type: 'integer', example: 101), new OA\Property(property: 'ref_code', type: 'string', example: 'BR-001'), new OA\Property(property: 'ref_name', type: 'string', example: '표준 브라켓'), new OA\Property(property: 'quantity', type: 'number', example: 2.0), new OA\Property(property: 'waste_rate', type: 'number', example: 0.05), new OA\Property(property: 'total_quantity', type: 'number', example: 2.1), new OA\Property(property: 'unit', type: 'string', example: 'EA'), new OA\Property(property: 'unit_cost', type: 'number', nullable: true, example: 5000.0), new OA\Property(property: 'total_cost', type: 'number', nullable: true, example: 10500.0), new OA\Property(property: 'applied_rule', type: 'string', nullable: true, example: '브라켓 선택 규칙'), new OA\Property( property: 'calculation_details', type: 'object', properties: [ new OA\Property(property: 'condition_matched', type: 'boolean', example: true), new OA\Property(property: 'quantity_expression', type: 'string', example: 'ceiling(W1 / 500)'), new OA\Property(property: 'quantity_calculation', type: 'string', example: 'ceiling(1050 / 500) = 3') ] ) ] )] class BomItemPreview {} #[OA\Schema( schema: 'ProductWithBomResponse', description: 'Product created with BOM response', properties: [ new OA\Property( property: 'product', type: 'object', properties: [ new OA\Property(property: 'id', type: 'integer', example: 123), new OA\Property(property: 'code', type: 'string', example: 'KSS01-1000x800-A'), new OA\Property(property: 'name', type: 'string', example: 'KSS01 스크린 1000x800 A타입'), new OA\Property(property: 'type', type: 'string', example: 'PRODUCT'), new OA\Property(property: 'category_id', type: 'integer', nullable: true, example: 1), new OA\Property(property: 'description', type: 'string', nullable: true, example: '매개변수 기반으로 생성된 맞춤형 스크린'), new OA\Property(property: 'unit', type: 'string', nullable: true, example: 'EA'), new OA\Property(property: 'min_order_qty', type: 'number', nullable: true, example: 1), new OA\Property(property: 'lead_time_days', type: 'integer', nullable: true, example: 7), new OA\Property(property: 'is_active', type: 'boolean', example: true), new OA\Property(property: 'created_at', type: 'string', format: 'date-time', example: '2024-01-01T00:00:00Z') ] ), new OA\Property( property: 'input_parameters', type: 'object', additionalProperties: new OA\Property(oneOf: [ new OA\Schema(type: 'number'), new OA\Schema(type: 'string'), new OA\Schema(type: 'boolean') ]), example: [ 'W0' => 1000, 'H0' => 800, 'installation_type' => 'A', 'power_source' => '220V' ] ), new OA\Property( property: 'calculated_values', type: 'object', additionalProperties: new OA\Property(type: 'number'), example: [ 'W1' => 1050, 'H1' => 850, 'area' => 892500, 'weight' => 25.5 ] ), new OA\Property( property: 'bom_items', type: 'array', items: new OA\Items( properties: [ new OA\Property(property: 'id', type: 'integer', example: 1), new OA\Property(property: 'ref_type', type: 'string', enum: ['MATERIAL', 'PRODUCT'], example: 'MATERIAL'), new OA\Property(property: 'ref_id', type: 'integer', example: 101), new OA\Property(property: 'ref_code', type: 'string', example: 'BR-001'), new OA\Property(property: 'ref_name', type: 'string', example: '표준 브라켓'), new OA\Property(property: 'quantity', type: 'number', example: 2.0), new OA\Property(property: 'waste_rate', type: 'number', example: 0.05), new OA\Property(property: 'unit', type: 'string', example: 'EA') ], type: 'object' ) ), new OA\Property( property: 'summary', type: 'object', properties: [ new OA\Property(property: 'total_bom_items', type: 'integer', example: 15), new OA\Property(property: 'model_id', type: 'integer', example: 1), new OA\Property(property: 'bom_template_id', type: 'integer', nullable: true, example: 1) ] ) ] )] class ProductWithBomResponse {} #[OA\Schema( schema: 'ProductParametersResponse', description: 'Product parameters response', properties: [ new OA\Property(property: 'product_id', type: 'integer', example: 123), new OA\Property(property: 'model_id', type: 'integer', example: 1), new OA\Property( property: 'input_parameters', type: 'object', additionalProperties: new OA\Property(oneOf: [ new OA\Schema(type: 'number'), new OA\Schema(type: 'string'), new OA\Schema(type: 'boolean') ]), example: [ 'W0' => 1000, 'H0' => 800, 'installation_type' => 'A', 'power_source' => '220V' ] ), new OA\Property( property: 'parameter_definitions', type: 'array', items: new OA\Items(ref: '#/components/schemas/ModelParameterResource') ) ] )] class ProductParametersResponse {} #[OA\Schema( schema: 'ProductCalculatedValuesResponse', description: 'Product calculated values response', properties: [ new OA\Property(property: 'product_id', type: 'integer', example: 123), new OA\Property(property: 'model_id', type: 'integer', example: 1), new OA\Property( property: 'calculated_values', type: 'object', additionalProperties: new OA\Property(type: 'number'), example: [ 'W1' => 1050, 'H1' => 850, 'area' => 892500, 'weight' => 25.5, 'motor_power' => 120 ] ), new OA\Property( property: 'formula_applications', type: 'array', items: new OA\Items( properties: [ new OA\Property(property: 'formula_name', type: 'string', example: '최종 가로 크기 계산'), new OA\Property(property: 'target_parameter', type: 'string', example: 'W1'), new OA\Property(property: 'expression', type: 'string', example: 'W0 + (installation_type == "A" ? 50 : 30)'), new OA\Property(property: 'calculated_value', type: 'number', example: 1050), new OA\Property(property: 'execution_order', type: 'integer', example: 1) ], type: 'object' ) ) ] )] class ProductCalculatedValuesResponse {}