api/resources/Orders/PosCheckoutController.js

187 lines
6.4 KiB
JavaScript

import { shippingAddress } from "../ShippingAddresses/ShippingAddressModel.js";
import { Order } from "./orderModel.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;
// // console.log(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 shipping address!" });
// if (!subtotal)
// return res
// .status(404)
// .json({ message: "please provide 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 = await 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(),
// });
// return res.status(201).json({ success: true, order });
// } catch (error) {
// console.error("Error creating order:", error);
// return res
// .status(500)
// .json({ success: false, message: "Internal server error" });
// }
// };
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(),
});
return res.status(201).json({ success: true, order });
} catch (error) {
console.error("Error creating order:", error);
return res.status(500).json({ success: false, message: "Internal server error" });
}
};