/var/www/greso.tech/server/nsm/controllers/order
Edit: /var/www/greso.tech/server/nsm/controllers/order/lead.js (11019B)
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
key,
client_name,
client_phone,
client_email,
pickup_street,
pickup_apt,
pickup_state,
pickup_city,
pickup_zip,
pickup_comment,
delivery_street,
delivery_apt,
delivery_state,
delivery_city,
delivery_zip,
delivery_comment,
reference_number, // provider
pickupDateFrom, // provider
pickupDateTo, // provider
deliveryDateFrom, // provider
deliveryDateTo, // provider
} = req.body
// get provider and company by key
const provider = await db.providers.findOne({
where: { key: key }
})
if (!provider) {
throw new BadRequest({
code: 403,
lang: req.user?.languageCode
})
}
const providerId = provider.id
const companyId = provider.companyId
if (!isSet(companyId) || isEmpty(companyId)) {
throw new BadRequest({
code: 2003,
lang: req.user?.languageCode
})
}
const company = await db.company.findOne({ where: { id: companyId } })
if (!company) {
throw new BadRequest({
code: 2003,
lang: req.user?.languageCode
})
}
var params = {
providerId,
companyId,
}
// get user by email
const userEmail = await db.userEmail.findOne({
where: { email: client_email }
})
var userId;
var destinationUserId;
if (userEmail) {
userId = userEmail.userId
destinationUserId = userEmail.userId
} else {
//if user not exists create user, then add to company
// get role
const role = db.role.findOne({
where: {
key: 'client'
}
})
if (!role) {
throw new BadRequest({
code: 2001,
lang: req.user?.languageCode
})
}
const user = await db.user.create({
roleId: role.id,
})
let u = {
id: uuid.v4(),
name: client_name,
email: client_email,
userId: user.id
}
await db.userEmail.create(u)
let p = {
id: uuid.v4(),
phone: client_phone,
userId: user.id
}
await db.userPhone.create(p)
let userCompany = await db.companyUsers.findOne({
where: { userId: user.id, companyId: company.id }
})
if (!userCompany) {
await db.companyUsers.create({
userId: user.id,
companyId: company.id,
roleId: role.id
})
}
}
var pickupAddressId
var pickupAreaId
var deliveryAddressId
var deliveryAreaId
// create pickup address
if (isSet(pickup_zip) || isSet(pickup_street)) {
var latitude
var longitude
if (isSet(pickup_zip) && pickup_zip.length == 5) {
zipCode = await db.zipCode.findOne({
where: {
zip: pickup_zip
}
})
if (zipCode) {
latitude = zipCode.latitude
longitude = zipCode.longitude
area = await SERVICES.CompanyService.GetRateArea({companyId, latitude, longitude})
}
if (area.length > 0) {
pickupAreaId = area[0].id
if (!isSet(pickup_state) || isEmpty(pickup_state)) {
pickup_state = area[0].name
}
}
}
const address = await db.address.create({
id: uuid.v4(),
// name,
city: pickup_city,
state: pickup_state,
street: pickup_street,
// street_number,
number: pickup_apt,
zip: pickup_zip,
comment: pickup_comment,
// doorbell,
// floor,
latitude: latitude,
longitude: longitude,
})
pickupAddressId = address.id
}
// create delivery address
if (isSet(delivery_zip) || isSet(delivery_street)) {
var latitude
var longitude
if (isSet(delivery_zip) && delivery_zip.length == 5) {
zipCode = await db.zipCode.findOne({
where: {
zip: delivery_zip
}
})
if (zipCode) {
latitude = zipCode.latitude
longitude = zipCode.longitude
area = await SERVICES.CompanyService.GetRateArea({companyId, latitude, longitude})
}
if (area.length > 0) {
deliveryAreaId = area[0].id
if (!isSet(delivery_state) || isEmpty(delivery_state)) {
delivery_state = area[0].name
}
}
}
const address = await db.address.create({
id: uuid.v4(),
// name,
city: delivery_city,
state: delivery_state,
street: delivery_street,
// street_number,
number: delivery_apt,
zip: delivery_zip,
comment: delivery_comment,
// doorbell,
// floor,
latitude: latitude,
longitude: longitude,
})
deliveryAddressId = address.id
}
// rate
var rate = 0
var companyConfig = JSON.parse(company.config)
if (companyConfig) {
for (var c in companyConfig) {
if (companyConfig[c].key == 'inventory_rate') {
rate = companyConfig[c].value ?? 0
}
}
}
if (pickupAreaId && deliveryAreaId) {
var wh = {}
wh['rateFromId'] = pickupAreaId
wh['rateToId'] = deliveryAreaId
const rateItem = await db.rateItems.findOne({
wh
})
if (rateItem && rateItem.price > 0) {
rate = rateItem.price
}
}
// 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
})
}
}
// 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(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(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
}
}
company.ordersCreated++
company.save()
// GENERATE ID
var zerofilled = ('000000'+company.ordersCreated).slice(-6);
params['number'] = company.prefix + zerofilled
// params['updateUserId'] = req.user.id; // ???
var inventoryId = uuid.v4()
params['inventoryId'] = inventoryId;
const newOrder = await db.order.create(params)
await db.orderHistory.create({
orderId: newOrder.id,
userId: null,
// userId: req.body.userId || null,
status: ORDER_STATUS.NEW,
comment: 'Lead provider order created'
})
try {
await db.orderInventory.create(
{
id: inventoryId,
orderId: id,
type: 'estimate',
status: 'edit',
localRateId: null,
pickupFrom: null,
pickupTo: null,
pickupHours: 0,
drivingFrom: null,
drivingTo: null,
drivingHours: 0,
deliveryFrom: null,
deliveryTo: null,
deliveryHours: 0,
doubleDriving: false,
rate: rate,
rate_multiply: 'volume',
carrier_rate: 0,
storage_rate: 0,
storage: false,
valuation: '',
items_weight: 0,
items_volume: 0,
items_count: 0,
items_total: 0,
bulky_count: 0,
bulky_total: 0,
extras_count: 0,
extras_total: 0,
packages_count: 0,
packages_total: 0,
fuel_percent: 0,
fuel_total: 0,
edited_packages: false,
custom_packages: 0,
edited_weight: false,
custom_weight: 0,
edited_volume: false,
custom_volume: 0,
edited_total: false,
custom_total: 0,
discount_comment: '',
discount_cash: 0,
total: 0,
paid: 0,
due: 0,
}
)
} catch(e){
throw new BadRequest({
code: 500,
message: e.message,
lang: req.user?.languageCode
})
}
transaction.commit()
await transaction.afterCommit(async (t) => {
newOrder.orderInventoryId = inventoryId
const salesRep = await SERVICES.LeadService.GetNextLD(companyId)
newOrder.salesRepId = salesRep.salesRepId
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)
}
}
}