232 lines
5.7 KiB
TypeScript
232 lines
5.7 KiB
TypeScript
|
|
/**
|
||
|
|
* 회계 샘플 데이터 생성기 (입금, 출금, 매입)
|
||
|
|
*/
|
||
|
|
|
||
|
|
import {
|
||
|
|
randomPick,
|
||
|
|
randomInt,
|
||
|
|
today,
|
||
|
|
randomRemark,
|
||
|
|
} from './index';
|
||
|
|
|
||
|
|
// ===== 공통 상수 =====
|
||
|
|
|
||
|
|
// 거래처 목록 (실제로는 API에서 가져옴)
|
||
|
|
const SAMPLE_VENDORS = [
|
||
|
|
{ id: '1', name: '(주)삼성전자' },
|
||
|
|
{ id: '2', name: '(주)LG화학' },
|
||
|
|
{ id: '3', name: '현대중공업' },
|
||
|
|
{ id: '4', name: '(주)포스코' },
|
||
|
|
{ id: '5', name: '한화솔루션' },
|
||
|
|
];
|
||
|
|
|
||
|
|
// 계좌명 목록
|
||
|
|
const ACCOUNT_NAMES = [
|
||
|
|
'기업은행 1234-5678-9012',
|
||
|
|
'국민은행 111-22-33333',
|
||
|
|
'신한은행 110-123-456789',
|
||
|
|
'우리은행 1002-123-456789',
|
||
|
|
'하나은행 888-123456-78901',
|
||
|
|
];
|
||
|
|
|
||
|
|
// ===== 입금 관련 =====
|
||
|
|
|
||
|
|
// 입금 유형
|
||
|
|
const DEPOSIT_TYPES = ['revenue', 'deposit', 'sales', 'other', 'unset'];
|
||
|
|
|
||
|
|
// 입금자명
|
||
|
|
const DEPOSITOR_NAMES = [
|
||
|
|
'홍길동',
|
||
|
|
'김철수',
|
||
|
|
'이영희',
|
||
|
|
'박민수',
|
||
|
|
'최지영',
|
||
|
|
'(주)삼성전자',
|
||
|
|
'(주)LG화학',
|
||
|
|
'현대중공업',
|
||
|
|
];
|
||
|
|
|
||
|
|
// 입금 적요
|
||
|
|
const DEPOSIT_NOTES = [
|
||
|
|
'제품 판매대금',
|
||
|
|
'선수금 입금',
|
||
|
|
'용역비 입금',
|
||
|
|
'대금 회수',
|
||
|
|
'계약금 입금',
|
||
|
|
'잔금 입금',
|
||
|
|
'기타 입금',
|
||
|
|
'',
|
||
|
|
];
|
||
|
|
|
||
|
|
export interface DepositFormData {
|
||
|
|
depositDate: string;
|
||
|
|
accountName: string;
|
||
|
|
depositorName: string;
|
||
|
|
depositAmount: number;
|
||
|
|
note: string;
|
||
|
|
vendorId: string;
|
||
|
|
depositType: string;
|
||
|
|
}
|
||
|
|
|
||
|
|
export interface GenerateDepositDataOptions {
|
||
|
|
vendors?: Array<{ id: string; name: string }>;
|
||
|
|
}
|
||
|
|
|
||
|
|
export function generateDepositData(options: GenerateDepositDataOptions = {}): DepositFormData {
|
||
|
|
const { vendors = SAMPLE_VENDORS } = options;
|
||
|
|
const vendor = randomPick(vendors);
|
||
|
|
|
||
|
|
return {
|
||
|
|
depositDate: today(),
|
||
|
|
accountName: randomPick(ACCOUNT_NAMES),
|
||
|
|
depositorName: randomPick(DEPOSITOR_NAMES),
|
||
|
|
depositAmount: randomInt(100000, 10000000),
|
||
|
|
note: randomPick(DEPOSIT_NOTES),
|
||
|
|
vendorId: vendor.id,
|
||
|
|
depositType: randomPick(DEPOSIT_TYPES.filter(t => t !== 'unset')), // unset 제외
|
||
|
|
};
|
||
|
|
}
|
||
|
|
|
||
|
|
// ===== 출금 관련 =====
|
||
|
|
|
||
|
|
// 출금 유형
|
||
|
|
const WITHDRAWAL_TYPES = ['expense', 'payment', 'purchase', 'salary', 'other', 'unset'];
|
||
|
|
|
||
|
|
// 수취인명
|
||
|
|
const RECIPIENT_NAMES = [
|
||
|
|
'(주)삼성전자',
|
||
|
|
'(주)LG화학',
|
||
|
|
'현대중공업',
|
||
|
|
'(주)포스코',
|
||
|
|
'한화솔루션',
|
||
|
|
'홍길동',
|
||
|
|
'김철수',
|
||
|
|
'국세청',
|
||
|
|
];
|
||
|
|
|
||
|
|
// 출금 적요
|
||
|
|
const WITHDRAWAL_NOTES = [
|
||
|
|
'자재 구매대금',
|
||
|
|
'외주 가공비',
|
||
|
|
'임대료 지급',
|
||
|
|
'전기요금',
|
||
|
|
'수도요금',
|
||
|
|
'통신비',
|
||
|
|
'급여 지급',
|
||
|
|
'세금 납부',
|
||
|
|
'',
|
||
|
|
];
|
||
|
|
|
||
|
|
export interface WithdrawalFormData {
|
||
|
|
withdrawalDate: string;
|
||
|
|
accountName: string;
|
||
|
|
recipientName: string;
|
||
|
|
withdrawalAmount: number;
|
||
|
|
note: string;
|
||
|
|
vendorId: string;
|
||
|
|
withdrawalType: string;
|
||
|
|
}
|
||
|
|
|
||
|
|
export interface GenerateWithdrawalDataOptions {
|
||
|
|
vendors?: Array<{ id: string; name: string }>;
|
||
|
|
}
|
||
|
|
|
||
|
|
export function generateWithdrawalData(options: GenerateWithdrawalDataOptions = {}): WithdrawalFormData {
|
||
|
|
const { vendors = SAMPLE_VENDORS } = options;
|
||
|
|
const vendor = randomPick(vendors);
|
||
|
|
|
||
|
|
return {
|
||
|
|
withdrawalDate: today(),
|
||
|
|
accountName: randomPick(ACCOUNT_NAMES),
|
||
|
|
recipientName: randomPick(RECIPIENT_NAMES),
|
||
|
|
withdrawalAmount: randomInt(50000, 5000000),
|
||
|
|
note: randomPick(WITHDRAWAL_NOTES),
|
||
|
|
vendorId: vendor.id,
|
||
|
|
withdrawalType: randomPick(WITHDRAWAL_TYPES.filter(t => t !== 'unset')), // unset 제외
|
||
|
|
};
|
||
|
|
}
|
||
|
|
|
||
|
|
// ===== 매입(지출결의서) 관련 =====
|
||
|
|
|
||
|
|
// 문서 유형
|
||
|
|
const DOCUMENT_TYPES = ['proposal', 'expenseReport', 'expenseEstimate'];
|
||
|
|
|
||
|
|
// 지출결의서 제목
|
||
|
|
const PROPOSAL_TITLES = [
|
||
|
|
'사무용품 구매 요청',
|
||
|
|
'장비 수리비 지출 요청',
|
||
|
|
'출장비 정산 요청',
|
||
|
|
'회의비 지출 요청',
|
||
|
|
'교육비 지출 요청',
|
||
|
|
'소프트웨어 라이선스 구매',
|
||
|
|
'마케팅 비용 지출 요청',
|
||
|
|
'복리후생비 지출 요청',
|
||
|
|
];
|
||
|
|
|
||
|
|
// 지출결의서 내용
|
||
|
|
const PROPOSAL_DESCRIPTIONS = [
|
||
|
|
'업무 효율 향상을 위한 사무용품 구매가 필요합니다.',
|
||
|
|
'노후화된 장비의 수리가 필요하여 지출을 요청드립니다.',
|
||
|
|
'고객 미팅을 위한 출장 경비를 정산해주시기 바랍니다.',
|
||
|
|
'팀 회의 진행을 위한 다과 비용입니다.',
|
||
|
|
'직원 역량 강화를 위한 교육비 지출입니다.',
|
||
|
|
'업무용 소프트웨어 라이선스 갱신 비용입니다.',
|
||
|
|
'신규 고객 유치를 위한 마케팅 활동 비용입니다.',
|
||
|
|
'직원 복지 증진을 위한 지출입니다.',
|
||
|
|
];
|
||
|
|
|
||
|
|
// 지출 사유
|
||
|
|
const PROPOSAL_REASONS = [
|
||
|
|
'업무 효율성 향상',
|
||
|
|
'고객 서비스 개선',
|
||
|
|
'비용 절감 효과',
|
||
|
|
'법적 의무 이행',
|
||
|
|
'안전 관리 필수',
|
||
|
|
'계약 조건 이행',
|
||
|
|
'직원 역량 강화',
|
||
|
|
'시설 유지보수',
|
||
|
|
];
|
||
|
|
|
||
|
|
export interface PurchaseApprovalFormData {
|
||
|
|
basicInfo: {
|
||
|
|
drafter: string;
|
||
|
|
draftDate: string;
|
||
|
|
documentNo: string;
|
||
|
|
documentType: string;
|
||
|
|
};
|
||
|
|
proposalData: {
|
||
|
|
vendor: string;
|
||
|
|
vendorPaymentDate: string;
|
||
|
|
title: string;
|
||
|
|
description: string;
|
||
|
|
reason: string;
|
||
|
|
estimatedCost: number;
|
||
|
|
};
|
||
|
|
}
|
||
|
|
|
||
|
|
export interface GeneratePurchaseApprovalDataOptions {
|
||
|
|
vendors?: Array<{ id: string; name: string }>;
|
||
|
|
documentType?: string;
|
||
|
|
}
|
||
|
|
|
||
|
|
export function generatePurchaseApprovalData(options: GeneratePurchaseApprovalDataOptions = {}): PurchaseApprovalFormData {
|
||
|
|
const { vendors = SAMPLE_VENDORS, documentType = 'proposal' } = options;
|
||
|
|
const vendor = randomPick(vendors);
|
||
|
|
|
||
|
|
return {
|
||
|
|
basicInfo: {
|
||
|
|
drafter: '홍길동',
|
||
|
|
draftDate: new Date().toISOString().slice(0, 16).replace('T', ' '),
|
||
|
|
documentNo: '',
|
||
|
|
documentType,
|
||
|
|
},
|
||
|
|
proposalData: {
|
||
|
|
vendor: vendor.name,
|
||
|
|
vendorPaymentDate: today(),
|
||
|
|
title: randomPick(PROPOSAL_TITLES),
|
||
|
|
description: randomPick(PROPOSAL_DESCRIPTIONS),
|
||
|
|
reason: randomPick(PROPOSAL_REASONS),
|
||
|
|
estimatedCost: randomInt(100000, 5000000),
|
||
|
|
},
|
||
|
|
};
|
||
|
|
}
|