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:
@@ -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);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user