Files
sam-react-prod/src/components/clients/clientDetailConfig.ts
유병철 a1f4c82cec fix: 프로젝트 전체 TypeScript 타입에러 408개 수정 (tsc --noEmit 0 errors)
- 공통 템플릿 타입 수정 (IntegratedDetailTemplate, UniversalListPage)
- 페이지(app/[locale]) 타입 호환성 수정 (80개)
- 재고/자재 모듈 타입 수정 (StockStatus, ReceivingManagement)
- 생산 모듈 타입 수정 (WorkOrders, WorkerScreen, WorkResults)
- 주문/출고 모듈 타입 수정 (ShipmentManagement, Orders)
- 견적/단가 모듈 타입 수정 (Quotes, Pricing)
- 건설 모듈 타입 수정 (49개, 17개 하위 모듈)
- HR 모듈 타입 수정 (CardManagement, VacationManagement 등)
- 설정 모듈 타입 수정 (PermissionManagement, AccountManagement 등)
- 게시판 모듈 타입 수정 (BoardManagement, BoardList 등)
- 회계 모듈 타입 수정 (VendorManagement, BadDebtCollection 등)
- 기타 모듈 타입 수정 (CEODashboard, clients, vehicle 등)
- 유틸/훅/API 타입 수정 (hooks, contexts, lib)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-30 10:07:58 +09:00

269 lines
7.0 KiB
TypeScript

/**
* 거래처(영업) 상세 페이지 설정
* IntegratedDetailTemplate V2 마이그레이션
*/
import { Building2 } from 'lucide-react';
import type { DetailConfig, FieldDefinition, SectionDefinition } from '@/components/templates/IntegratedDetailTemplate/types';
import type { ClientFormData, Client } from '@/hooks/useClientList';
// ===== 거래처 유형 옵션 =====
const CLIENT_TYPE_OPTIONS = [
{ value: '매입', label: '매입' },
{ value: '매출', label: '매출' },
{ value: '매입매출', label: '매입매출' },
];
// ===== 상태 옵션 =====
const STATUS_OPTIONS = [
{ value: 'true', label: '활성' },
{ value: 'false', label: '비활성' },
];
// ===== 필드 정의 =====
export const clientFields: FieldDefinition[] = [
// 기본 정보
{
key: 'businessNo',
label: '사업자등록번호',
type: 'businessNumber',
required: true,
placeholder: '000-00-00000',
validation: [
{ type: 'required', message: '사업자등록번호를 입력해주세요.' },
],
},
{
key: 'clientCode',
label: '거래처 코드',
type: 'text',
disabled: true,
helpText: '자동 생성됩니다',
},
{
key: 'name',
label: '거래처명',
type: 'text',
required: true,
placeholder: '거래처명 입력',
validation: [
{ type: 'required', message: '거래처명을 입력해주세요.' },
{ type: 'minLength', value: 2, message: '거래처명은 2자 이상 입력해주세요.' },
],
},
{
key: 'representative',
label: '대표자명',
type: 'text',
required: true,
placeholder: '대표자명 입력',
validation: [
{ type: 'required', message: '대표자명을 입력해주세요.' },
{ type: 'minLength', value: 2, message: '대표자명은 2자 이상 입력해주세요.' },
],
},
{
key: 'clientType',
label: '거래처 유형',
type: 'radio',
required: true,
options: CLIENT_TYPE_OPTIONS,
},
{
key: 'businessType',
label: '업태',
type: 'text',
placeholder: '제조업, 도소매업 등',
},
{
key: 'businessItem',
label: '종목',
type: 'text',
placeholder: '철강, 건설 등',
},
// 연락처 정보
{
key: 'address',
label: '주소',
type: 'text',
placeholder: '주소 입력',
gridSpan: 2,
},
{
key: 'phone',
label: '전화번호',
type: 'phone',
placeholder: '02-1234-5678',
},
{
key: 'mobile',
label: '모바일',
type: 'phone',
placeholder: '010-1234-5678',
},
{
key: 'fax',
label: '팩스',
type: 'phone',
placeholder: '02-1234-5678',
},
{
key: 'email',
label: '이메일',
type: 'email',
placeholder: 'example@company.com',
validation: [
{
type: 'custom',
message: '올바른 이메일 형식이 아닙니다.',
validate: (value) => {
if (!value) return true; // 선택 필드
return /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(String(value));
},
},
],
},
// 담당자 정보
{
key: 'managerName',
label: '담당자명',
type: 'text',
placeholder: '담당자명 입력',
},
{
key: 'managerTel',
label: '담당자 전화',
type: 'phone',
placeholder: '010-1234-5678',
},
{
key: 'systemManager',
label: '시스템 관리자',
type: 'text',
placeholder: '시스템 관리자명',
},
// 기타 정보
{
key: 'memo',
label: '메모',
type: 'textarea',
placeholder: '메모 입력',
gridSpan: 2,
},
{
key: 'isActive',
label: '상태',
type: 'radio',
options: STATUS_OPTIONS,
// Note: default value is handled by formData initialization
},
];
// ===== 섹션 정의 =====
export const clientSections: SectionDefinition[] = [
{
id: 'basicInfo',
title: '기본 정보',
description: '거래처의 기본 정보를 입력하세요',
fields: ['businessNo', 'clientCode', 'name', 'representative', 'clientType', 'businessType', 'businessItem'],
},
{
id: 'contactInfo',
title: '연락처 정보',
description: '거래처의 연락처 정보를 입력하세요',
fields: ['address', 'phone', 'mobile', 'fax', 'email'],
},
{
id: 'managerInfo',
title: '담당자 정보',
description: '거래처 담당자 정보를 입력하세요',
fields: ['managerName', 'managerTel', 'systemManager'],
},
{
id: 'otherInfo',
title: '기타 정보',
description: '추가 정보를 입력하세요',
fields: ['memo', 'isActive'],
},
];
// ===== 설정 =====
export const clientDetailConfig: DetailConfig<Client> = {
title: '거래처',
description: '거래처 정보를 관리합니다',
icon: Building2,
basePath: '/ko/sales/client-management-sales-admin',
fields: clientFields,
sections: clientSections,
gridColumns: 2,
actions: {
submitLabel: '저장',
cancelLabel: '취소',
showDelete: true,
deleteLabel: '삭제',
showEdit: true,
editLabel: '수정',
showBack: true,
backLabel: '목록',
deleteConfirmMessage: {
title: '거래처 삭제',
description: '이 거래처를 삭제하시겠습니까? 삭제된 데이터는 복구할 수 없습니다.',
},
},
transformInitialData: (data: Client) => ({
businessNo: data.businessNo || '',
clientCode: data.code || '',
name: data.name || '',
representative: data.representative || '',
clientType: data.clientType || '매입',
businessType: data.businessType || '',
businessItem: data.businessItem || '',
address: data.address || '',
phone: data.phone || '',
mobile: data.mobile || '',
fax: data.fax || '',
email: data.email || '',
managerName: data.managerName || '',
managerTel: data.managerTel || '',
systemManager: data.systemManager || '',
memo: data.memo || '',
isActive: data.status === '활성' ? 'true' : 'false',
}),
transformSubmitData: (formData): Partial<ClientFormData> => ({
clientCode: formData.clientCode as string,
name: formData.name as string,
businessNo: formData.businessNo as string,
representative: formData.representative as string,
clientType: formData.clientType as ClientFormData['clientType'],
businessType: formData.businessType as string,
businessItem: formData.businessItem as string,
address: formData.address as string,
phone: formData.phone as string,
mobile: formData.mobile as string,
fax: formData.fax as string,
email: formData.email as string,
managerName: formData.managerName as string,
managerTel: formData.managerTel as string,
systemManager: formData.systemManager as string,
memo: formData.memo as string,
isActive: formData.isActive === 'true',
// 기본값 설정
purchasePaymentDay: '말일',
salesPaymentDay: '말일',
taxAgreement: false,
taxAmount: '',
taxStartDate: '',
taxEndDate: '',
badDebt: false,
badDebtAmount: '',
badDebtReceiveDate: '',
badDebtEndDate: '',
badDebtProgress: '',
accountId: '',
accountPassword: '',
}),
};