fix: [finance] 거래처 등록 필수값 개선 (거래처명+사업자번호만 필수)

- 백엔드: bizNo 필수 검증 추가, trade_type/status null-safe 처리
- 프론트엔드: 사업자번호 필수 검증 + 라벨에 * 표시 추가
- 나머지 필드 비어있어도 저장 가능하도록 NOT NULL 컬럼 기본값 보장
This commit is contained in:
김보곤
2026-03-09 10:54:07 +09:00
parent f855da6c71
commit 888e810d31
2 changed files with 5 additions and 3 deletions

View File

@@ -83,6 +83,7 @@ public function store(Request $request): JsonResponse
{
$request->validate([
'name' => 'required|string|max:100',
'bizNo' => 'required|string|max:20',
'type' => 'nullable|string|max:100',
'category' => 'nullable|string|max:100',
]);
@@ -92,7 +93,7 @@ public function store(Request $request): JsonResponse
$partner = TradingPartner::create([
'tenant_id' => $tenantId,
'name' => $request->input('name'),
'trade_type' => $request->input('tradeType', 'sales'),
'trade_type' => $request->input('tradeType') ?? 'sales',
'type' => $request->input('type') ?? 'vendor',
'category' => $request->input('category') ?? '기타',
'biz_no' => $request->input('bizNo'),
@@ -103,7 +104,7 @@ public function store(Request $request): JsonResponse
'address' => $request->input('address'),
'manager' => $request->input('manager'),
'manager_phone' => $request->input('managerPhone'),
'status' => $request->input('status', 'active'),
'status' => $request->input('status') ?? 'active',
'memo' => $request->input('memo'),
]);

View File

@@ -127,6 +127,7 @@ function PartnersManagement() {
};
const handleSave = async () => {
if (!formData.name) { alert('거래처명을 입력해주세요.'); return; }
if (!formData.bizNo) { alert('사업자번호를 입력해주세요.'); return; }
setSaving(true);
try {
const url = modalMode === 'add' ? '/finance/partners/store' : `/finance/partners/${editingItem.id}`;
@@ -362,7 +363,7 @@ className={`mb-4 border-2 border-dashed rounded-xl p-6 text-center cursor-pointe
</div>
<div><label className="block text-sm font-medium text-gray-700 mb-1">거래처명 *</label><input type="text" value={formData.name} onChange={(e) => setFormData(prev => ({ ...prev, name: e.target.value }))} placeholder="거래처명" className="w-full px-3 py-2 border border-gray-300 rounded-lg" /></div>
<div className="grid grid-cols-2 gap-4">
<div><label className="block text-sm font-medium text-gray-700 mb-1">사업자번호</label><input type="text" value={formData.bizNo} onChange={(e) => setFormData(prev => ({ ...prev, bizNo: e.target.value }))} placeholder="123-45-67890" className="w-full px-3 py-2 border border-gray-300 rounded-lg" /></div>
<div><label className="block text-sm font-medium text-gray-700 mb-1">사업자번호 *</label><input type="text" value={formData.bizNo} onChange={(e) => setFormData(prev => ({ ...prev, bizNo: e.target.value }))} placeholder="123-45-67890" className="w-full px-3 py-2 border border-gray-300 rounded-lg" /></div>
<div><label className="block text-sm font-medium text-gray-700 mb-1">대표자</label><input type="text" value={formData.ceo} onChange={(e) => setFormData(prev => ({ ...prev, ceo: e.target.value }))} placeholder="대표자명" className="w-full px-3 py-2 border border-gray-300 rounded-lg" /></div>
</div>
<div className="grid grid-cols-2 gap-4">