/var/www/greso.tech/server/nsm/controllers/order/document
Edit: /var/www/greso.tech/server/nsm/controllers/order/document/edit.js (13580B)
module.exports = function ({ db, logger }) {
const { NotFound, BadRequest } = require('../../../responseModels/errors')
const { isSet, isEmail, isPhone, isEmpty, minLength, isNumber, isStatusBiggerThen } = require('../../../utils/validator.util')
return async (req, res, next) => {
logger.child({ path: req.path, request: req.query }).info()
let t1 = performance.now()
try {
var {
id,
orderId,
inventoryId,
documentId,
userId,
name,
rootDocumentId,
status,
link,
objects,
} = req.body
if (!isSet(id) || isEmpty(id)) {
throw new BadRequest({ code: 400, lang: req.user?.languageCode })
}
if (!isSet(orderId) || isEmpty(orderId)) {
throw new BadRequest({ code: 2032, lang: req.user?.languageCode })
}
// check order
const order = await db.order.findOne({
where: { id: orderId }
})
if (!order) {
throw new BadRequest({
code: 2032,
lang: req.user?.languageCode
})
}
// ------- WORK WITH SIGNATURES --------
// check document
const document = await db.documents.findOne({
where: { id: documentId }
})
if (!document) {
throw new NotFound({ 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 inventory
const inventory = await db.orderInventory.findOne({
where: { id: documentEdit.inventoryId }
})
if (!inventory) {
throw new NotFound({ code: 2035, lang: req.user?.languageCode })
}
// MAIN VARIABLES
var foundNewSignPickup = false;
var foundNewSignDelivery = false;
var foundNewSignSalesRep = false;
var foundNewSignAgent = false;
var foundNewSignCarrier = false;
if (isSet(userId) && !isEmpty(userId)) {
documentEdit.userId = userId
}
if (isSet(inventoryId) && !isEmpty(inventoryId)) {
documentEdit.inventoryId = inventoryId
}
if (isSet(documentId) && !isEmpty(documentId)) {
documentEdit.documentId = documentId
}
if (isSet(name) && !isEmpty(name)) {
documentEdit.name = name
}
if (isSet(rootDocumentId) && !isEmpty(rootDocumentId)) {
documentEdit.rootDocumentId = rootDocumentId
}
if (isSet(status) && !isEmpty(status)) {
documentEdit.status = status
}
if (isSet(objects) && !isEmpty(objects)) {
try {
var old_objects = documentEdit.objects != '' ? JSON.parse(documentEdit.objects) : []
var new_objects = JSON.parse(objects)
for (var new_idx in new_objects) {
var found = false
for (var old_idx in old_objects) {
if (old_objects[old_idx].id == new_objects[new_idx].id) {
found = true
}
}
if (!found) {
if(new_objects[new_idx].type == 'sign'){
switch(new_objects[new_idx].model){
case 'pickupClient':
foundNewSignPickup = true
break;
case 'deliveryClient':
foundNewSignDelivery = true
break;
case 'salesRep':
foundNewSignSalesRep = true
break;
case 'agentWorker':
foundNewSignAgent = true
break;
case 'carrierWorker':
foundNewSignCarrier = true
break;
}
}
}
}
} catch (e) {
throw new NotFound({ code: 2119, lang: req.user?.languageCode })
}
documentEdit.objects = objects
}
if (isSet(link) && !isEmpty(link)) {
documentEdit.link = link
}
// --> CHECK SIGNATURES
var onPickupClientSignOrderStatus = ''
var onDeliveryClientSignOrderStatus = ''
var onSalesRepSignOrderStatus = ''
var onAgentWorkerSignOrderStatus = ''
var onCarrierWorkerSignOrderStatus = ''
var onPickupClientSignInventoryStatus = ''
var onDeliveryClientSignInventoryStatus = ''
var onSalesRepSignInventoryStatus = ''
var onAgentWorkerSignInventoryStatus = ''
var onCarrierWorkerSignInventoryStatus = ''
var onPickupClientSignSendDocument = ''
var onDeliveryClientSignSendDocument = ''
var onSalesRepSignSendDocument = ''
var onAgentWorkerSignSendDocument = ''
var onCarrierWorkerSignSendDocument = ''
// FIND ALL NEEDED SIGNATURES AND SET ACTIONS
var signedPickupClient = false
var signedDeliveryClient = false
var signedSalesRep = false
var signedAgentWorker = false
var signedCarrierWorker = false
var countPickupClient = 0;
var countDeliveryClient = 0;
var countSalesRep = 0;
var countAgentWorker = 0;
var countCarrierWorker = 0;
var signPickupClient = []
var signDeliveryClient = []
var signSalesRep = []
var signAgentWorker = []
var signCarrierWorker = []
var pages = JSON.parse(document.objects)
for (var page in pages) {
// check page status
if (isStatusBiggerThen(order.status, pages[page].status)) {
var objects = JSON.parse(pages[page].objects)
for (var obj in objects) {
if (objects[obj].type == 'sign') {
if (isStatusBiggerThen(order.status, objects[obj].value)) {
switch (objects[obj].model) {
case 'pickupClient':
signPickupClient.push(objects[obj])
break;
case 'deliveryClient':
signDeliveryClient.push(objects[obj])
break;
case 'salesRep':
signSalesRep.push(objects[obj])
break;
case 'agentWorker':
signAgentWorker.push(objects[obj])
break;
case 'carrierWorker':
signCarrierWorker.push(objects[obj])
break;
}
}
}
if (objects[obj].type == 'action') {
if (objects[obj].model == 'actionOnPickupClientSign') {
if (objects[obj].key == 'actionSetOrderStatus') {
onPickupClientSignOrderStatus = objects[obj].value
}
if (objects[obj].key == 'actionSetEstimateStatus') {
onPickupClientSignInventoryStatus = objects[obj].value
}
if (objects[obj].key == 'actionSetSendDocument') {
onPickupClientSignSendDocument = objects[obj].value
}
}
if (objects[obj].model == 'actionOnDeliveryClientSign') {
if (objects[obj].key == 'actionSetOrderStatus') {
onDeliveryClientSignOrderStatus = objects[obj].value
}
if (objects[obj].key == 'actionSetEstimateStatus') {
onDeliveryClientSignInventoryStatus = objects[obj].value
}
if (objects[obj].key == 'actionSetSendDocument') {
onDeliveryClientSignSendDocument = objects[obj].value
}
}
if (objects[obj].model == 'actionOnSalesRepSign') {
if (objects[obj].key == 'actionSetOrderStatus') {
onSalesRepSignOrderStatus = objects[obj].value
}
if (objects[obj].key == 'actionSetEstimateStatus') {
onSalesRepSignInventoryStatus = objects[obj].value
}
if (objects[obj].key == 'actionSetSendDocument') {
onSalesRepSignSendDocument = objects[obj].value
}
}
if (objects[obj].model == 'actionOnAgentWorkerSign') {
if (objects[obj].key == 'actionSetOrderStatus') {
onAgentWorkerSignOrderStatus = objects[obj].value
}
if (objects[obj].key == 'actionSetEstimateStatus') {
onAgentWorkerSignInventoryStatus = objects[obj].value
}
if (objects[obj].key == 'actionSetSendDocument') {
onAgentWorkerSignSendDocument = objects[obj].value
}
}
if (objects[obj].model == 'actionOnCarrierWorkerSign') {
if (objects[obj].key == 'actionSetOrderStatus') {
onCarrierWorkerSignOrderStatus = objects[obj].value
}
if (objects[obj].key == 'actionSetEstimateStatus') {
onCarrierWorkerSignInventoryStatus = objects[obj].value
}
if (objects[obj].key == 'actionSetSendDocument') {
onCarrierWorkerSignSendDocument = objects[obj].value
}
}
}
}
}
}
// CHECK DOCUMENT SIGNATURES
var orderDocumentObjects = JSON.parse(documentEdit.objects)
// SIGN COUNT
for(var d_obj in orderDocumentObjects){
for(var obj in signPickupClient){
if(signPickupClient[obj].id == orderDocumentObjects[d_obj].id){
countPickupClient++
}
}
for(var obj in signDeliveryClient){
if(signDeliveryClient[obj].id == orderDocumentObjects[d_obj].id){
countDeliveryClient++
}
}
for(var obj in signSalesRep){
if(signSalesRep[obj].id == orderDocumentObjects[d_obj].id){
countSalesRep++
}
}
for(var obj in signAgentWorker){
if(signAgentWorker[obj].id == orderDocumentObjects[d_obj].id){
countAgentWorker++
}
}
for(var obj in signCarrierWorker){
if(signCarrierWorker[obj].id == orderDocumentObjects[d_obj].id){
countCarrierWorker++
}
}
}
// SIGNED
if(countPickupClient == signPickupClient.length){
signedPickupClient = true;
}
if(countDeliveryClient == signDeliveryClient.length){
signedDeliveryClient = true;
}
if(countSalesRep == signSalesRep.length){
signedSalesRep = true;
}
if(countAgentWorker == signAgentWorker.length){
signedAgentWorker = true;
}
if(countCarrierWorker == signCarrierWorker.length){
signedCarrierWorker = true;
}
// ACTIONS VARS
var onSignOrderStatus = ''
var onSignInventoryStatus = ''
var onSignSendDocument = ''
// SET ACTION VARS ( ONLY ONE ACTION WORK ON ONE REQUEST !!! )
if (foundNewSignPickup && signedPickupClient) {
onSignOrderStatus = onPickupClientSignOrderStatus
onSignInventoryStatus = onPickupClientSignInventoryStatus
onSignSendDocument = onPickupClientSignSendDocument
}
if (foundNewSignDelivery && signedDeliveryClient) {
onSignOrderStatus = onDeliveryClientSignOrderStatus
onSignInventoryStatus = onDeliveryClientSignInventoryStatus
onSignSendDocument = onDeliveryClientSignSendDocument
}
if (foundNewSignSalesRep && signedSalesRep) {
onSignOrderStatus = onSalesRepSignOrderStatus
onSignInventoryStatus = onSalesRepSignInventoryStatus
onSignSendDocument = onSalesRepSignSendDocument
}
if (foundNewSignAgent && signedAgentWorker) {
onSignOrderStatus = onAgentWorkerSignOrderStatus
onSignInventoryStatus = onAgentWorkerSignInventoryStatus
onSignSendDocument = onAgentWorkerSignSendDocument
}
if (foundNewSignCarrier && signedCarrierWorker) {
onSignOrderStatus = onCarrierWorkerSignOrderStatus
onSignInventoryStatus = onCarrierWorkerSignInventoryStatus
onSignSendDocument = onCarrierWorkerSignSendDocument
}
// DO ACTION
if (onSignOrderStatus != '' && isStatusBiggerThen(onSignOrderStatus, order.status)) {
order.status = onSignOrderStatus
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;
}
await db.orderHistory.create({
orderId: order.id,
userId: req.user.id || null,
status: order.status,
comment: 'Order set status ' + order.status + ' after sign document'
})
order.save()
}
if (onSignInventoryStatus != '') {
inventory.status = onSignInventoryStatus
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 sign document'
})
}
if (onSignSendDocument != '') {
const sendDocument = await db.documents.findOne({
where: { id: onSignSendDocument }
})
if (sendDocument) {
const result = await SERVICES.MailService.SendDocument(sendDocument)
var status = 'ERROR'
if (result.accepted.length > 0) {
sendDocument.status = "sended"
sendDocument.save()
}
}
}
// ALL SIGNATURES COMPLETED IN THIS STATUS !!!
if (signedPickupClient
&& signedDeliveryClient
&& signedSalesRep
&& signedAgentWorker
&& signedCarrierWorker) {
documentEdit.status = 'signed'
}
await documentEdit.save()
await SERVICES.OrderService.OrderStatus(order, 'orderEdit')
const time = performance.now() - t1
return res.status(200).json({ status: 'success', id: documentEdit.id, time })
} catch (err) {
next(err)
}
}
}