315 lines
8.9 KiB
JavaScript
315 lines
8.9 KiB
JavaScript
const moment = require('moment-jalaali')
|
|
const { body, validationResult } = require('express-validator')
|
|
const PieceRequest = require('../models/PieceRequest')
|
|
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')
|
|
}
|
|
|
|
/// ///////////////// agent
|
|
module.exports.add_piece_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 pr = PieceRequest(data)
|
|
await pr.save()
|
|
return res.json({ message: _faSr.response.success_save })
|
|
} catch (e) {
|
|
return res500(res, e)
|
|
}
|
|
}
|
|
]
|
|
|
|
module.exports.add_pieces_to_pr = [
|
|
[
|
|
body('ItemReceptionTransDate').notEmpty().withMessage('تاریخ پذیرش را مشخص کنید'),
|
|
|
|
body('ItemName').notEmpty().withMessage('نام کالا را مشخص کنید'),
|
|
|
|
body('ItemID').notEmpty().withMessage('Include ItemID'),
|
|
|
|
body('ItemCode').notEmpty().withMessage('Include ItemCode'),
|
|
|
|
body('gStatus').notEmpty().withMessage('وضعیت گارانتی را مشخص کنید'),
|
|
|
|
body('pieceName').notEmpty().withMessage('نام قطعه را مشخص کنید'),
|
|
|
|
body('pieceQuantity')
|
|
.notEmpty()
|
|
.withMessage('تعداد قطعه را مشخص کنید')
|
|
.isNumeric()
|
|
.withMessage(_faSr.format.number),
|
|
|
|
body('pieceCode').notEmpty().withMessage('Include pieceCode'),
|
|
|
|
body('pieceId').notEmpty().withMessage('Include pieceId')
|
|
],
|
|
checkValidations(validationResult),
|
|
async (req, res) => {
|
|
try {
|
|
const prId = req.params?.prId
|
|
const {
|
|
ItemReceptionTransDate,
|
|
ItemName,
|
|
SerialNo1,
|
|
ItemID,
|
|
ItemCode,
|
|
gStatus,
|
|
pieceName,
|
|
pieceCode,
|
|
pieceQuantity,
|
|
pieceId
|
|
} = req.body
|
|
|
|
const data = {
|
|
ItemReceptionTransDate,
|
|
ItemName,
|
|
SerialNo1,
|
|
ItemID,
|
|
ItemCode,
|
|
gStatus,
|
|
pieceName,
|
|
pieceCode,
|
|
pieceQuantity,
|
|
pieceId
|
|
}
|
|
|
|
const pr = await PieceRequest.findById(prId)
|
|
pr.items.push(data)
|
|
await pr.save()
|
|
return res.json({ message: _faSr.response.success_save })
|
|
} catch (e) {
|
|
return res404(res, e)
|
|
}
|
|
}
|
|
]
|
|
|
|
module.exports.remove_piece_from_pr = [
|
|
async (req, res) => {
|
|
try {
|
|
const pieceItemId = req.params?.pieceItemId
|
|
if (!pieceItemId) throw new Error('invalid id')
|
|
const pr = await PieceRequest.findOne({ 'items._id': pieceItemId })
|
|
pr.items.id(pieceItemId).remove()
|
|
await pr.save()
|
|
return res.json({ message: _faSr.response.success_remove })
|
|
} catch (e) {
|
|
console.log(e)
|
|
|
|
return res500(res, e)
|
|
}
|
|
}
|
|
]
|
|
|
|
module.exports.update_pr_description = [
|
|
(req, res) => {
|
|
const { description } = req.body
|
|
const data = {
|
|
description
|
|
}
|
|
PieceRequest.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_pr_for_agent = [
|
|
(req, res) => {
|
|
const agent_id = req.agent_id
|
|
PieceRequest.find({ agent_id }, (err, data) => {
|
|
if (err) return res500(res, err)
|
|
else return res.json(data)
|
|
})
|
|
}
|
|
]
|
|
|
|
module.exports.get_one_pr_for_agent = [
|
|
(req, res) => {
|
|
PieceRequest.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_pr = [
|
|
async (req, res) => {
|
|
try {
|
|
const pr = await PieceRequest.findById(req.params?.id)
|
|
if (pr.status !== 'temp') return res406(res, 'نمیتوانید درخواست ارسال شده را حذف کنید')
|
|
await pr.remove()
|
|
return res.json({ message: _faSr.response.success_remove })
|
|
} catch (e) {
|
|
return res404(res, 'invalid id')
|
|
}
|
|
}
|
|
]
|
|
|
|
module.exports.change_pr_status_to_sent_by_agent = [
|
|
async (req, res) => {
|
|
try {
|
|
const thisTime = Date.now()
|
|
|
|
const pr = await PieceRequest.findById(req.params?.id).populate('agent_id')
|
|
if (!pr) throw new Error('invalid pr id')
|
|
const totalPr = await PieceRequest.find({ status: { $ne: 'temp' } })
|
|
|
|
if (pr.status !== 'temp') return res406(res, 'این فرم قبلا برای آسان سرویس ارسال شده')
|
|
if (!pr.items.length) return res406(res, 'هیچ قطعه ای به فرم اضافه نکرده اید')
|
|
|
|
// generate tracking code
|
|
const trackingCode = 'PR' + totalPr.length.toString().padStart(4, '0') + generateRandomDigits(2)
|
|
|
|
// modify pr
|
|
pr.status = 'sent'
|
|
pr.statusHistory.push({ status: 'sent', date: thisTime })
|
|
pr.trackingCode = trackingCode
|
|
pr.sendDate = ArpaDateFormat(thisTime)
|
|
|
|
await sms.pieceRequest.sent(pr.agent_id.mobile_number, trackingCode, thisTime)
|
|
|
|
await pr.save()
|
|
notifyAdmin('updateNewPieceRequests')
|
|
return res.json({ message: 'درخواست قطعه ارسال شد' })
|
|
} catch (e) {
|
|
console.log(e)
|
|
|
|
return res404(res, e)
|
|
}
|
|
}
|
|
]
|
|
|
|
/// ///////////////// admin
|
|
module.exports.get_all_pr_for_admin = [
|
|
async (req, res) => {
|
|
try {
|
|
const prList = await PieceRequest.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(prList)
|
|
} catch (e) {
|
|
return res500(res, e)
|
|
}
|
|
}
|
|
]
|
|
|
|
module.exports.get_oneAgent_pr_for_admin = [
|
|
async (req, res) => {
|
|
const agent_id = req.params?.agent_id
|
|
try {
|
|
const prList = await PieceRequest.find({ status: { $ne: 'temp' }, agent_id }).populate(
|
|
'agent_id',
|
|
'full_name agent_code mobile_number national_code province_name city_name'
|
|
)
|
|
return res.json(prList)
|
|
} catch (e) {
|
|
return res500(res, e)
|
|
}
|
|
}
|
|
]
|
|
|
|
module.exports.get_one_pr_for_admin = [
|
|
async (req, res) => {
|
|
try {
|
|
const { user_id } = req
|
|
const thisTime = Date.now()
|
|
const pr = await PieceRequest.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 (!pr.seen) {
|
|
pr.seen = true
|
|
pr._openedBy = user_id
|
|
pr.status = 'ongoing'
|
|
pr.statusHistory.push({ status: 'ongoing', date: thisTime })
|
|
await pr.save()
|
|
|
|
await sms.pieceRequest.ongoing(pr.agent_id.mobile_number, pr.trackingCode, thisTime)
|
|
notifyAdmin('updateNewPieceRequests')
|
|
}
|
|
return res.json(pr)
|
|
} catch (e) {
|
|
return res500(res, e)
|
|
}
|
|
}
|
|
]
|
|
|
|
module.exports.change_pr_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 pr = await PieceRequest.findById(req.params?.id).populate('agent_id')
|
|
if (!pr) throw new Error('invalid pr id')
|
|
|
|
// check statuses
|
|
const statusErrMsg = 'invalid status for this time'
|
|
if (pr.status === 'delivered') return res406(res, statusErrMsg)
|
|
if (pr.status === 'waiting' && status === 'waiting') return res406(res, statusErrMsg)
|
|
|
|
// save status
|
|
pr._updatedBy = user_id
|
|
pr.status = status
|
|
pr.statusHistory.push({ status, date: thisTime })
|
|
|
|
if (status === 'waiting') {
|
|
await sms.pieceRequest.waiting(pr.agent_id.mobile_number, pr.trackingCode, thisTime)
|
|
}
|
|
|
|
if (status === 'delivered') {
|
|
if (deliveryCode) pr.deliveryCode = deliveryCode
|
|
await sms.pieceRequest.delivered(pr.agent_id.mobile_number, pr.trackingCode, deliveryCode, thisTime)
|
|
}
|
|
await pr.save()
|
|
return res.json({ message: _faSr.response.success_save })
|
|
} catch (e) {
|
|
return res500(res, e)
|
|
}
|
|
}
|
|
]
|