yazid138 vor 1 Jahr
Ursprung
Commit
8beb7869b3

+ 118 - 59
controller/v1/auto.controller.js

@@ -5,7 +5,7 @@ const sanksiModel = require('../../model/sanksi.model')
 const laporanModel = require('../../model/laporan.model')
 const {
   TEMPLATE_REMINDER,
-  TEMPLATE_REMINDER2, TRUE, UPDATE_SANKSI,
+  TEMPLATE_REMINDER2, TRUE, UPDATE_SANKSI, CREATE_SANKSI
 } = require('../../utils/constanta')
 const moment = require('moment')
 const autoSaveModel = require('../../model/autoSave.model')
@@ -13,24 +13,26 @@ const { cekSatuDataSanksi, cekSatuDataLaporan } = require('../../utils/v1/cekDat
 const logModel = require('../../model/log.model')
 const kontakModel = require('../../model/kontak.model')
 const pemantauanModel = require('../../model/pemantauan.model')
+const batchModel = require('../../model/batch.model')
+const pddiktiService = require('../../services/v2/pddikti.service')
 
 exports.keberatan = handleError(async (req, res) => {
   const dataSanksi = await sanksiModel
     .find({
       'tanggal_akhir_keberatan': {
-        $lte: moment().toISOString(),
+        $lte: moment().toISOString()
       },
       'is_pengajuan_keberatan': {
         $exists: false,
-        $eq: null,
-      },
+        $eq: null
+      }
     })
     .populate('user')
     .populate('laporan')
 
   if (!dataSanksi.length) {
     return response.success(res, {
-      message: 'Tidak ada keberatan yang diubah',
+      message: 'Tidak ada keberatan yang diubah'
     })
   }
 
@@ -39,7 +41,7 @@ exports.keberatan = handleError(async (req, res) => {
       async (sanksi) =>
         await sanksiModel.findByIdAndUpdate(sanksi._id, {
           is_pengajuan_keberatan: false,
-          last_step: "Dokumen Perbaikan"
+          last_step: 'Dokumen Perbaikan'
         })
     )
   )
@@ -47,7 +49,7 @@ exports.keberatan = handleError(async (req, res) => {
     aktivitas: `Server berhasil merubah last_step PT ${dataSanksi.map((e) => e.laporan.pt.nama).join(', ')} menjadi Dokumen Perbaikan`
   })
   return response.success(res, {
-    message: 'Notifikasi berhasil terkirim',
+    message: 'Notifikasi berhasil terkirim'
   })
 })
 
@@ -55,23 +57,23 @@ exports.banding = handleError(async (req, res) => {
   const dataSanksi = await sanksiModel
     .find({
       'tanggal_akhir_banding': {
-        $lt: moment().toISOString(),
+        $lt: moment().toISOString()
       },
       'is_pengajuan_banding': {
         $exists: false,
-        $eq: null,
+        $eq: null
       },
       'jawaban.keberatan': {
         $exists: true,
-        $ne: null,
-      },
+        $ne: null
+      }
     })
     .populate('user')
     .populate('laporan')
 
   if (!dataSanksi.length) {
     return response.success(res, {
-      message: 'Tidak ada banding yang diubah',
+      message: 'Tidak ada banding yang diubah'
     })
   }
 
@@ -80,7 +82,7 @@ exports.banding = handleError(async (req, res) => {
       async (sanksi) => {
         await sanksiModel.findByIdAndUpdate(sanksi._id, {
           is_pengajuan_banding: false,
-          last_step: "Dokumen Perbaikan"
+          last_step: 'Dokumen Perbaikan'
         })
       }
     )
@@ -89,7 +91,7 @@ exports.banding = handleError(async (req, res) => {
     aktivitas: `Server berhasil merubah last_step PT ${dataSanksi.map((e) => e.laporan.pt.nama).join(', ')} menjadi Dokumen Perbaikan`
   })
   return response.success(res, {
-    message: 'Notifikasi berhasil terkirim',
+    message: 'Notifikasi berhasil terkirim'
   })
 })
 
@@ -98,12 +100,12 @@ exports.reminderKeberatan = handleError(async (req, res) => {
     .find({
       'tanggal_akhir_keberatan': {
         $exists: true,
-        $ne: null,
+        $ne: null
       },
       'jawaban.keberatan': {
         $exists: false,
-        $eq: null,
-      },
+        $eq: null
+      }
     })
     .populate('user')
     .populate('laporan')
@@ -119,23 +121,23 @@ exports.reminderKeberatan = handleError(async (req, res) => {
             {
               key: '1',
               value: 'no_laporan',
-              value_text: e.laporan.no_laporan,
+              value_text: e.laporan.no_laporan
             },
             {
               key: '2',
               value: 'keterangan',
-              value_text: 'Proses Menjawab Pengajuan Keberatan',
+              value_text: 'Proses Menjawab Pengajuan Keberatan'
             },
             {
               key: '3',
               value: 'pt',
-              value_text: e.laporan.pt.nama,
+              value_text: e.laporan.pt.nama
             },
             {
               key: '4',
               value: 'masa',
-              value_text: `menjawab pengajuan keberatan tersisa ${dayLeft} hari lagi.`,
-            },
+              value_text: `menjawab pengajuan keberatan tersisa ${dayLeft} hari lagi.`
+            }
           ])
           const contacts = await kontakModel.find()
           await logModel.create({
@@ -144,7 +146,7 @@ exports.reminderKeberatan = handleError(async (req, res) => {
         } catch (error) {
           return response.error(res, {
             message: 'Notifikasi gagal terkirim',
-            error: error.message,
+            error: error.message
           })
         }
       }
@@ -154,7 +156,7 @@ exports.reminderKeberatan = handleError(async (req, res) => {
   let message = 'Tidak ada notifikasi yang dikirim'
   if (notif.length) message = 'Notifikasi berhasil terkirim'
   return response.success(res, {
-    message,
+    message
   })
 })
 
@@ -163,12 +165,12 @@ exports.reminderBanding = handleError(async (req, res) => {
     .find({
       'tanggal_akhir_banding': {
         $exists: true,
-        $ne: null,
+        $ne: null
       },
       'jawaban.banding': {
         $exists: false,
-        $eq: null,
-      },
+        $eq: null
+      }
     })
     .populate('user')
     .populate('laporan')
@@ -184,23 +186,23 @@ exports.reminderBanding = handleError(async (req, res) => {
             {
               key: '1',
               value: 'no_laporan',
-              value_text: e.laporan.no_laporan,
+              value_text: e.laporan.no_laporan
             },
             {
               key: '2',
               value: 'keterangan',
-              value_text: 'Proses Menjawab Pengajuan Banding',
+              value_text: 'Proses Menjawab Pengajuan Banding'
             },
             {
               key: '3',
               value: 'pt',
-              value_text: e.laporan.pt.nama,
+              value_text: e.laporan.pt.nama
             },
             {
               key: '4',
               value: 'masa',
-              value_text: `menjawab pengajuan banding tersisa ${dayLeft} hari lagi.`,
-            },
+              value_text: `menjawab pengajuan banding tersisa ${dayLeft} hari lagi.`
+            }
           ])
           const contacts = await kontakModel.find()
           await logModel.create({
@@ -209,7 +211,7 @@ exports.reminderBanding = handleError(async (req, res) => {
         } catch (error) {
           return response.error(res, {
             message: 'Notifikasi gagal terkirim',
-            error: error.message,
+            error: error.message
           })
         }
       }
@@ -219,14 +221,14 @@ exports.reminderBanding = handleError(async (req, res) => {
   let message = 'Tidak ada notifikasi yang dikirim'
   if (notif.length) message = 'Notifikasi berhasil terkirim'
   return response.success(res, {
-    message,
+    message
   })
 })
 
 exports.updateStatusSanksi = handleError(async (req, res) => {
   const sanksi = await sanksiModel.find({
     'masa_berlaku.to_date': {
-      $lte: new Date().toISOString(),
+      $lte: new Date().toISOString()
     },
     aktif: true,
     'masa_berlaku.berakhir': {
@@ -242,14 +244,19 @@ exports.updateStatusSanksi = handleError(async (req, res) => {
         sanksi: e._id,
         action: UPDATE_SANKSI,
         pt_id: e.laporan.pt.id,
-        keterangan: 'Masa berlaku sanksi sudah melewati TMT'
+        keterangan: 'Masa berlaku sanksi sudah melewati TMT',
+        levelSanksi: 0
       })
       await sanksiModel.findByIdAndUpdate(e._id, { 'masa_berlaku.berakhir': true })
+      await batchModel.create({
+        sanksi: e._id,
+        type: UPDATE_SANKSI
+      })
     })
   )
 
   return response.success(res, {
-    message: 'update status sanksi berhasil',
+    message: 'update status sanksi berhasil'
   })
 })
 
@@ -258,20 +265,20 @@ exports.save = handleError(async (req, res) => {
   const { laporan: isLaporan, sanksi: isSanksi } = req.query
   const user = req.user
 
-  let autoData = null;
-  let laporan = null;
-  let sanksi = null;
+  let autoData = null
+  let laporan = null
+  let sanksi = null
   if (isLaporan === TRUE) {
-    laporan = await cekSatuDataLaporan(res, user, id);
+    laporan = await cekSatuDataLaporan(res, user, id)
     if (!laporan) return
-    autoData = await autoSaveModel.findOne({ laporan_id: laporan._id });
+    autoData = await autoSaveModel.findOne({ laporan_id: laporan._id })
   } else if (isSanksi === TRUE) {
-    sanksi = await cekSatuDataSanksi(res, user, id);
+    sanksi = await cekSatuDataSanksi(res, user, id)
     if (!sanksi) return
-    autoData = await autoSaveModel.findOne({ sanksi_id: sanksi._id });
+    autoData = await autoSaveModel.findOne({ sanksi_id: sanksi._id })
   } else {
     return response.error(res, {
-      message: 'query harus sanksi atau laporan yg bernilai true',
+      message: 'query harus sanksi atau laporan yg bernilai true'
     })
   }
 
@@ -284,7 +291,7 @@ exports.save = handleError(async (req, res) => {
             dataSuratBA: req.body?.PenetapanSanksi?.dataSuratBA || dataSave.laporan.PenetapanSanksi?.dataSuratBA,
             dataUpload: req.body?.PenetapanSanksi?.dataUpload || dataSave.laporan.PenetapanSanksi?.dataUpload,
             dataPelanggaran: req.body?.PenetapanSanksi?.dataPelanggaran || dataSave.laporan.PenetapanSanksi?.dataPelanggaran,
-            activeStep: req.body?.PenetapanSanksi?.activeStep || dataSave.laporan.PenetapanSanksi?.activeStep,
+            activeStep: req.body?.PenetapanSanksi?.activeStep || dataSave.laporan.PenetapanSanksi?.activeStep
           }
         }
       })
@@ -300,7 +307,7 @@ exports.save = handleError(async (req, res) => {
   }
 
   return response.success(res, {
-    message: 'Berhasil menyimpan data auto save',
+    message: 'Berhasil menyimpan data auto save'
   })
 })
 
@@ -308,26 +315,26 @@ exports.getSave = handleError(async (req, res) => {
   const { id } = req.params
   const { laporan: isLaporan, sanksi: isSanksi } = req.query
 
-  let data = null;
-  let laporan = null;
-  let sanksi = null;
+  let data = null
+  let laporan = null
+  let sanksi = null
   if (isLaporan === TRUE) {
     laporan = await laporanModel.findById(id)
     if (!laporan) return response.error(res, {
       code: 404,
       message: 'laporan_id tidak ada'
     })
-    data = (await autoSaveModel.findOne({ laporan_id: laporan._id })).laporan;
+    data = (await autoSaveModel.findOne({ laporan_id: laporan._id })).laporan
   } else if (isSanksi === 'true') {
     sanksi = await sanksiModel.findById(id)
     if (!sanksi) return response.error(res, {
       code: 404,
       message: 'sanksi_id tidak ada'
     })
-    data = (await autoSaveModel.findOne({ sanksi_id: sanksi._id })).sanksi;
+    data = (await autoSaveModel.findOne({ sanksi_id: sanksi._id })).sanksi
   } else {
     return response.error(res, {
-      message: 'harus terdapat query sanksi atau laporan yg bernilai true',
+      message: 'harus terdapat query sanksi atau laporan yg bernilai true'
     })
   }
 
@@ -338,11 +345,13 @@ exports.getSave = handleError(async (req, res) => {
 })
 
 exports.berakhirSanksi = handleError(async (req, res) => {
-  const sanksi = await sanksiModel.find({'masa_berlaku.to_date': {
+  const sanksi = await sanksiModel.find({
+    'masa_berlaku.to_date': {
       $ne: null,
       $exists: true
-    }}).populate('laporan')
-  let count = 0;
+    }
+  }).populate('laporan')
+  let count = 0
 
   await Promise.all(sanksi.map(async e => {
     const dayLeft = moment(e.masa_berlaku.to_date).diff(
@@ -368,7 +377,7 @@ exports.berakhirSanksi = handleError(async (req, res) => {
             value_text: `habis masa berlaku sanksi tersisa ${dayLeft} hari lagi.`
           }
         ])
-        count++;
+        count++
         const contacts = await kontakModel.find()
         await logModel.create({
           aktivitas: `Server berhasil mengirim notifikasi reminder Whatsapp kepada ${contacts.map((e) => e.nama).join(', ')} dengan Nomor Sanksi ${e.no_sanksi} terhadap ${e.laporan.pt.nama} bahwa Masa Berlaku Sanksi tersisa ${dayLeft} hari lagi.`
@@ -376,7 +385,7 @@ exports.berakhirSanksi = handleError(async (req, res) => {
       } catch (error) {
         return response.error(res, {
           message: 'Notifikasi gagal terkirim',
-          error: error.message,
+          error: error.message
         })
       }
     }
@@ -384,6 +393,56 @@ exports.berakhirSanksi = handleError(async (req, res) => {
   let message = 'Notifikasi berhasil terkirim'
   if (count === 0) message = 'tidak ada notifikasi yg dikirim'
   return response.success(res, {
-    message,
+    message
+  })
+})
+
+exports.batchUpdateSanksi = handleError(async (req, res) => {
+  const data = await batchModel.find({
+    type: UPDATE_SANKSI
+  })
+    .populate({
+      path: 'sanksi',
+      populate: ['laporan']
+    })
+  let error = []
+  await Promise.all(data.map(async e => {
+    const { sanksi } = e
+    try {
+      await pddiktiService.updatePDDIKTI({
+        ptKode: sanksi.laporan.pt.kode,
+        noSanksi: sanksi.no_sanksi,
+        fromDate: sanksi.masa_berlaku.from_date,
+        levelSanksi: sanksi.levelSanksi,
+        terimaSanksi: sanksi.tanggal_terima_sanksi
+      })
+      await logModel.create({
+        aktivitas: `Server berhasil mengirimkan data Ke API PDDIKTI untuk update Status PT ${sanksi.laporan.pt.nama}`
+      })
+      await batchModel.deleteOne(e._id)
+    } catch (e) {
+      error.push(e.message)
+      await Promise.all([
+        laporanModel.updateOne({
+          _id: sanksi.laporan._id
+        }, {
+          sanksi: null
+        }),
+        sanksiModel.deleteOne({
+          _id: sanksi._id
+        }),
+        logModel.create({
+          aktivitas: `Server gagal mengirimkan data Ke API PDDIKTI untuk update Status PT ${sanksi.laporan.pt.nama}, dengan error ${e.message}`
+        }),
+        pemantauanModel.deleteOne({
+          laporan: sanksi.laporan._id,
+          sanksi: sanksi._id,
+          action: CREATE_SANKSI
+        })
+      ])
+    }
+  }))
+  return response.success(res, {
+    message: error.length ? 'Ada beberapa data yang tidak bisa dikirim ke PDDIKTI' : 'Berhasil mengirim data ke PDDIKTI'
   })
 })

+ 11 - 31
controller/v1/sanksi.controller.js

@@ -6,6 +6,7 @@ const { addManyDokumen, addDokumen } = require('../../utils/dokumenFunction')
 const { validate } = require('../../utils/v1/validation')
 const pemantauanModel = require('../../model/pemantauan.model')
 const pelanggaranModel = require('../../model/pelanggaran.model')
+const batchModel = require('../../model/batch.model')
 const logModel = require('../../model/log.model')
 const { hariKerja } = require('../../utils/hariKerja')
 const {
@@ -95,7 +96,8 @@ exports.create = handleError(async (req, res) => {
     tanggal_akhir_keberatan,
     masa_berlaku: from_date && to_date ? { from_date, to_date } : null,
     batas_waktu: from_date ? { keberatan: tanggal_akhir_keberatan } : null,
-    aktif: from_date ? true : false
+    aktif: from_date ? true : false,
+    levelSanksi: Math.max(...sanksiBody.map(e => e.level))
   })
   await laporanModel.findByIdAndUpdate(laporan._id, {
     sanksi: data._id,
@@ -121,39 +123,16 @@ exports.create = handleError(async (req, res) => {
 
 exports.updatePDDIKTI = handleError(async (req, res) => {
   const { sanksi_id } = req.params
-  const user = req.user
   const sanksi = await sanksiModel.findOne({ _id: sanksi_id }).populate('pelanggaran').populate('laporan')
-  try {
-    await pddiktiService.updatePDDIKTI({ ptKode: sanksi.laporan.pt.kode, noSanksi: sanksi.no_sanksi, fromDate: sanksi.masa_berlaku.from_date, pelanggaran: sanksi.pelanggaran, terimaSanksi: sanksi.tanggal_terima_sanksi })
-    await logModel.create({
-      user: user._id,
-      aktivitas: `Server berhasil mengirimkan data Ke API PDDIKTI untuk update Status PT ${sanksi.laporan.pt.nama}`
-    })
-    return response.success(res, {
-      message: 'Berhasil mengirim data ke PDDIKTI'
-    })
-  } catch (e) {
-    await Promise.all([
-      laporanModel.updateOne({
-        _id: laporan._id
-      }, {
-        sanksi: null
-      }), sanksiModel.deleteOne({
-        _id: data._id
-      }), logModel.create({
-        user: user._id,
-        aktivitas: `Server gagal mengirimkan data Ke API PDDIKTI untuk update Status PT ${sanksi.laporan.pt.nama}, dengan error ${e.message}`
-      }), pemantauanModel.deleteOne({
-        laporan: sanksi.laporan._id,
-        sanksi: sanksi._id,
-        action: CREATE_SANKSI
-      })
-    ])
-    return response.error(res, {
-      message: 'Gagal Membuat Sanksi',
-      error: e.message
+  if (sanksi.masa_berlaku.from_date) {
+    await batchModel.create({
+      sanksi: sanksi._id,
+      type: UPDATE_SANKSI
     })
   }
+  return response.success(res, {
+    message: 'Berhasil memasukkan data ke dalam batch update status PDDIKTI'
+  })
 })
 
 exports.update = handleError(async (req, res) => {
@@ -194,6 +173,7 @@ exports.update = handleError(async (req, res) => {
       keterangan,
       dokumen: dokumen_id,
       aktif: from_date ? true : false,
+      levelSanksi: Math.max(...sanksiBody.map(e => e.level)),
       masa_berlaku,
       $push: {
         riwayat_sanksi: sanksi

+ 10 - 6
controller/v1/sanksi/cabutSanksi.controller.js

@@ -17,13 +17,16 @@ exports.create = handleError(async (req, res) => {
   if (!sanksi) return
 
   const files = req.files
-  if (!files?.length) {
+  if (!(files?.dokumen && files?.dokumen_rekomendasi)) {
     return response.error(res, {
-      message: 'dokumen harus ada'
+      message: 'dokumen dan dokumen_rekomendasi harus ada'
     })
   }
-  const dokumen = await addManyDokumen(files)
-  const dokumen_id = dokumen.map((e) => e._id)
+
+  const [dokumen_id, dokumenRekomendasi_id] = await Promise.all([
+    (async () => (await addManyDokumen(files.dokumen)).map((e) => e._id))(),
+    (async ()=> (await addManyDokumen(files.dokumen_rekomendasi)).map(e => e._id))()
+  ])
 
   const data = await sanksiModel.findOneAndUpdate(
     {
@@ -49,8 +52,9 @@ exports.create = handleError(async (req, res) => {
       },
       $push: {
         riwayat_pengajuan_cabut_sanksi: {
-          index: sanksi.index_perbaikan-1,
-          dokumen: dokumen_id
+          index: sanksi.index_perbaikan - 1,
+          dokumen: dokumen_id,
+          dokumen_rekomendasi: dokumenRekomendasi_id
         }
       }
     }

+ 5 - 8
controller/v1/user.controller.js

@@ -4,7 +4,7 @@ const userModel = require('../../model/user.model')
 const { validate } = require('../../utils/v1/validation')
 const { addDokumen } = require('../../utils/dokumenFunction')
 const jwt = require('jsonwebtoken')
-const { TEMPLATE_VERIFIKASI, TRUE, FALSE } = require('../../utils/constanta')
+const { TEMPLATE_VERIFIKASI, TRUE, FALSE,TEMPLATE_OTP } = require('../../utils/constanta')
 const pddiktiService = require('../../services/v2/pddikti.service')
 
 exports.addUserPublic = handleError(async (req, res) => {
@@ -64,13 +64,10 @@ exports.addUserPublic = handleError(async (req, res) => {
   let notif = null
   if (isVerify !== FALSE && no_hp) {
     pddiktiService.whatsapp(
-      TEMPLATE_VERIFIKASI,
-      [{ nama: nama || 'rahasia', no_hp: no_hp2 }],
-      [
-        { key: '1', value: 'pt', value_text: pt[0].nama },
-        { key: '3', value: 'no_verifikasi', value_text: no_verifikasi },
-        { key: '2', value: 'no_laporan', value_text: no_laporan },
-      ]
+      TEMPLATE_OTP,
+      [{ name: nama || 'rahasia', number: no_hp2 }],
+      [{ key: 1, value: 'no_verifikasi', value_text: no_verifikasi }],
+      [{ index: 0, type: 'url', value: no_verifikasi }]
     ).catch()
   }
 

+ 8 - 7
controller/v2/auth.controller.js

@@ -1,7 +1,7 @@
 const { validation } = require('../../middleware/validation')
 const response = require('../../utils/responseHandler')
 const userModel = require('../../model/user.model')
-const { roleDataProduction, TEMPLATE_VERIFIKASI, PTB_DIKTI, PTB_ADMIN } = require('../../utils/constanta')
+const { roleDataProduction, TEMPLATE_VERIFIKASI, PTB_DIKTI, PTB_ADMIN, TEMPLATE_OTP } = require('../../utils/constanta')
 const convertRole = require('../../utils/convertRole')
 const jwt = require('jsonwebtoken')
 const moment = require('moment')
@@ -187,11 +187,12 @@ exports.sendOTP = [
       expires: moment().add(5, 'minutes').toDate()
     })
     try {
-      const waResult = await pddiktiService.whatsapp(TEMPLATE_VERIFIKASI, [{ name: user.nama, number: no_hp }], [
-        { key: '1', value: 'pt', value_text: user.lembaga.nama },
-        { key: '3', value: 'no_verifikasi', value_text: generatedOtp },
-        { key: '2', value: 'no_laporan', value_text: '-' }
-      ])
+      const waResult = await pddiktiService.whatsapp(
+        TEMPLATE_OTP,
+        [{ name: user.nama, number: no_hp }],
+        [{ key: 1, value: 'otp', value_text: generatedOtp }],
+        [{ type: 'url', value: generatedOtp }]
+      )
       if ([200, 201].includes(waResult.status)) {
         return response.error(res, {
           code: waResult[0].error.code,
@@ -205,7 +206,7 @@ exports.sendOTP = [
       })
     }
     return response.success(res, {
-      message: 'Berhasil mengirimkan OTP',
+      message: 'Berhasil mengirimkan OTP'
     })
   }
 ]

+ 14 - 0
model/batch.model.js

@@ -0,0 +1,14 @@
+const mongoose = require('mongoose')
+const sanksi = require('./sanksi.model')
+const laporan = require('./laporan.model')
+const { Schema, Types } = mongoose
+
+module.exports = mongoose.model(
+  'Batch',
+  new Schema({
+    laporan: { type: Types.ObjectId, ref: laporan },
+    sanksi:{ type: Types.ObjectId, ref: sanksi },
+    type: String,
+  }),
+  'batch'
+)

+ 7 - 0
model/sanksi.model.js

@@ -17,6 +17,7 @@ module.exports = mongoose.model(
       keterangan: String,
       is_read: Boolean,
       last_step: String,
+      levelSanksi: Number,
       is_pengajuan_keberatan: Boolean,
       is_pengajuan_banding: Boolean,
       is_finalisasi: { type: Boolean, default: false },
@@ -144,6 +145,12 @@ module.exports = mongoose.model(
         ),
         cabut_sanksi: new Schema(
           {
+            dokumen_rekomendasi: [
+              {
+                type: Types.ObjectId,
+                ref: dokumen
+              }
+            ],
             dokumen: [
               {
                 type: Types.ObjectId,

+ 7 - 0
model/sanksi2.model.js

@@ -15,6 +15,7 @@ module.exports = mongoose.model(
       keterangan: String,
       is_read: Boolean,
       last_step: String,
+      levelSanksi: Number,
       is_pengajuan_keberatan: Boolean,
       is_pengajuan_banding: Boolean,
       is_finalisasi: { type: Boolean, default: false },
@@ -142,6 +143,12 @@ module.exports = mongoose.model(
         ),
         cabut_sanksi: new Schema(
           {
+            dokumen_rekomendasi: [
+              {
+                type: Types.ObjectId,
+                ref: dokumen
+              }
+            ],
             dokumen: [
               {
                 type: Types.ObjectId,

+ 1 - 0
routes/v1/auto.routes.js

@@ -11,5 +11,6 @@ router.get('/status-sanksi', verify, auto.updateStatusSanksi)
 router.get('/berakhir-sanksi', verify, auto.berakhirSanksi)
 router.post('/save/:id', auth, auto.save)
 router.get('/save/:id', auto.getSave)
+router.get('/batch/update-status-sanksi', verify, auto.batchUpdateSanksi)
 
 module.exports = router

+ 1 - 1
routes/v1/sanksi/cabutSanksi.routes.js

@@ -6,7 +6,7 @@ const roleId = require('../../../middleware/role')
 router.post(
   '/create/:sanksi_id',
   roleId(2022),
-  handleDokumen.array('dokumen'),
+  handleDokumen.fields([{ name: 'dokumen' }, {name: 'dokumen_rekomendasi'}]),
   cabutSanksi.create
 )
 

+ 12 - 10
services/v2/pddikti.service.js

@@ -1,7 +1,7 @@
 const axios = require('../../utils/axios')
 const coba = require('../../utils/coba')
 const qs = require('qs')
-const {PRODUCTION} = require('../../utils/constanta')
+const { PRODUCTION } = require('../../utils/constanta')
 
 /**
  *
@@ -16,8 +16,8 @@ exports.getPT = (id, query = {}) => {
     url = 'https://api.kemdikbud.go.id:8443/pddikti/1.2/pt'
     token = coba.decrypt(process.env.BEAT2)
   }
-  const {search, pembina} = query
-  if (id) url += '/'+id
+  const { search, pembina } = query
+  if (id) url += '/' + id
   if (Object.keys(query).length) {
     url += '?'
     const parseUrl = []
@@ -44,7 +44,7 @@ exports.getPembina = (id, query = {}) => {
     url = 'https://api.kemdikbud.go.id:8443/pddikti/1.2/lembaga-non-sp'
     token = coba.decrypt(process.env.BEAT2)
   }
-  const {search} = query
+  const { search } = query
   if (Object.keys(query).length) {
     url += '?'
     const parseURL = []
@@ -60,7 +60,7 @@ exports.getPembina = (id, query = {}) => {
  * @param password
  * @returns {Promise<*>}
  */
-exports.login = ({username, password}) => {
+exports.login = ({ username, password }) => {
   let token
   let url = 'https://api.kemdikbud.go.id:8243/manakses/2.0/auth'
   if (coba.decrypt(process.env.CXQSB) === PRODUCTION) {
@@ -71,7 +71,7 @@ exports.login = ({username, password}) => {
     url,
     qs.stringify({
       username,
-      password,
+      password
     }),
     token,
     {
@@ -89,7 +89,7 @@ exports.login = ({username, password}) => {
  * @param terimaSanksi
  * @returns {Promise<*>}
  */
-exports.updatePDDIKTI = ({ptKode, noSanksi, fromDate, pelanggaran, terimaSanksi}) => {
+exports.updatePDDIKTI = ({ ptKode, noSanksi, fromDate, levelSanksi, terimaSanksi }) => {
   let token
   let url = `https://api.kemdikbud.go.id:8243/pddikti/1.2/pt/${ptKode}/sanksi`
   if (coba.decrypt(process.env.CXQSB) === PRODUCTION) {
@@ -102,7 +102,7 @@ exports.updatePDDIKTI = ({ptKode, noSanksi, fromDate, pelanggaran, terimaSanksi}
       noSanksi: noSanksi,
       tmtBerlaku: fromDate,
       tstBerlaku: terimaSanksi,
-      idJenisSanksi: Math.max(...pelanggaran.map(e => e.level_sanksi)),
+      idJenisSanksi: levelSanksi,
       alasan: 'Penetapan sanksi'
     },
     token
@@ -114,9 +114,10 @@ exports.updatePDDIKTI = ({ptKode, noSanksi, fromDate, pelanggaran, terimaSanksi}
  * @param templateId
  * @param data
  * @param contacts
+ * @param buttons
  * @returns {Promise<*>}
  */
-exports.whatsapp = (templateId, contacts, data) => {
+exports.whatsapp = (templateId, contacts, data, buttons) => {
   let token
   let url = 'https://api.kemdikbud.go.id:8243/qontak/1.0/send'
   if (coba.decrypt(process.env.CXQSB) === PRODUCTION) {
@@ -128,7 +129,8 @@ exports.whatsapp = (templateId, contacts, data) => {
     {
       templateId,
       contacts,
-      body: data
+      body: data,
+      buttons: buttons.map((e, index) => ({ ...e, index }))
     },
     token
   )

+ 1 - 0
utils/constanta.js

@@ -10,6 +10,7 @@ exports.TEMPLATE_PERBAIKAN_DOKUMEN = '891ee9c7-39f8-416e-af5c-6b3a10e9dbec'
 exports.TEMPLATE_VERIFIKASI = '37a9ccba-e1bc-4d02-86e0-3be4c718af2a'
 exports.TEMPLATE_REMINDER = '960eaacb-0dd9-42a6-b331-60fac972eb96'
 exports.TEMPLATE_REMINDER2 = 'd4f02018-2063-4d29-bd05-9f9468d71bf1'
+exports.TEMPLATE_OTP = 'b22e8ad2-a3c4-43b6-92de-e736435313f6'
 
 exports.LLDIKTI = 'lldikti'
 exports.DIKTI = 'dikti'

+ 3 - 0
utils/v1/cekData.js

@@ -146,11 +146,14 @@ exports.cekSatuDataSanksi = async (
     .populate('jawaban.banding.dokumen')
     .populate('jawaban.banding.dokumen_terima_banding')
     .populate('pengajuan.cabut_sanksi.dokumen')
+    .populate('pengajuan.cabut_sanksi.dokumen_rekomendasi')
     .populate('jawaban.cabut_sanksi.dokumen')
     .populate('rekomendasi.dokumen')
     .populate('perbaikan.dokumen')
     .populate('riwayat_sanksi.dokumen')
     .populate('riwayat_sanksi.perbaikan.dokumen')
+    .populate('riwayat_pengajuan_cabut_sanksi.dokumen')
+    .populate('riwayat_jawaban_cabut_sanksi.dokumen')
   if (!sanksi?.laporan) {
     response.error(res, {
       message: 'sanksi_id tidak ada',