Files
asan-service/server/controllers/oldPieceRequestController.js
T
2023-08-17 13:05:51 +03:30

339 lines
9.9 KiB
JavaScript

const moment = require('moment-jalaali')
const { body, validationResult } = require('express-validator')
const OldPieceRequest = require('../models/OldPieceRequest')
const { _sr } = require('../plugins/serverResponses')
const {
res404,
res406,
res500,
checkValidations,
generateRandomDigits
} = require('../plugins/controllersHelperFunctions')
const { SMS } = require('../plugins/SMS_Module')
const { notifyAdmin } = require('../WebSocket/controllers/admin_EventsController')
const _faSr = _sr.fa
// date formaters
function ArpaDateFormat(date) {
return moment(date).format('YYYY-MM-DD HH:mm:ss')
}
function SmsDateFormat(date) {
return moment(date).format('jYYYY/jMM/jDD')
}
/// ///////////////// agent
module.exports.add_oldPiece_request = [
async (req, res) => {
try {
const { user_id, agent_id } = req
const thisTime = Date.now()
const data = {
user_id,
agent_id,
createDate: ArpaDateFormat(thisTime),
statusHistory: [{ status: 'temp', date: thisTime }]
}
const opr = OldPieceRequest(data)
await opr.save()
return res.json({ message: _faSr.response.success_save })
} catch (e) {
return res500(res, e)
}
}
]
module.exports.add_oldPieces_to_opr = [
[
body('ItemReceptionTransDate').notEmpty().withMessage('تاریخ پذیرش را مشخص کنید'),
body('ItemName').notEmpty().withMessage('نام کالا را مشخص کنید'),
body('ItemID').notEmpty().withMessage('Include ItemID'),
body('ItemCode').notEmpty().withMessage('Include ItemCode'),
body('pieceName').notEmpty().withMessage('نام قطعه را مشخص کنید'),
body('pieceCode').notEmpty().withMessage('Include pieceCode'),
body('pieceId').notEmpty().withMessage('Include pieceId')
],
checkValidations(validationResult),
async (req, res) => {
try {
const oprId = req.params?.oprId
const { ItemReceptionTransDate, ItemName, SerialNo1, ItemID, ItemCode, pieceName, pieceCode, pieceId } = req.body
const data = {
ItemReceptionTransDate,
ItemName,
SerialNo1,
ItemID,
ItemCode,
pieceName,
pieceCode,
pieceId
}
const opr = await OldPieceRequest.findById(oprId)
opr.items.push(data)
await opr.save()
return res.json({ message: _faSr.response.success_save })
} catch (e) {
return res404(res, e)
}
}
]
module.exports.remove_oldPiece_from_opr = [
async (req, res) => {
try {
const oldPieceItemId = req.params?.oldPieceItemId
if (!oldPieceItemId) throw new Error('invalid id')
const opr = await OldPieceRequest.findOne({ 'items._id': oldPieceItemId })
opr.items.id(oldPieceItemId).remove()
await opr.save()
return res.json({ message: _faSr.response.success_remove })
} catch (e) {
console.log(e)
return res500(res, e)
}
}
]
module.exports.update_opr_description = [
(req, res) => {
const { description } = req.body
const data = {
description
}
OldPieceRequest.findByIdAndUpdate(req.params?.id, data, (err, oldData) => {
if (err) return res404(res, 'invalid id')
return res.json({ message: _faSr.response.success_save })
})
}
]
module.exports.get_all_opr_for_agent = [
(req, res) => {
const agent_id = req.agent_id
OldPieceRequest.find({ agent_id }, (err, data) => {
if (err) return res500(res, err)
else return res.json(data)
})
}
]
module.exports.get_one_opr_for_agent = [
(req, res) => {
OldPieceRequest.findById(req.params.id)
.populate(
'agent_id',
'full_name province_name city_name address agent_code postal_code tel_number fax_number mobile_number'
)
.exec((err, data) => {
if (err || !data) return res404(res, err)
else return res.json(data)
})
}
]
module.exports.delete_opr = [
async (req, res) => {
try {
const opr = await OldPieceRequest.findById(req.params?.id)
if (opr.status !== 'temp') return res406(res, 'نمیتوانید درخواست ارسال شده را حذف کنید')
await opr.remove()
return res.json({ message: _faSr.response.success_remove })
} catch (e) {
return res404(res, 'invalid id')
}
}
]
module.exports.change_opr_status_to_sent_by_agent = [
async (req, res) => {
try {
const thisTime = Date.now()
const opr = await OldPieceRequest.findById(req.params?.id).populate('agent_id')
if (!opr) throw new Error('invalid opr id')
const totalOpr = await OldPieceRequest.find({ status: { $ne: 'temp' } })
if (opr.status !== 'temp') return res406(res, 'این فرم قبلا برای آسان سرویس ارسال شده')
if (!opr.items.length) return res406(res, 'هیچ قطعه ای به فرم اضافه نکرده اید')
// generate tracking code
const trackingCode = 'OR' + totalOpr.length.toString().padStart(4, '0') + generateRandomDigits(2)
// modify opr
opr.status = 'sent'
opr.statusHistory.push({ status: 'sent', date: thisTime })
opr.trackingCode = trackingCode
opr.sendDate = ArpaDateFormat(thisTime)
// send sms for agent
const smsMsg = [
' نماینده گرامی درخواست قطعه داغی شما در تاریخ ',
SmsDateFormat(thisTime),
' با کد پیگیری ',
trackingCode,
' برای شرکت ارسال شد. '
]
SMS([opr.agent_id.mobile_number], smsMsg.join(''))
await opr.save()
notifyAdmin('updateNewOldPieceRequests')
return res.json({ message: 'درخواست قطعه داغی ارسال شد' })
} catch (e) {
console.log(e)
return res404(res, e)
}
}
]
/// ///////////////// admin
module.exports.get_all_opr_for_admin = [
async (req, res) => {
try {
const oprList = await OldPieceRequest.find({ status: { $ne: 'temp' } }).populate(
'agent_id',
'full_name agent_code mobile_number national_code province_name city_name province_id city_id'
)
return res.json(oprList)
} catch (e) {
return res500(res, e)
}
}
]
module.exports.get_oneAgent_opr_for_admin = [
async (req, res) => {
const agent_id = req.params?.agent_id
try {
const oprList = await OldPieceRequest.find({ status: { $ne: 'temp' }, agent_id }).populate(
'agent_id',
'full_name agent_code mobile_number national_code province_name city_name'
)
return res.json(oprList)
} catch (e) {
return res500(res, e)
}
}
]
module.exports.get_one_opr_for_admin = [
async (req, res) => {
try {
const { user_id } = req
const thisTime = Date.now()
const opr = await OldPieceRequest.findById(req.params?.id)
.populate(
'agent_id',
'agent_code full_name mobile_number fax_number tel_number province_name city_name national_code address postal_code store_name'
)
.populate('_openedBy', 'username first_name last_name')
.populate('_updatedBy', 'username first_name last_name')
if (!opr.seen) {
opr.seen = true
opr._openedBy = user_id
opr.status = 'ongoing'
opr.statusHistory.push({ status: 'ongoing', date: thisTime })
await opr.save()
const smsMsg = [
' نماینده گرامی درخواست قطعه داغی شما با کد پیگیری ',
opr.trackingCode,
' در تاریخ ',
SmsDateFormat(thisTime),
' در دست اقدام قرار گرفت. '
]
SMS([opr.agent_id.mobile_number], smsMsg.join(''))
notifyAdmin('updateNewOldPieceRequests')
}
return res.json(opr)
} catch (e) {
return res500(res, e)
}
}
]
module.exports.change_opr_status_by_admin = [
[
body('status')
.notEmpty()
.withMessage('status is required')
.bail()
.custom((value, { req }) => {
const acceptablvalues = ['waiting', 'delivered']
if (!acceptablvalues.includes(value)) return Promise.reject(new Error('invalid status'))
else return true
})
],
checkValidations(validationResult),
async (req, res) => {
const { user_id } = req
const { status, deliveryCode } = req.body
const thisTime = Date.now()
try {
const opr = await OldPieceRequest.findById(req.params?.id).populate('agent_id')
if (!opr) throw new Error('invalid opr id')
// check statuses
const statusErrMsg = 'invalid status for this time'
if (opr.status === 'delivered') return res406(res, statusErrMsg)
if (opr.status === 'waiting' && status === 'waiting') return res406(res, statusErrMsg)
// save status
opr._updatedBy = user_id
opr.status = status
opr.statusHistory.push({ status, date: thisTime })
let smsMessage
// differenet status methods
if (status === 'waiting') {
smsMessage = [
' نماینده گرامی درخواست قطعه داغی شما با کد پیگیری ',
opr.trackingCode,
' در تاریخ ',
SmsDateFormat(thisTime),
' در انتظار قطعه میباشد. '
]
}
if (status === 'delivered') {
if (deliveryCode) opr.deliveryCode = deliveryCode
function deliveryCodePhrase() {
if (deliveryCode.length) return `کد پیگیری مرسوله: ${deliveryCode}` + '\n'
else return ''
}
smsMessage = [
' نماینده گرامی درخواست قطعه داغی شما با کد پیگیری ',
opr.trackingCode,
' در تاریخ ',
SmsDateFormat(thisTime),
' تحویل شد. ',
'\n',
deliveryCodePhrase()
]
}
await SMS([opr.agent_id.mobile_number], smsMessage.join(''))
await opr.save()
return res.json({ message: _faSr.response.success_save })
} catch (e) {
return res500(res, e)
}
}
]