126 lines
3.3 KiB
TypeScript
126 lines
3.3 KiB
TypeScript
|
|
/**
|
||
|
|
* 견적 샘플 데이터 생성기
|
||
|
|
*/
|
||
|
|
|
||
|
|
import {
|
||
|
|
randomPick,
|
||
|
|
randomInt,
|
||
|
|
randomInt100,
|
||
|
|
randomPhone,
|
||
|
|
dateAfterDays,
|
||
|
|
today,
|
||
|
|
randomFloor,
|
||
|
|
nextCode,
|
||
|
|
resetCodeCounter,
|
||
|
|
randomRemark,
|
||
|
|
tempId,
|
||
|
|
} from './index';
|
||
|
|
import type { QuoteFormData, QuoteItem } from '@/components/quotes/QuoteRegistration';
|
||
|
|
import type { Vendor } from '@/components/accounting/VendorManagement';
|
||
|
|
import type { FinishedGoods } from '@/components/quotes/actions';
|
||
|
|
|
||
|
|
// 제품 카테고리
|
||
|
|
const PRODUCT_CATEGORIES = ['SCREEN', 'STEEL'];
|
||
|
|
|
||
|
|
// 가이드레일 설치 유형
|
||
|
|
const GUIDE_RAIL_TYPES = ['wall', 'floor'];
|
||
|
|
|
||
|
|
// 모터 전원
|
||
|
|
const MOTOR_POWERS = ['single', 'three'];
|
||
|
|
|
||
|
|
// 연동제어기
|
||
|
|
const CONTROLLERS = ['basic', 'smart', 'premium'];
|
||
|
|
|
||
|
|
// 작성자 목록 (실제로는 로그인 사용자 사용)
|
||
|
|
const WRITERS = ['드미트리', '김철수', '이영희', '박지민', '최서연'];
|
||
|
|
|
||
|
|
/**
|
||
|
|
* 견적 품목 1개 생성
|
||
|
|
*/
|
||
|
|
export function generateQuoteItem(
|
||
|
|
index: number,
|
||
|
|
products?: FinishedGoods[]
|
||
|
|
): QuoteItem {
|
||
|
|
const category = randomPick(PRODUCT_CATEGORIES);
|
||
|
|
|
||
|
|
// 카테고리에 맞는 제품 필터링
|
||
|
|
let productName = '';
|
||
|
|
if (products && products.length > 0) {
|
||
|
|
const categoryProducts = products.filter(p =>
|
||
|
|
p.categoryCode?.toUpperCase() === category || !p.categoryCode
|
||
|
|
);
|
||
|
|
if (categoryProducts.length > 0) {
|
||
|
|
productName = randomPick(categoryProducts).name;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
// 제품명이 없으면 기본값
|
||
|
|
if (!productName) {
|
||
|
|
productName = category === 'SCREEN'
|
||
|
|
? randomPick(['방화스크린 FSC-1', '방화스크린 FSC-2', '방화스크린 FSC-3'])
|
||
|
|
: randomPick(['방화철재셔터 FSD-1', '방화철재셔터 FSD-2']);
|
||
|
|
}
|
||
|
|
|
||
|
|
return {
|
||
|
|
id: tempId(),
|
||
|
|
floor: randomFloor(),
|
||
|
|
code: nextCode(),
|
||
|
|
productCategory: category,
|
||
|
|
productName,
|
||
|
|
openWidth: String(randomInt100(2000, 5000)),
|
||
|
|
openHeight: String(randomInt100(2000, 5000)),
|
||
|
|
guideRailType: randomPick(GUIDE_RAIL_TYPES),
|
||
|
|
motorPower: randomPick(MOTOR_POWERS),
|
||
|
|
controller: randomPick(CONTROLLERS),
|
||
|
|
quantity: randomInt(1, 10),
|
||
|
|
wingSize: '50',
|
||
|
|
inspectionFee: 50000,
|
||
|
|
};
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* 견적 폼 데이터 생성
|
||
|
|
*/
|
||
|
|
export interface GenerateQuoteDataOptions {
|
||
|
|
clients?: Vendor[]; // 거래처 목록
|
||
|
|
products?: FinishedGoods[]; // 제품 목록
|
||
|
|
itemCount?: number; // 품목 수 (기본: 1~5개 랜덤)
|
||
|
|
}
|
||
|
|
|
||
|
|
export function generateQuoteData(options: GenerateQuoteDataOptions = {}): QuoteFormData {
|
||
|
|
const { clients = [], products = [], itemCount } = options;
|
||
|
|
|
||
|
|
// 부호 카운터 리셋
|
||
|
|
resetCodeCounter();
|
||
|
|
|
||
|
|
// 거래처 선택
|
||
|
|
let clientId = '';
|
||
|
|
let clientName = '';
|
||
|
|
if (clients.length > 0) {
|
||
|
|
const client = randomPick(clients);
|
||
|
|
clientId = String(client.id);
|
||
|
|
clientName = client.name;
|
||
|
|
}
|
||
|
|
|
||
|
|
// 품목 수 결정
|
||
|
|
const count = itemCount ?? randomInt(1, 5);
|
||
|
|
|
||
|
|
// 품목 생성
|
||
|
|
const items: QuoteItem[] = [];
|
||
|
|
for (let i = 0; i < count; i++) {
|
||
|
|
items.push(generateQuoteItem(i, products));
|
||
|
|
}
|
||
|
|
|
||
|
|
return {
|
||
|
|
registrationDate: today(),
|
||
|
|
writer: randomPick(WRITERS),
|
||
|
|
clientId,
|
||
|
|
clientName,
|
||
|
|
siteName: clientName ? `${clientName} 현장` : '테스트 현장',
|
||
|
|
manager: randomPick(['김담당', '이담당', '박담당', '최담당']),
|
||
|
|
contact: randomPhone(),
|
||
|
|
dueDate: dateAfterDays(7), // 1주일 후
|
||
|
|
remarks: randomRemark(),
|
||
|
|
items,
|
||
|
|
};
|
||
|
|
}
|