/var/www/qr4y.com/server/delivery/api/controllers/order
Edit: /var/www/qr4y.com/server/delivery/api/controllers/order/create.js (6250B)
// const { Op } = require('sequelize')
const uuid = require('uuid');
const { NotFound, BadRequest, ApiError } = require('../../responseModels/errors')
const { isSet, isEmpty, isArray, isNumber } = require('../../utils/validator.util')
// const checkPermission = require('../utils/checkPermission.util')
const { performance } = require('perf_hooks')
// const { getDateByDateRange, hoursList, daysOfWeekList } = require('../utils/date')
// const fetch = require('node-fetch')
// const config = require('../../../config/app.json')
module.exports = function ({ db, logger }) {
return async (req, res, next) => {
logger.child({ path: req.path, request: req.body }).info()
let transaction = await db.sequelize.transaction()
try {
let t1 = performance.now()
// checkPermission(req, 'order_create')
var {
id,
addressId,
companyId,
branchId,
status,
tips,
phone,
payTypeId,
deliveryPayTypeId,
deliveryTypeId,
delivery_time,
delivery_distance,
delivery_cost,
delivery_cost_calculated,
order_cost,
userId,
comment,
tableId,
reservAt,
person_count,
userCartItems
} = req.body
// company counters
const company = await db.company.findOne({ where: { id: companyId } })
if (!company) {
throw new BadRequest({ code: 1059, lang: req.user?.languageCode })
}
company.ordersCreated++
company.save()
const number = company.ordersCreated;
if (!isSet(order_cost) || isEmpty(order_cost)) {
throw new BadRequest({ code: 1062, lang: req.user?.languageCode })
}
if (!isSet(userCartItems) || !isArray(userCartItems)) {
throw new BadRequest({ code: 1014, lang: req.user?.languageCode })
}
if (!isSet(person_count) || isEmpty(person_count)) {
person_count = 1
}
if (!isSet(delivery_time) || isEmpty(delivery_time)) {
delivery_time = 0
}
if (!isSet(delivery_distance) || isEmpty(delivery_distance)) {
delivery_distance = 0
}
if (!isSet(delivery_cost) || isEmpty(delivery_cost)) {
delivery_cost = 0
}
if (!isSet(delivery_cost_calculated) || isEmpty(delivery_cost_calculated)) {
delivery_cost_calculated = 0
}
if (!isSet(tips) || isEmpty(tips)) {
tips = 0
}
// пройти по корзине и заполнить массив
let discount = 0
let prepare_time = 0
let orderItems = userCartItems.map((userCartItem) => {
console.log(userCartItem.price_json)
// максимальное время приготовления
// if (branchProduct.prepare_time > prepare_time) {
// prepare_time = branchProduct.prepare_time
// }
// orderTotal += branchProduct.price * userCartItem.qty
// вернуть новый orderItem
return {
productId: userCartItem.productId,
price_json: userCartItem.price_json,
// productPrinterId: branchProduct.printerId,
}
})
let params = {
companyId,
branchId,
number,
status,
payTypeId,
deliveryPayTypeId,
deliveryTypeId,
prepare_time,
discount,
order_cost: order_cost,
delivery_time: delivery_time,
delivery_distance: delivery_distance,
delivery_cost: delivery_cost,
delivery_cost_calculated: delivery_cost_calculated,
person_count: person_count,
tax: 0,
bag: 0,
tips: tips,
no_plastic: false,
comment,
orderItems
}
if (!isSet(id) || isEmpty(id)) {
id = uuid.v4()
}
params['id'] = id
let inc = [{ model: db.orderItems }]
// discount
if (isSet(userId) && !isEmpty(userId)) {
const user = await db.user.findOne({ where: { id: userId } })
if (user) {
user.ordersCreated++
user.save()
params['userId'] = userId
const companyClient = await db.companyClients.findOne({
where: { companyId: companyId, userId: userId }
})
if (companyClient) {
discount = parseInt(companyClient.discount)
if (discount > 0) {
params['discount'] = discount
}
} else {
// add company client
db.companyClients.create({
userId: userId,
companyId: companyId
})
// company counters
const company = await db.company.findOne({ where: { id: companyId } })
if (company) {
company.countClients++
company.save()
}
}
}
await db.userCartItem.destroy({
where: { userId: userId, branchId: branchId },
truncate: false
})
}
if (isSet(reservAt) && !isEmpty(reservAt)) {
params['reservAt'] = reservAt
}
if (isSet(tableId) && !isEmpty(tableId)) {
params['tableId'] = tableId
}
if (phone != null && phone.length > 9) {
params['phone'] = phone
}
// ИТОГО ------------
params['total'] =
params['delivery_cost'] +
params['tax'] +
params['bag'] +
params['tips'] +
params['order_cost'] -
((params['order_cost'] / 100) * params['discount'])
// создать заказ
let order = await db.order.create(params, { include: inc })
await db.orderHistory.create({
orderId: order.id,
userId: req.body.userId || null,
event: ORDER_HISTORY_EVENT.CREATE,
app: req.user?.app || APP.UNKNOWN
})
if (isSet(addressId) && !isEmpty(addressId)) {
const address = await db.address.findOne({ where: { id: addressId } })
if (address) {
await db.orderAddress.create({
orderId: order.id,
adres: address.adres,
latitude: address.latitude,
longtitude: address.longtitude,
})
}
}
let orderPay = await db.orderPay.create({
orderId: order.id,
userId: order.userId,
payTypeId: order.payTypeId,
summ: order.total,
created: req.user?.app | 'system',
paid: req.user?.app | 'system',
pay_status: 'not_paid'
})
transaction.commit()
transaction = null
// форматирование и рассылка заказа
await SERVICES.OrderService.StatusOrder(order)
const time = performance.now() - t1
return res.status(200).json({
status: 'success',
id: order.id,
order,
time
})
} catch (err) {
transaction?.rollback()
next(err)
}
}
}