Files
alla-allaos-fullstack/src/features/crm-demo/data/mock-crm.ts
phaichayon b8cd39eaa4 task-b
task-b.1
complere
2026-06-15 11:19:31 +07:00

1378 lines
37 KiB
TypeScript

import type {
ApprovalItem,
AuditEvent,
ContactShare,
ContactShareLog,
CrmBranch,
CrmSalesperson,
Customer,
CustomerContact,
DocumentSequence,
Enquiry,
MasterOption,
Quotation,
QuotationTemplate
} from '../api/types';
export interface CrmMockState {
branches: CrmBranch[];
salespersons: CrmSalesperson[];
customers: Customer[];
contacts: CustomerContact[];
contactShares: ContactShare[];
contactShareLogs: ContactShareLog[];
enquiries: Enquiry[];
quotations: Quotation[];
approvals: ApprovalItem[];
auditEvents: AuditEvent[];
sequences: DocumentSequence[];
masterOptions: MasterOption[];
templates: QuotationTemplate[];
}
export const initialCrmState: CrmMockState = {
branches: [
{ id: 'bkk', code: 'BKK', name: 'Bangkok HQ', region: 'Central' },
{ id: 'chn', code: 'CHN', name: 'Chiang Mai Branch', region: 'North' }
],
salespersons: [
{ id: 'sp-1', name: 'Krit S.', nickname: 'Krit', branchId: 'bkk', role: 'sales' },
{ id: 'sp-2', name: 'Nicha P.', nickname: 'Nicha', branchId: 'bkk', role: 'sale_admin' },
{ id: 'sp-3', name: 'Ton A.', nickname: 'Ton', branchId: 'chn', role: 'sales' }
],
customers: [
{
id: 'cus-1',
code: 'CUS-BKK-001',
name: 'Siam Metro Development',
taxId: '0105556100011',
address: '88 Rama 9 Road',
province: 'Bangkok',
district: 'Huai Khwang',
subDistrict: 'Bang Kapi',
postalCode: '10310',
phone: '02-555-1001',
fax: '02-555-1999',
email: 'procurement@siammetro.co.th',
customerType: 'developer',
customerStatus: 'active',
branchId: 'bkk',
contactIds: ['ct-1', 'ct-2']
},
{
id: 'cus-2',
code: 'CUS-BKK-002',
name: 'Prime Lift Engineering',
taxId: '0105556100012',
address: '19 Vibhavadi Rangsit',
province: 'Bangkok',
district: 'Chatuchak',
subDistrict: 'Chom Phon',
postalCode: '10900',
phone: '02-555-2002',
email: 'sales@primelift.co.th',
customerType: 'contractor',
customerStatus: 'active',
branchId: 'bkk',
contactIds: ['ct-3', 'ct-4']
},
{
id: 'cus-3',
code: 'CUS-CHN-003',
name: 'Northern Cold Chain',
taxId: '0505556100013',
address: '125 Super Highway',
province: 'Chiang Mai',
district: 'Mueang',
subDistrict: 'Wat Ket',
postalCode: '50000',
phone: '053-555-3003',
email: 'project@ncc.co.th',
customerType: 'owner',
customerStatus: 'prospect',
branchId: 'chn',
contactIds: ['ct-5', 'ct-6']
},
{
id: 'cus-4',
code: 'CUS-BKK-004',
name: 'Urban Dock Solution',
taxId: '0105556100014',
address: '77 Bangna-Trad KM.8',
province: 'Samut Prakan',
district: 'Bang Phli',
subDistrict: 'Bang Kaeo',
postalCode: '10540',
phone: '02-555-4004',
email: 'admin@urbandock.asia',
customerType: 'consultant',
customerStatus: 'active',
branchId: 'bkk',
contactIds: ['ct-7', 'ct-8']
},
{
id: 'cus-5',
code: 'CUS-CHN-005',
name: 'Lanna Solar Estate',
taxId: '0505556100015',
address: '199 Ring Road',
province: 'Chiang Mai',
district: 'San Sai',
subDistrict: 'Nong Chom',
postalCode: '50210',
phone: '053-555-5005',
email: 'energy@lannasolar.co.th',
customerType: 'developer',
customerStatus: 'inactive',
branchId: 'chn',
contactIds: ['ct-9', 'ct-10']
}
],
contacts: [
{
id: 'ct-1',
customerId: 'cus-1',
name: 'Ploy Tantip',
position: 'Procurement Manager',
email: 'ploy@siammetro.co.th',
phone: '081-111-1111',
isPrimary: true
},
{
id: 'ct-2',
customerId: 'cus-1',
name: 'Vee Chan',
position: 'Project Engineer',
email: 'vee@siammetro.co.th',
phone: '081-111-1112'
},
{
id: 'ct-3',
customerId: 'cus-2',
name: 'Boss K.',
position: 'Managing Director',
email: 'boss@primelift.co.th',
phone: '082-222-2221',
isPrimary: true
},
{
id: 'ct-4',
customerId: 'cus-2',
name: 'Jane R.',
position: 'Estimator',
email: 'jane@primelift.co.th',
phone: '082-222-2222'
},
{
id: 'ct-5',
customerId: 'cus-3',
name: 'Aon M.',
position: 'Operations Head',
email: 'aon@ncc.co.th',
phone: '083-333-3331',
isPrimary: true
},
{
id: 'ct-6',
customerId: 'cus-3',
name: 'Max P.',
position: 'Warehouse Lead',
email: 'max@ncc.co.th',
phone: '083-333-3332'
},
{
id: 'ct-7',
customerId: 'cus-4',
name: 'Mint T.',
position: 'Design Consultant',
email: 'mint@urbandock.asia',
phone: '084-444-4441',
isPrimary: true
},
{
id: 'ct-8',
customerId: 'cus-4',
name: 'Ken D.',
position: 'Project Coordinator',
email: 'ken@urbandock.asia',
phone: '084-444-4442'
},
{
id: 'ct-9',
customerId: 'cus-5',
name: 'Fah N.',
position: 'Energy Planning Lead',
email: 'fah@lannasolar.co.th',
phone: '085-555-5551',
isPrimary: true
},
{
id: 'ct-10',
customerId: 'cus-5',
name: 'Palm J.',
position: 'Plant Director',
email: 'palm@lannasolar.co.th',
phone: '085-555-5552'
}
],
contactShares: [
{
id: 'share-1',
contactId: 'ct-1',
sharedWithUserId: 'u-1',
sharedWithUserName: 'Nicha P.',
permission: 'view',
createdAt: '2026-06-01T09:00:00.000Z'
},
{
id: 'share-2',
contactId: 'ct-7',
sharedWithUserId: 'u-2',
sharedWithUserName: 'Ton A.',
permission: 'edit',
createdAt: '2026-06-03T10:30:00.000Z'
}
],
contactShareLogs: [
{
id: 'share-log-1',
contactId: 'ct-1',
action: 'SHARE',
targetUserName: 'Nicha P.',
actorName: 'Krit S.',
createdAt: '2026-06-01T09:00:00.000Z'
},
{
id: 'share-log-2',
contactId: 'ct-7',
action: 'SHARE',
targetUserName: 'Ton A.',
actorName: 'Krit S.',
createdAt: '2026-06-03T10:30:00.000Z'
},
{
id: 'share-log-3',
contactId: 'ct-7',
action: 'REVOKE',
targetUserName: 'Ton A.',
actorName: 'Nicha P.',
createdAt: '2026-06-07T14:45:00.000Z'
}
],
enquiries: [
{
id: 'enq-1',
code: 'ENQ2606-001',
title: 'Dock leveler replacement for Phase 3 warehouse',
customerId: 'cus-1',
contactId: 'ct-1',
branchId: 'bkk',
salesmanId: 'sp-1',
productType: 'dockdoor',
status: 'converted',
requirementSummary: 'Replace 8 dock levelers with high cycle hydraulic model.',
projectLocation: 'Bangkok Logistics Park',
chancePercent: 82,
competitor: 'Apex Dock',
expectedValue: 2750000,
dueDate: '2026-06-14',
createdAt: '2026-05-28T09:00:00.000Z',
updatedAt: '2026-06-09T15:20:00.000Z',
quotationIds: ['qt-1', 'qt-2'],
activities: [
{
id: 'enq-1-act-1',
type: 'CALL',
title: 'รับ requirement เบื้องต้น',
detail: 'ลูกค้าต้องการเปลี่ยนภายใน Q3',
actorName: 'Krit S.',
createdAt: '2026-05-28T09:00:00.000Z'
},
{
id: 'enq-1-act-2',
type: 'VISIT',
title: 'สำรวจหน้างาน',
detail: 'หน้างานพร้อม shutdown 3 วัน',
actorName: 'Krit S.',
createdAt: '2026-05-30T13:30:00.000Z'
},
{
id: 'enq-1-act-3',
type: 'CONVERT',
title: 'Convert to quotation',
detail: 'สร้าง QT2606-001',
actorName: 'Nicha P.',
createdAt: '2026-06-02T08:15:00.000Z'
}
]
},
{
id: 'enq-2',
code: 'ENQ2606-002',
title: 'Overhead crane upgrade for fabrication line',
customerId: 'cus-2',
contactId: 'ct-3',
branchId: 'bkk',
salesmanId: 'sp-1',
productType: 'crane',
status: 'requirement',
requirementSummary: '10 ton overhead crane with remote monitoring.',
projectLocation: 'Samut Sakhon Plant',
chancePercent: 68,
competitor: 'LiftPro',
expectedValue: 5200000,
dueDate: '2026-06-20',
createdAt: '2026-05-29T10:00:00.000Z',
updatedAt: '2026-06-10T11:00:00.000Z',
quotationIds: ['qt-3'],
activities: [
{
id: 'enq-2-act-1',
type: 'MEETING',
title: 'Kickoff meeting',
detail: 'หารือ requirement ทางเทคนิค',
actorName: 'Krit S.',
createdAt: '2026-05-29T10:00:00.000Z'
}
]
},
{
id: 'enq-3',
code: 'ENQ2606-003',
title: 'Solar rooftop for cold storage lot C',
customerId: 'cus-3',
contactId: 'ct-5',
branchId: 'chn',
salesmanId: 'sp-3',
productType: 'solarcell',
status: 'follow_up',
requirementSummary: '500 kWp rooftop with energy monitoring.',
projectLocation: 'Chiang Mai DC',
chancePercent: 49,
competitor: 'SunNorth',
expectedValue: 6100000,
dueDate: '2026-06-18',
createdAt: '2026-05-27T09:20:00.000Z',
updatedAt: '2026-06-08T16:10:00.000Z',
quotationIds: ['qt-4'],
activities: [
{
id: 'enq-3-act-1',
type: 'NOTE',
title: 'ติดตาม BOQ',
detail: 'รอฝั่งลูกค้าส่งโหลดไฟฟ้า',
actorName: 'Ton A.',
createdAt: '2026-06-08T16:10:00.000Z'
}
]
},
{
id: 'enq-4',
code: 'ENQ2606-004',
title: 'Dock shelter package for retrofit',
customerId: 'cus-4',
contactId: 'ct-7',
branchId: 'bkk',
salesmanId: 'sp-1',
productType: 'dockdoor',
status: 'new',
requirementSummary: 'Retrofit existing dock shelter 12 bays.',
projectLocation: 'Bangna Logistics Hub',
chancePercent: 35,
competitor: 'Apex Dock',
expectedValue: 1850000,
dueDate: '2026-06-21',
createdAt: '2026-06-05T14:00:00.000Z',
updatedAt: '2026-06-05T14:00:00.000Z',
quotationIds: [],
activities: [
{
id: 'enq-4-act-1',
type: 'CALL',
title: 'Lead intake',
detail: 'รับ lead จาก consultant',
actorName: 'Krit S.',
createdAt: '2026-06-05T14:00:00.000Z'
}
]
},
{
id: 'enq-5',
code: 'ENQ2606-005',
title: 'Crane preventive maintenance agreement',
customerId: 'cus-2',
contactId: 'ct-4',
branchId: 'bkk',
salesmanId: 'sp-1',
productType: 'crane',
status: 'qualifying',
requirementSummary: 'Annual PM contract for 6 cranes.',
projectLocation: 'Ayutthaya Plant',
chancePercent: 53,
competitor: 'LiftPro',
expectedValue: 980000,
dueDate: '2026-06-19',
createdAt: '2026-06-02T11:00:00.000Z',
updatedAt: '2026-06-06T12:00:00.000Z',
quotationIds: ['qt-5'],
activities: [
{
id: 'enq-5-act-1',
type: 'UPDATE',
title: 'ผ่านขั้น qualifying',
detail: 'ลูกค้ามี budget แล้ว',
actorName: 'Krit S.',
createdAt: '2026-06-06T12:00:00.000Z'
}
]
},
{
id: 'enq-6',
code: 'ENQ2606-006',
title: 'Solar canopy concept study',
customerId: 'cus-5',
contactId: 'ct-9',
branchId: 'chn',
salesmanId: 'sp-3',
productType: 'solarcell',
status: 'closed_lost',
requirementSummary: 'Concept study for parking canopy solar.',
projectLocation: 'Chiang Rai Service Center',
chancePercent: 0,
competitor: 'GreenBeam',
expectedValue: 2400000,
dueDate: '2026-06-08',
createdAt: '2026-05-20T09:00:00.000Z',
updatedAt: '2026-06-08T18:00:00.000Z',
quotationIds: ['qt-6'],
activities: [
{
id: 'enq-6-act-1',
type: 'UPDATE',
title: 'Lost to competitor',
detail: 'ราคา competitor ต่ำกว่า',
actorName: 'Ton A.',
createdAt: '2026-06-08T18:00:00.000Z'
}
]
},
{
id: 'enq-7',
code: 'ENQ2606-007',
title: 'High-speed door package',
customerId: 'cus-1',
contactId: 'ct-2',
branchId: 'bkk',
salesmanId: 'sp-1',
productType: 'dockdoor',
status: 'cancelled',
requirementSummary: 'High-speed doors for food-grade area.',
projectLocation: 'Pathum Thani',
chancePercent: 0,
competitor: 'FastDoor',
expectedValue: 1600000,
dueDate: '2026-06-11',
createdAt: '2026-05-25T10:10:00.000Z',
updatedAt: '2026-06-04T11:00:00.000Z',
quotationIds: [],
activities: [
{
id: 'enq-7-act-1',
type: 'UPDATE',
title: 'Project cancelled',
detail: 'Owner เลื่อน CAPEX',
actorName: 'Nicha P.',
createdAt: '2026-06-04T11:00:00.000Z'
}
]
},
{
id: 'enq-8',
code: 'ENQ2606-008',
title: 'Monorail crane for packaging line',
customerId: 'cus-3',
contactId: 'ct-6',
branchId: 'chn',
salesmanId: 'sp-3',
productType: 'crane',
status: 'new',
requirementSummary: '1 ton monorail crane with quick delivery.',
projectLocation: 'Lamphun Plant',
chancePercent: 28,
competitor: 'NorthHoist',
expectedValue: 740000,
dueDate: '2026-06-24',
createdAt: '2026-06-09T13:00:00.000Z',
updatedAt: '2026-06-09T13:00:00.000Z',
quotationIds: [],
activities: [
{
id: 'enq-8-act-1',
type: 'CALL',
title: 'รับ enquiry ใหม่',
detail: 'ต้องการเสนอราคาใน 7 วัน',
actorName: 'Ton A.',
createdAt: '2026-06-09T13:00:00.000Z'
}
]
}
],
quotations: [
{
id: 'qt-1',
code: 'QT2606-001',
enquiryId: 'enq-1',
quotationDate: '2026-06-02',
validUntil: '2026-07-02',
quotationType: 'official',
project: 'Warehouse Dock Modernization',
siteLocation: 'Bangkok Logistics Park',
customerRoles: [
{ role: 'owner', customerId: 'cus-1', contactId: 'ct-1' },
{ role: 'consultant', customerId: 'cus-4', contactId: 'ct-7' },
{ role: 'billing', customerId: 'cus-2', contactId: 'ct-4' }
],
salesmanId: 'sp-1',
saleAdminId: 'sp-2',
branchId: 'bkk',
status: 'pending_approval',
revision: 0,
totalAmount: 2750000,
chancePercent: 82,
isHotProject: true,
approvalSnapshot: 'Awaiting Level 2 approval',
items: [
{
id: 'qt-1-item-1',
topic: 'Mechanical',
description: 'Hydraulic dock leveler 8 sets',
quantity: 8,
unit: 'set',
unitPrice: 280000,
amount: 2240000
},
{
id: 'qt-1-item-2',
topic: 'Installation',
description: 'Site install and commissioning',
quantity: 1,
unit: 'lot',
unitPrice: 510000,
amount: 510000
}
],
topics: [
{
id: 'qt-1-topic-1',
type: 'scope',
label: 'Scope',
items: ['Supply equipment', 'Install and test', 'Operator training']
},
{
id: 'qt-1-topic-2',
type: 'exclusion',
label: 'Exclusion',
items: ['Civil work by customer', 'Night shift overtime']
},
{
id: 'qt-1-topic-3',
type: 'payment',
label: 'Payment',
items: ['40% down payment', '50% upon delivery', '10% after handover']
}
],
followUps: [
{
id: 'qt-1-fu-1',
title: 'Prepare approval summary',
dueDate: '2026-06-12',
ownerName: 'Nicha P.',
status: 'open'
},
{
id: 'qt-1-fu-2',
title: 'Confirm shutdown window',
dueDate: '2026-06-13',
ownerName: 'Krit S.',
status: 'open'
}
],
attachments: [
{
id: 'qt-1-att-1',
fileName: 'technical-spec.pdf',
fileType: 'pdf',
uploadedAt: '2026-06-02T10:00:00.000Z'
}
],
approvalSteps: [
{
id: 'qt-1-ap-1',
level: 1,
approverName: 'Head of Sales',
approverPosition: 'Sales Director',
status: 'approved',
actedAt: '2026-06-03T09:30:00.000Z'
},
{
id: 'qt-1-ap-2',
level: 2,
approverName: 'CEO Office',
approverPosition: 'Managing Director',
status: 'pending'
}
],
auditEventIds: ['audit-1', 'audit-2']
},
{
id: 'qt-2',
code: 'QT2606-001-R01',
enquiryId: 'enq-1',
quotationDate: '2026-06-07',
validUntil: '2026-07-07',
quotationType: 'official',
project: 'Warehouse Dock Modernization',
siteLocation: 'Bangkok Logistics Park',
customerRoles: [
{ role: 'owner', customerId: 'cus-1', contactId: 'ct-1' },
{ role: 'consultant', customerId: 'cus-4', contactId: 'ct-7' }
],
salesmanId: 'sp-1',
saleAdminId: 'sp-2',
branchId: 'bkk',
status: 'revised',
revision: 1,
totalAmount: 2875000,
chancePercent: 78,
isHotProject: true,
approvedPdfUrl: '/mock/qt2606-001-r01.pdf',
items: [
{
id: 'qt-2-item-1',
topic: 'Mechanical',
description: 'Hydraulic dock leveler 8 sets',
quantity: 8,
unit: 'set',
unitPrice: 280000,
amount: 2240000
},
{
id: 'qt-2-item-2',
topic: 'Safety',
description: 'Additional dock light and safety package',
quantity: 1,
unit: 'lot',
unitPrice: 635000,
amount: 635000
}
],
topics: [
{
id: 'qt-2-topic-1',
type: 'scope',
label: 'Scope',
items: ['Updated safety package', 'Delivery within 30 days']
},
{
id: 'qt-2-topic-2',
type: 'exclusion',
label: 'Exclusion',
items: ['Permit by customer']
},
{ id: 'qt-2-topic-3', type: 'payment', label: 'Payment', items: ['40/50/10 milestone'] }
],
followUps: [
{
id: 'qt-2-fu-1',
title: 'Send revised file to customer',
dueDate: '2026-06-12',
ownerName: 'Krit S.',
status: 'open'
}
],
attachments: [
{
id: 'qt-2-att-1',
fileName: 'rev1-comparison.pdf',
fileType: 'pdf',
uploadedAt: '2026-06-07T16:00:00.000Z'
}
],
approvalSteps: [
{
id: 'qt-2-ap-1',
level: 1,
approverName: 'Head of Sales',
approverPosition: 'Sales Director',
status: 'approved',
actedAt: '2026-06-07T15:30:00.000Z'
},
{
id: 'qt-2-ap-2',
level: 2,
approverName: 'CEO Office',
approverPosition: 'Managing Director',
status: 'approved',
actedAt: '2026-06-08T09:00:00.000Z'
}
],
auditEventIds: ['audit-3']
},
{
id: 'qt-3',
code: 'QT2606-002',
enquiryId: 'enq-2',
quotationDate: '2026-06-05',
validUntil: '2026-07-05',
quotationType: 'budgetary',
project: 'Fabrication Crane Upgrade',
siteLocation: 'Samut Sakhon Plant',
customerRoles: [
{ role: 'owner', customerId: 'cus-2', contactId: 'ct-3' },
{ role: 'contractor', customerId: 'cus-4', contactId: 'ct-8' }
],
salesmanId: 'sp-1',
saleAdminId: 'sp-2',
branchId: 'bkk',
status: 'draft',
revision: 0,
totalAmount: 5200000,
chancePercent: 68,
isHotProject: false,
items: [
{
id: 'qt-3-item-1',
topic: 'Crane',
description: '10 ton overhead crane',
quantity: 1,
unit: 'set',
unitPrice: 4500000,
amount: 4500000
},
{
id: 'qt-3-item-2',
topic: 'IoT',
description: 'Remote monitoring package',
quantity: 1,
unit: 'set',
unitPrice: 700000,
amount: 700000
}
],
topics: [
{
id: 'qt-3-topic-1',
type: 'scope',
label: 'Scope',
items: ['Supply', 'Install', 'Commission']
},
{
id: 'qt-3-topic-2',
type: 'payment',
label: 'Payment',
items: ['50% deposit', '40% delivery', '10% handover']
},
{
id: 'qt-3-topic-3',
type: 'exclusion',
label: 'Exclusion',
items: ['Building strengthening']
}
],
followUps: [
{
id: 'qt-3-fu-1',
title: 'Finalize civil scope',
dueDate: '2026-06-15',
ownerName: 'Krit S.',
status: 'open'
}
],
attachments: [],
approvalSteps: [],
auditEventIds: []
},
{
id: 'qt-4',
code: 'QT2606-003',
enquiryId: 'enq-3',
quotationDate: '2026-06-03',
validUntil: '2026-07-03',
quotationType: 'official',
project: 'Cold Chain Rooftop Solar',
siteLocation: 'Chiang Mai DC',
customerRoles: [
{ role: 'owner', customerId: 'cus-3', contactId: 'ct-5' },
{ role: 'consultant', customerId: 'cus-5', contactId: 'ct-9' }
],
salesmanId: 'sp-3',
saleAdminId: 'sp-2',
branchId: 'chn',
status: 'sent',
revision: 0,
totalAmount: 6100000,
chancePercent: 49,
isHotProject: true,
approvedPdfUrl: '/mock/qt2606-003.pdf',
items: [
{
id: 'qt-4-item-1',
topic: 'Solar',
description: '500 kWp rooftop system',
quantity: 1,
unit: 'lot',
unitPrice: 5900000,
amount: 5900000
},
{
id: 'qt-4-item-2',
topic: 'Monitoring',
description: 'EMS dashboard',
quantity: 1,
unit: 'lot',
unitPrice: 200000,
amount: 200000
}
],
topics: [
{ id: 'qt-4-topic-1', type: 'scope', label: 'Scope', items: ['EPC turnkey'] },
{ id: 'qt-4-topic-2', type: 'payment', label: 'Payment', items: ['30/60/10'] },
{
id: 'qt-4-topic-3',
type: 'exclusion',
label: 'Exclusion',
items: ['Transformer upgrade']
}
],
followUps: [
{
id: 'qt-4-fu-1',
title: 'Follow up board decision',
dueDate: '2026-06-11',
ownerName: 'Ton A.',
status: 'open'
}
],
attachments: [
{
id: 'qt-4-att-1',
fileName: 'financial-model.xls',
fileType: 'xls',
uploadedAt: '2026-06-03T12:00:00.000Z'
}
],
approvalSteps: [
{
id: 'qt-4-ap-1',
level: 1,
approverName: 'Regional Sales Manager',
approverPosition: 'Regional Manager',
status: 'approved',
actedAt: '2026-06-03T11:00:00.000Z'
}
],
auditEventIds: ['audit-4']
},
{
id: 'qt-5',
code: 'QT2606-004',
enquiryId: 'enq-5',
quotationDate: '2026-06-06',
validUntil: '2026-07-06',
quotationType: 'service',
project: 'Annual Crane PM',
siteLocation: 'Ayutthaya Plant',
customerRoles: [{ role: 'owner', customerId: 'cus-2', contactId: 'ct-4' }],
salesmanId: 'sp-1',
saleAdminId: 'sp-2',
branchId: 'bkk',
status: 'approved',
revision: 0,
totalAmount: 980000,
chancePercent: 53,
isHotProject: false,
approvedPdfUrl: '/mock/qt2606-004.pdf',
items: [
{
id: 'qt-5-item-1',
topic: 'Service',
description: 'PM contract 12 months',
quantity: 1,
unit: 'lot',
unitPrice: 980000,
amount: 980000
}
],
topics: [
{
id: 'qt-5-topic-1',
type: 'scope',
label: 'Scope',
items: ['Quarterly PM', 'Emergency call support']
},
{ id: 'qt-5-topic-2', type: 'payment', label: 'Payment', items: ['100% after PO'] },
{ id: 'qt-5-topic-3', type: 'exclusion', label: 'Exclusion', items: ['Spare parts'] }
],
followUps: [
{
id: 'qt-5-fu-1',
title: 'Await PO',
dueDate: '2026-06-17',
ownerName: 'Nicha P.',
status: 'open'
}
],
attachments: [],
approvalSteps: [
{
id: 'qt-5-ap-1',
level: 1,
approverName: 'Service GM',
approverPosition: 'GM Service',
status: 'approved',
actedAt: '2026-06-07T10:00:00.000Z'
}
],
auditEventIds: []
},
{
id: 'qt-6',
code: 'QT2606-005',
enquiryId: 'enq-6',
quotationDate: '2026-05-26',
validUntil: '2026-06-25',
quotationType: 'budgetary',
project: 'Solar Canopy Feasibility',
siteLocation: 'Chiang Rai Service Center',
customerRoles: [{ role: 'owner', customerId: 'cus-5', contactId: 'ct-9' }],
salesmanId: 'sp-3',
saleAdminId: 'sp-2',
branchId: 'chn',
status: 'lost',
revision: 0,
totalAmount: 2400000,
chancePercent: 0,
isHotProject: false,
items: [
{
id: 'qt-6-item-1',
topic: 'Solar',
description: 'Canopy concept and EPC budget',
quantity: 1,
unit: 'lot',
unitPrice: 2400000,
amount: 2400000
}
],
topics: [
{ id: 'qt-6-topic-1', type: 'scope', label: 'Scope', items: ['Concept study'] },
{ id: 'qt-6-topic-2', type: 'payment', label: 'Payment', items: ['50/50'] },
{ id: 'qt-6-topic-3', type: 'exclusion', label: 'Exclusion', items: ['Authority permit'] }
],
followUps: [],
attachments: [],
approvalSteps: [],
auditEventIds: ['audit-5']
},
{
id: 'qt-7',
code: 'QT2606-006',
enquiryId: 'enq-4',
quotationDate: '2026-06-09',
validUntil: '2026-07-09',
quotationType: 'official',
project: 'Dock Shelter Retrofit',
siteLocation: 'Bangna Logistics Hub',
customerRoles: [{ role: 'consultant', customerId: 'cus-4', contactId: 'ct-7' }],
salesmanId: 'sp-1',
saleAdminId: 'sp-2',
branchId: 'bkk',
status: 'pending_approval',
revision: 0,
totalAmount: 1850000,
chancePercent: 35,
isHotProject: false,
items: [
{
id: 'qt-7-item-1',
topic: 'Retrofit',
description: 'Dock shelter 12 bays',
quantity: 12,
unit: 'bay',
unitPrice: 154166.67,
amount: 1850000
}
],
topics: [
{
id: 'qt-7-topic-1',
type: 'scope',
label: 'Scope',
items: ['Supply and install 12 shelters']
},
{ id: 'qt-7-topic-2', type: 'payment', label: 'Payment', items: ['50/50'] },
{ id: 'qt-7-topic-3', type: 'exclusion', label: 'Exclusion', items: ['Scaffold by others'] }
],
followUps: [
{
id: 'qt-7-fu-1',
title: 'Submit approval',
dueDate: '2026-06-12',
ownerName: 'Nicha P.',
status: 'open'
}
],
attachments: [],
approvalSteps: [
{
id: 'qt-7-ap-1',
level: 1,
approverName: 'Sales Director',
approverPosition: 'Director',
status: 'pending'
}
],
auditEventIds: []
},
{
id: 'qt-8',
code: 'QT2606-007',
enquiryId: 'enq-8',
quotationDate: '2026-06-10',
validUntil: '2026-07-10',
quotationType: 'official',
project: 'Monorail Crane Fast Track',
siteLocation: 'Lamphun Plant',
customerRoles: [{ role: 'owner', customerId: 'cus-3', contactId: 'ct-6' }],
salesmanId: 'sp-3',
saleAdminId: 'sp-2',
branchId: 'chn',
status: 'draft',
revision: 0,
totalAmount: 740000,
chancePercent: 28,
isHotProject: false,
items: [
{
id: 'qt-8-item-1',
topic: 'Crane',
description: '1 ton monorail crane',
quantity: 1,
unit: 'set',
unitPrice: 740000,
amount: 740000
}
],
topics: [
{ id: 'qt-8-topic-1', type: 'scope', label: 'Scope', items: ['Supply only'] },
{ id: 'qt-8-topic-2', type: 'payment', label: 'Payment', items: ['100% before delivery'] },
{
id: 'qt-8-topic-3',
type: 'exclusion',
label: 'Exclusion',
items: ['Install by customer']
}
],
followUps: [],
attachments: [],
approvalSteps: [],
auditEventIds: []
},
{
id: 'qt-9',
code: 'QT2606-008',
enquiryId: 'enq-2',
quotationDate: '2026-06-08',
validUntil: '2026-07-08',
quotationType: 'official',
project: 'Crane Upgrade Option B',
siteLocation: 'Samut Sakhon Plant',
customerRoles: [{ role: 'owner', customerId: 'cus-2', contactId: 'ct-3' }],
salesmanId: 'sp-1',
saleAdminId: 'sp-2',
branchId: 'bkk',
status: 'rejected',
revision: 0,
totalAmount: 5450000,
chancePercent: 22,
isHotProject: false,
items: [
{
id: 'qt-9-item-1',
topic: 'Crane',
description: 'Higher spec option',
quantity: 1,
unit: 'set',
unitPrice: 5450000,
amount: 5450000
}
],
topics: [
{ id: 'qt-9-topic-1', type: 'scope', label: 'Scope', items: ['Higher duty cycle spec'] },
{ id: 'qt-9-topic-2', type: 'payment', label: 'Payment', items: ['40/50/10'] },
{
id: 'qt-9-topic-3',
type: 'exclusion',
label: 'Exclusion',
items: ['Building modification']
}
],
followUps: [],
attachments: [],
approvalSteps: [
{
id: 'qt-9-ap-1',
level: 1,
approverName: 'Sales Director',
approverPosition: 'Director',
status: 'rejected',
actedAt: '2026-06-09T13:00:00.000Z',
comment: 'Margin below target'
}
],
auditEventIds: []
},
{
id: 'qt-10',
code: 'QT2606-009',
enquiryId: 'enq-5',
quotationDate: '2026-06-10',
validUntil: '2026-07-10',
quotationType: 'service',
project: 'Spare Parts Bundle',
siteLocation: 'Ayutthaya Plant',
customerRoles: [{ role: 'billing', customerId: 'cus-2', contactId: 'ct-4' }],
salesmanId: 'sp-1',
saleAdminId: 'sp-2',
branchId: 'bkk',
status: 'accepted',
revision: 0,
totalAmount: 420000,
chancePercent: 100,
isHotProject: false,
approvedPdfUrl: '/mock/qt2606-009.pdf',
items: [
{
id: 'qt-10-item-1',
topic: 'Spare Parts',
description: 'Critical spare bundle',
quantity: 1,
unit: 'lot',
unitPrice: 420000,
amount: 420000
}
],
topics: [
{ id: 'qt-10-topic-1', type: 'scope', label: 'Scope', items: ['Spare bundle supply'] },
{ id: 'qt-10-topic-2', type: 'payment', label: 'Payment', items: ['100% with PO'] },
{ id: 'qt-10-topic-3', type: 'exclusion', label: 'Exclusion', items: ['On-site labor'] }
],
followUps: [
{
id: 'qt-10-fu-1',
title: 'Coordinate delivery slot',
dueDate: '2026-06-16',
ownerName: 'Nicha P.',
status: 'done'
}
],
attachments: [
{
id: 'qt-10-att-1',
fileName: 'spare-list.doc',
fileType: 'doc',
uploadedAt: '2026-06-10T09:00:00.000Z'
}
],
approvalSteps: [
{
id: 'qt-10-ap-1',
level: 1,
approverName: 'Service GM',
approverPosition: 'GM Service',
status: 'approved',
actedAt: '2026-06-10T08:00:00.000Z'
}
],
auditEventIds: []
}
],
approvals: [
{
id: 'approval-1',
quotationId: 'qt-1',
quotationCode: 'QT2606-001',
amount: 2750000,
productType: 'dockdoor',
branchId: 'bkk',
submitterName: 'Nicha P.',
approverLevel: 2,
status: 'pending'
},
{
id: 'approval-2',
quotationId: 'qt-7',
quotationCode: 'QT2606-006',
amount: 1850000,
productType: 'dockdoor',
branchId: 'bkk',
submitterName: 'Nicha P.',
approverLevel: 1,
status: 'pending'
},
{
id: 'approval-3',
quotationId: 'qt-3',
quotationCode: 'QT2606-002',
amount: 5200000,
productType: 'crane',
branchId: 'bkk',
submitterName: 'Krit S.',
approverLevel: 1,
status: 'pending'
}
],
auditEvents: [
{
id: 'audit-1',
entityType: 'quotation',
entityId: 'qt-1',
action: 'CREATE',
actorName: 'Nicha P.',
detail: 'สร้างใบเสนอราคา QT2606-001',
createdAt: '2026-06-02T08:15:00.000Z'
},
{
id: 'audit-2',
entityType: 'approval',
entityId: 'qt-1',
action: 'APPROVE',
actorName: 'Head of Sales',
detail: 'อนุมัติ level 1',
createdAt: '2026-06-03T09:30:00.000Z'
},
{
id: 'audit-3',
entityType: 'quotation',
entityId: 'qt-2',
action: 'REVISE',
actorName: 'Krit S.',
detail: 'สร้าง revision R01 เพิ่ม safety package',
createdAt: '2026-06-07T16:00:00.000Z'
},
{
id: 'audit-4',
entityType: 'quotation',
entityId: 'qt-4',
action: 'SEND',
actorName: 'Ton A.',
detail: 'ส่งใบเสนอราคาให้ลูกค้าทางอีเมล',
createdAt: '2026-06-04T10:10:00.000Z'
},
{
id: 'audit-5',
entityType: 'quotation',
entityId: 'qt-6',
action: 'REJECT',
actorName: 'Customer Board',
detail: 'ลูกค้าเลือกคู่แข่งเนื่องจากราคา',
createdAt: '2026-06-08T18:00:00.000Z'
}
],
sequences: [
{
id: 'seq-1',
documentType: 'enquiry',
prefix: 'ENQ',
period: '2606',
branchId: 'bkk',
currentNumber: 8,
paddingLength: 3
},
{
id: 'seq-2',
documentType: 'quotation',
prefix: 'QT',
period: '2606',
branchId: 'bkk',
currentNumber: 9,
paddingLength: 3
},
{
id: 'seq-3',
documentType: 'quotation_revision',
prefix: 'QT',
period: '2606',
branchId: 'bkk',
currentNumber: 1,
paddingLength: 2
}
],
masterOptions: [
{ id: 'mo-1', group: 'status', code: 'new', label: 'New', active: true },
{
id: 'mo-2',
group: 'status',
code: 'pending_approval',
label: 'Pending Approval',
active: true
},
{ id: 'mo-3', group: 'product_type', code: 'crane', label: 'Crane', active: true },
{ id: 'mo-4', group: 'product_type', code: 'dockdoor', label: 'Dock Door', active: true },
{ id: 'mo-5', group: 'product_type', code: 'solarcell', label: 'Solar Cell', active: true },
{ id: 'mo-6', group: 'payment_term', code: '40_50_10', label: '40/50/10', active: true },
{ id: 'mo-7', group: 'currency', code: 'THB', label: 'Thai Baht', active: true },
{ id: 'mo-8', group: 'tax_rate', code: 'VAT7', label: 'VAT 7%', active: true }
],
templates: [
{
id: 'tpl-1',
name: 'Standard Commercial Proposal',
version: 'v1.2',
branchId: 'bkk',
description: 'Template for standard equipment quotation.',
mappings: [
{
id: 'tpl-1-map-1',
key: 'customer_name',
placeholder: '{{customer_name}}',
sourceField: 'customer.name'
},
{
id: 'tpl-1-map-2',
key: 'project_name',
placeholder: '{{project_name}}',
sourceField: 'quotation.project'
},
{
id: 'tpl-1-map-3',
key: 'quotation_price',
placeholder: '{{quotation_price}}',
sourceField: 'quotation.totalAmount'
}
]
},
{
id: 'tpl-2',
name: 'Solar EPC Proposal',
version: 'v0.9',
branchId: 'chn',
description: 'Template for solar EPC quotation preview.',
mappings: [
{
id: 'tpl-2-map-1',
key: 'site_location',
placeholder: '{{site_location}}',
sourceField: 'quotation.siteLocation'
},
{
id: 'tpl-2-map-2',
key: 'approver_names',
placeholder: '{{approver_names}}',
sourceField: 'quotation.approvalSteps[].approverName'
}
]
}
]
};