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 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 data = job.data; if (!data.ord_id || !data.ord_code) { Logger.log('info', `${queueName} running_fail: data not valid`); return { type: 'fail', message: 'data not valid', data: null, }; } const order = await OrdersModels.showOrder({ 'id': data.ord_id, }); if (order.length < 1) { Logger.log('info', `${queueName} running_fail: order not found on order_id ${data.ord_id}`); return { type: 'fail', message: `order not found on order_id ${data.ord_id}`, data: null, }; } // 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 ${data.ord_id}`); return { type: 'success', message: 'order have been accepted by another vendor', data: null, }; } else { await OrdersVendorsModels.updt(data.current_ord_vdr_id, { status: OrdersVendorsModels.STTS_NOT_READY, }); } // blast to other vendor if (data.next_ord_vdr_id.length > 0) { for (let key in data.next_ord_vdr_id) { // get by vendor_id not bid token // let blastToVendor = await OrdersVendorsModels.getByBidToken(data.next_vdr_bid_token[key].tkn); let blastToVendor = await OrdersVendorsModels.getById(data.next_ord_vdr_id[key].id); if (blastToVendor.length < 1) { Logger.log('info', `${queueName} running_fail: vendor want to blast not found on order_id ${data.ord_id[key]} and bid_token ${data.next_vdr_bid_token[key].tkn}`); // return { // type: 'fail', // message: `vendor want to blast not found on order_id ${data.ord_id[key]} and bid_token ${data.next_vdr_bid_token[key].tkn}`, // data: null, // }; continue; } // kalau expirednya mau diupdate // if (blastToVendor[0].status === OrdersVendorsModels.STTS_WAIT && blastToVendor[0].is_want === OrdersVendorsModels.IS_WANT_IGNORE) { // await OrdersVendorsModels.updt(data.next_ord_vdr_id[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(), // }); // } let 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, // weight: Number(order[0].weight), // cbm: Number(order[0].cbm), // koli: Number(order[0].koli), 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: data.next_vdr_acc_link[key].link, }; LibMail.sendBidOrderMail('Ada Order Masuk', blastToVendor[0].vdr_mail, bidOrderMailData); } } else { await OrdersModels.updt(data.ord_id, { status: OrdersModels.STTS_CANCEL, cancel_type: OrdersModels.CANCEL_TYPE_VDR_NOT_READY, cancel_at: now, }); } // 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, }; } };