From dff1adc5bf64bb1b0543f0b50fec245ffe83a267 Mon Sep 17 00:00:00 2001 From: mahyargdz Date: Sun, 16 Feb 2025 11:55:23 +0330 Subject: [PATCH] update: the sms service to use new sms panel --- server/SMSModule.js | 95 +- server/controllers/orderController.js | 1846 ++++++++++++------------- 2 files changed, 979 insertions(+), 962 deletions(-) diff --git a/server/SMSModule.js b/server/SMSModule.js index 64504ef..f83a3fe 100644 --- a/server/SMSModule.js +++ b/server/SMSModule.js @@ -1,43 +1,68 @@ -const axios = require('axios') +const axios = require("axios"); + module.exports.sms = async (phoneNumber, message) => { - try { + const smsService = new SmsService("QkkNxhyXZ6GtEf1soOTtikomO3mA4LaNQDH8mol8huDIwh00"); + return smsService.sendMessage(phoneNumber, message); +}; +class SmsService { + constructor(apiKey) { + this.API_URL = "https://api.sms.ir/v1"; + this.OTP_PATTERN = "83604"; + this.SMS_API_KEY = apiKey; + } + //******************************** */ - // get token - const getToken = await axios.post('https://RestfulSms.com/api/Token', { - UserApiKey: '4d1a116be65a637f9a8636c5', - SecretKey: 'BargRestaurant@A!@#' - }) + //******************************** */ - if (!getToken.data.IsSuccessful) { - return false + async sendMessage(phone, message) { + try { + const lineNumber = await this.getLineNumber(); + const smsData = { + MessageTexts: [message], + LineNumber: `${lineNumber}`, + Mobiles: [phone], + }; + const { data } = await axios.post(`${this.API_URL}/send/likeToLike`, smsData, { + headers: { + "X-API-KEY": this.SMS_API_KEY, + }, + }); + return data; + } catch (error) { + console.error("Error in sending SMS", error); } - - const token = getToken.data.TokenKey - - //get lines - const getLineNumber = await axios.get('https://RestfulSms.com/api/SMSLine', { - headers: { - 'Content-Type': 'application/json', - 'x-sms-ir-secure-token': token - } - }) - - // message details - const data = { - Messages: [message], - MobileNumbers:Array.isArray(phoneNumber) ? phoneNumber : [phoneNumber], - LineNumber : getLineNumber.data.SMSLines[0].LineNumber, - SendDateTime: '', - CanContinueInCaseOfError: 'false' + } + //******************************** */ + async getLineNumber() { + try { + const { data } = await axios.get(`${this.API_URL}/line`, { + headers: { + "X-API-KEY": this.SMS_API_KEY, + }, + }); + return data.data[1] ?? data.data[0]; + } catch (error) { + console.error("Error in getting line number", error); } + } + //******************************** */ - return axios.post(`http://RestfulSms.com/api/MessageSend`, data, { - headers: { - 'Content-Type': 'application/json', - 'x-sms-ir-secure-token': token - } - }) - } catch (e) { - console.log(e) + async sendOTPSms(otp, phone) { + const smsData = { + Parameters: [{ name: "code", value: `${otp}` }], + Mobile: phone, + TemplateId: this.OTP_PATTERN, + }; + try { + const { data } = await axios.post(`${this.API_URL}/send/verify`, smsData, { + headers: { + "X-API-KEY": this.SMS_API_KEY, + "Content-Type": "application/json", + }, + }); + return data; + } catch (error) { + console.error("Error in sending OTP SMS", error); + } } } diff --git a/server/controllers/orderController.js b/server/controllers/orderController.js index a1a7c40..8596b7a 100644 --- a/server/controllers/orderController.js +++ b/server/controllers/orderController.js @@ -1,114 +1,113 @@ -const CartItem = require('../models/CartItem') -const Order = require('../models/Order') -const User = require('../models/User') -const Food = require('../models/Food') -const Payment = require('../models/Payment') -const DiscountCode = require('../models/DiscountCode') -const StoreInfo = require('../models/StoreInfo') -const {body, validationResult} = require('express-validator') -const {res404, res500, checkValidations} = require('../plugins/controllersHelperFunctions') -const {_sr} = require('../plugins/serverResponses') -const axios = require('axios') -const zarinpal = require('./../zarinpal') -const {sendSingle, sendMulti} = require('./../plugins/pushNotif').notification -const {sendNotifyOrder} = require('./../socket/adminNotify') -const moment = require('moment-jalaali'); -const {sms} = require('./../SMSModule') -const CronJob = require('cron').CronJob - +const CartItem = require("../models/CartItem"); +const Order = require("../models/Order"); +const User = require("../models/User"); +const Food = require("../models/Food"); +const Payment = require("../models/Payment"); +const DiscountCode = require("../models/DiscountCode"); +const StoreInfo = require("../models/StoreInfo"); +const { body, validationResult } = require("express-validator"); +const { res404, res500, checkValidations } = require("../plugins/controllersHelperFunctions"); +const { _sr } = require("../plugins/serverResponses"); +const axios = require("axios"); +const zarinpal = require("./../zarinpal"); +const { sendSingle, sendMulti } = require("./../plugins/pushNotif").notification; +const { sendNotifyOrder } = require("./../socket/adminNotify"); +const moment = require("moment-jalaali"); +const { sms } = require("./../SMSModule"); +const CronJob = require("cron").CronJob; /////////// variables -const apiKey = 'eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsImp0aSI6ImRiYjIwMmRhYzAxYzFjNzgwYjgxNWQyZDgyMWNmNmY1Njk0MThhMGE3N2Q1M2Y0OTZkYzQzYTgxMmNmN2U3ZWJjNzI5MjY5YjkxMjA4MTYyIn0.eyJhdWQiOiIxNDk3OSIsImp0aSI6ImRiYjIwMmRhYzAxYzFjNzgwYjgxNWQyZDgyMWNmNmY1Njk0MThhMGE3N2Q1M2Y0OTZkYzQzYTgxMmNmN2U3ZWJjNzI5MjY5YjkxMjA4MTYyIiwiaWF0IjoxNjI3MzI2Mzc0LCJuYmYiOjE2MjczMjYzNzQsImV4cCI6MTYyOTkxODM3NCwic3ViIjoiIiwic2NvcGVzIjpbImJhc2ljIl19.hyKNSy4fmPps6yIdm33Wof-mES9ujh5lmI3VFWyecbkNCm9ATPwsZ9s53A3a1wPJmHfLBXpCcob5NGL-GjZlVfqfRBiReRMr_iniCjUOnqENfFwVEJutxI-xrzVe7PZzOgx1Vr6WwSUHvQ36eJSS1lBlHlqCgwRbkG0hs4YdZsKhzhfYdlAluNw9djjUAMbRWZVL0EluP9CYko4w8tB0KHUZMZYGQcevCfb_3OU9ygHo7B--Z5aTPfm7IK4eP0gHsZ_t857B3tu3ZJB1mkgxc2R9gZUflKqj1ZqkYiR0uMGP-571enXh6pYQLXL2k-gOxLIedCaE6XytxVXhENnotA'; -const limit = 20 -const zarinUrl = 'https://www.zarinpal.com/pg/StartPay' -const timeToStart = 1800000 +const apiKey = + "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsImp0aSI6ImRiYjIwMmRhYzAxYzFjNzgwYjgxNWQyZDgyMWNmNmY1Njk0MThhMGE3N2Q1M2Y0OTZkYzQzYTgxMmNmN2U3ZWJjNzI5MjY5YjkxMjA4MTYyIn0.eyJhdWQiOiIxNDk3OSIsImp0aSI6ImRiYjIwMmRhYzAxYzFjNzgwYjgxNWQyZDgyMWNmNmY1Njk0MThhMGE3N2Q1M2Y0OTZkYzQzYTgxMmNmN2U3ZWJjNzI5MjY5YjkxMjA4MTYyIiwiaWF0IjoxNjI3MzI2Mzc0LCJuYmYiOjE2MjczMjYzNzQsImV4cCI6MTYyOTkxODM3NCwic3ViIjoiIiwic2NvcGVzIjpbImJhc2ljIl19.hyKNSy4fmPps6yIdm33Wof-mES9ujh5lmI3VFWyecbkNCm9ATPwsZ9s53A3a1wPJmHfLBXpCcob5NGL-GjZlVfqfRBiReRMr_iniCjUOnqENfFwVEJutxI-xrzVe7PZzOgx1Vr6WwSUHvQ36eJSS1lBlHlqCgwRbkG0hs4YdZsKhzhfYdlAluNw9djjUAMbRWZVL0EluP9CYko4w8tB0KHUZMZYGQcevCfb_3OU9ygHo7B--Z5aTPfm7IK4eP0gHsZ_t857B3tu3ZJB1mkgxc2R9gZUflKqj1ZqkYiR0uMGP-571enXh6pYQLXL2k-gOxLIedCaE6XytxVXhENnotA"; +const limit = 20; +const zarinUrl = "https://www.zarinpal.com/pg/StartPay"; +const timeToStart = 1800000; // const timeToStart = 1800000 ////////// functions const deg2rad = (deg) => { - return deg * (Math.PI / 180) -} + return deg * (Math.PI / 180); +}; const _computeShippingCost = async (addresses, location) => { try { if (addresses.length && location) { - const address = addresses[0] + const address = addresses[0]; const R = 6371; // Radius of the earth in km - const dLat = deg2rad(address.location.coordinates[1] - location.coordinates[1]); // deg2rad below + const dLat = deg2rad(address.location.coordinates[1] - location.coordinates[1]); // deg2rad below const dLon = deg2rad(address.location.coordinates[0] - location.coordinates[0]); const a = - Math.sin(dLat / 2) * Math.sin(dLat / 2) + - Math.cos(deg2rad(address.location.coordinates[1])) * Math.cos(deg2rad(location.coordinates[1])) * - Math.sin(dLon / 2) * Math.sin(dLon / 2) - ; + Math.sin(dLat / 2) * Math.sin(dLat / 2) + + Math.cos(deg2rad(address.location.coordinates[1])) * + Math.cos(deg2rad(location.coordinates[1])) * + Math.sin(dLon / 2) * + Math.sin(dLon / 2); const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)); // Distance in km return R * c; - } else { - return 0 + return 0; } } catch (error) { - return 0 + return 0; } -} +}; const _computeShippingCostByRoad = async (addresses, storeLocation) => { try { if (addresses.length && storeLocation) { - const address = addresses.find(item2 => item2.used === true) - const lng = address.location.coordinates[0] - const lat = address.location.coordinates[1] + const address = addresses.find((item2) => item2.used === true); + const lng = address.location.coordinates[0]; + const lat = address.location.coordinates[1]; - const storeLng = storeLocation.coordinates[0] - const storeLat = storeLocation.coordinates[1] + const storeLng = storeLocation.coordinates[0]; + const storeLat = storeLocation.coordinates[1]; const getDistance = await axios.get(`https://map.ir/routes/route/v1/driving/${lng},${lat};${storeLng},${storeLat}`, { headers: { - 'x-api-key': apiKey - } + "x-api-key": apiKey, + }, }); - if (getDistance.data.code !== 'Ok') return new Error(_sr['fa'].response.unknownError); + if (getDistance.data.code !== "Ok") return new Error(_sr["fa"].response.unknownError); //@todo if distance under 1000 meter equal to 0 return getDistance.data.routes[0].distance <= 1000 ? 0 : Math.round(getDistance.data.routes[0].distance / 1000); - } else { - return 0 + return 0; } } catch (error) { - return 0 + return 0; } -} +}; const getMinutes = (str) => { - var time = str.split(':'); + var time = str.split(":"); return time[0] * 60 + time[1] * 1; -} +}; const getMinutesNow = (timezone) => { var timeNow = new Date(); return timeNow.getUTCHours() * 60 + timeNow.getUTCMinutes(); -} +}; const _computeHavePointPrice = async (items) => { try { - let total = 0 + let total = 0; for (const item of items) { if (item.havePoint) { - let priceItem = item.price - (item.price * item.static_discount || 0 / 100) - let totalPrice = priceItem * item.quantity - total += totalPrice + let priceItem = item.price - (item.price * item.static_discount || 0 / 100); + let totalPrice = priceItem * item.quantity; + total += totalPrice; } } - return total + return total; } catch (error) { - return 0 + return 0; } -} +}; //////////////////////////////////////////////////////////////////public ////////////////////////////////////// cart @@ -148,124 +147,124 @@ module.exports.addToCart = [ // } // }, [ - body('product_id') - .custom((value, {req}) => { - return Food.findById(value) - .then(product => { - if (product) return true - else return Promise.reject(_sr['fa'].not_found.item_id) - }) - .catch(err => { - return Promise.reject(_sr['fa'].not_found.item_id) - }) - }), - body('type') - .notEmpty().withMessage(`نوع عملی که باید انجام شود را بفرستید`), - - body('branchId') - .notEmpty().withMessage(_sr['fa'].required.field) - .bail() - .custom((value, {req}) => { - return StoreInfo.findOne({_id: value}) - .then(store => { - if (!store) return Promise.reject(_sr['fa'].not_found.item_id) - else return true - }) + body("product_id").custom((value, { req }) => { + return Food.findById(value) + .then((product) => { + if (product) return true; + else return Promise.reject(_sr["fa"].not_found.item_id); }) + .catch((err) => { + return Promise.reject(_sr["fa"].not_found.item_id); + }); + }), + body("type").notEmpty().withMessage(`نوع عملی که باید انجام شود را بفرستید`), + + body("branchId") + .notEmpty() + .withMessage(_sr["fa"].required.field) + .bail() + .custom((value, { req }) => { + return StoreInfo.findOne({ _id: value }).then((store) => { + if (!store) return Promise.reject(_sr["fa"].not_found.item_id); + else return true; + }); + }), ], checkValidations(validationResult), async (req, res) => { try { - const {product_id, type, branchId} = req.body; - const checkCart = await CartItem.findOne({branchId, product_id , user_id: req.user._id}).populate('product_id'); + const { product_id, type, branchId } = req.body; + const checkCart = await CartItem.findOne({ branchId, product_id, user_id: req.user._id }).populate("product_id"); if (checkCart) { if (Number(checkCart.quantity) > 0) { - if (type === 'positive') { + if (type === "positive") { checkCart.quantity = Number(checkCart.quantity) + 1; - } else if (type === 'negative') { + } else if (type === "negative") { checkCart.quantity = Number(checkCart.quantity) - 1; } await checkCart.save(); if (Number(checkCart.quantity) === 0 || checkCart.product_id.stock === 0) { - await checkCart.deleteOne() + await checkCart.deleteOne(); } } - return res.json({message: _sr['fa'].response.success_save}) + return res.json({ message: _sr["fa"].response.success_save }); } else { const addCart = await CartItem.create({ branchId, product_id, user_id: req.user._id, - quantity: 1 - }) + quantity: 1, + }); - if (!addCart) return res500(res, _sr['fa'].response.unknownError); + if (!addCart) return res500(res, _sr["fa"].response.unknownError); - return res.json({message: _sr['fa'].response.success_save}) + return res.json({ message: _sr["fa"].response.success_save }); } } catch (error) { - return res500(res, _sr['fa'].response.unknownError); + return res500(res, _sr["fa"].response.unknownError); } - } -] + }, +]; module.exports.getCartItems = [ async (req, res) => { try { - const branchId = req?.params?.branchId + const branchId = req?.params?.branchId; - const allCartItems = await CartItem.find({branchId, user_id: req.user._id}).populate({ - path: 'user_id', - select: '-password -token', - sort: {useRate: -1} - }).populate('product_id') + const allCartItems = await CartItem.find({ branchId, user_id: req.user._id }) + .populate({ + path: "user_id", + select: "-password -token", + sort: { useRate: -1 }, + }) + .populate("product_id"); return res.json(allCartItems); } catch (error) { - return res500(res, _sr['fa'].response.unknownError); + return res500(res, _sr["fa"].response.unknownError); } - } -] + }, +]; module.exports.updateCart = [ [ - body('quantity') - .notEmpty() - .withMessage((value, {req}) => { - return _sr['fa'].required.quantity - }) - .bail() - .isNumeric() - .withMessage((value, {req}) => { - return _sr['fa'].format.number - }) + body("quantity") + .notEmpty() + .withMessage((value, { req }) => { + return _sr["fa"].required.quantity; + }) + .bail() + .isNumeric() + .withMessage((value, { req }) => { + return _sr["fa"].format.number; + }), ], checkValidations(validationResult), (req, res) => { CartItem.findById(req.params.item_id) - .then(item => { - if (!item) return res404(res, _sr['fa'].not_found.item_id) - item.quantity = Number(req.body.quantity) - item.save() - return res.json({message: _sr['fa'].response.success_save}) - }) - .catch(err => { - return res404(res, err) - }) - } -] + .then((item) => { + if (!item) return res404(res, _sr["fa"].not_found.item_id); + item.quantity = Number(req.body.quantity); + item.save(); + return res.json({ message: _sr["fa"].response.success_save }); + }) + .catch((err) => { + return res404(res, err); + }); + }, +]; module.exports.deleteAllCartItem = [ (req, res) => { - CartItem.deleteMany({user_id: req.user._id}, (err, result) => { - if (err) return res500(res, _sr['fa'].response.unknownError) - else return res.json({message: _sr['fa'].response.success_remove}) - }) - } -] + CartItem.deleteMany({ user_id: req.user._id }, (err, result) => { + if (err) return res500(res, _sr["fa"].response.unknownError); + else return res.json({ message: _sr["fa"].response.success_remove }); + }); + }, +]; /////////////////////////////////// reorder module.exports.reOrder = [ @@ -301,116 +300,113 @@ module.exports.reOrder = [ // }, async (req, res) => { try { - const orderId = req.params?.orderId - const checkOrder = await Order.findOne({'status': 'delivered', user_id: req.user._id, _id: orderId}).populate('product_id') + const orderId = req.params?.orderId; + const checkOrder = await Order.findOne({ status: "delivered", user_id: req.user._id, _id: orderId }).populate("product_id"); if (!checkOrder) return res404(res, `سفارش کاربر یافت نشد`); - await CartItem.deleteMany({user_id: req.user._id}) + await CartItem.deleteMany({ user_id: req.user._id }); for (const food of checkOrder.order_items) { if (food.product_id && !food.product_id?.deleted) { await CartItem.create({ product_id: food.product_id._id, user_id: req.user._id, - quantity: food.quantity - }) + quantity: food.quantity, + }); } } - return res.json({message: _sr['fa'].response.success_save}) + return res.json({ message: _sr["fa"].response.success_save }); } catch (error) { - return res500(res, _sr['fa'].response.unknownError) + return res500(res, _sr["fa"].response.unknownError); } - } -] + }, +]; ////////////////////////////////////// order module.exports.addOrder = [ [ - body('description') - .optional().isString().withMessage(`توضیحات سفارش باید به صورت رشته فرستاده شود`), + body("description").optional().isString().withMessage(`توضیحات سفارش باید به صورت رشته فرستاده شود`), - body('bag') - .optional().isBoolean().withMessage(_sr['fa'].format.boolean), + body("bag").optional().isBoolean().withMessage(_sr["fa"].format.boolean), - body('score') - .optional().isBoolean().withMessage(_sr['fa'].format.boolean), + body("score").optional().isBoolean().withMessage(_sr["fa"].format.boolean), - body('discountCode') - .if((value, {req}) => { - return value; - }) - .custom((value, {req}) => { - return DiscountCode.findOne({discount_code: value}).then(discount => { - if (!discount) return Promise.reject(`کد تخفیف وارد شده صحیح نمیباشد`); - if (Number(discount.discount_expire_date) > Date.now()) return Promise.reject(`تاریخ مصرف کد تخفیف به اتمام رشیده است`) - if (discount.used_by.includes(req?.user?._id)) return Promise.reject(`کد تخفیف قبلا استفاده شده است`); - if (!discount.isPublic) { - if (discount?.discount_user_id?.toString() !== req?.user?._id.toString()) return Promise.reject(`کد تخفیف وارد شده صحیح نمیباشد`) - } else return true - }).catch(error => { - return Promise.reject(`کد تخفیف وارد شده صحیح نمیباشد`); - }) - }), - - body('branchId') - .notEmpty().withMessage(_sr['fa'].required.field) - .bail() - .custom((value, {req}) => { - return StoreInfo.findOne({_id: value}) - .then(store => { - if (!store) return Promise.reject(_sr['fa'].not_found.item_id) - else return true - }) - }) + body("discountCode") + .if((value, { req }) => { + return value; + }) + .custom((value, { req }) => { + return DiscountCode.findOne({ discount_code: value }) + .then((discount) => { + if (!discount) return Promise.reject(`کد تخفیف وارد شده صحیح نمیباشد`); + if (Number(discount.discount_expire_date) > Date.now()) return Promise.reject(`تاریخ مصرف کد تخفیف به اتمام رشیده است`); + if (discount.used_by.includes(req?.user?._id)) return Promise.reject(`کد تخفیف قبلا استفاده شده است`); + if (!discount.isPublic) { + if (discount?.discount_user_id?.toString() !== req?.user?._id.toString()) + return Promise.reject(`کد تخفیف وارد شده صحیح نمیباشد`); + } else return true; + }) + .catch((error) => { + return Promise.reject(`کد تخفیف وارد شده صحیح نمیباشد`); + }); + }), + body("branchId") + .notEmpty() + .withMessage(_sr["fa"].required.field) + .bail() + .custom((value, { req }) => { + return StoreInfo.findOne({ _id: value }).then((store) => { + if (!store) return Promise.reject(_sr["fa"].not_found.item_id); + else return true; + }); + }), ], checkValidations(validationResult), //////////////////// validation step (req, res, next) => { - CartItem.find({branchId: req?.body?.branchId, user_id: req.user._id}) - .then(items => { - // check if cart is not empty - if (items.length) { - // check product stock - let outOfRun = [] - items.forEach(async (item, index) => { - await Food.findById(item.product_id) - .then(product => { - if (product.stock < item.quantity) { - outOfRun.push({ - name: product.name, - product_id: product._id, - category_id: product.category, - stock: product.stock - }) - item.remove() - } - if (index + 1 === items.length) { - if (!outOfRun.length) return next() - else return res.status(422).json(outOfRun) - } - }) - }) - } else { - return res.status(404).json({message: _sr['fa'].response.cart_empty}) - } - }) + CartItem.find({ branchId: req?.body?.branchId, user_id: req.user._id }).then((items) => { + // check if cart is not empty + if (items.length) { + // check product stock + let outOfRun = []; + items.forEach(async (item, index) => { + await Food.findById(item.product_id).then((product) => { + if (product.stock < item.quantity) { + outOfRun.push({ + name: product.name, + product_id: product._id, + category_id: product.category, + stock: product.stock, + }); + item.remove(); + } + if (index + 1 === items.length) { + if (!outOfRun.length) return next(); + else return res.status(422).json(outOfRun); + } + }); + }); + } else { + return res.status(404).json({ message: _sr["fa"].response.cart_empty }); + } + }); }, //////////////////// save order async (req, res) => { try { - const {branchId , description, bag, score, discountCode} = req.body; - const cartItems = await CartItem.find({branchId ,user_id: req.user._id}).populate('product_id'); + const { branchId, description, bag, score, discountCode } = req.body; + const cartItems = await CartItem.find({ branchId, user_id: req.user._id }).populate("product_id"); const getUserInfo = await User.findById(req.user._id); - const getDiscountCode = await DiscountCode.findOne({branchId ,discount_code: discountCode}); + const getDiscountCode = await DiscountCode.findOne({ branchId, discount_code: discountCode }); if (!getUserInfo) return res404(res, `اطلاعات کاربر یافت نشد`); - if (!cartItems.length) return res.status(404).json({message: `هیچ محصولی در سبد خرید شما وجود ندارد`}) + if (!cartItems.length) return res.status(404).json({ message: `هیچ محصولی در سبد خرید شما وجود ندارد` }); - await Order.deleteMany({branchId, status: 'incomplete', user_id: req.user._id}); + await Order.deleteMany({ branchId, status: "incomplete", user_id: req.user._id }); /// check order exist or not // const checkOrder = await Order.findOne({'status': 'incomplete', user_id: req.user._id}); @@ -427,96 +423,93 @@ module.exports.addOrder = [ quantity: item.quantity, price: item.product_id.price, static_discount: item.product_id.static_discount, - havePoint: item.product_id.havePoint + havePoint: item.product_id.havePoint, }); } - - if (score && bag) return res.status(422).json({message: 'استفاده همزمان از کیف پول و امتیاز برای خرید مجاز نمی باشد'}) + if (score && bag) return res.status(422).json({ message: "استفاده همزمان از کیف پول و امتیاز برای خرید مجاز نمی باشد" }); const orderData = { branchId, user_id: req.user._id, number: Date.now(), order_items: orderItems, - statuses: [{ - status: 'incomplete' - }], + statuses: [ + { + status: "incomplete", + }, + ], description, bag, score, discount_code: getDiscountCode?.discount_code, discount_amount: getDiscountCode?.discount_amount, - discount_menuType: getDiscountCode?.menuTypeId + discount_menuType: getDiscountCode?.menuTypeId, }; await Order.create(orderData); - return res.json({message: _sr['fa'].response.success_save}) - + return res.json({ message: _sr["fa"].response.success_save }); } catch (error) { - console.log(error) - return res500(res, _sr['fa'].response.unknownError); + console.log(error); + return res500(res, _sr["fa"].response.unknownError); } - } -] + }, +]; module.exports.orderPay = [ [ - body('branchId') - .notEmpty().withMessage(_sr['fa'].required.field) - .bail() - .custom((value, {req}) => { - return StoreInfo.findOne({_id: value}) - .then(store => { - if (!store) return Promise.reject(_sr['fa'].not_found.item_id) - else return true - }) - }) - + body("branchId") + .notEmpty() + .withMessage(_sr["fa"].required.field) + .bail() + .custom((value, { req }) => { + return StoreInfo.findOne({ _id: value }).then((store) => { + if (!store) return Promise.reject(_sr["fa"].not_found.item_id); + else return true; + }); + }), ], checkValidations(validationResult), (req, res, next) => { - CartItem.find({branchId: req?.body?.branchId, user_id: req.user._id}) - .then(items => { - // check if cart is not empty - if (items.length) { - // check product stock - let outOfRun = [] - items.forEach(async (item, index) => { - await Food.findById(item.product_id) - .then(product => { - if (product.stock < item.quantity) { - outOfRun.push({ - product_id: product._id, - category_id: product.category, - stock: product.stock - }) - item.remove() - } - if (index + 1 === items.length) { - if (!outOfRun.length) return next() - else return res.status(422).json(outOfRun) - } - }) - }) - } else { - return res.status(404).json({message: _sr['fa'].response.cart_empty}) - } - }) + CartItem.find({ branchId: req?.body?.branchId, user_id: req.user._id }).then((items) => { + // check if cart is not empty + if (items.length) { + // check product stock + let outOfRun = []; + items.forEach(async (item, index) => { + await Food.findById(item.product_id).then((product) => { + if (product.stock < item.quantity) { + outOfRun.push({ + product_id: product._id, + category_id: product.category, + stock: product.stock, + }); + item.remove(); + } + if (index + 1 === items.length) { + if (!outOfRun.length) return next(); + else return res.status(422).json(outOfRun); + } + }); + }); + } else { + return res.status(404).json({ message: _sr["fa"].response.cart_empty }); + } + }); }, async (req, res) => { try { - const branchId = req?.body?.branchId - const cartItems = await CartItem.find({branchId , user_id: req.user._id}).populate('product_id'); - const checkOrder = await Order.findOne({branchId , 'status': 'incomplete', user_id: req.user._id}) + const branchId = req?.body?.branchId; + const cartItems = await CartItem.find({ branchId, user_id: req.user._id }).populate("product_id"); + const checkOrder = await Order.findOne({ branchId, status: "incomplete", user_id: req.user._id }); const getUserInfo = await User.findById(req.user._id); - const getStoreInfo = await StoreInfo.findOne({_id : branchId}) + const getStoreInfo = await StoreInfo.findOne({ _id: branchId }); - if (!checkOrder) return res404(res, 'لطفا از مرحله سبد خرید دوباره ادامه دهید') + if (!checkOrder) return res404(res, "لطفا از مرحله سبد خرید دوباره ادامه دهید"); - let pricePoint = Math.floor(getStoreInfo?.priceForChange/getStoreInfo?.pointForChange) || 0 - let totalPricePoint = getStoreInfo?.totalPricePoint || 0 - let pointForBuy = getStoreInfo?.pointForBuy || 0 + let pricePoint = Math.floor(getStoreInfo?.priceForChange / getStoreInfo?.pointForChange) || 0; + let totalPricePoint = getStoreInfo?.totalPricePoint || 0; + let pointForBuy = getStoreInfo?.pointForBuy || 0; let discount_percent = checkOrder?.discount_amount || 0; let discount_menuType = checkOrder?.discount_menuType; @@ -525,15 +518,14 @@ module.exports.orderPay = [ let sum = 0; let sumFoodByPercent = 0; let sumFoodByPercentForDiscount = 0; - let total = 0 - let firstTotal = 0 + let total = 0; + let firstTotal = 0; let percent = 0; let tax = 0; if (!getUserInfo) return res404(res, `اطلاعات کاربر یافت نشد`); - if (!cartItems.length) return res.status(404).json({message: `هیچ محصولی در سبد خرید شما وجود ندارد`}) - + if (!cartItems.length) return res.status(404).json({ message: `هیچ محصولی در سبد خرید شما وجود ندارد` }); const orderItems = []; for (const item of cartItems) { @@ -543,117 +535,116 @@ module.exports.orderPay = [ quantity: item.quantity, price: item.product_id.price, static_discount: item.product_id.static_discount, - havePoint: item.product_id.havePoint + havePoint: item.product_id.havePoint, }); - const itemPercent = item.product_id.price * item.product_id.static_discount / 100; + const itemPercent = (item.product_id.price * item.product_id.static_discount) / 100; const sumPercent = itemPercent * item.quantity; const price = item.product_id.price; const sumPriceItem = price * item.quantity; - - let sumByPercentForDiscount = sumPriceItem - sumPercent + let sumByPercentForDiscount = sumPriceItem - sumPercent; if (Boolean(discount_percent) && discount_menuType) { - specialDiscountMenuType = true + specialDiscountMenuType = true; if (item?.product_id?.category.type?.toString() === discount_menuType?.toString()) { - sumFoodByPercentForDiscount += sumByPercentForDiscount + sumFoodByPercentForDiscount += sumByPercentForDiscount; } } - sum = sum + sumPriceItem; /// sum food price without percent percent = percent + sumPercent; /// sum all food percent } /// sum food price with percent - sumFoodByPercent = sum - percent + sumFoodByPercent = sum - percent; /// compute shipping cost if (getStoreInfo) { if (getStoreInfo?.shippingType) { routePrice = getStoreInfo?.shippingCost || 0; } else { - routePrice = await _computeShippingCostByRoad(getUserInfo?.addresses, getStoreInfo?.location) * (getStoreInfo?.shippingCost || 0) || 0; + routePrice = + (await _computeShippingCostByRoad(getUserInfo?.addresses, getStoreInfo?.location)) * (getStoreInfo?.shippingCost || 0) || 0; } /// compute tax of order if (getStoreInfo?.tax) { - tax = sumFoodByPercent * 9 / 100 + tax = (sumFoodByPercent * 9) / 100; } } /// compute discount code if (Boolean(discount_percent)) { - let discountPercent = (specialDiscountMenuType ? sumFoodByPercentForDiscount : sumFoodByPercent) * discount_percent / 100 - percent = percent + discountPercent + let discountPercent = ((specialDiscountMenuType ? sumFoodByPercentForDiscount : sumFoodByPercent) * discount_percent) / 100; + percent = percent + discountPercent; /// compute sum food with discount percent - sumFoodByPercent = sumFoodByPercent - discountPercent + sumFoodByPercent = sumFoodByPercent - discountPercent; } /// compute total of order total = sumFoodByPercent + tax + routePrice; - checkOrder.order_items = orderItems - checkOrder.createdOn = Date.now() - checkOrder.address = getUserInfo.addresses.find(item => item.used) - checkOrder.sum = Math.ceil(sum) - checkOrder.routePrice = Math.ceil(routePrice) - checkOrder.tax = Math.ceil(tax) - checkOrder.percent = Math.ceil(percent) - checkOrder.total = Math.ceil(total) - checkOrder.pricePoint = pricePoint - firstTotal = Math.ceil(total) + checkOrder.order_items = orderItems; + checkOrder.createdOn = Date.now(); + checkOrder.address = getUserInfo.addresses.find((item) => item.used); + checkOrder.sum = Math.ceil(sum); + checkOrder.routePrice = Math.ceil(routePrice); + checkOrder.tax = Math.ceil(tax); + checkOrder.percent = Math.ceil(percent); + checkOrder.total = Math.ceil(total); + checkOrder.pricePoint = pricePoint; + firstTotal = Math.ceil(total); if (checkOrder.bag) { - const payPrice = total - getUserInfo?.bagAmount - total = payPrice <= 0 ? 0 : payPrice + const payPrice = total - getUserInfo?.bagAmount; + total = payPrice <= 0 ? 0 : payPrice; } if (checkOrder.score && pricePoint > 0) { - const payScore = total - (getUserInfo?.score * pricePoint) - total = payScore <= 0 ? 0 : payScore + const payScore = total - getUserInfo?.score * pricePoint; + total = payScore <= 0 ? 0 : payScore; } - checkOrder.payTotal = Math.ceil(total) + checkOrder.payTotal = Math.ceil(total); - console.log('total', total) - console.log('payTotal', checkOrder?.payTotal) + console.log("total", total); + console.log("payTotal", checkOrder?.payTotal); /// if total pay is zero dont move to pay method if (checkOrder?.payTotal <= 0) { - /// if bag true use the bagAmount of user if (checkOrder?.bag) { - getUserInfo.bagAmount -= firstTotal + getUserInfo.bagAmount -= firstTotal; // add point for user only for available product - const computeAvaPro = await _computeHavePointPrice(checkOrder.order_items) + const computeAvaPro = await _computeHavePointPrice(checkOrder.order_items); /// add score for order if (computeAvaPro >= totalPricePoint && totalPricePoint > 0) { - const point = (Math.floor(computeAvaPro / totalPricePoint) * pointForBuy) + const point = Math.floor(computeAvaPro / totalPricePoint) * pointForBuy; if (point > 0) { - getUserInfo.score = getUserInfo.score + point + getUserInfo.score = getUserInfo.score + point; getUserInfo.scoreLogs = [ { score: point, order_id: getUserInfo._id, - forWhat: 'buy', - action: 'increase' - } - ] + forWhat: "buy", + action: "increase", + }, + ]; } } - await getUserInfo.save() + await getUserInfo.save(); if (Boolean(discount_percent)) { - const updateDiscount = await DiscountCode.findOne({discount_code: checkOrder.discount_code}) + const updateDiscount = await DiscountCode.findOne({ discount_code: checkOrder.discount_code }); - if (!updateDiscount || (Number(updateDiscount.discount_expire_date) > Date.now())) return res.status(403).json({message: 'مشکلی در پرداخت و ثبت سفارش پیش آمده است لطفا با پشتیبانی تماس بگیرید'}) + if (!updateDiscount || Number(updateDiscount.discount_expire_date) > Date.now()) + return res.status(403).json({ message: "مشکلی در پرداخت و ثبت سفارش پیش آمده است لطفا با پشتیبانی تماس بگیرید" }); - updateDiscount.used_by.push(getUserInfo._id) - await updateDiscount.save() + updateDiscount.used_by.push(getUserInfo._id); + await updateDiscount.save(); } const addPayment = await Payment.create({ @@ -662,107 +653,107 @@ module.exports.orderPay = [ transactionId: Date.now(), refId: Date.now(), getPayment: true, - action: 'decreaseBag', - status: 'paid', + action: "decreaseBag", + status: "paid", cost: firstTotal, - }) + }); - checkOrder.payment.push(addPayment._id) - checkOrder.bagCost = firstTotal + checkOrder.payment.push(addPayment._id); + checkOrder.bagCost = firstTotal; } /// it was ok! /// if score true use the score of user if (checkOrder?.score && pricePoint > 0) { - const point = Math.ceil(firstTotal / pricePoint) - checkOrder.scoreCost = point * pricePoint - checkOrder.scorePoint = point - getUserInfo.score -= point + const point = Math.ceil(firstTotal / pricePoint); + checkOrder.scoreCost = point * pricePoint; + checkOrder.scorePoint = point; + getUserInfo.score -= point; getUserInfo.scoreLogs = [ { score: point, order_id: checkOrder._id, - forWhat: 'buy', - action: 'decrease' - } - ] + forWhat: "buy", + action: "decrease", + }, + ]; - await getUserInfo.save() + await getUserInfo.save(); } checkOrder.statuses.push({ - status: 'processing' - }) - checkOrder.status = 'processing' - checkOrder.paymentStatus = 'paid' - await checkOrder.save() + status: "processing", + }); + checkOrder.status = "processing"; + checkOrder.paymentStatus = "paid"; + await checkOrder.save(); for (const food of checkOrder.order_items) { - const getFood = await Food.findById(food.product_id) + const getFood = await Food.findById(food.product_id); if (getFood) { - getFood.stock = getFood.stock - food.quantity + getFood.stock = getFood.stock - food.quantity; // getFood.canReview.push(req.user._id)///add user id for review - getFood.save() + getFood.save(); } } /// remove cart item - await CartItem.deleteMany({user_id: getUserInfo._id}) + await CartItem.deleteMany({ user_id: getUserInfo._id }); //----------------------- send notif for admins ----------------- - const fcmTokens = [] - const allAdmins = await User.find({scope: 'admin'}) + const fcmTokens = []; + const allAdmins = await User.find({ scope: "admin" }); for (const admin of allAdmins) { - if (admin.fcmToken) fcmTokens.push(admin.fcmToken) + if (admin.fcmToken) fcmTokens.push(admin.fcmToken); } const objNotif = { - title: 'سفارش جدید!', - body: 'یک سفارش جدید در پنل برگ من ثبت گردید' - } + title: "سفارش جدید!", + body: "یک سفارش جدید در پنل برگ من ثبت گردید", + }; const payload = { notification: objNotif, }; const input = { registrationTokens: fcmTokens, - payload - } - await sendMulti(input) + payload, + }; + await sendMulti(input); - sendNotifyOrder(checkOrder?.branchId) + sendNotifyOrder(checkOrder?.branchId); //---------------------------------------------------------------- //--------------------- send notif to user -------------------------- const messageUser = { - title: 'ثبت سفارش', - body: 'با تشکر از اعتماد شما سفارش شما با موفقیت ثبت شد' - } + title: "ثبت سفارش", + body: "با تشکر از اعتماد شما سفارش شما با موفقیت ثبت شد", + }; const payloadUser = { notification: messageUser, }; const inputUser = { registrationTokens: getUserInfo.fcmToken, - payload: payloadUser - } - await sendSingle(inputUser) + payload: payloadUser, + }; + await sendSingle(inputUser); //------------------------------------------------------------------- //------------------------------- send sms -------------------------- - const smsTemplate = `سفارش شما با موفقیت ثبت شد با تشکر از اعتماد شما برگ من لغو11` + const smsTemplate = `سفارش شما با موفقیت ثبت شد با تشکر از اعتماد شما برگ من لغو11`; - const smsResult = await sms(getUserInfo.mobile_number, smsTemplate) + const smsResult = await sms(getUserInfo.mobile_number, smsTemplate); - if (!smsResult || !smsResult.data.IsSuccessful) { - return res500(res, `مشکلی در ارسال پیامک پیش آمده است`) + if (!smsResult) { + return res500(res, `مشکلی در ارسال پیامک پیش آمده است`); } //------------------------------------------------------------------- - return res.json({message: _sr['fa'].response.success_save}) + return res.json({ message: _sr["fa"].response.success_save }); } - const request = await zarinpal.request(checkOrder?.payTotal, checkOrder?.number?.toString(), req.user) + const request = await zarinpal.request(checkOrder?.payTotal, checkOrder?.number?.toString(), req.user); if (!request.status) { - console.log(request) - return res500(res, _sr['fa'].response.unknownError) + console.log(request); + return res500(res, _sr["fa"].response.unknownError); } // add payment to order @@ -771,111 +762,112 @@ module.exports.orderPay = [ order_id: checkOrder._id, transactionId: request.response.authority, cost: checkOrder.payTotal, - }) + }); if (addPayment) { - checkOrder.payment = addPayment._id + checkOrder.payment = addPayment._id; await checkOrder.save(); } else { - return res500(res, _sr['fa'].response.unknownError) + return res500(res, _sr["fa"].response.unknownError); } /// remove cart item - await CartItem.deleteMany({branchId , user_id: req.user._id}) - - return res.json({paymentUrl: `${zarinUrl}/${request.response.authority}`}) + await CartItem.deleteMany({ branchId, user_id: req.user._id }); + return res.json({ paymentUrl: `${zarinUrl}/${request.response.authority}` }); } catch (error) { - console.log(error.message) - return res500(res, _sr['fa'].response.unknownError) + console.log(error.message); + return res500(res, _sr["fa"].response.unknownError); } - } -] + }, +]; module.exports.getPaymentResponse = [ async (req, res) => { try { - const checkPayment = await Payment.findOne({transactionId: req?.query?.Authority}).populate('order_id') + const checkPayment = await Payment.findOne({ transactionId: req?.query?.Authority }).populate("order_id"); - const user = await User.findById(checkPayment.user_id) + const user = await User.findById(checkPayment.user_id); ///check duplicate transaction - if (!checkPayment || checkPayment.getPayment || checkPayment.action === 'decreaseBag') { + if (!checkPayment || checkPayment.getPayment || checkPayment.action === "decreaseBag") { return res.json({ status: false, - fromWhere : user?.fromWhere || 'app', - message: 'پرداخت ناموفق بود' - }) + fromWhere: user?.fromWhere || "app", + message: "پرداخت ناموفق بود", + }); } /// verify transaction - const verify = await zarinpal.verify(checkPayment.action === 'increaseBag' ? checkPayment.cost : checkPayment.order_id.payTotal, checkPayment.transactionId) + const verify = await zarinpal.verify( + checkPayment.action === "increaseBag" ? checkPayment.cost : checkPayment.order_id.payTotal, + checkPayment.transactionId, + ); - console.log(verify) + console.log(verify); if (verify.status) { - if (verify.code === 101) { - console.log(verify) + console.log(verify); return res.json({ status: false, - message: 'پرداخت ناموفق بود' - }) + message: "پرداخت ناموفق بود", + }); } - checkPayment.status = 'paid' - checkPayment.refId = verify?.response?.ref_id - checkPayment.getPayment = true - checkPayment.fee_type = verify?.response?.fee_type - checkPayment.card_hash = verify?.response?.card_hash - checkPayment.card_pan = verify?.response?.card_pan - checkPayment.fee = verify?.response?.fee - checkPayment.created_at = Date.now() - checkPayment.createdOn = Date.now() + checkPayment.status = "paid"; + checkPayment.refId = verify?.response?.ref_id; + checkPayment.getPayment = true; + checkPayment.fee_type = verify?.response?.fee_type; + checkPayment.card_hash = verify?.response?.card_hash; + checkPayment.card_pan = verify?.response?.card_pan; + checkPayment.fee = verify?.response?.fee; + checkPayment.created_at = Date.now(); + checkPayment.createdOn = Date.now(); - await checkPayment.save() + await checkPayment.save(); /// only for buy food execute this action - if (checkPayment.action === 'payOrder') { - const getOrder = await Order.findById(checkPayment.order_id._id) + if (checkPayment.action === "payOrder") { + const getOrder = await Order.findById(checkPayment.order_id._id); - if (!getOrder) return res404(res, 'سفارش پیدا نشد') + if (!getOrder) return res404(res, "سفارش پیدا نشد"); for (const food of getOrder.order_items) { - const getFood = await Food.findById(food.product_id) + const getFood = await Food.findById(food.product_id); if (getFood) { - getFood.stock = getFood.stock - food.quantity + getFood.stock = getFood.stock - food.quantity; // getFood.canReview.push(req.user._id)///add user id for review - getFood.save() + getFood.save(); } } if (getOrder.discount_code) { - const discount = await DiscountCode.findOne({discount_code: getOrder.discount_code}) + const discount = await DiscountCode.findOne({ discount_code: getOrder.discount_code }); if (discount) { - discount.used_by.push(getOrder.user_id) + discount.used_by.push(getOrder.user_id); - await discount.save() + await discount.save(); } } if (user) { /// decrease score if (getOrder?.score) { - getOrder.scorePoint = user.score - getOrder.scoreCost = user.score * getOrder?.pricePoint + getOrder.scorePoint = user.score; + getOrder.scoreCost = user.score * getOrder?.pricePoint; user.scoreLogs = [ { score: user.score, order_id: getOrder._id, - forWhat: 'buy', - action: 'decrease' - } - ] - user.score = 0 - await user.save() + forWhat: "buy", + action: "decrease", + }, + ]; + user.score = 0; + await user.save(); } /// decrease bag @@ -886,127 +878,126 @@ module.exports.getPaymentResponse = [ transactionId: Date.now(), refId: Date.now(), getPayment: true, - action: 'decreaseBag', - status: 'paid', + action: "decreaseBag", + status: "paid", cost: user.bagAmount, - }) - getOrder.payment.push(addPayment._id) - getOrder.bagCost = user.bagAmount - user.bagAmount = 0 - await user.save() + }); + getOrder.payment.push(addPayment._id); + getOrder.bagCost = user.bagAmount; + user.bagAmount = 0; + await user.save(); } if (!getOrder.score || !getOrder?.discount_code) { // add point for user only for available product - const computeAvaPro = await _computeHavePointPrice(getOrder?.order_items) + const computeAvaPro = await _computeHavePointPrice(getOrder?.order_items); /// add score for order if (computeAvaPro >= getOrder?.totalPricePoint && getOrder?.totalPricePoint > 0) { - const point = (Math.floor(computeAvaPro / getOrder?.totalPricePoint) * getOrder?.pointForBuy) + const point = Math.floor(computeAvaPro / getOrder?.totalPricePoint) * getOrder?.pointForBuy; if (point > 0) { - user.score = user.score + point + user.score = user.score + point; user.scoreLogs = [ { score: point, order_id: getOrder._id, - forWhat: 'buy', - action: 'increase' - } - ] - await user.save() + forWhat: "buy", + action: "increase", + }, + ]; + await user.save(); } } } } getOrder.statuses.push({ - status: 'processing' - }) - getOrder.status = 'processing' - getOrder.paymentStatus = 'paid' + status: "processing", + }); + getOrder.status = "processing"; + getOrder.paymentStatus = "paid"; - await getOrder.save() + await getOrder.save(); //----------------------- send notif for admins ----------------- - const fcmTokens = [] - const allAdmins = await User.find({scope: 'admin'}) + const fcmTokens = []; + const allAdmins = await User.find({ scope: "admin" }); for (const admin of allAdmins) { - if (admin.fcmToken) fcmTokens.push(admin.fcmToken) + if (admin.fcmToken) fcmTokens.push(admin.fcmToken); } const objNotif = { - title: 'سفارش جدید!', - body: 'یک سفارش جدید در پنل برگ من ثبت گردید' - } + title: "سفارش جدید!", + body: "یک سفارش جدید در پنل برگ من ثبت گردید", + }; const payload = { notification: objNotif, }; const input = { registrationTokens: fcmTokens, - payload - } - await sendMulti(input) + payload, + }; + await sendMulti(input); - sendNotifyOrder(getOrder?.branchId) + sendNotifyOrder(getOrder?.branchId); //---------------------------------------------------------------- //--------------------- send notif to user -------------------------- const messageUser = { - title: 'ثبت سفارش', - body: 'با تشکر از اعتماد شما سفارش شما با موفقیت ثبت شد' - } + title: "ثبت سفارش", + body: "با تشکر از اعتماد شما سفارش شما با موفقیت ثبت شد", + }; const payloadUser = { notification: messageUser, }; const inputUser = { registrationTokens: user.fcmToken, - payload: payloadUser - } - await sendSingle(inputUser) + payload: payloadUser, + }; + await sendSingle(inputUser); //------------------------------------------------------------------- //------------------------------- send sms -------------------------- - const smsTemplate = `سفارش شما با موفقیت ثبت شد با تشکر از اعتماد شما برگ من لغو11` + const smsTemplate = `سفارش شما با موفقیت ثبت شد با تشکر از اعتماد شما برگ من لغو11`; - const smsResult = await sms(user.mobile_number, smsTemplate) + const smsResult = await sms(user.mobile_number, smsTemplate); - if (!smsResult || !smsResult.data.IsSuccessful) { - return res500(res, `مشکلی در ارسال پیامک پیش آمده است`) + if (!smsResult) { + return res500(res, `مشکلی در ارسال پیامک پیش آمده است`); } //------------------------------------------------------------------- + } else if (checkPayment.action === "increaseBag") { + if (!user) + return res.json({ + status: false, + message: "مشکلی در افزایش موجودی کیف پول شما پیش آمده است لطفا با پشتیبانی تماس بگیرید", + }); + user.bagAmount = user.bagAmount + checkPayment?.cost; - } else if (checkPayment.action === 'increaseBag') { - if (!user) return res.json({ - status: false, - message: 'مشکلی در افزایش موجودی کیف پول شما پیش آمده است لطفا با پشتیبانی تماس بگیرید' - }) - - user.bagAmount = user.bagAmount + checkPayment?.cost - - await user.save() + await user.save(); //--------------------- send notif to user -------------------------- const messageUser = { - title: 'افزایش موجودی', - body: 'با تشکر از اعتماد شما کیف پول شما با موفقیت شارژ شد برگ من' - } + title: "افزایش موجودی", + body: "با تشکر از اعتماد شما کیف پول شما با موفقیت شارژ شد برگ من", + }; const payloadUser = { notification: messageUser, }; const inputUser = { registrationTokens: user.fcmToken, - payload: payloadUser - } - await sendSingle(inputUser) + payload: payloadUser, + }; + await sendSingle(inputUser); //------------------------------------------------------------------- //------------------------------- send sms -------------------------- - const smsTemplate = `با تشکر از اعتماد شما کیف پول شما با موفقیت شارژ شد برگ من لغو11` + const smsTemplate = `با تشکر از اعتماد شما کیف پول شما با موفقیت شارژ شد برگ من لغو11`; - const smsResult = await sms(user.mobile_number, smsTemplate) + const smsResult = await sms(user.mobile_number, smsTemplate); - if (!smsResult || !smsResult.data.IsSuccessful) { - return res500(res, `مشکلی در ارسال پیامک پیش آمده است`) + if (!smsResult) { + return res500(res, `مشکلی در ارسال پیامک پیش آمده است`); } //------------------------------------------------------------------- } @@ -1014,279 +1005,281 @@ module.exports.getPaymentResponse = [ return res.json({ status: true, refId: verify?.response?.ref_id, - fromWhere : user?.fromWhere || 'app', - message: 'پرداخت با موفقیت انجام شد' - }) - + fromWhere: user?.fromWhere || "app", + message: "پرداخت با موفقیت انجام شد", + }); } else { /// only for buy food execute this action - if (checkPayment.action === 'payOrder') { - let getOrder = await Order.findById(checkPayment.order_id._id) + if (checkPayment.action === "payOrder") { + let getOrder = await Order.findById(checkPayment.order_id._id); if (getOrder) { getOrder.statuses.push({ - status: 'void' - }) - getOrder.status = 'void' - getOrder.paymentStatus = 'unpaid' + status: "void", + }); + getOrder.status = "void"; + getOrder.paymentStatus = "unpaid"; - await getOrder.save() + await getOrder.save(); } - checkPayment.getPayment = true - checkPayment.created_at = new Date() - await checkPayment.save() + checkPayment.getPayment = true; + checkPayment.created_at = new Date(); + await checkPayment.save(); } return res.json({ status: false, - fromWhere : user?.fromWhere || 'app', - message: 'پرداخت ناموفق بود' - }) + fromWhere: user?.fromWhere || "app", + message: "پرداخت ناموفق بود", + }); } } catch (error) { - console.log(error.message) - return res500(res, _sr['fa'].response.unknownError) + console.log(error.message); + return res500(res, _sr["fa"].response.unknownError); } - } -] + }, +]; module.exports.addAddressToOrder = [ (req, res) => { Order.findById(req.params.order_id) - .then(order => { - if (!order.address) { - User.findOne({'addresses._id': req.body.address_id}) - .then(user => { - order.address = user.addresses.id(req.body.address_id) - // add processing status to order - order.statuses.push({ - status: 'processing' - }) - order.save() - return res.json(order) - }) - .catch(err => { - return res500(res, err) - }) - } else { - return res.status(500).json({message: v_m[req.body.locale].response.already_has_address}) - } - }) - .catch(err => { - return res404(res, err) - }) - } -] + .then((order) => { + if (!order.address) { + User.findOne({ "addresses._id": req.body.address_id }) + .then((user) => { + order.address = user.addresses.id(req.body.address_id); + // add processing status to order + order.statuses.push({ + status: "processing", + }); + order.save(); + return res.json(order); + }) + .catch((err) => { + return res500(res, err); + }); + } else { + return res.status(500).json({ message: v_m[req.body.locale].response.already_has_address }); + } + }) + .catch((err) => { + return res404(res, err); + }); + }, +]; module.exports.addStatusToOrder = [ async (req, res) => { try { - const order = await Order.findById(req.params.order_id).populate('user_id') + const order = await Order.findById(req.params.order_id).populate("user_id"); - if (!order) return res404(res, 'سفارش مورد نظر یافت نشد') + if (!order) return res404(res, "سفارش مورد نظر یافت نشد"); order.statuses.push({ - status: req.body.status - }) - order.status = req.body.status - order.save() + status: req.body.status, + }); + order.status = req.body.status; + order.save(); - if (req.body.status === 'delivered') { + if (req.body.status === "delivered") { //--------------------- send notif to user -------------------------- const messageUser = { - title: 'ارسال سفارش', - body: 'سفارش شما ارسال گردید با تشکر برگ من' - } + title: "ارسال سفارش", + body: "سفارش شما ارسال گردید با تشکر برگ من", + }; const payloadUser = { notification: messageUser, }; const inputUser = { registrationTokens: order?.user_id?.fcmToken, - payload: payloadUser - } - await sendSingle(inputUser) + payload: payloadUser, + }; + await sendSingle(inputUser); //------------------------------------------------------------------- setTimeout(async () => { - let smsTemplate = '' - if (order.user_id.fromWhere === 'app') smsTemplate = `لطفا با ثبت نظر برای سفارش خود به ما برای خدمات بهتر کمک کنید با تشکر برگ من` - else smsTemplate = `لطفا با ثبت نظر برای سفارش خود به ما برای خدمات بهتر کمک کنید با تشکر برگ من لغو11 - لینک : https://app.bargrestaurant.com/rate/${req.params.order_id}` - const smsResult = await sms(order?.user_id?.mobile_number, smsTemplate) + let smsTemplate = ""; + if (order.user_id.fromWhere === "app") + smsTemplate = `لطفا با ثبت نظر برای سفارش خود به ما برای خدمات بهتر کمک کنید با تشکر برگ من`; + else + smsTemplate = `لطفا با ثبت نظر برای سفارش خود به ما برای خدمات بهتر کمک کنید با تشکر برگ من لغو11 + لینک : https://app.bargrestaurant.com/rate/${req.params.order_id}`; + const smsResult = await sms(order?.user_id?.mobile_number, smsTemplate); //--------------------- send notif to user -------------------------- const messageUser = { - title: 'ثبت نظر', - body: 'لطفا با ثبت نظر برای سفارش خود به ما برای خدمات بهتر کمک کنید با تشکر' - } + title: "ثبت نظر", + body: "لطفا با ثبت نظر برای سفارش خود به ما برای خدمات بهتر کمک کنید با تشکر", + }; const payloadUser = { notification: messageUser, }; const inputUser = { registrationTokens: order?.user_id?.fcmToken, - payload: payloadUser - } - await sendSingle(inputUser) + payload: payloadUser, + }; + await sendSingle(inputUser); //------------------------------------------------------------------- - if (!smsResult || !smsResult.data.IsSuccessful) { - console.log('order sms', smsResult) + if (!smsResult) { + console.log("order sms", smsResult); } - }, timeToStart) + }, timeToStart); } - return res.json(order) + return res.json(order); } catch (error) { - console.log(error.message) - return res500(res, _sr['fa'].response.unknownError) + console.log(error.message); + return res500(res, _sr["fa"].response.unknownError); } - } -] + }, +]; module.exports.changePayStatus = [ [ - body('status') - .notEmpty().withMessage(_sr['fa'].required.field) - .bail() - .isIn(['refund', 'unpaid', 'paid']).withMessage('وضعیت ارسال شده صحیح نمی باشد') + body("status") + .notEmpty() + .withMessage(_sr["fa"].required.field) + .bail() + .isIn(["refund", "unpaid", "paid"]) + .withMessage("وضعیت ارسال شده صحیح نمی باشد"), ], checkValidations(validationResult), async (req, res) => { try { - const targetOrder = await Order.findById(req.params.id) + const targetOrder = await Order.findById(req.params.id); - if (!targetOrder) return res404(res, 'سفارش مورد نظر پیدا نشد'); + if (!targetOrder) return res404(res, "سفارش مورد نظر پیدا نشد"); - const targetPayment = await Payment.findById(targetOrder.payment) + const targetPayment = await Payment.findById(targetOrder.payment); if (targetPayment) { - targetPayment.status = req.body.status - await targetPayment.save() + targetPayment.status = req.body.status; + await targetPayment.save(); } - targetOrder.paymentStatus = req.body.status - await targetOrder.save() + targetOrder.paymentStatus = req.body.status; + await targetOrder.save(); - return res.json({message: _sr['fa'].response.success_save}) + return res.json({ message: _sr["fa"].response.success_save }); } catch (error) { - return res500(res, _sr['fa'].response.unknownError) + return res500(res, _sr["fa"].response.unknownError); } - } -] + }, +]; module.exports.getOrders = [ (req, res) => { - const branchId = req?.params?.branchId + const branchId = req?.params?.branchId; Order.find({ branchId, user_id: req.user._id, - status: {$in: ['canceled' , 'processing', 'sent', 'delivered']}, - paymentStatus: 'paid' - }).populate({ - path: 'order_items.product_id', - select: 'name canReview ratings' - }).sort({_id: -1}) - .then(orders => { - const allOrders = [] + status: { $in: ["canceled", "processing", "sent", "delivered"] }, + paymentStatus: "paid", + }) + .populate({ + path: "order_items.product_id", + select: "name canReview ratings", + }) + .sort({ _id: -1 }) + .then((orders) => { + const allOrders = []; - for (const item of orders) { - let clone = JSON.parse(JSON.stringify(item.order_items)) + for (const item of orders) { + let clone = JSON.parse(JSON.stringify(item.order_items)); - clone.map(food => { - // food.review = food?.product_id?.canReview?.includes(req.user._id.toString()) - // food.rating = food?.product_id?.ratings?.find(rate => rate.user_id.toString() === req.user._id.toString() && rate?.order_id?.toString() === item?._id?.toString())?.rate || 0 - food.rating = food?.product_id?.ratings?.find(rate => rate?.user_id?.toString() === req?.user?._id.toString())?.rate || 0 - }) + clone.map((food) => { + // food.review = food?.product_id?.canReview?.includes(req.user._id.toString()) + // food.rating = food?.product_id?.ratings?.find(rate => rate.user_id.toString() === req.user._id.toString() && rate?.order_id?.toString() === item?._id?.toString())?.rate || 0 + food.rating = food?.product_id?.ratings?.find((rate) => rate?.user_id?.toString() === req?.user?._id.toString())?.rate || 0; + }); - allOrders.push({ - _id: item._id, - address: item.address, - status: item.status, - items: clone, - orderType: item.orderType, - review: item.rating.rate, - created_at: item.createdOn, - total: item.total - }) - } + allOrders.push({ + _id: item._id, + address: item.address, + status: item.status, + items: clone, + orderType: item.orderType, + review: item.rating.rate, + created_at: item.createdOn, + total: item.total, + }); + } - return res.json(allOrders) - }) - .catch(err => { - console.log(err.message) - return res500(res, _sr['fa'].response.unknownError) - }) - } -] + return res.json(allOrders); + }) + .catch((err) => { + console.log(err.message); + return res500(res, _sr["fa"].response.unknownError); + }); + }, +]; module.exports.getOrdersForReport = [ async (req, res) => { try { - const branchId = req?.params?.branchId + const branchId = req?.params?.branchId; const orders = await Order.find({ branchId, - status: {$in: ['canceled' ,'processing', 'sent', 'delivered']}, - paymentStatus: 'paid' - }) - return res.json(orders) + status: { $in: ["canceled", "processing", "sent", "delivered"] }, + paymentStatus: "paid", + }); + return res.json(orders); } catch (error) { - return res500(res, _sr['fa'].response.unknownError) + return res500(res, _sr["fa"].response.unknownError); } - } -] + }, +]; module.exports.getOneOrderByUser = [ async (req, res) => { try { - const targetOrder = await Order.findOne({_id: req.params.id, user_id: req.user._id}).select('status') + const targetOrder = await Order.findOne({ _id: req.params.id, user_id: req.user._id }).select("status"); - if (!targetOrder) return res404(res, 'سفارش مورد نظر پیدا نشد') + if (!targetOrder) return res404(res, "سفارش مورد نظر پیدا نشد"); - return res.json(targetOrder) + return res.json(targetOrder); } catch (error) { - console.log('get one order by user |', error.message) - return res500(res, _sr['fa'].response.unknownError) + console.log("get one order by user |", error.message); + return res500(res, _sr["fa"].response.unknownError); } - } -] + }, +]; module.exports.deleteOrder = [ async (req, res) => { try { const targetOrder = await Order.findById(req.params.id); - if (!targetOrder) return res404(res, 'سفارش مورد نظر پیدا نشد') + if (!targetOrder) return res404(res, "سفارش مورد نظر پیدا نشد"); /// @todo maybe delete payment too - await targetOrder.deleteOne() + await targetOrder.deleteOne(); - return res.json({message: _sr['fa'].response.success_remove}) + return res.json({ message: _sr["fa"].response.success_remove }); } catch (error) { - console.log('delete order: ', error.message) - return res500(res, _sr['fa'].response.unknownError) + console.log("delete order: ", error.message); + return res500(res, _sr["fa"].response.unknownError); } - } -] + }, +]; module.exports.increaseBag = [ - [ - body('price') - .notEmpty().withMessage(`لطفا یک مقدار مشخص کنید`) - ], + [body("price").notEmpty().withMessage(`لطفا یک مقدار مشخص کنید`)], checkValidations(validationResult), async (req, res) => { try { const cost = req.body.price; - const user = await User.findById(req.user._id) + const user = await User.findById(req.user._id); - if (!user) return res404(res, `اطلاعات کاربر پیدا نشد`) + if (!user) return res404(res, `اطلاعات کاربر پیدا نشد`); - const request = await zarinpal.request(cost, 'کیف پول', req.user) + const request = await zarinpal.request(cost, "کیف پول", req.user); if (!request.status) { - console.log(request) - return res500(res, _sr['fa'].response.unknownError) + console.log(request); + return res500(res, _sr["fa"].response.unknownError); } // add payment to order @@ -1295,122 +1288,119 @@ module.exports.increaseBag = [ order_id: null, transactionId: request.response.authority, cost: cost, - action: 'increaseBag' - }) + action: "increaseBag", + }); - return res.json({paymentUrl: `${zarinUrl}/${request.response.authority}`}) + return res.json({ paymentUrl: `${zarinUrl}/${request.response.authority}` }); } catch (error) { - return res500(res, _sr['fa'].response.unknownError) + return res500(res, _sr["fa"].response.unknownError); } - } -] + }, +]; /////// admin panel module.exports.getOneOrder = [ (req, res) => { - Order.findById(req.params.id).populate({ - path: 'user_id', - select: 'first_name last_name scoreLogs' - }).populate('order_items.product_id') - .populate('payment') - .then(order => { - return res.json(order) - }) - .catch(err => { - return res404(res, err) - }) - } -] + Order.findById(req.params.id) + .populate({ + path: "user_id", + select: "first_name last_name scoreLogs", + }) + .populate("order_items.product_id") + .populate("payment") + .then((order) => { + return res.json(order); + }) + .catch((err) => { + return res404(res, err); + }); + }, +]; module.exports.search = [ async (req, res) => { try { - let { - branchId, - number, - orderStatus, - paymentStatus, - userId, - date - } = req.body; + let { branchId, number, orderStatus, paymentStatus, userId, date } = req.body; let findQuery = { branchId, - status: {$nin: ['incomplete', 'void']} + status: { $nin: ["incomplete", "void"] }, }; - findQuery['$and'] = []; - findQuery['$or'] = []; + findQuery["$and"] = []; + findQuery["$or"] = []; /** search by number */ if (number && !_.isEmpty(number)) { - findQuery['$and'].push({ - number + findQuery["$and"].push({ + number, }); } /** search by orderStatus */ if (orderStatus && !_.isEmpty(orderStatus)) { - findQuery['$and'].push({ + findQuery["$and"].push({ status: { - $in: orderStatus - } + $in: orderStatus, + }, }); } /** search by paymentStatus */ if (paymentStatus && !_.isEmpty(paymentStatus)) { - findQuery['$and'].push({ + findQuery["$and"].push({ paymentStatus: { - $in: paymentStatus - } + $in: paymentStatus, + }, }); } /** search by user_id */ if (userId && !_.isEmpty(userId)) { - findQuery['$and'].push({ - user_id: userId + findQuery["$and"].push({ + user_id: userId, }); } /** search by date */ if (date && !_.isEmpty(date)) { if (date.length === 1) { - findQuery['$and'].push({ + findQuery["$and"].push({ createdOn: { - $gte: moment(date[0]).startOf('days'), - $lt: moment(date[0]).endOf('days') - } + $gte: moment(date[0]).startOf("days"), + $lt: moment(date[0]).endOf("days"), + }, }); } else { - findQuery['$and'].push({ + findQuery["$and"].push({ createdOn: { $gte: new Date(date[0]), - $lt: new Date(date[1]) - } + $lt: new Date(date[1]), + }, }); } } - _.isEmpty(findQuery['$and']) && delete findQuery['$and']; - _.isEmpty(findQuery['$or']) && delete findQuery['$or']; + _.isEmpty(findQuery["$and"]) && delete findQuery["$and"]; + _.isEmpty(findQuery["$or"]) && delete findQuery["$or"]; /** get news */ const orders = await Order.paginate(findQuery, { - page: req.query.page, limit, populate: [{path: 'user_id', select: 'first_name last_name'}], + page: req.query.page, + limit, + populate: [{ path: "user_id", select: "first_name last_name" }], sort: { - _id: -1 - } + _id: -1, + }, }); /** show result */ return res.json(orders); } catch (error) { - console.log(error.message) - return res500(res, _sr['fa'].response.unknownError) + console.log(error.message); + return res500(res, _sr["fa"].response.unknownError); } - } -] + }, +]; module.exports.reports = [ // [ @@ -1423,38 +1413,38 @@ module.exports.reports = [ // checkValidations(validationResult), async (req, res) => { try { - const branchId = req?.params?.branchId + const branchId = req?.params?.branchId; let findQuery = { branchId, - status: {$nin: ['incomplete', 'void']} + status: { $nin: ["incomplete", "void"] }, }; - let {startDate,endDate} = req.body; + let { startDate, endDate } = req.body; // if (!startDate || !endDate){ - // findQuery.createdOn = { - // createdOn: { - // $gte: moment().startOf('days'), - // $lt: moment().endOf('days') - // } - // } + // findQuery.createdOn = { + // createdOn: { + // $gte: moment().startOf('days'), + // $lt: moment().endOf('days') + // } + // } // }else { - if (startDate && endDate) { - findQuery.createdOn = { - $gte: new Date(startDate), - $lt: new Date(endDate) - } - }else if (startDate){ - findQuery.createdOn = { - $gte: moment(startDate), - $lt: new Date() - } - }else if (endDate){ - findQuery.createdOn = { - // $gte: '', - $lt: moment(endDate) - } - } + if (startDate && endDate) { + findQuery.createdOn = { + $gte: new Date(startDate), + $lt: new Date(endDate), + }; + } else if (startDate) { + findQuery.createdOn = { + $gte: moment(startDate), + $lt: new Date(), + }; + } else if (endDate) { + findQuery.createdOn = { + // $gte: '', + $lt: moment(endDate), + }; + } // } /** search by date */ @@ -1475,87 +1465,91 @@ module.exports.reports = [ // } /** get news */ - const orders = await Order.find(findQuery).populate({path: 'user_id', select: 'first_name last_name'}).sort({_id: -1}); + const orders = await Order.find(findQuery).populate({ path: "user_id", select: "first_name last_name" }).sort({ _id: -1 }); let result = { count: orders?.length || 0, - total: orders?.reduce((total, item) => { - return total + item?.total - }, 0) || 0, - payOnline: orders?.reduce((total, item) => { - return total + item?.payTotal - }, 0) || 0, - routePrice: orders?.reduce((total, item) => { - return total + item?.routePrice - }, 0) || 0, - bagCost: orders?.reduce((total, item) => { - return total + item?.bagCost - }, 0) || 0, - scorePoint: orders?.reduce((total, item) => { - return total + item?.scorePoint - }, 0) || 0, - scoreCost: orders?.reduce((total, item) => { - return total + item?.scoreCost - }, 0) || 0, - } + total: + orders?.reduce((total, item) => { + return total + item?.total; + }, 0) || 0, + payOnline: + orders?.reduce((total, item) => { + return total + item?.payTotal; + }, 0) || 0, + routePrice: + orders?.reduce((total, item) => { + return total + item?.routePrice; + }, 0) || 0, + bagCost: + orders?.reduce((total, item) => { + return total + item?.bagCost; + }, 0) || 0, + scorePoint: + orders?.reduce((total, item) => { + return total + item?.scorePoint; + }, 0) || 0, + scoreCost: + orders?.reduce((total, item) => { + return total + item?.scoreCost; + }, 0) || 0, + }; /** show result */ return res.json(result); } catch (error) { - console.log(error.message) - return res500(res, _sr['fa'].response.unknownError) + console.log(error.message); + return res500(res, _sr["fa"].response.unknownError); } - } -] + }, +]; //////////////////////////////////// compute price module.exports.computePrice = [ //////////////////// validation step (req, res, next) => { - const branchId = req?.params?.branchId - CartItem.find({branchId , user_id: req.user._id}) - .then(items => { - // check if cart is not empty - if (items.length) { - // check product stock - let outOfRun = [] - items.forEach(async (item, index) => { - await Food.findById(item.product_id) - .then(product => { - if (product.stock < item.quantity) { - outOfRun.push({ - product_id: product._id, - category_id: product.category, - stock: product.stock - }) - item.remove() - } - if (index + 1 === items.length) { - if (!outOfRun.length) return next() - else return res.status(422).json(outOfRun) - } - }) - }) - } else { - return res.status(404).json({message: _sr['fa'].response.cart_empty}) - } - }) + const branchId = req?.params?.branchId; + CartItem.find({ branchId, user_id: req.user._id }).then((items) => { + // check if cart is not empty + if (items.length) { + // check product stock + let outOfRun = []; + items.forEach(async (item, index) => { + await Food.findById(item.product_id).then((product) => { + if (product.stock < item.quantity) { + outOfRun.push({ + product_id: product._id, + category_id: product.category, + stock: product.stock, + }); + item.remove(); + } + if (index + 1 === items.length) { + if (!outOfRun.length) return next(); + else return res.status(422).json(outOfRun); + } + }); + }); + } else { + return res.status(404).json({ message: _sr["fa"].response.cart_empty }); + } + }); }, async (req, res) => { try { - const branchId = req?.params?.branchId - const cartItems = await CartItem.find({branchId, user_id: req.user._id}).populate({ - path: 'product_id', + const branchId = req?.params?.branchId; + const cartItems = await CartItem.find({ branchId, user_id: req.user._id }).populate({ + path: "product_id", populate: { - path: 'category', - model: 'FoodCategory' - } + path: "category", + model: "FoodCategory", + }, }); - const checkOrder = await Order.findOne({branchId , 'status': 'incomplete', user_id: req.user._id}) + const checkOrder = await Order.findOne({ branchId, status: "incomplete", user_id: req.user._id }); const getUserInfo = await User.findById(req.user._id); - const getStoreInfo = await StoreInfo.findOne({_id : branchId}) + const getStoreInfo = await StoreInfo.findOne({ _id: branchId }); const product = []; - const userAddress = getUserInfo.addresses.find(item => item.used === true) || null + const userAddress = getUserInfo.addresses.find((item) => item.used === true) || null; let specialDiscountMenuType = false; let discount_percent = checkOrder?.discount_amount || 0; let discount_menuType = checkOrder?.discount_menuType; @@ -1569,7 +1563,7 @@ module.exports.computePrice = [ if (!getUserInfo) return res404(res, `اطلاعات کاربر یافت نشد`); - if (!cartItems.length) return res.status(404).json({message: `هیچ محصولی در سبد خرید شما وجود ندارد`}) + if (!cartItems.length) return res.status(404).json({ message: `هیچ محصولی در سبد خرید شما وجود ندارد` }); if (checkOrder) { const orderItems = []; @@ -1580,25 +1574,25 @@ module.exports.computePrice = [ quantity: item.quantity, price: item.product_id.price, static_discount: item.product_id.static_discount, - havePoint: item.product_id.havePoint + havePoint: item.product_id.havePoint, }); product.push({ product: item.product_id, - quantity: item.quantity - }) + quantity: item.quantity, + }); - const itemPercent = item.product_id.price * item.product_id.static_discount / 100; + const itemPercent = (item.product_id.price * item.product_id.static_discount) / 100; const sumPercent = itemPercent * item.quantity; const price = item.product_id.price; const sumPriceItem = price * item.quantity; - let sumByPercentForDiscount = sumPriceItem - sumPercent + let sumByPercentForDiscount = sumPriceItem - sumPercent; if (Boolean(discount_percent) && discount_menuType) { - specialDiscountMenuType = true + specialDiscountMenuType = true; if (item?.product_id?.category.type?.toString() === discount_menuType?.toString()) { - sumFoodByPercentForDiscount += sumByPercentForDiscount + sumFoodByPercentForDiscount += sumByPercentForDiscount; } } @@ -1607,53 +1601,54 @@ module.exports.computePrice = [ } /// sum food price with percent - sumFoodByPercent = sum - percent + sumFoodByPercent = sum - percent; /// compute shipping cost if (getStoreInfo) { if (getStoreInfo?.shippingType) { routePrice = getStoreInfo?.shippingCost || 0; } else { - routePrice = await _computeShippingCostByRoad(getUserInfo?.addresses, getStoreInfo?.location) * (getStoreInfo?.shippingCost || 0) || 0; + routePrice = + (await _computeShippingCostByRoad(getUserInfo?.addresses, getStoreInfo?.location)) * (getStoreInfo?.shippingCost || 0) || 0; } /// compute tax of order if (getStoreInfo?.tax) { - tax = sumFoodByPercent * 9 / 100 + tax = (sumFoodByPercent * 9) / 100; } } /// compute discount code if (Boolean(discount_percent)) { - let discountPercent = (specialDiscountMenuType ? sumFoodByPercentForDiscount : sumFoodByPercent) * discount_percent / 100 - percent = percent + discountPercent + let discountPercent = ((specialDiscountMenuType ? sumFoodByPercentForDiscount : sumFoodByPercent) * discount_percent) / 100; + percent = percent + discountPercent; /// compute sum food with discount percent - sumFoodByPercent = sumFoodByPercent - discountPercent + sumFoodByPercent = sumFoodByPercent - discountPercent; } /// compute total of order total = sumFoodByPercent + tax + routePrice; - checkOrder.order_items = orderItems - checkOrder.createdOn = Date.now() - checkOrder.sum = Math.ceil(sum) - checkOrder.routePrice = Math.ceil(routePrice) - checkOrder.tax = Math.ceil(tax) - checkOrder.percent = Math.ceil(percent) - checkOrder.total = Math.ceil(total) - checkOrder.pricePoint = getStoreInfo?.pricePoint + checkOrder.order_items = orderItems; + checkOrder.createdOn = Date.now(); + checkOrder.sum = Math.ceil(sum); + checkOrder.routePrice = Math.ceil(routePrice); + checkOrder.tax = Math.ceil(tax); + checkOrder.percent = Math.ceil(percent); + checkOrder.total = Math.ceil(total); + checkOrder.pricePoint = getStoreInfo?.pricePoint; if (checkOrder.bag) { - const payPrice = total - getUserInfo?.bagAmount - total = payPrice <= 0 ? 0 : payPrice + const payPrice = total - getUserInfo?.bagAmount; + total = payPrice <= 0 ? 0 : payPrice; } if (checkOrder.score && getStoreInfo?.pricePoint > 0) { - const payScore = total - (getUserInfo?.score * getStoreInfo?.pricePoint) - total = payScore <= 0 ? 0 : payScore + const payScore = total - getUserInfo?.score * getStoreInfo?.pricePoint; + total = payScore <= 0 ? 0 : payScore; } - checkOrder.payTotal = Math.ceil(total) + checkOrder.payTotal = Math.ceil(total); checkOrder.save(); } @@ -1666,64 +1661,66 @@ module.exports.computePrice = [ routePrice: Math.ceil(routePrice), tax: Math.ceil(tax), percent: Math.ceil(percent), - total: Math.ceil(checkOrder.payTotal) - }) - + total: Math.ceil(checkOrder.payTotal), + }); } catch (error) { - console.log(error.message) - return res500(res, _sr['fa'].response.unknownError) + console.log(error.message); + return res500(res, _sr["fa"].response.unknownError); } - } -] + }, +]; ////////////////////////////////////// get list of all orders for admin module.exports.getAllOrders = [ async (req, res) => { try { - const branchId = req?.params?.branchId - const orders = await Order.paginate({branchId, status: {$nin: ['incomplete', 'void']}}, { - page: req.query.page || 1, - limit, - populate: [ - {path: 'user_id', select: 'first_name last_name'} - ], - sort: {_id: -1} - }) - - return res.json(orders) + const branchId = req?.params?.branchId; + const orders = await Order.paginate( + { branchId, status: { $nin: ["incomplete", "void"] } }, + { + page: req.query.page || 1, + limit, + populate: [{ path: "user_id", select: "first_name last_name" }], + sort: { _id: -1 }, + }, + ); + return res.json(orders); } catch (error) { - return res500(res, _sr['fa'].response.unknownError) + return res500(res, _sr["fa"].response.unknownError); } - } -] + }, +]; ///////////////////////////////////// get payment list module.exports.getAllPaymentByUser = [ async (req, res) => { try { - const getAll = await Payment.find({user_id: req.user._id}).sort({_id: -1}) - return res.json(getAll) + const getAll = await Payment.find({ user_id: req.user._id }).sort({ _id: -1 }); + return res.json(getAll); } catch (error) { - return res500(res, _sr['fa'].response.unknownError) + return res500(res, _sr["fa"].response.unknownError); } - } -] + }, +]; module.exports.getAllPaymentByAdmin = [ async (req, res) => { try { - const getAll = await Payment.paginate({user_id: req.params.id}, { - page: req.query.page || 1, - limit, - sort: {_id: -1} - }) - return res.json(getAll) + const getAll = await Payment.paginate( + { user_id: req.params.id }, + { + page: req.query.page || 1, + limit, + sort: { _id: -1 }, + }, + ); + return res.json(getAll); } catch (error) { - return res500(res, _sr['fa'].response.unknownError) + return res500(res, _sr["fa"].response.unknownError); } - } -] + }, +]; //////////////////////////////////// get all foods for rates module.exports.getAllRateFood = [ @@ -1732,41 +1729,38 @@ module.exports.getAllRateFood = [ const getOrder = await Order.findOne({ _id: req.params.order_id, user_id: req.user._id, - status: 'delivered', - paymentStatus: 'paid' + status: "delivered", + paymentStatus: "paid", }).populate({ - path: 'order_items.product_id', - select: 'name ratings' - }) + path: "order_items.product_id", + select: "name ratings", + }); - if (!getOrder) return res404(res, `سفارش مورد نظر پیدا نشد`) + if (!getOrder) return res404(res, `سفارش مورد نظر پیدا نشد`); - return res.json(getOrder) + return res.json(getOrder); } catch (e) { - return res500(res, _sr['fa'].response.unknownError) + return res500(res, _sr["fa"].response.unknownError); } - } -] + }, +]; /////////////////////////////////// rate order module.exports.rateOrderAndFood = [ - [ - body('rateOrder') - .notEmpty().withMessage(_sr['fa'].required.field) - ], + [body("rateOrder").notEmpty().withMessage(_sr["fa"].required.field)], checkValidations(validationResult), async (req, res) => { try { - const orderId = req?.params?.order_id - const {rateOrder, reason, foods} = req.body + const orderId = req?.params?.order_id; + const { rateOrder, reason, foods } = req.body; const getOrder = await Order.findOne({ _id: orderId, user_id: req.user._id, - status: 'delivered', - paymentStatus: 'paid' - }) + status: "delivered", + paymentStatus: "paid", + }); - if (!getOrder) return res404(res, `سفارش مورد نظر پیدا نشد`) + if (!getOrder) return res404(res, `سفارش مورد نظر پیدا نشد`); //// add rate for all foods for (const food of foods) { @@ -1774,163 +1768,161 @@ module.exports.rateOrderAndFood = [ rate: food.rate, comment: food.comment, order_id: getOrder._id, - user_id: getOrder.user_id - } + user_id: getOrder.user_id, + }; //// check food exist or not - const getFood = await Food.findById(food?.product_id?._id) + const getFood = await Food.findById(food?.product_id?._id); - if (getFood && getOrder?.order_items.some(item => item?.product_id?._id?.toString() === getFood?._id?.toString())) { - getFood.ratings.push(data) - let rateSUM = 0 - getFood?.ratings?.forEach(item => rateSUM += Number(item.rate)) - getFood.rate = (rateSUM / getFood?.ratings?.length).toFixed(1) - await getFood.save() + if (getFood && getOrder?.order_items.some((item) => item?.product_id?._id?.toString() === getFood?._id?.toString())) { + getFood.ratings.push(data); + let rateSUM = 0; + getFood?.ratings?.forEach((item) => (rateSUM += Number(item.rate))); + getFood.rate = (rateSUM / getFood?.ratings?.length).toFixed(1); + await getFood.save(); } } //// add rate to order getOrder.rating = { rate: rateOrder, - reasonForBad: reason - } + reasonForBad: reason, + }; - await getOrder.save() + await getOrder.save(); - return res.json({message: _sr['fa'].response.success_save}) + return res.json({ message: _sr["fa"].response.success_save }); } catch (e) { - return res500(res, _sr['fa'].response.unknownError) + return res500(res, _sr["fa"].response.unknownError); } - } -] + }, +]; ////////////////////////////////// buy club module.exports.buyClub = [ - [ - body('clubId') - .notEmpty().withMessage(_sr['fa'].required.field) - ], + [body("clubId").notEmpty().withMessage(_sr["fa"].required.field)], checkValidations(validationResult), async (req, res) => { try { - const clubId = req.body?.clubId + const clubId = req.body?.clubId; - const user = await User.findById(req.user._id) - if (!user) return res404(res, 'اطلاعات کاربر یافت نشد') + const user = await User.findById(req.user._id); + if (!user) return res404(res, "اطلاعات کاربر یافت نشد"); - const club = await Food.findOne({_id: clubId, club: true}) - if (!club) return res404(res, 'کلاب مورد نظر پیدا نشد') + const club = await Food.findOne({ _id: clubId, club: true }); + if (!club) return res404(res, "کلاب مورد نظر پیدا نشد"); - if (user.score < club.point) return res.status(422).json({message: 'امتیاز شما برای خرید این محصول کافی نمی باشد'}) + if (user.score < club.point) return res.status(422).json({ message: "امتیاز شما برای خرید این محصول کافی نمی باشد" }); const data = { user_id: user._id, score: true, scorePoint: club.point, scoreCost: club.price, - orderType: 'club', + orderType: "club", number: Date.now(), - address: user?.addresses.find(item => item.used), + address: user?.addresses.find((item) => item.used), createdOn: Date.now(), - paymentStatus: 'paid', - statuses: [{ - status: 'processing' - }], - status: 'processing', - order_items: [{ - product_id: club._id, - name: club.name, - quantity: 1, - price: club.price, - point: club.point, - havePoint: true - }], + paymentStatus: "paid", + statuses: [ + { + status: "processing", + }, + ], + status: "processing", + order_items: [ + { + product_id: club._id, + name: club.name, + quantity: 1, + price: club.price, + point: club.point, + havePoint: true, + }, + ], sum: club.point, routePrice: 0, tax: 0, percent: 0, - total: club.price - } + total: club.price, + }; - const order = await Order.create(data) - if (!order) return res500(res, _sr['fa'].response.unknownError) + const order = await Order.create(data); + if (!order) return res500(res, _sr["fa"].response.unknownError); - user.score -= club.point + user.score -= club.point; user.scoreLogs = [ { score: club.point, order_id: order._id, - forWhat: 'buy', - action: 'decrease' - } - ] - await user.save() + forWhat: "buy", + action: "decrease", + }, + ]; + await user.save(); - club.stock -= club?.clubQuantity || 1 - await club.save() + club.stock -= club?.clubQuantity || 1; + await club.save(); - return res.json({message: _sr['fa'].response.success_save}) + return res.json({ message: _sr["fa"].response.success_save }); } catch (error) { - return res500(res, _sr['fa'].response.unknownError) + return res500(res, _sr["fa"].response.unknownError); } - } -] + }, +]; ////////////////////////////////// test notif module.exports.testNotif = [ async (req, res) => { try { - sendNotifyOrder('6126313206f2593a6a4f71db') - return res.json({}) + sendNotifyOrder("6126313206f2593a6a4f71db"); + return res.json({}); } catch (error) { - return res500(res, error.message) + return res500(res, error.message); } - } -] + }, +]; module.exports.chromeNotif = [ async (req, res) => { try { - const fcmTokens = [] - const allAdmins = await User.find({scope: 'admin'}) + const fcmTokens = []; + const allAdmins = await User.find({ scope: "admin" }); for (const admin of allAdmins) { - if (admin.fcmToken) fcmTokens.push(admin.fcmToken) + if (admin.fcmToken) fcmTokens.push(admin.fcmToken); } const objNotif = { title: "سفارش جدید!", - body: "یک سفارش جدید در پنل برگ من ثبت گردید" - } + body: "یک سفارش جدید در پنل برگ من ثبت گردید", + }; const payload = { notification: objNotif, data: { - routeName: 'test', + routeName: "test", type: "bazaar", routeType: "viewBazaar", }, }; - console.log(fcmTokens) + console.log(fcmTokens); const input = { registrationTokens: fcmTokens, - payload - } + payload, + }; - console.log(input) + console.log(input); - const test = await sendMulti(input) + const test = await sendMulti(input); - return res.json(test) + return res.json(test); // const payload = JSON.stringify({ // title: 'Push notifications with Service Workers', // }); // // webPush.sendNotification('test', payload) // .catch(error => console.error(error)); - } catch (error) { - - } - } -] - + } catch (error) {} + }, +];