order-management.js

5.20 KB
05/11/2024 05:56
JS
order-management.js
export class OrderManager {
    constructor(dependencies) {
        this.productManager = dependencies.productManager;
        this.notificationSystem = dependencies.notificationSystem;
        this.customerStorage = dependencies.customerStorage;
        this.settingsManager = dependencies.settingsManager;
        
        this.orderIdCounter = parseInt(localStorage.getItem('lastOrderId') || '0');
    }

    async createOrder(orderData) {
        try {
            // ตรวจสอบสินค้าคงเหลือ
            const stockCheck = await this.checkStock(orderData.items);
            if (!stockCheck.success) {
                return {
                    success: false,
                    error: 'INSUFFICIENT_STOCK',
                    message: stockCheck.message
                };
            }

            // คำนวณค่าจัดส่ง
            const deliveryFee = this.calculateDeliveryFee(orderData);

            // สร้างออเดอร์
            const order = {
                id: this.generateOrderId(),
                ...orderData,
                deliveryFee,
                status: 'pending',
                createdAt: new Date().toISOString()
            };

            // บันทึกออเดอร์
            await this.saveOrder(order);

            // อัพเดทสต็อก
            await this.updateStock(order.items);

            // แจ้งเตือน
            await this.notificationSystem.notifyNewOrder(order);

            // บันทึกประวัติลูกค้า
            this.customerStorage.addToOrderHistory(order);

            return {
                success: true,
                order
            };

        } catch (error) {
            console.error('Order creation failed:', error);
            return {
                success: false,
                error: 'ORDER_CREATION_FAILED',
                message: 'ไม่สามารถสร้างออเดอร์ได้ กรุณาลองใหม่อีกครั้ง'
            };
        }
    }

    generateOrderId() {
        this.orderIdCounter++;
        localStorage.setItem('lastOrderId', this.orderIdCounter.toString());
        return `ORD${String(this.orderIdCounter).padStart(6, '0')}`;
    }

    async checkStock(items) {
        for (const item of items) {
            const product = this.productManager.getProduct(item.id);
            if (!product) {
                return {
                    success: false,
                    message: `สินค้า ${item.name} ไม่พบในระบบ`
                };
            }
            if (product.stock < item.quantity) {
                return {
                    success: false,
                    message: `สินค้า ${item.name} มีไม่เพียงพอ`
                };
            }
        }
        return { success: true };
    }

    calculateDeliveryFee(orderData) {
        const settings = this.settingsManager.getSetting('business.delivery');
        const subtotal = orderData.items.reduce(
            (sum, item) => sum + (item.price * item.quantity), 
            0
        );

        if (subtotal >= settings.freeOver) {
            return 0;
        }

        // คำนวณตามระยะทาง (ตัวอย่าง)
        const distance = this.calculateDistance(orderData.address);
        if (distance > settings.radius) {
            return settings.fee * Math.ceil(distance / settings.radius);
        }

        return settings.fee;
    }

    calculateDistance(address) {
        // ในที่นี้ควรใช้ Google Maps API หรือบริการอื่นๆ
        // สำหรับตัวอย่างจะ return ค่าสมมติ
        return 3; // กิโลเมตร
    }

    async saveOrder(order) {
        const orders = JSON.parse(localStorage.getItem('orders') || '[]');
        orders.push(order);
        localStorage.setItem('orders', JSON.stringify(orders));
    }

    async updateStock(items) {
        items.forEach(item => {
            const product = this.productManager.getProduct(item.id);
            if (product) {
                this.productManager.updateProduct(item.id, {
                    stock: product.stock - item.quantity
                });
            }
        });
    }

    getOrderById(orderId) {
        const orders = JSON.parse(localStorage.getItem('orders') || '[]');
        return orders.find(order => order.id === orderId);
    }

    updateOrderStatus(orderId, status) {
        const orders = JSON.parse(localStorage.getItem('orders') || '[]');
        const orderIndex = orders.findIndex(order => order.id === orderId);
        
        if (orderIndex !== -1) {
            orders[orderIndex].status = status;
            orders[orderIndex].updatedAt = new Date().toISOString();
            localStorage.setItem('orders', JSON.stringify(orders));
            
            // แจ้งเตือนการอัพเดทสถานะ
            this.notificationSystem.notifyStatusUpdate(orders[orderIndex]);
            
            return true;
        }
        return false;
    }
}