From 105da2bccbd0c402af96f01cabd26dd2a2134e5a Mon Sep 17 00:00:00 2001 From: Sibunnayak Date: Mon, 29 Apr 2024 15:10:57 +0530 Subject: [PATCH] point of sale order contoller with razorpay completed and cash with mail completed --- app.js | 3 - package-lock.json | 9 +- resources/Orders/PosCheckoutController.js | 241 +++++++++++++--------- 3 files changed, 146 insertions(+), 107 deletions(-) diff --git a/app.js b/app.js index 4781cde..dec8764 100644 --- a/app.js +++ b/app.js @@ -172,7 +172,6 @@ import CouponRoute from "./resources/Affiliate&Coupon/Coupon/CouponRoute.js"; //support Ticket import SupportRouter from "./resources/Supports/supportRoute.js"; // Point of Sale -import PosorderRoute from "./resources/PosOrders/PosorderRoute.js"; app.use("/api/v1/", user); //Product @@ -240,6 +239,4 @@ app.use("/api/panel", PanelRoute); // app.use("/api/shorturl", ShortUrlRouter); //Support app.use("/api", SupportRouter); -// Point of Sale -app.use("/api/posOrder", PosorderRoute); export default app; diff --git a/package-lock.json b/package-lock.json index 9bafc1a..a1f5970 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5417,7 +5417,8 @@ "cloudinary-core": { "version": "2.12.3", "resolved": "https://registry.npmjs.org/cloudinary-core/-/cloudinary-core-2.12.3.tgz", - "integrity": "sha512-Ll4eDzcrIVn4zCttMh3Mdi+KNz07p5EEjBT2PQSRx8Eok1lKPt3uBBenOk/w88RKK3B8SFIWcEe/mN4BHQ0p8A==" + "integrity": "sha512-Ll4eDzcrIVn4zCttMh3Mdi+KNz07p5EEjBT2PQSRx8Eok1lKPt3uBBenOk/w88RKK3B8SFIWcEe/mN4BHQ0p8A==", + "requires": {} }, "color-convert": { "version": "2.0.1", @@ -6660,7 +6661,8 @@ "multer-storage-cloudinary": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/multer-storage-cloudinary/-/multer-storage-cloudinary-4.0.0.tgz", - "integrity": "sha512-25lm9R6o5dWrHLqLvygNX+kBOxprzpmZdnVKH4+r68WcfCt8XV6xfQaMuAg+kUE5Xmr8mJNA4gE0AcBj9FJyWA==" + "integrity": "sha512-25lm9R6o5dWrHLqLvygNX+kBOxprzpmZdnVKH4+r68WcfCt8XV6xfQaMuAg+kUE5Xmr8mJNA4gE0AcBj9FJyWA==", + "requires": {} }, "mute-stream": { "version": "0.0.8", @@ -7893,7 +7895,8 @@ "ws": { "version": "7.4.6", "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", - "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==" + "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", + "requires": {} }, "xregexp": { "version": "2.0.0", diff --git a/resources/Orders/PosCheckoutController.js b/resources/Orders/PosCheckoutController.js index 7792e1f..ee069ad 100644 --- a/resources/Orders/PosCheckoutController.js +++ b/resources/Orders/PosCheckoutController.js @@ -1,6 +1,7 @@ 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(); @@ -21,99 +22,6 @@ const generateUniqueOrderId = async () => { 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; @@ -122,11 +30,14 @@ export const poscreateOrderCheckout = async (req, res) => { 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!" }); + 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" }); + 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); @@ -154,11 +65,24 @@ export const poscreateOrderCheckout = async (req, res) => { 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_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), + 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 @@ -177,10 +101,125 @@ export const poscreateOrderCheckout = async (req, res) => { 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: `

Welcome to Smellika - Let the Shopping Begin!

+ Hi ${ + order?.shippingInfo?.first_Name + }, + +

Great news! Your order #${ + order?.orderID + } has been confirmed. Here are the details

+

Shipping Address : ${ + order?.shippingInfo?.first_Name + } ${order?.shippingInfo?.last_Name} , ${order?.shippingInfo?.street} ${ + order?.shippingInfo?.city + } ${order?.shippingInfo?.state} ${order?.shippingInfo?.country}, PIN-${ + order?.shippingInfo?.postalCode + }, Phone Number: ${order?.shippingInfo?.phone_Number} + ${ + order?.shippingInfo?.company_name + ? ",Company Name :" + order?.shippingInfo?.company_name + "" + : "" + } ${ + order?.shippingInfo?.gst_number + ? ", GST_NO:" + order?.shippingInfo?.gst_number + : "" + }

+

Order Items :

+ + + + + + + + + + + + + + + + + + + + ${order?.orderItems + ?.map( + (product, index) => ` + + + + + + + + + + + + + + ` + ) + .join("")} + + + + + +
S No.Product NameVariantImageQuantityPriceGST AmountSubTotal
${ + index + 1 + }${ + product.name + }${ + product?.variant_Name + }${
+         product.name
+       }${ + product.quantity + }₹${ + product.price + }₹${ + product?.gst_amount + }₹${ + product?.product_Subtotal + }
Total Amount :₹${ + order?.total_amount + }
+ +
+ Best regards,
+ + Team Smellika`, + }); 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" }); + return res + .status(500) + .json({ success: false, message: "Internal server error" }); } };