const batchModel = require('../model/batch.model') const pemantauanModel = require('../model/pemantauan.model') const logModel = require('../model/log.model') const pddiktiService = require('./v2/pddikti.service') const moment = require('moment') const { UPDATE_SANKSI, CREATE_SANKSI } = require('../utils/constanta') const { logInfo, logError } = require('../utils/logger') /** * Proses semua batch job UPDATE_SANKSI: kirim ke PDDIKTI, hapus batch kalau sukses, * biarkan tersimpan (untuk retry) kalau gagal. * Dipakai oleh endpoint manual (auto.controller.batchUpdateSanksi) dan worker background. */ exports.processBatchUpdateSanksi = async () => { const data = await batchModel.find({ type: UPDATE_SANKSI }) .populate({ path: 'sanksi', populate: ['laporan'] }) if (!data.length) return { processed: 0, error: [] } const error = [] await Promise.all(data.map(async (e) => { const { sanksi } = e if (!sanksi?.laporan) return try { await pddiktiService.updatePDDIKTI({ ptKode: sanksi.laporan.pt.kode, noSanksi: sanksi.laporan.no_laporan, fromDate: moment(sanksi.masa_berlaku.from_date).format('YYYY-MM-DD'), levelSanksi: sanksi.levelSanksi, terimaSanksi: moment(sanksi.tanggal_terima_sanksi).format('YYYY-MM-DD') }) await logModel.create({ aktivitas: `Server berhasil mengirimkan data Ke API PDDIKTI untuk update Status PT ${sanksi.laporan.pt.nama}` }) await batchModel.deleteOne({ _id: e._id }) logInfo('BATCH_SANKSI', 'Batch item processed', { batchId: e._id, pt: sanksi.laporan.pt.nama }) } catch (err) { error.push(err.message) logError('BATCH_SANKSI', 'Batch item failed', { batchId: e._id, pt: sanksi.laporan?.pt?.nama, error: err.message }) await Promise.all([ logModel.create({ aktivitas: `Server gagal mengirimkan data Ke API PDDIKTI untuk update Status PT ${sanksi.laporan.pt.nama}, dengan error ${err.message}` }), pemantauanModel.deleteOne({ laporan: sanksi.laporan._id, sanksi: sanksi._id, action: CREATE_SANKSI }) ]) } })) return { processed: data.length, error } }