/var/www/greso.tech/server/nsm/controllers/order/document
Edit: /var/www/greso.tech/server/nsm/controllers/order/document/send.js (5634B)
module.exports = function ({ db, logger }) {
const { NotFound, BadRequest } = require('../../../responseModels/errors')
const { isSet, isEmail, isPhone, isEmpty, minLength, isNumber, isStatusBiggerThen } = require('../../../utils/validator.util')
const uuid = require('uuid');
return async (req, res, next) => {
logger.child({ path: req.path }).info()
let t1 = performance.now()
try {
const { id } = req.body
if (!isSet(id) || isEmpty(id)) {
throw new BadRequest({ code: 400, lang: req.user?.languageCode })
}
// check order document
const documentEdit = await db.orderDocument.findOne({
where: { id: id }
})
if (!documentEdit) {
throw new NotFound({ lang: req.user?.languageCode })
}
// check document
const document = await db.documents.findOne({
where: { id: documentEdit.documentId }
})
if (!document) {
throw new NotFound({ lang: req.user?.languageCode })
}
// check order
const order = await db.order.findOne({
where: { id: documentEdit.orderId }
})
if (!order) {
throw new NotFound({ code: 2032, lang: req.user?.languageCode })
}
// check inventory
const inventory = await db.orderInventory.findOne({
where: { id: documentEdit.inventoryId }
})
if (!inventory) {
throw new NotFound({ code: 2035, lang: req.user?.languageCode })
}
// check sign before sent document
var onSendOrderStatus = ''
var onSendInventoryStatus = ''
var beforeSignObjects = []
var beforeSignCount = 0;
try{
// FIND ALL NEEDED SIGNATURES AND SET ACTIONS
var pages = JSON.parse(document.objects)
var orderDocumentObjects = documentEdit.objects!='' ? JSON.parse(documentEdit.objects) : []
for(var page in pages){
var objects = JSON.parse(pages[page].objects)
for(var obj in objects){
if(objects[obj].type == 'sign'
&& objects[obj].key == 'signBeforeSend'){
beforeSignObjects.push(objects[obj])
}
if(objects[obj].type == 'action'){
if(objects[obj].model == 'actionOnSend'){
if(objects[obj].key == 'actionSetOrderStatus'){
onSendOrderStatus = objects[obj].value
}
if(objects[obj].key == 'actionSetEstimateStatus'){
onSendInventoryStatus = objects[obj].value
}
}
}
}
}
// CHECK DOCUMENT SIGNATURES
for(var d_obj in orderDocumentObjects){
for(var obj in beforeSignObjects){
if (beforeSignObjects[obj].id == orderDocumentObjects[d_obj].id) {
beforeSignCount++
}
}
}
if (beforeSignObjects.length != beforeSignCount) {
throw new NotFound({ code: 2118, lang: req.user?.languageCode })
}
} catch (e) {
throw new NotFound({ code: 2119, lang: req.user?.languageCode })
}
// check completed, start sending document
const result = await SERVICES.MailService.SendDocument(documentEdit)
var status = 'ERROR'
if(result.accepted.length>0){
documentEdit.status = "sended"
documentEdit.save()
// --> Set order status
if(onSendOrderStatus != '' && isStatusBiggerThen(onSendOrderStatus, order.status)){
order.status = onSendOrderStatus
order.updateUserId = req.user.id;
switch(order.status){
case ORDER_STATUS.ESTIMATE:
order.estimateAt = Date.now()
break;
case ORDER_STATUS.BOOKED:
order.bookedAt = Date.now()
break;
case ORDER_STATUS.CONFIRMED:
order.confirmedAt = Date.now()
break;
case ORDER_STATUS.ONSITE:
order.onsiteAt = Date.now()
break;
case ORDER_STATUS.PICKUP:
order.pickupAt = Date.now()
break;
case ORDER_STATUS.PICKED_UP:
order.pickedUpAt = Date.now()
break;
case ORDER_STATUS.WAREHOUSE:
order.warehouseAt = Date.now()
break;
case ORDER_STATUS.STORAGE:
order.storageAt = Date.now()
break;
case ORDER_STATUS.WAREHOUSE_UNLOADING:
order.warehouseUnloadingAt = Date.now()
break;
case ORDER_STATUS.LOADING:
order.loadingAt = Date.now()
break;
case ORDER_STATUS.ENROUTE:
order.enrouteAt = Date.now()
break;
case ORDER_STATUS.ARRIVED:
order.arrivedAt = Date.now()
break;
case ORDER_STATUS.UNLOADING:
order.unloadingAt = Date.now()
break;
case ORDER_STATUS.COMPLETE:
order.completeAt = Date.now()
break;
case ORDER_STATUS.CANCEL:
order.cancelAt = Date.now()
break;
}
order.save()
await db.orderHistory.create({
orderId: order.id,
userId: req.user.id || order.updateUserId,
status: order.status,
comment: 'Order set status ' + order.status + ' after send mail'
})
}
// --> Set inventory status
if (onSendInventoryStatus != '') {
inventory.status = onSendInventoryStatus
await inventory.save()
await db.orderHistory.create({
orderId: order.id,
userId: req.user.id || order.updateUserId,
status: order.status,
comment: 'Inventory set status ' + inventory.status + ' after send mail'
})
}
// <-- CHECK SIGNATURES
// ACTIONS
status = 'OK'
}
var params = {
id: uuid.v4(),
orderId: order.id,
userId: order.userId,
type: 'email',
message: document.name+' sent',
status,
}
await db.orderMessage.create(params)
await SERVICES.OrderService.OrderStatus(order, 'orderEdit')
const time = performance.now() - t1
return res.status(200).json({ status: 'success', id: document.id, time })
} catch (err) {
next(err)
}
}
}