import ShippingAddress from "../ShippingAddresses/ShippingAddressModel.js"; import { Order } from "./orderModel.js"; import sendEmail from "../../Utils/sendEmail.js"; //generate unique order id const generateUniqueOrderId = async () => { const currentYear = new Date().getFullYear(); // Find the latest order to get the last serial number const latestOrder = await Order.findOne({}, {}, { sort: { orderID: -1 } }); let serialNumber = 1; if (latestOrder) { const lastYear = parseInt(latestOrder.orderID.substring(0, 4), 10); if (lastYear === currentYear) { // If the last order was in the current year, increment the serial number serialNumber = parseInt(latestOrder.orderID.substring(4), 10) + 1; } } // Pad the serial number with zeros and concatenate with the current year const paddedSerialNumber = serialNumber.toString().padStart(7, "0"); const orderId = `${currentYear}${paddedSerialNumber}`; return orderId; }; export const poscreateOrderCheckout = async (req, res) => { try { const { userr, address, cart, subtotal, orderType } = req.body; // Perform validation if (cart.length < 1) return res.status(400).json({ message: "Cart is empty!" }); if (!address) return res .status(404) .json({ message: "Please select a shipping address!" }); if (!subtotal) return res .status(404) .json({ message: "Please provide the product subtotal!" }); if (!userr) return res.status(400).json({ message: "User is not defined" }); // Retrieve shipping address from database let addss = await ShippingAddress.findById(address); let shipping = { first_Name: addss.first_Name, last_Name: addss?.last_Name, phone_Number: addss?.phone_Number, street: addss?.street, city: addss?.city, state: addss?.state, postalCode: addss?.postalCode, country: addss?.country, company_name: addss?.company_name, gst_number: addss?.gst_number, addressId: address, }; // Construct order items array const orderItems = cart.map((item) => ({ product: item.product._id, name: item.product.name, variant_Name: item.variant.variant_Name, price: Number(item.variant.price), total_price: item.quantity * Number(item.variant.price), image: item.product.image, quantity: item.quantity, gst_amount: Number( (Number(item.variant.price) * item.variant.gst_Id?.tax) / 100 )?.toFixed(3), total_gst_amount: Number( Number(item.quantity) * Number((Number(item.variant.price) * item.variant.gst_Id?.tax) / 100) )?.toFixed(3), gst_rate: item.variant.gst_Id?.tax, tax_Name: item.variant?.gst_Id?.name, product_Subtotal: Number( Number(item.quantity * Number(item.variant.price)) + Number( Number(item.quantity) * Number( (Number(item.variant.price) * item.variant.gst_Id?.tax) / 100 ) ) ).toFixed(3), })); // Generate a unique order ID const Id = await generateUniqueOrderId(); // Create the order document const order = await Order.create({ orderID: Id, total_amount: subtotal, orderItems, shippingInfo: shipping, user: userr, orderType, paymentMode: "cod", payment_status: "success", isPaid: true, paidAt: new Date().toISOString(), }); // console.log(order); // Find the user associated with the order const orderWithUser = await Order.findById(order._id).populate("user"); if (!orderWithUser) { return res .status(404) .json({ success: false, message: "Order not found" }); } const user = orderWithUser.user; const userEmail = user.email; // Send email after order creation await sendEmail({ to: userEmail, from: `${process.env.SEND_EMAIL_FROM}`, subject: `Your Order #${order?.orderID} Confirmation`, html: `
Great news! Your order #${ order?.orderID } has been confirmed. Here are the details
S No. | Product Name | Variant | Image | Quantity | Price | GST Amount | SubTotal |
---|---|---|---|---|---|---|---|
${ index + 1 } | ${ product.name } | ${ product?.variant_Name } | ${ product.quantity } | ₹${ product.price } | ₹${ product?.gst_amount } | ₹${ product?.product_Subtotal } | |
Total Amount : | ₹${ order?.total_amount } |