/var/www/greso.tech/server/nsm/controllers/order
Edit: /var/www/greso.tech/server/nsm/controllers/order/create.js (12778B)
module.exports = function ({ db, logger }) {
const uuid = require('uuid');
const { NotFound, BadRequest } = require('../../responseModels/errors')
const { isSet, isEmail, isPhone, isEmpty, minLength, isNumber, parseBool } = require('../../utils/validator.util')
return async (req, res, next) => {
logger.child({ path: req.path, request: req.query }).info()
let t1 = performance.now()
let transaction = await db.sequelize.transaction()
try {
// client name
// client phone
// client email
// pickup address (street, state, zip, city)
// delivery address (street, state, zip, city)
var {
id, // provider
reference_number, // provider
companyId,
userId,
destinationUserId,
salesRepId,
qaId,
warehouseId,
providerId,
app,
pickupAddressId,
deliveryAddressId,
pickupAreaId,
deliveryAreaId,
orderType,
hold,
followUpDate,
pickupDateFrom, // provider
pickupDateTo, // provider
deliveryDateFrom, // provider
deliveryDateTo, // provider
loadingDate,
deliveryDate,
estimateChargesId,
reviceChargesId,
deliveryChargesId,
inventoryId,
inventory
} = req.body
// required
if (!isSet(id) || isEmpty(id)) {
id = uuid.v4()
}else{
const order = await db.order.findOne({
where: { id: id }
})
if (order) {
throw new BadRequest({
code: 2000,
lang: req.user?.languageCode
})
}
}
if (!isSet(companyId) || isEmpty(companyId)) {
throw new BadRequest({
code: 2003,
lang: req.user?.languageCode
})
}
if (!isSet(orderType) || isEmpty(orderType)) {
throw new BadRequest({
code: 2124,
lang: req.user?.languageCode
})
}
var params = {
companyId,
orderType,
}
// static params
params['status'] = ORDER_STATUS.NEW
params['pay_status_order'] = 'no_pay'
// not required
if (isSet(id)){
if(isEmpty(id)) {
throw new BadRequest({
code: 2007,
lang: req.user?.languageCode
})
}else{
params['id'] = id
}
}
if (isSet(reference_number)){
if(isEmpty(reference_number)) {
throw new BadRequest({
code: 2024,
lang: req.user?.languageCode
})
}else{
params['reference_number'] = reference_number
}
}
if (isSet(userId)){
if(isEmpty(userId)) {
throw new BadRequest({
code: 2011,
lang: req.user?.languageCode
})
}else{
params['userId'] = userId
}
}
if (isSet(destinationUserId)){
if(isEmpty(destinationUserId)) {
throw new BadRequest({
code: 2048,
lang: req.user?.languageCode
})
}else{
params['destinationUserId'] = destinationUserId
}
}
if (isSet(salesRepId)){
if(isEmpty(salesRepId)) {
throw new BadRequest({
code: 2047,
lang: req.user?.languageCode
})
}else{
params['salesRepId'] = salesRepId
}
}
if (isSet(qaId)){
if(isEmpty(qaId)) {
throw new BadRequest({
code: 2049,
lang: req.user?.languageCode
})
}else{
params['qaId'] = qaId
}
}
if (isSet(warehouseId)){
if(isEmpty(warehouseId)) {
throw new BadRequest({
code: 2053,
lang: req.user?.languageCode
})
}else{
params['warehouseId'] = warehouseId
}
}
if (isSet(providerId)){
if(isEmpty(providerId)) {
throw new BadRequest({
code: 2054,
lang: req.user?.languageCode
})
}else{
params['providerId'] = providerId
}
}
if (isSet(app)){
if(isEmpty(app)) {
throw new BadRequest({
code: 2016,
lang: req.user?.languageCode
})
}else{
params['app'] = app
}
}
if (isSet(pickupAddressId)){
if(isEmpty(pickupAddressId)) {
throw new BadRequest({
code: 2018,
lang: req.user?.languageCode
})
}else{
params['pickupAddressId'] = pickupAddressId
}
}
if (isSet(deliveryAddressId)){
if(isEmpty(deliveryAddressId)) {
throw new BadRequest({
code: 2019,
lang: req.user?.languageCode
})
}else{
params['deliveryAddressId'] = deliveryAddressId
}
}
if (isSet(pickupAreaId)){
if(isEmpty(pickupAreaId)) {
throw new BadRequest({
code: 2039,
lang: req.user?.languageCode
})
}else{
params['pickupAreaId'] = pickupAreaId
}
}
if (isSet(deliveryAreaId)){
if(isEmpty(deliveryAreaId)) {
throw new BadRequest({
code: 2040,
lang: req.user?.languageCode
})
}else{
params['deliveryAreaId'] = deliveryAreaId
}
}
if (isSet(hold)){
if(isEmpty(hold)) {
throw new BadRequest({
code: 2103,
lang: req.user?.languageCode
})
}else{
params['hold'] = hold
}
}
if (isSet(followUpDate)){
if(isEmpty(followUpDate)) {
throw new BadRequest({
code: 2102,
lang: req.user?.languageCode
})
}else{
params['followUpDate'] = followUpDate
}
}
if (isSet(pickupDateFrom)){
if(isEmpty(pickupDateFrom)) {
throw new BadRequest({
code: 2020,
lang: req.user?.languageCode
})
}else{
params['pickupDateFrom'] = pickupDateFrom
}
}
if (isSet(pickupDateTo)){
if(isEmpty(pickupDateTo)) {
throw new BadRequest({
code: 2022,
lang: req.user?.languageCode
})
}else{
params['pickupDateTo'] = pickupDateTo
}
}
if (isSet(deliveryDateFrom)){
if(isEmpty(deliveryDateFrom)) {
throw new BadRequest({
code: 2021,
lang: req.user?.languageCode
})
}else{
params['deliveryDateFrom'] = deliveryDateFrom
}
}
if (isSet(deliveryDateTo)){
if(isEmpty(deliveryDateTo)) {
throw new BadRequest({
code: 2021,
lang: req.user?.languageCode
})
}else{
params['deliveryDateTo'] = deliveryDateTo
}
}
if (isSet(loadingDate)){
if(isEmpty(loadingDate)) {
throw new BadRequest({
code: 2055,
lang: req.user?.languageCode
})
}else{
params['loadingDate'] = loadingDate
}
}
if (isSet(deliveryDate)){
if(isEmpty(deliveryDate)) {
throw new BadRequest({
code: 2084,
lang: req.user?.languageCode
})
}else{
params['deliveryDate'] = deliveryDate
}
}
const company = await db.company.findOne({ where: { id: companyId } })
if (company) {
company.ordersCreated++
company.save()
}else{
throw new BadRequest({
code: 2003,
lang: req.user?.languageCode
})
}
// GENERATE ID
var zerofilled = ('000000'+company.ordersCreated).slice(-6);
params['number'] = company.prefix + zerofilled
params['updateUserId'] = req.user.id;
const newOrder = await db.order.create(params)
await db.orderHistory.create({
orderId: newOrder.id,
userId: req.user.id || null,
// userId: req.body.userId || null,
status: ORDER_STATUS.NEW,
comment: 'Order created'
})
var items = []
var extras = []
try{
if(inventory!=null && !isEmpty(inventory)){
const inventoryArr = JSON.parse(inventory);
const itemsArr = JSON.parse(inventoryArr.items);
for (let index = 0; index < itemsArr.length; index++) {
items.push({
id: itemsArr[index].id,
orderInventoryId: itemsArr[index].inventoryId,
extraId: itemsArr[index].extraId,
name: itemsArr[index].name,
count: itemsArr[index].count,
isItem: itemsArr[index].isItem,
isPacking: itemsArr[index].isPacking,
isUnpacking: itemsArr[index].isUnpacking,
weight: itemsArr[index].weight,
volume: itemsArr[index].volume,
qrcode: itemsArr[index].qrcode,
comment: itemsArr[index].comment,
color: itemsArr[index].color,
bulky: itemsArr[index].bulky,
})
}
const extrasArr = JSON.parse(inventoryArr.extras);
for (let index = 0; index < extrasArr.length; index++) {
extras.push({
id: extrasArr[index].id,
extraId: extrasArr[index].extraId,
orderInventoryId: extrasArr[index].inventoryId,
name: extrasArr[index].name,
type: extrasArr[index].type,
price: extrasArr[index].price,
})
}
await db.orderInventory.create(
{
id: inventoryArr.id,
orderId: inventoryArr.orderId,
type: inventoryArr.type,
status: inventoryArr.status,
localRateId: inventoryArr.localRateId,
pickupFrom: inventoryArr.pickupFrom,
pickupTo: inventoryArr.pickupTo,
pickupHours: inventoryArr.pickupHours,
drivingFrom: inventoryArr.drivingFrom,
drivingTo: inventoryArr.drivingTo,
drivingHours: inventoryArr.drivingHours,
deliveryFrom: inventoryArr.deliveryFrom,
deliveryTo: inventoryArr.deliveryTo,
deliveryHours: inventoryArr.deliveryHours,
doubleDriving: inventoryArr.doubleDriving,
rate: inventoryArr.rate,
rate_multiply: inventoryArr.rate_multiply,
carrier_rate: inventoryArr.carrier_rate,
storage_rate: inventoryArr.storage_rate,
storage: inventoryArr.storage,
valuation:JSON.stringify(inventoryArr.valuation),
items_weight: inventoryArr.items_weight,
items_volume: inventoryArr.items_volume,
items_count: inventoryArr.items_count,
items_total: inventoryArr.items_total,
bulky_count: inventoryArr.bulky_count,
bulky_total: inventoryArr.bulky_total,
extras_count: inventoryArr.extras_count,
extras_total: inventoryArr.extras_total,
packages_count: inventoryArr.packages_count,
packages_total: inventoryArr.packages_total,
fuel_percent: inventoryArr.fuel_percent,
fuel_total: inventoryArr.fuel_total,
edited_packages: inventoryArr.edited_packages,
custom_packages: inventoryArr.custom_packages,
edited_weight: inventoryArr.edited_weight,
custom_weight: inventoryArr.custom_weight,
edited_volume: inventoryArr.edited_volume,
custom_volume: inventoryArr.custom_volume,
edited_total: inventoryArr.edited_total,
custom_total: inventoryArr.custom_total,
discount_comment: inventoryArr.discount_comment,
discount_cash: inventoryArr.discount_cash,
total: inventoryArr.total,
paid: inventoryArr.paid,
due: inventoryArr.due,
}
)
}
}catch(e){
throw new BadRequest({
code: 500,
message: e.message,
lang: req.user?.languageCode
})
}
transaction.commit()
await transaction.afterCommit(async (t) => {
if(items.length > 0){
for (let index = 0; index < items.length; index++) {
try{
db.inventoryItems.create(items[index])
}catch(e){
throw new BadRequest({
code: 500,
message: e.message,
lang: req.user?.languageCode
})
}
}
}
if(extras.length > 0){
for (let index = 0; index < extras.length; index++) {
try{
db.inventoryExtras.create(extras[index])
}catch(e){
throw new BadRequest({
code: 500,
message: e.message,
lang: req.user?.languageCode
})
}
}
}
let saveOrder = false;
if (isSet(inventoryId)){
if(isEmpty(inventoryId)) {
throw new BadRequest({
code: 2035,
lang: req.user?.languageCode
})
}else{
newOrder.orderInventoryId = inventoryId
saveOrder = true;
}
}
if (isSet(estimateChargesId)){
if(isEmpty(estimateChargesId)) {
throw new BadRequest({
code: 2035,
lang: req.user?.languageCode
})
}else{
newOrder.orderEstimateChargesId = estimateChargesId
saveOrder = true;
}
} else {
newOrder.orderEstimateChargesId = inventoryId
saveOrder = true;
}
if (isSet(reviceChargesId)){
if(isEmpty(reviceChargesId)) {
throw new BadRequest({
code: 2035,
lang: req.user?.languageCode
})
}else{
newOrder.orderReviceChargesId = reviceChargesId
saveOrder = true;
}
}
if (isSet(deliveryChargesId)){
if(isEmpty(deliveryChargesId)) {
throw new BadRequest({
code: 2035,
lang: req.user?.languageCode
})
}else{
newOrder.orderDeliveryChargesId = deliveryChargesId
saveOrder = true;
}
}
if(saveOrder){
await newOrder.save()
SERVICES.OrderService.OrderStatus(newOrder, 'orderCreate')
}
});
transaction = null
const time = performance.now() - t1
return res.status(200).json({ status: 'success', id: newOrder.id, time })
} catch (err) {
transaction?.rollback()
next(err)
}
}
}