Files
sam-react-prod/src/components/dev/generators/accountingData.ts

232 lines
5.7 KiB
TypeScript
Raw Normal View History

/**
* (, , )
*/
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),
},
};
}