From 496aec04f5f1dbda22aeea2450af10e31c1fec48 Mon Sep 17 00:00:00 2001 From: kent Date: Sat, 20 Dec 2025 22:28:38 +0900 Subject: [PATCH] =?UTF-8?q?refactor:=20=ED=95=98=EB=93=9C=EC=BD=94?= =?UTF-8?q?=EB=94=A9=EB=90=9C=20validation=EC=9D=84=20common=5Fcodes=20?= =?UTF-8?q?=EA=B8=B0=EB=B0=98=EC=9C=BC=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - item_type_code: 기존 PRODUCT,MATERIAL 고정값 → common_codes 조회 - margin_rate: max:100 제한 제거 (100% 초과 마진 허용) - client_type: 매입/매출/매입매출 common_codes로 이동 - bad_debt_progress: 협의중/소송중/회수완료/대손처리 common_codes로 이동 - product_category: 스크린/스틸 common_codes로 이동 - 마이그레이션 추가: client_type, bad_debt_progress, product_category 코드 그룹 수정 파일: - PriceStoreRequest, PriceUpdateRequest - ClientStoreRequest, ClientUpdateRequest - QuoteStoreRequest, QuoteUpdateRequest 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- .../Requests/Client/ClientStoreRequest.php | 11 ++- .../Requests/Client/ClientUpdateRequest.php | 11 ++- .../Requests/Pricing/PriceStoreRequest.php | 8 +- .../Requests/Pricing/PriceUpdateRequest.php | 8 +- app/Http/Requests/Quote/QuoteStoreRequest.php | 7 +- .../Requests/Quote/QuoteUpdateRequest.php | 7 +- ...client_and_quote_codes_to_common_codes.php | 91 +++++++++++++++++++ 7 files changed, 131 insertions(+), 12 deletions(-) create mode 100644 database/migrations/2025_12_20_222346_add_client_and_quote_codes_to_common_codes.php 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(); + } +};