diff --git a/app/Http/Requests/Client/ClientStoreRequest.php b/app/Http/Requests/Client/ClientStoreRequest.php index ac57fbe..51c344d 100644 --- a/app/Http/Requests/Client/ClientStoreRequest.php +++ b/app/Http/Requests/Client/ClientStoreRequest.php @@ -3,6 +3,7 @@ namespace App\Http\Requests\Client; use Illuminate\Foundation\Http\FormRequest; +use Illuminate\Validation\Rule; class ClientStoreRequest extends FormRequest { @@ -17,7 +18,10 @@ public function rules(): array 'client_group_id' => 'nullable|integer', 'client_code' => 'required|string|max:50', 'name' => 'required|string|max:100', - 'client_type' => 'nullable|in:매입,매출,매입매출', + 'client_type' => [ + 'nullable', + Rule::exists('common_codes', 'code')->where('code_group', 'client_type'), + ], // 연락처 정보 'contact_person' => 'nullable|string|max:100', 'phone' => 'nullable|string|max:20', @@ -48,7 +52,10 @@ public function rules(): array 'bad_debt_amount' => 'nullable|numeric|min:0', 'bad_debt_receive_date' => 'nullable|date', 'bad_debt_end_date' => 'nullable|date|after_or_equal:bad_debt_receive_date', - 'bad_debt_progress' => 'nullable|in:협의중,소송중,회수완료,대손처리', + 'bad_debt_progress' => [ + 'nullable', + Rule::exists('common_codes', 'code')->where('code_group', 'bad_debt_progress'), + ], // 기타 'memo' => 'nullable|string', 'is_active' => 'nullable|boolean', diff --git a/app/Http/Requests/Client/ClientUpdateRequest.php b/app/Http/Requests/Client/ClientUpdateRequest.php index 115deec..636001f 100644 --- a/app/Http/Requests/Client/ClientUpdateRequest.php +++ b/app/Http/Requests/Client/ClientUpdateRequest.php @@ -3,6 +3,7 @@ namespace App\Http\Requests\Client; use Illuminate\Foundation\Http\FormRequest; +use Illuminate\Validation\Rule; class ClientUpdateRequest extends FormRequest { @@ -17,7 +18,10 @@ public function rules(): array 'client_group_id' => 'nullable|integer', 'client_code' => 'sometimes|string|max:50', 'name' => 'sometimes|string|max:100', - 'client_type' => 'nullable|in:매입,매출,매입매출', + 'client_type' => [ + 'nullable', + Rule::exists('common_codes', 'code')->where('code_group', 'client_type'), + ], // 연락처 정보 'contact_person' => 'nullable|string|max:100', 'phone' => 'nullable|string|max:20', @@ -48,7 +52,10 @@ public function rules(): array 'bad_debt_amount' => 'nullable|numeric|min:0', 'bad_debt_receive_date' => 'nullable|date', 'bad_debt_end_date' => 'nullable|date|after_or_equal:bad_debt_receive_date', - 'bad_debt_progress' => 'nullable|in:협의중,소송중,회수완료,대손처리', + 'bad_debt_progress' => [ + 'nullable', + Rule::exists('common_codes', 'code')->where('code_group', 'bad_debt_progress'), + ], // 기타 'memo' => 'nullable|string', 'is_active' => 'nullable|boolean', diff --git a/app/Http/Requests/Pricing/PriceStoreRequest.php b/app/Http/Requests/Pricing/PriceStoreRequest.php index 588eb00..93f1d44 100644 --- a/app/Http/Requests/Pricing/PriceStoreRequest.php +++ b/app/Http/Requests/Pricing/PriceStoreRequest.php @@ -16,7 +16,11 @@ public function rules(): array { return [ // 품목 연결 (필수) - 'item_type_code' => 'required|string|in:PRODUCT,MATERIAL', + 'item_type_code' => [ + 'required', + 'string', + Rule::exists('common_codes', 'code')->where('code_group', 'item_type'), + ], 'item_id' => 'required|integer', 'client_group_id' => 'nullable|integer', @@ -26,7 +30,7 @@ public function rules(): array 'loss_rate' => 'nullable|numeric|min:0|max:100', // 판매가 정보 - 'margin_rate' => 'nullable|numeric|min:0|max:100', + 'margin_rate' => 'nullable|numeric|min:0', // max 제한 제거 (100% 초과 마진 허용) 'sales_price' => 'nullable|numeric|min:0', 'rounding_rule' => ['nullable', Rule::in(['round', 'ceil', 'floor'])], 'rounding_unit' => ['nullable', Rule::in([1, 10, 100, 1000])], diff --git a/app/Http/Requests/Pricing/PriceUpdateRequest.php b/app/Http/Requests/Pricing/PriceUpdateRequest.php index 267928a..d0bcdd6 100644 --- a/app/Http/Requests/Pricing/PriceUpdateRequest.php +++ b/app/Http/Requests/Pricing/PriceUpdateRequest.php @@ -16,7 +16,11 @@ public function rules(): array { return [ // 품목 연결 (선택) - 'item_type_code' => 'sometimes|string|in:PRODUCT,MATERIAL', + 'item_type_code' => [ + 'sometimes', + 'string', + Rule::exists('common_codes', 'code')->where('code_group', 'item_type'), + ], 'item_id' => 'sometimes|integer', 'client_group_id' => 'nullable|integer', @@ -26,7 +30,7 @@ public function rules(): array 'loss_rate' => 'nullable|numeric|min:0|max:100', // 판매가 정보 - 'margin_rate' => 'nullable|numeric|min:0|max:100', + 'margin_rate' => 'nullable|numeric|min:0', // max 제한 제거 (100% 초과 마진 허용) 'sales_price' => 'nullable|numeric|min:0', 'rounding_rule' => ['nullable', Rule::in(['round', 'ceil', 'floor'])], 'rounding_unit' => ['nullable', Rule::in([1, 10, 100, 1000])], diff --git a/app/Http/Requests/Quote/QuoteStoreRequest.php b/app/Http/Requests/Quote/QuoteStoreRequest.php index acd2864..c484c65 100644 --- a/app/Http/Requests/Quote/QuoteStoreRequest.php +++ b/app/Http/Requests/Quote/QuoteStoreRequest.php @@ -2,8 +2,8 @@ namespace App\Http\Requests\Quote; -use App\Models\Quote\Quote; use Illuminate\Foundation\Http\FormRequest; +use Illuminate\Validation\Rule; class QuoteStoreRequest extends FormRequest { @@ -33,7 +33,10 @@ public function rules(): array 'site_code' => 'nullable|string|max:50', // 제품 정보 - 'product_category' => 'nullable|in:'.Quote::CATEGORY_SCREEN.','.Quote::CATEGORY_STEEL, + 'product_category' => [ + 'nullable', + Rule::exists('common_codes', 'code')->where('code_group', 'product_category'), + ], 'product_id' => 'nullable|integer', 'product_code' => 'nullable|string|max:50', 'product_name' => 'nullable|string|max:100', diff --git a/app/Http/Requests/Quote/QuoteUpdateRequest.php b/app/Http/Requests/Quote/QuoteUpdateRequest.php index 7b70e65..c6137b0 100644 --- a/app/Http/Requests/Quote/QuoteUpdateRequest.php +++ b/app/Http/Requests/Quote/QuoteUpdateRequest.php @@ -2,8 +2,8 @@ namespace App\Http\Requests\Quote; -use App\Models\Quote\Quote; use Illuminate\Foundation\Http\FormRequest; +use Illuminate\Validation\Rule; class QuoteUpdateRequest extends FormRequest { @@ -31,7 +31,10 @@ public function rules(): array 'site_code' => 'nullable|string|max:50', // 제품 정보 - 'product_category' => 'nullable|in:'.Quote::CATEGORY_SCREEN.','.Quote::CATEGORY_STEEL, + 'product_category' => [ + 'nullable', + Rule::exists('common_codes', 'code')->where('code_group', 'product_category'), + ], 'product_id' => 'nullable|integer', 'product_code' => 'nullable|string|max:50', 'product_name' => 'nullable|string|max:100', diff --git a/database/migrations/2025_12_20_222346_add_client_and_quote_codes_to_common_codes.php b/database/migrations/2025_12_20_222346_add_client_and_quote_codes_to_common_codes.php new file mode 100644 index 0000000..a386e34 --- /dev/null +++ b/database/migrations/2025_12_20_222346_add_client_and_quote_codes_to_common_codes.php @@ -0,0 +1,91 @@ + 'PURCHASE', 'name' => '매입', 'sort_order' => 1], + ['code' => 'SALES', 'name' => '매출', 'sort_order' => 2], + ['code' => 'BOTH', 'name' => '매입매출', 'sort_order' => 3], + ]; + + foreach ($clientTypes as $item) { + DB::table('common_codes')->updateOrInsert( + ['code_group' => 'client_type', 'code' => $item['code']], + [ + 'code_group' => 'client_type', + 'code' => $item['code'], + 'name' => $item['name'], + 'sort_order' => $item['sort_order'], + 'is_active' => true, + 'created_at' => $now, + 'updated_at' => $now, + ] + ); + } + + // bad_debt_progress 코드 그룹 (악성채권 진행상태) + $badDebtProgress = [ + ['code' => 'NEGOTIATING', 'name' => '협의중', 'sort_order' => 1], + ['code' => 'LITIGATION', 'name' => '소송중', 'sort_order' => 2], + ['code' => 'RECOVERED', 'name' => '회수완료', 'sort_order' => 3], + ['code' => 'WRITTEN_OFF', 'name' => '대손처리', 'sort_order' => 4], + ]; + + foreach ($badDebtProgress as $item) { + DB::table('common_codes')->updateOrInsert( + ['code_group' => 'bad_debt_progress', 'code' => $item['code']], + [ + 'code_group' => 'bad_debt_progress', + 'code' => $item['code'], + 'name' => $item['name'], + 'sort_order' => $item['sort_order'], + 'is_active' => true, + 'created_at' => $now, + 'updated_at' => $now, + ] + ); + } + + // product_category 코드 그룹 (견적 제품 카테고리) + $productCategories = [ + ['code' => 'SCREEN', 'name' => '스크린', 'sort_order' => 1], + ['code' => 'STEEL', 'name' => '스틸', 'sort_order' => 2], + ]; + + foreach ($productCategories as $item) { + DB::table('common_codes')->updateOrInsert( + ['code_group' => 'product_category', 'code' => $item['code']], + [ + 'code_group' => 'product_category', + 'code' => $item['code'], + 'name' => $item['name'], + 'sort_order' => $item['sort_order'], + 'is_active' => true, + 'created_at' => $now, + 'updated_at' => $now, + ] + ); + } + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + DB::table('common_codes')->where('code_group', 'client_type')->delete(); + DB::table('common_codes')->where('code_group', 'bad_debt_progress')->delete(); + DB::table('common_codes')->where('code_group', 'product_category')->delete(); + } +};