const SandboxedJobMQ = require('bullmq').SandboxedJob; const moment = require('moment'); const LibWinston = require('../library/LibWinston'); const LibFirebase = require('../library/LibFirebase'); const OrdersModels = require('../models/OrdersModels'); const DriversModels = require('../models/DriversModels'); const OrdersPckDropsModels = require('../models/OrdersPckDropsModels'); // const GpsTracksModels = require('../models/GpsTracksModels'); const schedulerName = process.env.REDIS_SCHEDULER_DRV_UP_PHOTO; const Logger = LibWinston.initialize(schedulerName); module.exports = async (job) => { try { Logger.log('info', `${schedulerName} running: ${JSON.stringify(job.opts)}`); /** * cek apakah ord_pck_drop.stts(status_delivery) === OrdersPckDropsModels.STTS_DELIVERY_FINISH_PICKUP * jika iya dan sudah upload menu_travel_document maka kendaraan sedang dalam perjalanan ke lokasi drop * cek apakah ord_pck_drop.stts(status_delivery) === OrdersPckDropsModels.STTS_DELIVERY_OTW_DROP * jika iya dan ord_pck_drop.drv_app_lock_menu_otw_drop_at === 0 maka kendaraan masih dalam perjalanan ke lokasi drop */ const libFirebase = new LibFirebase(); let notifTitle = 'Notifikasi Cek Photo Saat diperjalanan'; // up location let notifBody = 'Harap Dihiraukan'; // up location // (async function() { try { async function checkNotifNLogs(job) { libFirebase.sendToDevice(job.drv_fcm_token, { // notification: { // title: notifTitle, // body: notifBody, // }, data: { title: notifTitle, body: notifBody, type: '' + LibFirebase.upPhotoOtwDrop, detail_id: '' + job.detail_id, content_available: 'true', } }, { priority: 'high', // to apple: normal(5), high(10) android: { priority: 'high', // to anroid: low(?). normal(5), high(10) }, content_available: true, click_action: 'FLUTTER_NOTIFICATION_CLICK', }); } let loop = process.env.SCHEDULE_DRV_UP_PHOTO_MAX_LOOP; for (let x = 0; x < loop; x++) { // all active order const activeJobs = await OrdersModels.listOrders({ is_active: OrdersModels.IS_ACTIVE, delivery_statuses: [ OrdersPckDropsModels.STTS_DELIVERY_OTW_DROP ], couple_pck_drop: 1, inner_join_phone_devices: 1, phone_devices_is_login: DriversModels.IS_LOGIN, last_tracks_phone_drv: 1, // group_by: 'GROUP BY ord_drv.drv_id', }); let hadSends = []; for (const job of activeJobs) { // baru ketembak notif, minimal ada 1x update lokasi if (job.drv_fcm_token && job.tr_crt_d && job.tr_crt_d != 0) { if (job.drv_app_lock_menu_otw_drop_at !== 0) continue; if (hadSends.includes(job.drv_id)) continue; // more than 2 hour let start = moment(); let end = moment.unix(job.tr_crt_d); let duration = moment.duration(start.diff(end)); if (duration.asHours() >= 2) { hadSends.push(job.drv_id); job.detail_id = Buffer.from(`${job.ord_id}_${job.ord_pck_id}_${job.ord_drop_id}_${job.ord_pck_drop_id}`, 'ascii').toString('hex'); await checkNotifNLogs(job); } } // ketembak notif jika belum pernah ada update lokasi samsek else { job.detail_id = Buffer.from(`${job.ord_id}_${job.ord_pck_id}_${job.ord_drop_id}_${job.ord_pck_drop_id}`, 'ascii').toString('hex'); await checkNotifNLogs(job); } } } } catch (e) { console.error(e); Logger.log('error', `${schedulerName} error: ${JSON.stringify(e)}`); } // })(); return { type: 'success', message: 'success run scheduler drv up photo', data: null, }; } catch (e) { return { type: 'error', message: e.message, e: e, }; } };