feat: client_code 백엔드 자동 생성으로 변경

- ClientStoreRequest: client_code 필수→nullable 변경
- ClientService.store(): 프론트 코드 무시, generateClientCode() 자동 생성
- ClientService.update(): client_code 변경 불가 처리
- 코드 형식: 8자리 영숫자 (예: A3B7X9K2)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
2025-12-21 16:32:44 +09:00
parent 72ba1c560b
commit b74297a75b
2 changed files with 35 additions and 17 deletions

View File

@@ -54,13 +54,8 @@ public function store(array $data)
{
$tenantId = $this->tenantId();
// client_code 중복 검사
$exists = Client::where('tenant_id', $tenantId)
->where('client_code', $data['client_code'])
->exists();
if ($exists) {
throw new BadRequestHttpException(__('error.duplicate_code'));
}
// client_code 자동 생성 (프론트에서 보내도 무시)
$data['client_code'] = $this->generateClientCode($tenantId);
$data['tenant_id'] = $tenantId;
$data['is_active'] = $data['is_active'] ?? true;
@@ -68,6 +63,36 @@ public function store(array $data)
return Client::create($data);
}
/**
* 유니크한 client_code 자동 생성
* 형식: 8자리 영숫자 (예: A3B7X9K2)
*/
private function generateClientCode(int $tenantId): string
{
$maxAttempts = 10;
$attempt = 0;
do {
// 8자리 영숫자 코드 생성 (대문자 + 숫자)
$code = strtoupper(substr(bin2hex(random_bytes(4)), 0, 8));
// 중복 검사
$exists = Client::withoutGlobalScopes()
->where('tenant_id', $tenantId)
->where('client_code', $code)
->exists();
$attempt++;
} while ($exists && $attempt < $maxAttempts);
if ($exists) {
// 극히 드문 경우: timestamp 추가하여 유니크성 보장
$code = strtoupper(substr(bin2hex(random_bytes(2)), 0, 4).dechex(time() % 0xFFFF));
}
return $code;
}
/** 수정 */
public function update(int $id, array $data)
{
@@ -78,15 +103,8 @@ public function update(int $id, array $data)
throw new NotFoundHttpException(__('error.not_found'));
}
// client_code 변경 시 중복 검사
if (isset($data['client_code']) && $data['client_code'] !== $client->client_code) {
$exists = Client::where('tenant_id', $tenantId)
->where('client_code', $data['client_code'])
->exists();
if ($exists) {
throw new BadRequestHttpException(__('error.duplicate_code'));
}
}
// client_code 변경 불가 (프론트에서 보내도 무시)
unset($data['client_code']);
$client->update($data);