const SandboxedJobMQ = require('bullmq').SandboxedJob; const LibWinston = require('../library/LibWinston'); const LibMail = require('../library/LibMail'); const moment = require('moment'); const GpsTracksModels = require('../models/GpsTracksModels'); const OrdersModels = require('../models/OrdersModels'); const OrdersVendorsModels = require('../models/OrdersVendorsModels'); const UsersModels = require('../models/UsersModels'); const queueName = process.env.REDIS_QUEUE_BLAST_ORDER; const Logger = LibWinston.initialize(queueName); module.exports = async (job) => { try { Logger.log('info', `${queueName} running: ${JSON.stringify(job.opts)}`); const now = moment().unix(); const { ord_id, ord_code, base_link } = job.data; if (!ord_id || !ord_code || !base_link) { Logger.log('info', `${queueName} running_fail: data not valid`); return { type: 'fail', message: 'data not valid', data: null, }; } const order = await OrdersModels.showOrder({ 'id': ord_id, }); if (order.length < 1) { Logger.log('info', `${queueName} running_fail: order not found on order_id ${ord_id}`); return { type: 'fail', message: `order not found on order_id ${ord_id}`, data: null, }; } ++order[0].count_sch_blast_order; // check is accepted if (order[0].ord_vdr_id) { Logger.log('info', `${queueName} running_info: order have been accepted by another vendor ${order[0].ord_vdr_id} on order_id ${ord_id}`); return { type: 'success', message: 'order have been accepted by another vendor', data: null, }; } // Kirim ke admin bahwa tidak ada vendor yang acc 3x10 menit if (order[0].count_sch_blast_order >= 3) { Logger.log('info', `${queueName} running_info: No vendor accept this order on order_id ${ord_id} in 3x10 minutes`); let admins = await UsersModels.getUsersActiveByRole(UsersModels.ROLE_ADMIN); for (let admin of admins) { LibMail.sendAdminInfoNoVdrAccOrd('Order Diabaikan oleh Vendor', admin.email, { trx_code: order[0].ord_code, trx_at: moment.unix(order[0].crt).format('DD MMM YYYY'), admin_id: admin.id, admin_name: admin.first_name, admin_phone: '0' + admin.phone, admin_mail: admin.email, admin_addr: admin.fulladdress, client_id: order[0].c_id, client_name: order[0].c_name, client_phone: '0' + order[0].c_phone_val, client_mail: order[0].c_mail, client_addr: '', client_prefer_type_truck: '', pickup_zone_title: order[0].pck_name, pickup_zone_addr: order[0].pck_addr, pickup_at: order[0].set_pck_at, drop_zone_title: order[0].drop_name, drop_zone_addr: order[0].drop_addr, }); } return { type: 'fail', message: `No vendor accept this order on order_id ${ord_id} in 3x10 minutes`, data: null, }; } OrdersModels.updt(order[0].ord_id, { count_sch_blast_order: order[0].count_sch_blast_order, }); // blast to other vendor const nextVendors = await OrdersVendorsModels.getNextVendorsByOrdId(ord_id); if (nextVendors.length > 0) { for (let key in nextVendors) { const blastToVendor = await OrdersVendorsModels.getById(nextVendors[key].id); if (blastToVendor.length < 1) { Logger.log('info', `${queueName} running_fail: vendor ${nextVendors[key].vdr_id} want to blast not found on order_id ${ord_id[key]}`); continue; } // kalau expirednya mau diupdate if (blastToVendor[0].status === OrdersVendorsModels.STTS_WAIT && blastToVendor[0].is_want === OrdersVendorsModels.IS_WANT_IGNORE) { await OrdersVendorsModels.updt(nextVendors[key].id, { is_exp: OrdersVendorsModels.LINK_WILL_EXP, exp_at: moment.unix(now).add(10, 'minutes').unix(), // exp_at: moment.unix(now).add(1, 'day').unix(), }); } const bidOrderMailData = { trx_code: order[0].ord_code, // client_id: order[0].ord_client_id, client_name: order[0].c_name, client_phone: '0' + order[0].c_phone_val, client_mail: order[0].c_mail, // client_addr, client_prefer_type_truck: order[0].prefer_type_truck, pickup_zone_title: order[0].pck_name, pickup_zone_addr: order[0].pck_addr, pickup_at: moment.unix(order[0].set_pck_at).format('DD MMM YYYY HH:mm') + ' WIB', drop_zone_title: order[0].drop_name, drop_zone_addr: order[0].drop_addr, // vendor_id: blastToVendor[0].vdr_id, vendor_name: blastToVendor[0].vdr_name, vendor_phone: '0' + blastToVendor[0].vdr_phone_val, vendor_mail: blastToVendor[0].vdr_mail, vendor_addr: blastToVendor[0].vdr_addr, vendor_acc_link: base_link + blastToVendor[0].bid_token, }; LibMail.sendBidOrderMail('Ada Order Masuk', blastToVendor[0].vdr_mail, bidOrderMailData); } } else { Logger.log('info', `${queueName} running_info: No next vendors, mean all vendors want but no accepted on order_id ${ord_id} in 3x10 minutes`); } // Logger.log('error', `${queueName} running_error: ${JSON.stringify(e, Object.getOwnPropertyNames(e))}`); return { type: 'success', message: 'success do blast order to vendor', data: null, }; } catch (e) { return { type: 'error', message: e.message, e: e, }; } };