/**
* @class OrderManager
* @description ระบบจัดการข้อมูลการสั่งซื้อและประวัติการสั่งซื้อ
*/
const OrderManager = {
/**
* @method init
* @description เริ่มต้นระบบจัดการการสั่งซื้อ
*/
init() {
this.setupTemplates();
this.setupEventListeners();
},
/**
* @method setupTemplates
* @description ลงทะเบียนเทมเพลตที่จำเป็นสำหรับแสดงประวัติการสั่งซื้อ
*/
setupTemplates() {
// เทมเพลตแสดงประวัติการสั่งซื้อ
TemplateManager.registerTemplate('order-history-template',
`
`
);
// เทมเพลตแสดงรายละเอียดการสั่งซื้อ
TemplateManager.registerTemplate('order-detail-template',
`
ข้อมูลการจัดส่ง
รายการสินค้า
ราคารวม
ค่าจัดส่ง
ยอดชำระทั้งสิ้น
ข้อมูลการชำระเงิน
`
);
// รายละเอียดของประวัติการสั่งซื้อ
TemplateManager.registerTemplate('history-detail-template',
`
`
);
// เทมเพลตรายการสั่งซื้อแต่ละรายการ
TemplateManager.registerTemplate('order-item-template',
`
ราคารวม
ค่าจัดส่ง
ยอดชำระ
`
);
// เทมเพลตรายการสินค้าในรายการสั่งซื้อ
TemplateManager.registerTemplate('order-item-list-template',
``
);
// เทมเพลตรายการว่างเปล่า
TemplateManager.registerTemplate('order-empty-template',
`ยังไม่มีประวัติการสั่งซื้อ
`
);
},
/**
* @method setupEventListeners
* @description ตั้งค่าการรับฟังอีเวนต์ต่างๆ
*/
setupEventListeners() {
document.addEventListener('click', (e) => {
const target = e.target;
if (target.matches('[data-action="viewOrder"]')) {
this.showOrderDetail(target.dataset.orderId);
}
});
// รับฟังอีเวนต์เมื่อมีการสั่งซื้อใหม่
EventBus.on('order:created', (order) => {
this.addToHistory(order);
});
},
/**
* @method showOrderDetail
* @description แสดงรายละเอียดของคำสั่งซื้อแบบละเอียด
* @param {string} orderId - รหัสคำสั่งซื้อ
*/
async showOrderDetail(orderId) {
try {
// 1. ดึงข้อมูล Order
const order = await this.getOrderById(orderId);
if (!order) {
NotificationManager.error('ไม่พบข้อมูลคำสั่งซื้อ');
return;
}
console.log(order);
// 2. แปลงข้อมูลและจัดรูปแบบ
const orderData = {
...order,
orderDate: new Date(order.orderDate).toLocaleString('th-TH', {
dateStyle: 'medium',
timeStyle: 'medium'
}),
name: order.customer.name,
phone: order.customer.phone,
address: CheckoutManager.formatAddress(order.customer),
deliveryNotes: order.customer.deliveryNotes,
subtotal: Utils.formatCurrency(order.total.subtotal),
deliveryFee: Utils.formatCurrency(order.total.deliveryFee),
total: Utils.formatCurrency(order.total.total),
paymentMethod: this.getPaymentMethodText(order.payment?.method),
transactionId: order.payment?.transactionId || '-',
paymentDate: order.payment?.date ? Utils.formatDate(order.payment.date, 'WITH_TIME') : '-'
};
const itemsList = order.items.map(item => ({
name: item.name,
quantity: item.quantity,
totalPrice: Utils.formatCurrency(item.price * item.quantity)
}))
const itemsHtml = itemsList.map(item =>
TemplateManager.create('checkout-item-template', item)
);
// 3. แสดง Modal
TemplateManager.showModal('order-detail-template', {
...orderData,
itemsList: itemsHtml
});
} catch (error) {
console.error('Error showing order detail:', error);
NotificationManager.error('เกิดข้อผิดพลาดในการแสดงรายละเอียดคำสั่งซื้อ');
}
},
/**
* @method getPaymentMethodText
* @description แปลงรหัสวิธีการชำระเงินเป็นข้อความ
* @param {string} method - รหัสวิธีการชำระเงิน
* @returns {string} ข้อความแสดงวิธีการชำระเงิน
*/
getPaymentMethodText(method) {
return CONFIG.PAYMENT.METHODS[method]?.name || method;
},
/**
* @method getOrders
* @description ดึงข้อมูลประวัติการสั่งซื้อทั้งหมด
* @returns {Promise} รายการคำสั่งซื้อ
*/
async getOrders() {
try {
// ดึงข้อมูลจาก localStorage และแปลงเป็น Array
const ordersData = localStorage.getItem(CONFIG.STORAGE_KEYS.ORDERS);
const orders = ordersData ? JSON.parse(ordersData) : [];
// ตรวจสอบว่าเป็น Array
if (!Array.isArray(orders)) {
return [];
}
// เรียงตามวันที่ล่าสุด
return orders.sort((a, b) => new Date(b.orderDate) - new Date(a.orderDate));
} catch (error) {
console.error('Error getting orders:', error);
return [];
}
},
/**
* @method getOrderById
* @description ดึงข้อมูลคำสั่งซื้อตามรหัส
* @param {string} orderId - รหัสคำสั่งซื้อ
* @returns {Promise