Files
gps-backend/controllers/OrderController.js
2025-05-29 08:59:40 +00:00

821 lines
25 KiB
JavaScript
Executable File

const moment = require('moment');
const Validator = require('validatorjs');
const Helper = require('../library/LibHelper');
const response = require('../config/response');
const LibMail = require('../library/LibMail');
const DanaModels = require('../models/DanaModels');
// const LibQueueBlastOrder = require('../library/LibQueueBlastOrder');
Validator.useLang('en');
class OrderController {
async createOrder(req, res) {
let apiRes = {};
try {
const now = moment().unix();
const {
trx_code,
trx_at,
client_id,
client_name,
client_phone,
client_mail,
client_addr,
client_prefer_type_truck,
// weight,
// cbm,
// koli,
pickup_zone_title,
pickup_zone_addr,
pickup_at,
drop_zone_title,
drop_zone_addr,
vendors,
admins,
} = req.body;
// input validation
const input = {
trx_code,
trx_at,
client_id,
client_name,
client_phone,
client_mail,
// client_addr,
client_prefer_type_truck,
// weight,
// cbm,
// koli,
pickup_zone_title,
pickup_zone_addr,
pickup_at,
drop_zone_title,
drop_zone_addr,
vendors,
admins,
};
const rulesInput = {
trx_code: 'required|string',
trx_at: 'required|numeric',
client_id: 'required|integer',
client_name: 'required|string|max:255',
client_phone: 'required|string',
client_mail: 'required|email',
// client_addr: 'required|string',
client_prefer_type_truck: 'present|string',
// weight: 'required|numeric',
// cbm: 'required|numeric',
// koli: 'required|numeric',
pickup_zone_title: 'required|string',
pickup_zone_addr: 'required|string',
pickup_at: 'required|numeric',
drop_zone_title: 'required|string',
drop_zone_addr: 'required|string',
// vendors: 'required|array',
// 'vendors.*.vendor_id': 'required|integer',
// 'vendors.*.vendor_name': 'required|string|max:255',
// 'vendors.*.vendor_phone': 'required|string',
// 'vendors.*.vendor_mail': 'required|email',
// 'vendors.*.vendor_addr': 'present|string',
// 'vendors.*.vendor_acc_link': 'required|string',
// 'vendors.*.vendor_reject_link': 'required|string',
admins: 'required|array',
'admins.*.admin_id': 'required|integer',
'admins.*.admin_name': 'required|string|max:255',
'admins.*.admin_phone': 'required|string',
'admins.*.admin_mail': 'required|email',
// 'admins.*.admin_addr': 'present|string',
};
const isInputValid = new Validator(input, rulesInput);
if (isInputValid.fails()) {
apiRes = JSON.parse(JSON.stringify(response[422]));
apiRes.meta.message += Helper.setErrMsg(': ' + Object.values(isInputValid.errors.all())[0][0]); // get first message
return res.status(200).json(apiRes);
}
let resp = {};
// for (let vendor of vendors) {
// let bidOrderMailData = {
// client_id,
// client_name,
// client_phone,
// client_mail,
// client_addr,
// client_prefer_type_truck: client_prefer_type_truck,
// weight: Number(weight),
// cbm: Number(cbm),
// koli: Number(koli),
// pickup_zone_title,
// pickup_zone_addr,
// pickup_at: moment.unix(pickup_at).format('DD MMM YYYY HH:mm') + ' WIB',
// drop_zone_title,
// drop_zone_addr,
// vendor_id: vendor.vendor_id,
// vendor_name: vendor.vendor_name,
// vendor_phone: vendor.vendor_phone,
// vendor_mail: vendor.vendor_mail,
// vendor_addr: vendor.vendor_addr,
// };
// LibMail.sendBidOrderMail('Ada Order Masuk', vendor.vendor_mail, bidOrderMailData);
// }
for (let admin of admins) {
let infoOrderMailData = {
trx_code,
trx_at: moment.unix(trx_at).format('DD MMM YYYY HH:mm') + ' WIB',
client_id,
client_name,
client_phone,
client_mail,
// client_addr,
client_prefer_type_truck: client_prefer_type_truck,
// weight: Number(weight),
// cbm: Number(cbm),
// koli: Number(koli),
pickup_zone_title,
pickup_zone_addr,
pickup_at: moment.unix(pickup_at).format('DD MMM YYYY HH:mm') + ' WIB',
drop_zone_title,
drop_zone_addr,
admin_id: admin.admin_id,
admin_name: admin.admin_name,
admin_phone: admin.admin_phone,
admin_mail: admin.admin_mail,
// admin_addr: admin.admin_addr,
};
LibMail.sendAdminInfoOrdMail('Ada Order Masuk', admin.admin_mail, infoOrderMailData);
}
let clientCreateOrdMailData = {
trx_code,
trx_at: moment.unix(trx_at).format('DD MMM YYYY HH:mm') + ' WIB',
client_id,
client_name,
client_phone,
client_mail,
// client_addr,
client_prefer_type_truck: client_prefer_type_truck,
// weight: Number(weight),
// cbm: Number(cbm),
// koli: Number(koli),
pickup_zone_title,
pickup_zone_addr,
pickup_at: moment.unix(pickup_at).format('DD MMM YYYY HH:mm') + ' WIB',
drop_zone_title,
drop_zone_addr,
};
LibMail.sendClientCreateOrdMail('Kamu Telah Membuat Order ' + trx_code, client_mail, clientCreateOrdMailData);
// success response
apiRes = JSON.parse(JSON.stringify(response[200]));
apiRes.meta.message = 'success create new order';
apiRes.data = resp;
return res.status(200).json(apiRes);
} catch (e) {
apiRes = JSON.parse(JSON.stringify(response[500]));
apiRes.meta.message += Helper.setErrMsg(': ' + e.message);
return res.status(500).json(apiRes);
}
}
async emailToVendor(req, res) {
let apiRes = {};
try {
const now = moment().unix();
const {
trx_code,
trx_at,
client_id,
client_name,
client_phone,
client_mail,
// client_addr,
client_prefer_type_truck,
// weight,
// cbm,
// koli,
pickup_zone_title,
pickup_zone_addr,
pickup_at,
drop_zone_title,
drop_zone_addr,
vendors,
} = req.body;
// input validation
const input = {
trx_code,
trx_at,
client_id,
client_name,
client_phone,
client_mail,
// client_addr,
client_prefer_type_truck,
// weight,
// cbm,
// koli,
pickup_zone_title,
pickup_zone_addr,
pickup_at,
drop_zone_title,
drop_zone_addr,
vendors,
};
const rulesInput = {
trx_code: 'required|string',
trx_at: 'required|numeric',
client_id: 'required|integer',
client_name: 'required|string|max:255',
client_phone: 'required|string',
client_mail: 'required|email',
// client_addr: 'required|string',
client_prefer_type_truck: 'present|string',
// weight: 'required|numeric',
// cbm: 'required|numeric',
// koli: 'required|numeric',
pickup_zone_title: 'required|string',
pickup_zone_addr: 'required|string',
pickup_at: 'required|numeric',
drop_zone_title: 'required|string',
drop_zone_addr: 'required|string',
vendors: 'required|array',
'vendors.*.vendor_id': 'required|integer',
'vendors.*.vendor_name': 'required|string|max:255',
'vendors.*.vendor_phone': 'required|string',
'vendors.*.vendor_mail': 'required|email',
// 'vendors.*.vendor_addr': 'present|string',
'vendors.*.vendor_acc_link': 'required|string',
// 'vendors.*.vendor_reject_link': 'required|string',
};
const isInputValid = new Validator(input, rulesInput);
if (isInputValid.fails()) {
apiRes = JSON.parse(JSON.stringify(response[422]));
apiRes.meta.message += Helper.setErrMsg(': ' + Object.values(isInputValid.errors.all())[0][0]); // get first message
return res.status(200).json(apiRes);
}
let resp = {};
for (let vendor of vendors) {
let bidOrderMailData = {
trx_code,
// client_id,
client_name,
client_phone,
client_mail,
// client_addr,
client_prefer_type_truck: client_prefer_type_truck,
// weight: Number(weight),
// cbm: Number(cbm),
// koli: Number(koli),
pickup_zone_title,
pickup_zone_addr,
pickup_at: moment.unix(pickup_at).format('DD MMM YYYY HH:mm') + ' WIB',
drop_zone_title,
drop_zone_addr,
// vendor_id: vendor.vendor_id,
vendor_name: vendor.vendor_name,
vendor_phone: vendor.vendor_phone,
vendor_mail: vendor.vendor_mail,
vendor_addr: vendor.vendor_addr,
vendor_acc_link: vendor.vendor_acc_link,
};
LibMail.sendBidOrderMail('Ada Order Masuk', vendor.vendor_mail, bidOrderMailData);
}
// success response
apiRes = JSON.parse(JSON.stringify(response[200]));
apiRes.meta.message = 'success send email';
apiRes.data = resp;
return res.status(200).json(apiRes);
} catch (e) {
apiRes = JSON.parse(JSON.stringify(response[500]));
apiRes.meta.message += Helper.setErrMsg(': ' + e.message);
return res.status(500).json(apiRes);
}
}
async emailVdrAccOrder(req, res) {
let apiRes = {};
try {
const now = moment().unix();
const {
trx_code,
trx_at,
client_id,
client_name,
client_phone,
client_mail,
// client_addr,
client_prefer_type_truck,
// weight,
// cbm,
// koli,
pickup_zone_title,
pickup_zone_addr,
pickup_at,
drop_zone_title,
drop_zone_addr,
vendors,
drivers,
} = req.body;
// input validation
const input = {
trx_code,
trx_at,
client_id,
client_name,
client_phone,
client_mail,
// client_addr,
client_prefer_type_truck,
// weight,
// cbm,
// koli,
pickup_zone_title,
pickup_zone_addr,
pickup_at,
drop_zone_title,
drop_zone_addr,
vendors,
drivers,
};
const rulesInput = {
trx_code: 'required|string',
trx_at: 'required|numeric',
client_id: 'required|integer',
client_name: 'required|string|max:255',
client_phone: 'required|string',
client_mail: 'required|email',
// client_addr: 'required|string',
client_prefer_type_truck: 'present|string',
// weight: 'required|numeric',
// cbm: 'required|numeric',
// koli: 'required|numeric',
pickup_zone_title: 'required|string',
pickup_zone_addr: 'required|string',
pickup_at: 'required|numeric',
drop_zone_title: 'required|string',
drop_zone_addr: 'required|string',
vendors: 'required|array',
'vendors.*.vendor_id': 'required|integer',
'vendors.*.vendor_name': 'required|string|max:255',
'vendors.*.vendor_phone': 'required|string',
'vendors.*.vendor_mail': 'required|email',
// 'vendors.*.vendor_addr': 'present|string',
'vendors.*.vendor_acc_at': 'required|numeric',
drivers: 'required|array',
'drivers.*.driver_id': 'required|integer',
'drivers.*.driver_name': 'required|string|max:255',
'drivers.*.driver_phone': 'required|string',
'drivers.*.driver_mail': 'required|email',
// 'drivers.*.driver_addr': 'present|string',
};
const isInputValid = new Validator(input, rulesInput);
if (isInputValid.fails()) {
apiRes = JSON.parse(JSON.stringify(response[422]));
apiRes.meta.message += Helper.setErrMsg(': ' + Object.values(isInputValid.errors.all())[0][0]); // get first message
return res.status(200).json(apiRes);
}
let resp = {};
for (let vendor of vendors) {
let vdrAccOrderMailData = {
trx_code,
// client_id,
client_name,
client_phone,
client_mail,
// client_addr,
client_prefer_type_truck: client_prefer_type_truck,
// weight: Number(weight),
// cbm: Number(cbm),
// koli: Number(koli),
pickup_zone_title,
pickup_zone_addr,
pickup_at: moment.unix(pickup_at).format('DD MMM YYYY HH:mm') + ' WIB',
drop_zone_title,
drop_zone_addr,
// vendor_id: vendor.vendor_id,
vendor_name: vendor.vendor_name,
vendor_phone: vendor.vendor_phone,
vendor_mail: vendor.vendor_mail,
vendor_addr: vendor.vendor_addr,
acc_at: moment.unix(vendor.vendor_acc_at).format('DD MMM YYYY HH:mm') + ' WIB',
};
LibMail.sendVdrAccOrderMail('Kamu Telah Menerima Order', vendor.vendor_mail, vdrAccOrderMailData);
}
for (let driver of drivers) {
let driverGetOrderMailData = {
trx_code,
// client_id,
client_name,
client_phone,
client_mail,
// client_addr,
client_prefer_type_truck: client_prefer_type_truck,
// weight: Number(weight),
// cbm: Number(cbm),
// koli: Number(koli),
pickup_zone_title,
pickup_zone_addr,
pickup_at: moment.unix(pickup_at).format('DD MMM YYYY HH:mm') + ' WIB',
drop_zone_title,
drop_zone_addr,
// driver_id: driver.driver_id,
driver_name: driver.driver_name,
driver_phone: driver.driver_phone,
driver_mail: driver.driver_mail,
driver_addr: driver.driver_addr,
acc_at: moment.unix(vendors[0].vendor_acc_at).format('DD MMM YYYY HH:mm') + ' WIB',
};
LibMail.sendDrvGetOrderMail('Kamu Mendapatkan Order', driver.driver_mail, driverGetOrderMailData);
}
let sendClientOrderHaveBeenAccMailData = {
trx_code,
// client_id,
client_name,
client_phone,
client_mail,
// client_addr,
client_prefer_type_truck: client_prefer_type_truck,
// weight: Number(weight),
// cbm: Number(cbm),
// koli: Number(koli),
pickup_zone_title,
pickup_zone_addr,
pickup_at: moment.unix(pickup_at).format('DD MMM YYYY HH:mm') + ' WIB',
drop_zone_title,
drop_zone_addr,
// vendor_id: vendors[0].vendor_id,
vendor_name: vendors[0].vendor_name,
vendor_phone: vendors[0].vendor_phone,
vendor_mail: vendors[0].vendor_mail,
vendor_addr: vendors[0].vendor_addr,
// driver_id: drivers[0].driver_id,
driver_name: drivers[0].driver_name,
driver_phone: drivers[0].driver_phone,
driver_mail: drivers[0].driver_mail,
driver_addr: drivers[0].driver_addr,
acc_at: moment.unix(vendors[0].vendor_acc_at).format('DD MMM YYYY HH:mm') + ' WIB',
};
LibMail.sendClientOrderHaveBeenAccMail('Order Kamu Telah Diambil Driver', client_mail, sendClientOrderHaveBeenAccMailData);
// success response
apiRes = JSON.parse(JSON.stringify(response[200]));
apiRes.meta.message = 'success send email';
apiRes.data = resp;
return res.status(200).json(apiRes);
} catch (e) {
apiRes = JSON.parse(JSON.stringify(response[500]));
apiRes.meta.message += Helper.setErrMsg(': ' + e.message);
return res.status(500).json(apiRes);
}
}
async delayBlastOrderBAK(req, res) {
let apiRes = {};
try {
const now = moment().unix();
const {
ord_id,
ord_code,
current_ord_vdr_id,
next_ord_vdr_id,
next_vdr_bid_token,
next_vdr_acc_link,
} = req.body;
// input validation
const input = {
ord_id,
ord_code,
current_ord_vdr_id,
next_ord_vdr_id,
next_vdr_bid_token,
next_vdr_acc_link,
};
const rulesInput = {
ord_id: 'required|integer|min:1',
ord_code: 'required|string',
current_ord_vdr_id: 'required|integer|min:1',
next_ord_vdr_id: 'present|array',
next_vdr_bid_token: 'present|array',
next_vdr_acc_link: 'present|array',
};
const isInputValid = new Validator(input, rulesInput);
if (isInputValid.fails()) {
apiRes = JSON.parse(JSON.stringify(response[422]));
apiRes.meta.message += Helper.setErrMsg(': ' + Object.values(isInputValid.errors.all())[0][0]); // get first message
return res.status(200).json(apiRes);
}
LibQueueBlastOrder.addQueue({
ord_id,
ord_code,
current_ord_vdr_id,
next_ord_vdr_id,
next_vdr_bid_token,
next_vdr_acc_link,
label: 'Delay Blast Order to Another Vendor',
delay: 10 * (60 * 1000), // 600000 || 10 minute || 10 * (60 * 1000)
});
// success response
apiRes = JSON.parse(JSON.stringify(response[200]));
apiRes.meta.message = 'success blast order';
return res.status(200).json(apiRes);
} catch (e) {
apiRes = JSON.parse(JSON.stringify(response[500]));
apiRes.meta.message += Helper.setErrMsg(': ' + e.message);
return res.status(500).json(apiRes);
}
}
async delayBlastOrder(req, res) {
let apiRes = {};
try {
const now = moment().unix();
const {
ord_id,
ord_code,
base_link,
} = req.body;
// input validation
const input = {
ord_id,
ord_code,
base_link,
};
const rulesInput = {
ord_id: 'required|integer|min:1',
ord_code: 'required|string',
base_link: 'required|string',
};
const isInputValid = new Validator(input, rulesInput);
if (isInputValid.fails()) {
apiRes = JSON.parse(JSON.stringify(response[422]));
apiRes.meta.message += Helper.setErrMsg(': ' + Object.values(isInputValid.errors.all())[0][0]); // get first message
return res.status(200).json(apiRes);
}
LibQueueBlastOrder.addQueue({
ord_id,
ord_code,
base_link,
delay: 10 * (60 * 1000), // 600000 || 10 minute || 10 * (60 * 1000)
});
LibQueueBlastOrder.addQueue({
ord_id,
ord_code,
base_link,
delay: 20 * (60 * 1000), // 600000 || 20 minute || 20 * (60 * 1000)
});
LibQueueBlastOrder.addQueue({
ord_id,
ord_code,
base_link,
delay: 30 * (60 * 1000), // 600000 || 30 minute || 30 * (60 * 1000)
});
// success response
apiRes = JSON.parse(JSON.stringify(response[200]));
apiRes.meta.message = 'success blast order';
return res.status(200).json(apiRes);
} catch (e) {
apiRes = JSON.parse(JSON.stringify(response[500]));
apiRes.meta.message += Helper.setErrMsg(': ' + e.message);
return res.status(500).json(apiRes);
}
}
async sendFinanceInfoTfPocket(req, res) {
let apiRes = {};
try {
const now = moment().unix();
const {
trx_code,
drv_name,
pickup_zone_title,
pickup_zone_addr,
drop_zone_title,
drop_zone_addr,
pocket_total,
bank_name,
bank_code,
bank_branch_name,
bank_acc_name,
bank_acc_no,
admins,
} = req.body;
// input validation
const input = {
trx_code,
drv_name,
pickup_zone_title,
pickup_zone_addr,
drop_zone_title,
drop_zone_addr,
pocket_total,
bank_name,
bank_code,
bank_branch_name,
bank_acc_name,
bank_acc_no,
admins,
};
const rulesInput = {
trx_code: 'required|string|max:255',
drv_name: 'required|string|max:255',
pickup_zone_title: 'required|string|max:255',
pickup_zone_addr: 'required|string',
drop_zone_title: 'required|string|max:255',
drop_zone_addr: 'required|string',
pocket_total: 'required|string|max:255',
bank_name: 'required|string',
bank_code: 'required|string|max:255',
bank_branch_name: 'string',
bank_acc_name: 'required|string',
bank_acc_no: 'required|string',
admins: 'required|array',
// 'admins.*.admin_id': 'required|integer',
'admins.*.admin_name': 'required|string|max:255',
'admins.*.admin_phone': 'required|string',
'admins.*.admin_mail': 'required|email',
};
const isInputValid = new Validator(input, rulesInput);
if (isInputValid.fails()) {
apiRes = JSON.parse(JSON.stringify(response[422]));
apiRes.meta.message += Helper.setErrMsg(': ' + Object.values(isInputValid.errors.all())[0][0]); // get first message
return res.status(200).json(apiRes);
}
let resp = {};
let mailData = {
trx_code,
drv_name,
pickup_zone_title,
pickup_zone_addr,
drop_zone_title,
drop_zone_addr,
pocket_total,
bank_name,
bank_code,
bank_branch_name,
bank_acc_name,
bank_acc_no,
};
for (let admin of admins) {
mailData.admin_name = admin.admin_name;
LibMail.sendFinanceInfoTfPocket('Transfer uang saku order ' + trx_code, admin.admin_mail, mailData);
}
// success response
apiRes = JSON.parse(JSON.stringify(response[200]));
apiRes.meta.message = 'success send mail';
apiRes.data = resp;
return res.status(200).json(apiRes);
} catch (e) {
apiRes = JSON.parse(JSON.stringify(response[500]));
apiRes.meta.message += Helper.setErrMsg(': ' + e.message);
return res.status(500).json(apiRes);
}
}
async sendFinanceInfoDanaAmount(req, res) {
let apiRes = {};
try {
const now = moment().unix();
const {
trx_code,
drv_name,
pickup_zone_title,
pickup_zone_addr,
drop_zone_title,
drop_zone_addr,
pocket_total,
bank_name,
bank_code,
bank_branch_name,
bank_acc_name,
bank_acc_no,
admins,
} = req.body;
// input validation
const input = {
trx_code,
drv_name,
pickup_zone_title,
pickup_zone_addr,
drop_zone_title,
drop_zone_addr,
pocket_total,
bank_name,
bank_code,
bank_branch_name,
bank_acc_name,
bank_acc_no,
admins,
};
const rulesInput = {
trx_code: 'required|string|max:255',
drv_name: 'required|string|max:255',
pickup_zone_title: 'required|string|max:255',
pickup_zone_addr: 'required|string',
drop_zone_title: 'string|max:255',
drop_zone_addr: 'string',
pocket_total: 'required|string|max:255',
bank_name: 'required|string',
bank_code: 'required|string|max:255',
bank_branch_name: 'string',
bank_acc_name: 'required|string',
bank_acc_no: 'required|string',
admins: 'required|array',
// 'admins.*.admin_id': 'required|integer',
'admins.*.admin_name': 'required|string|max:255',
'admins.*.admin_phone': 'required|string',
'admins.*.admin_mail': 'required|email',
};
const isInputValid = new Validator(input, rulesInput);
if (isInputValid.fails()) {
apiRes = JSON.parse(JSON.stringify(response[422]));
apiRes.meta.message += Helper.setErrMsg(': ' + Object.values(isInputValid.errors.all())[0][0]); // get first message
return res.status(200).json(apiRes);
}
const danas = await DanaModels.list({'id': DanaModels.PK_ID, 'limit': 1});
if (danas.length < 1) {
apiRes = JSON.parse(JSON.stringify(response[400]));
apiRes.meta.message = 'dana error';
return res.status(200).json(apiRes);
}
const dana = danas[0];
let resp = {};
let mailData = {
trx_code,
drv_name,
pickup_zone_title,
pickup_zone_addr,
drop_zone_title,
drop_zone_addr,
pocket_total,
bank_name,
bank_code,
bank_branch_name,
bank_acc_name,
bank_acc_no,
dana_current: 'Rp'+((new Intl.NumberFormat('id-ID')).format(dana.amt)).split('.').join('-').split(',').join('.').split('-').join(','), // yang . => - || , => . || - => ,,
dana_minimum: 'Rp'+((new Intl.NumberFormat('id-ID')).format(DanaModels.MINIMUM_AMT)).split('.').join('-').split(',').join('.').split('-').join(','), // yang . => - || , => . || - => ,,
};
for (let admin of admins) {
mailData.admin_name = admin.admin_name;
LibMail.sendFinanceInfoDanaAmount('Saldo Dana Tidak Mencukupi', admin.admin_mail, mailData);
}
// success response
apiRes = JSON.parse(JSON.stringify(response[200]));
apiRes.meta.message = 'success send mail';
apiRes.data = resp;
return res.status(200).json(apiRes);
} catch (e) {
apiRes = JSON.parse(JSON.stringify(response[500]));
apiRes.meta.message += Helper.setErrMsg(': ' + e.message);
return res.status(500).json(apiRes);
}
}
}
const object = new OrderController();
module.exports = object;