Files
sam-api/app/Http/Requests/Client/ClientUpdateRequest.php
권혁성 3917ea3831 fix: 거래처 연체/악성채권 저장 버그 수정
- ClientUpdateRequest, ClientStoreRequest에 is_overdue 필드 추가
  - FormRequest rules에 누락되어 프론트엔드 값이 필터링됨
- ClientService.update()에 bad_debt 토글 연동 로직 추가
  - bad_debt=true → BadDebt 레코드 생성 (status: collecting)
  - bad_debt=false → BadDebt 레코드 종료 (status: recovered)
- ClientService의 has_bad_debt 판단 로직 수정
  - 기존: sum(debt_amount) > 0
  - 변경: exists() - 금액과 무관하게 레코드 존재 여부로 판단

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-27 22:39:04 +09:00

103 lines
3.4 KiB
PHP

<?php
namespace App\Http\Requests\Client;
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Validation\Rule;
class ClientUpdateRequest extends FormRequest
{
public function authorize(): bool
{
return true;
}
protected function prepareForValidation(): void
{
$this->convertCommonCodeNameToCode('client_type');
$this->convertCommonCodeNameToCode('bad_debt_progress');
}
/**
* common_codes의 name을 code로 변환
*/
private function convertCommonCodeNameToCode(string $field): void
{
$value = $this->input($field);
if (! $value) {
return;
}
// 이미 code인지 확인
$existsAsCode = \DB::table('common_codes')
->where('code_group', $field)
->where('code', $value)
->exists();
if ($existsAsCode) {
return;
}
// name으로 code 조회
$code = \DB::table('common_codes')
->where('code_group', $field)
->where('name', $value)
->value('code');
if ($code) {
$this->merge([$field => $code]);
}
}
public function rules(): array
{
return [
'client_group_id' => 'nullable|integer',
'client_code' => 'sometimes|string|max:50',
'name' => 'sometimes|string|max:100',
'client_type' => [
'nullable',
Rule::exists('common_codes', 'code')->where('code_group', 'client_type'),
],
// 연락처 정보
'contact_person' => 'nullable|string|max:100',
'phone' => 'nullable|string|max:20',
'mobile' => 'nullable|string|max:20',
'fax' => 'nullable|string|max:20',
'email' => 'nullable|email|max:100',
'address' => 'nullable|string|max:255',
// 담당자 정보
'manager_name' => 'nullable|string|max:50',
'manager_tel' => 'nullable|string|max:20',
'system_manager' => 'nullable|string|max:50',
// 발주처 설정
'account_id' => 'nullable|string|max:50',
'account_password' => 'nullable|string|max:255',
'purchase_payment_day' => 'nullable|string|max:20',
'sales_payment_day' => 'nullable|string|max:20',
// 사업자 정보
'business_no' => 'nullable|string|max:20',
'business_type' => 'nullable|string|max:50',
'business_item' => 'nullable|string|max:100',
// 약정 세금
'tax_agreement' => 'nullable|boolean',
'tax_amount' => 'nullable|numeric|min:0',
'tax_start_date' => 'nullable|date',
'tax_end_date' => 'nullable|date|after_or_equal:tax_start_date',
// 악성채권 정보
'bad_debt' => 'nullable|boolean',
'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',
Rule::exists('common_codes', 'code')->where('code_group', 'bad_debt_progress'),
],
// 기타
'memo' => 'nullable|string',
'is_active' => 'nullable|boolean',
'is_overdue' => 'nullable|boolean',
];
}
}