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;