batchSanksi.service.js 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. const batchModel = require('../model/batch.model')
  2. const pemantauanModel = require('../model/pemantauan.model')
  3. const logModel = require('../model/log.model')
  4. const pddiktiService = require('./v2/pddikti.service')
  5. const moment = require('moment')
  6. const { UPDATE_SANKSI, CREATE_SANKSI } = require('../utils/constanta')
  7. const { logInfo, logError } = require('../utils/logger')
  8. /**
  9. * Proses semua batch job UPDATE_SANKSI: kirim ke PDDIKTI, hapus batch kalau sukses,
  10. * biarkan tersimpan (untuk retry) kalau gagal.
  11. * Dipakai oleh endpoint manual (auto.controller.batchUpdateSanksi) dan worker background.
  12. */
  13. exports.processBatchUpdateSanksi = async () => {
  14. const data = await batchModel.find({ type: UPDATE_SANKSI })
  15. .populate({ path: 'sanksi', populate: ['laporan'] })
  16. if (!data.length) return { processed: 0, error: [] }
  17. const error = []
  18. await Promise.all(data.map(async (e) => {
  19. const { sanksi } = e
  20. if (!sanksi?.laporan) return
  21. try {
  22. await pddiktiService.updatePDDIKTI({
  23. ptKode: sanksi.laporan.pt.kode,
  24. noSanksi: sanksi.laporan.no_laporan,
  25. fromDate: moment(sanksi.masa_berlaku.from_date).format('YYYY-MM-DD'),
  26. levelSanksi: sanksi.levelSanksi,
  27. terimaSanksi: moment(sanksi.tanggal_terima_sanksi).format('YYYY-MM-DD')
  28. })
  29. await logModel.create({
  30. aktivitas: `Server berhasil mengirimkan data Ke API PDDIKTI untuk update Status PT ${sanksi.laporan.pt.nama}`
  31. })
  32. await batchModel.deleteOne({ _id: e._id })
  33. logInfo('BATCH_SANKSI', 'Batch item processed', { batchId: e._id, pt: sanksi.laporan.pt.nama })
  34. } catch (err) {
  35. error.push(err.message)
  36. logError('BATCH_SANKSI', 'Batch item failed', { batchId: e._id, pt: sanksi.laporan?.pt?.nama, error: err.message })
  37. await Promise.all([
  38. logModel.create({
  39. aktivitas: `Server gagal mengirimkan data Ke API PDDIKTI untuk update Status PT ${sanksi.laporan.pt.nama}, dengan error ${err.message}`
  40. }),
  41. pemantauanModel.deleteOne({
  42. laporan: sanksi.laporan._id,
  43. sanksi: sanksi._id,
  44. action: CREATE_SANKSI
  45. })
  46. ])
  47. }
  48. }))
  49. return { processed: data.length, error }
  50. }