andi 2 years ago
parent
commit
d776c6cf08

+ 25 - 10
controller/auto.controller.js

@@ -2,6 +2,7 @@ const handleError = require('../utils/handleError')
 const response = require('../utils/responseHandler')
 const { notifWA } = require('../utils/notifFunction')
 const sanksiModel = require('../model/sanksi.model')
+const laporanModel = require('../model/laporan.model')
 const {
   TEMPLATE_KEBERATAN,
   TEMPLATE_BANDING,
@@ -273,11 +274,11 @@ exports.save = handleError(async (req, res) => {
   let laporan = null;
   let sanksi = null;
   if (isLaporan === 'true') {
-    laporan = await cekSatuDataLaporan(res, user, id, { all: true });
+    laporan = await cekSatuDataLaporan(res, user, id);
     if (!laporan) return
     autoData = await autoSaveModel.findOne({ laporan_id: laporan._id });
   } else if (isSanksi === 'true') {
-    sanksi = await cekSatuDataSanksi(res, user, id, { all: true });
+    sanksi = await cekSatuDataSanksi(res, user, id);
     if (!sanksi) return
     autoData = await autoSaveModel.findOne({ sanksi_id: sanksi._id });
   } else {
@@ -288,7 +289,16 @@ exports.save = handleError(async (req, res) => {
 
   if (autoData) {
     if (isLaporan) {
-      await autoSaveModel.updateOne({ laporan_id: laporan._id }, { laporan: req.body })
+      const dataSave = await autoSaveModel.findOne({ laporan_id: laporan._id })
+      await autoSaveModel.updateOne({ laporan_id: laporan._id }, {
+        laporan: {
+          ...req.body, PenetapanSanksi: {
+            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,
+          }
+        }
+      })
     } else {
       await autoSaveModel.updateOne({ sanksi_id: sanksi._id }, { sanksi: req.body })
     }
@@ -308,19 +318,24 @@ exports.save = handleError(async (req, res) => {
 exports.getSave = handleError(async (req, res) => {
   const { id } = req.params
   const { laporan: isLaporan, sanksi: isSanksi } = req.query
-  const user = req.user
 
   let data = null;
   let laporan = null;
   let sanksi = null;
   if (isLaporan === 'true') {
-    laporan = await cekSatuDataLaporan(res, user, id, { all: true });
-    if (!laporan) return
-    data = (await autoSaveModel.findOne({ laporan_id: laporan._id})).laporan;
+    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;
   } else if (isSanksi === 'true') {
-    sanksi = await cekSatuDataSanksi(res, user, id, { all: true });
-    if (!sanksi) return
-    data = (await autoSaveModel.findOne({ sanksi_id: sanksi._id})).sanksi;
+    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;
   } else {
     return response.error(res, {
       message: 'harus terdapat query sanksi atau laporan yg bernilai true',

+ 107 - 42
controller/laporan.controller.js

@@ -16,6 +16,7 @@ const {
 const { TEMPLATE_LAPORAN } = require('../utils/constanta')
 const logModel = require('../model/log.model')
 const kontakModel = require('../model/kontak.model')
+const { isValidObjectId } = require('mongoose')
 
 exports.create = handleError(async (req, res) => {
   const user = req.user
@@ -68,22 +69,32 @@ exports.create = handleError(async (req, res) => {
 
   data = await laporanModel.create(data)
 
-  const notif = await notifWA(TEMPLATE_LAPORAN, [
-    {
-      key: '1',
-      value: 'nama',
-      value_text: user.nama,
-    },
-    { key: '2', value: 'pt', value_text: pt[0].nama },
-    { key: '3', value: 'keterangan', value_text: keterangan },
-    { key: '4', value: 'no_laporan', value_text: no_laporan },
-  ])
-
   let contacts = await kontakModel.find()
   contacts = contacts.map((e) => e.nama).join(', ')
-  if (notif[0].status == 'success') {
+  try {
+    const notif = await notifWA(TEMPLATE_LAPORAN, [
+      {
+        key: '1',
+        value: 'nama',
+        value_text: user.nama,
+      },
+      { key: '2', value: 'pt', value_text: pt[0].nama },
+      { key: '3', value: 'keterangan', value_text: keterangan },
+      { key: '4', value: 'no_laporan', value_text: no_laporan },
+    ])
+
+    if (notif[0].status == 'success') {
+      await logModel.create({
+        aktivitas: `Server berhasil mengirim notif wa kepada ${contacts} untuk Pembuatan Laporan`,
+      })
+    } else {
+      await logModel.create({
+        aktivitas: `Server gagal mengirim notif wa kepada ${contacts} untuk Pembuatan Laporan, Error: ${JSON.stringify(notif)}`,
+      })
+    }
+  } catch (error) {
     await logModel.create({
-      aktivitas: `Server berhasil mengirim notif wa kepada ${contacts} untuk Pembuatan Laporan`,
+      aktivitas: `Server gagal mengirim notif wa kepada ${contacts} untuk Pembuatan Laporan, Error: ${error.message}`,
     })
   }
 
@@ -271,24 +282,34 @@ exports.public = handleError(async (req, res) => {
     for_pt: false,
   })
 
-  if (no_verifikasi)
-    await userModel.findByIdAndUpdate(user._id, { verified: true })
-  const notif = await notifWA(TEMPLATE_LAPORAN, [
-    {
-      key: '1',
-      value: 'nama',
-      value_text: user.isPrivate || !user.nama ? 'rahasia' : user.nama,
-    },
-    { key: '2', value: 'pt', value_text: pt[0].nama },
-    { key: '3', value: 'keterangan', value_text: keterangan },
-    { key: '4', value: 'no_laporan', value_text: no_laporan },
-  ])
+  if (no_verifikasi) await userModel.findByIdAndUpdate(user._id, { verified: true })
 
   let contacts = await kontakModel.find()
   contacts = contacts.map((e) => e.nama).join(', ')
-  if (notif[0].status == 'success') {
+  try {
+    const notif = await notifWA(TEMPLATE_LAPORAN, [
+      {
+        key: '1',
+        value: 'nama',
+        value_text: user.isPrivate || !user.nama ? 'rahasia' : user.nama,
+      },
+      { key: '2', value: 'pt', value_text: pt[0].nama },
+      { key: '3', value: 'keterangan', value_text: keterangan },
+      { key: '4', value: 'no_laporan', value_text: no_laporan },
+    ])
+
+    if (notif[0].status == 'success') {
+      await logModel.create({
+        aktivitas: `Server berhasil mengirim notif wa kepada ${contacts} untuk Pembuatan Laporan`,
+      })
+    } else {
+      await logModel.create({
+        aktivitas: `Server gagal mengirim notif wa kepada ${contacts} untuk Pembuatan Laporan, Error: ${JSON.stringify(notif)}`,
+      })
+    }
+  } catch (error) {
     await logModel.create({
-      aktivitas: `Server berhasil mengirim notif wa kepada ${contacts} untuk Pembuatan Laporan`,
+      aktivitas: `Server gagal mengirim notif wa kepada ${contacts} untuk Pembuatan Laporan, Error: ${error.message}`,
     })
   }
 
@@ -298,6 +319,30 @@ exports.public = handleError(async (req, res) => {
   })
 })
 
+exports.getLaporanByNoLaporanAndId = handleError(async (req, res) => {
+  const { no_laporan } = req.params
+  let where = { evaluasi: { $exists: true, $ne: [] } }
+  if (isValidObjectId(no_laporan)) where._id = no_laporan
+  else where.no_laporan = no_laporan
+  const data = await laporanModel.findOne(where)
+    .populate({ path: 'user', populate: 'foto' })
+    .populate({ path: 'pelanggaran', select: 'pelanggaran' })
+    .populate({ path: 'sanksi', populate: ['pelanggaran'] })
+    .populate('dokumen')
+    .populate('peserta_penetapan_sanksi.ttd')
+    .populate({ path: 'evaluasi', populate: ['user', 'dokumen'] })
+  if (!data) {
+    return response.error(res, {
+      message: 'no_laporan atau id tidak ada',
+      code: 404,
+    })
+  }
+  return response.success(res, {
+    message: 'Berhasil ambil data laporan',
+    data,
+  })
+})
+
 exports.getAll = handleError(async (req, res) => {
   const user = req.user
   const where = {}
@@ -371,9 +416,8 @@ exports.update = handleError(async (req, res) => {
   const keterangan2 = req.body.keterangan
   if (change_role === 'true') {
     data.role_data = user.role.id === 2020 ? 'lldikti' : 'dikti'
-    keterangan = `Laporan didelegasi ke ${
-      user.role.id === 2020 ? 'LLDIKTI' : 'DIKTI'
-    }`
+    keterangan = `Laporan didelegasi ke ${user.role.id === 2020 ? 'LLDIKTI' : 'DIKTI'
+      }`
     alasan = keterangan2
     data.alasan_delegasi = keterangan2
     // if (laporan.jadwal) {
@@ -519,22 +563,22 @@ exports.laporanByPembina = handleError(async (req, res) => {
     (async () =>
       isLaporan
         ? await cekBanyakDataLaporan(user, {
-            'pt.pembina.id': idPembina,
-            all: true,
-            ...where,
-          })
+          'pt.pembina.id': idPembina,
+          all: true,
+          ...where,
+        })
         : [])(),
     (async () =>
       isSanksi
         ? (
-            await cekBanyakDataSanksi(
-              user,
-              { all: true, ...where },
-              {
-                ['pt.pembina.id']: idPembina,
-              }
-            )
-          ).filter((e) => e.laporan != null)
+          await cekBanyakDataSanksi(
+            user,
+            { all: true, ...where },
+            {
+              ['pt.pembina.id']: idPembina,
+            }
+          )
+        ).filter((e) => e.laporan != null)
         : [])(),
   ])
 
@@ -543,3 +587,24 @@ exports.laporanByPembina = handleError(async (req, res) => {
     data: { laporan, sanksi: dataSanksi },
   })
 })
+
+exports.getOneLaporanPublic = handleError(async (req, res) => {
+  const { id } = req.params
+  const data = await laporanModel.findById(id)
+    .populate({ path: 'user', populate: 'foto' })
+    .populate({ path: 'pelanggaran', select: 'pelanggaran' })
+    .populate({ path: 'sanksi', populate: ['pelanggaran'] })
+    .populate('dokumen')
+    .populate('peserta_penetapan_sanksi.ttd')
+    .populate({ path: 'evaluasi', populate: ['user', 'dokumen'] })
+  console.log(data)
+  if (!data) return response.error(res, {
+    code: 404,
+    message: 'laporan_id tidak ada'
+  })
+
+  return response.success(res, {
+    message: 'Berhasil ambil satu data Laporan',
+    data,
+  })
+})

+ 1 - 1
controller/pelanggaran.controller.js

@@ -43,7 +43,7 @@ exports.sanksi = handleError(async (req, res) => {
   let data = await pelanggaranModel.find(w)
   data = [
     ...new Set(
-      data.map((e) => `${e.sanksi} - Sanksi Administratif ${e.label_sanksi}`)
+      data.map((e) => `${e.label_sanksi};${e.sanksi};${e.level_sanksi}`)
     ),
   ]
   return response.success(res, {

+ 149 - 10
controller/sanksi.controller.js

@@ -1,9 +1,10 @@
 const sanksiModel = require('../model/sanksi.model')
 const handleError = require('../utils/handleError')
 const response = require('../utils/responseHandler')
-const { addManyDokumen } = require('../utils/dokumenFunction')
+const { addManyDokumen, addDokumen } = require('../utils/dokumenFunction')
 const { validate } = require('../utils/validation')
 const pemantauanModel = require('../model/pemantauan.model')
+const pelanggaranModel = require('../model/pelanggaran.model')
 const { hariKerja } = require('../utils/hariKerja')
 const {
   cekSatuDataSanksi,
@@ -14,10 +15,10 @@ const {
 const laporanModel = require('../model/laporan.model')
 
 exports.create = handleError(async (req, res) => {
-  const { no_sanksi, keterangan, from_date, to_date } = req.body
+  const { no_sanksi, keterangan, from_date, to_date, tanggal_terima_sanksi, tanggal_akhir_keberatan } = req.body
   let { pelanggaran_id } = req.body
   const { laporan_id } = req.params
-  const { dokumen: files, berita_acara } = req.files
+  const { dokumen: files, berita_acara, dokumen_terima_sanksi } = req.files
   const user = req.user
 
   const isValid = validate(res, req.body, {
@@ -26,6 +27,8 @@ exports.create = handleError(async (req, res) => {
     pelanggaran_id: 'string',
     from_date: 'string',
     to_date: 'string',
+    tanggal_terima_sanksi: 'string',
+    tanggal_akhir_keberatan: 'string',
   })
   if (!isValid) return
 
@@ -34,8 +37,16 @@ exports.create = handleError(async (req, res) => {
   })
   if (!laporan) return
 
-  pelanggaran_id = await cekBanyakDataPelanggaran(res, pelanggaran_id)
-  if (!pelanggaran_id) return
+  const id_pelanggaran = pelanggaran_id.split(',')
+  const pelanggaran = await pelanggaranModel.find({
+    _id: {
+      $in: id_pelanggaran,
+    },
+  })
+  if (!pelanggaran.length) {
+    return response.error(res, { message: 'pelanggaran_id tidak ada' })
+  }
+  pelanggaran_id = pelanggaran.map((e) => e._id)
 
   const sanksi = await sanksiModel.findOne({ laporan: laporan_id })
   if (sanksi) {
@@ -54,6 +65,11 @@ exports.create = handleError(async (req, res) => {
     const dokumenBeritaAcara = await addManyDokumen(berita_acara)
     dokumenBeritaAcara_id = dokumenBeritaAcara[0]
   }
+  let dokumenTerimaSanksi_id = []
+  if (dokumen_terima_sanksi) {
+    const dokumenTerimaSanksi = await addManyDokumen(dokumen_terima_sanksi)
+    dokumenTerimaSanksi_id = dokumenTerimaSanksi.map((e) => e._id)
+  }
 
   const dokumen = await addManyDokumen(files)
   const dokumen_id = dokumen.map((e) => e._id)
@@ -64,7 +80,11 @@ exports.create = handleError(async (req, res) => {
     pelanggaran: pelanggaran_id,
     keterangan,
     dokumen: dokumen_id,
+    sanksi: pelanggaran.map(e=> ({label: e.label_sanksi, value: e.sanksi, level: e.level_sanksi})),
     berita_acara: dokumenBeritaAcara_id,
+    tanggal_terima_sanksi,
+    dokumen_terima_sanksi: dokumenTerimaSanksi_id,
+    tanggal_akhir_keberatan,
     masa_berlaku: {
       from_date,
       to_date,
@@ -161,6 +181,16 @@ exports.update = handleError(async (req, res) => {
     user: user._id,
     keterangan: 'Melakukan Perubahan Sanksi',
     dokumen: dokumen_id,
+    data: {
+      no_sanksi,
+      // pelanggaran: pelanggaran_id,
+      sanksi: sanksiBody,
+      keterangan,
+      masa_berlaku: {
+        from_date,
+        to_date,
+      },
+    }
   })
 
   return response.success(res, {
@@ -169,6 +199,62 @@ exports.update = handleError(async (req, res) => {
   })
 })
 
+exports.updatePt = handleError(async (req, res) => {
+  const { is_pengajuan_keberatan, is_pengajuan_banding, is_dokumen_perbaikan } = req.body
+  const { sanksi_id } = req.params
+  const user = req.user
+
+  const isValid = validate(res, req.body, {
+    is_pengajuan_keberatan: { type: 'boolean', optional: true },
+    is_pengajuan_banding: { type: 'boolean', optional: true },
+    is_dokumen_perbaikan: { type: 'boolean', optional: true },
+  })
+  if (!isValid) return
+
+  const sanksi = await cekSatuDataSanksi(res, user, sanksi_id)
+  if (!sanksi) return
+
+  let keterangan = '';
+  let last_step = '';
+  if (is_pengajuan_keberatan == true) {
+    last_step = 'Permohonan Keberatan'
+    keterangan = 'Menerima Pengajuan Keberatan';
+  } else if (is_pengajuan_keberatan == false) {
+    keterangan = 'Membatalkan Pengajuan Keberatan';
+    last_step = 'Dokumen Perbaikan';
+  }
+
+  if (is_pengajuan_banding == true) {
+    last_step = 'Permohonan Banding'
+    keterangan = 'Menerima Pengajuan Banding';
+  } else if (is_pengajuan_banding == false) {
+    keterangan = 'Membatalkan Pengajuan Banding';
+    last_step = 'Dokumen Perbaikan';
+  }
+
+  await pemantauanModel.create({
+    laporan: sanksi.laporan._id,
+    sanksi: sanksi._id,
+    action: 'UPDATE SANKSI',
+    pt_id: sanksi.laporan.pt.id,
+    user: user._id,
+    keterangan,
+  })
+
+  if (is_dokumen_perbaikan == true) {
+    last_step = 'Dokumen Perbaikan';
+  }
+
+  await sanksiModel.updateOne(
+    { _id: sanksi._id },
+    { is_pengajuan_keberatan, is_pengajuan_banding, last_step }
+  );
+
+  return response.success(res, {
+    message: 'Berhasil merubah Sanksi',
+  })
+})
+
 exports.getAll = handleError(async (req, res) => {
   const user = req.user
   const {
@@ -181,20 +267,26 @@ exports.getAll = handleError(async (req, res) => {
     delegasi,
     naikSanksi,
     turunSanksi,
+    pengajuan_keberatan
   } = req.query
   const where = {}
   const q = {}
   if (aktif && aktif === 'false') {
     where.aktif = false
   }
+  if (pengajuan_keberatan === 'true') {
+    where.is_pengajuan_keberatan = true;
+  }
   if (keberatan === 'true') {
     where['pengajuan.keberatan'] = { $exists: true, $ne: null }
+    where.is_pengajuan_keberatan = true
     if (jawaban === 'true') {
       where['jawaban.keberatan'] = { $exists: true, $ne: null }
     }
   }
   if (banding === 'true') {
     where.banding = true
+    where.is_pengajuan_banding = true
     where['pengajuan.keberatan'] = { $exists: true, $ne: null }
     where['jawaban.keberatan'] = { $exists: true, $ne: null }
     where['pengajuan.banding'] = { $exists: true, $ne: null }
@@ -210,16 +302,16 @@ exports.getAll = handleError(async (req, res) => {
     }
   }
   if (perbaikan === 'true') {
-    where['jawaban.banding'] = { $exists: true, $ne: null }
+    where.$or = [{ 'jawaban.banding': { $exists: true, $ne: null } }, { is_pengajuan_keberatan: false }, { is_pengajuan_banding: false }]
   }
   if (delegasi === 'true') {
     where.delegasi = true
   }
   if (naikSanksi === 'true') {
-    q.level_sanksi = { $in: [1, 2] }
+    where['sanksi.level'] = { $in: [1, 2] }
   }
   if (turunSanksi === 'true') {
-    q.level_sanksi = { $in: [2, 3] }
+    where['sanksi.level'] = { $in: [2, 3] }
   }
   const data = await cekBanyakDataSanksi(user, where, q)
   return response.success(res, {
@@ -262,7 +354,7 @@ exports.getOne = handleError(async (req, res) => {
 exports.editTmt = handleError(async (req, res) => {
   const user = req.user
   const { id } = req.params
-  const { from_date, to_date } = req.body
+  const { from_date, to_date, no_surat } = req.body
   const files = req.files
 
   const sanksi = await cekSatuDataSanksi(res, user, id)
@@ -271,6 +363,7 @@ exports.editTmt = handleError(async (req, res) => {
   const isValid = validate(res, req.body, {
     from_date: { type: 'date', convert: true },
     to_date: { type: 'date', convert: true },
+    no_surat: 'string',
   })
   if (!isValid) return
 
@@ -288,7 +381,7 @@ exports.editTmt = handleError(async (req, res) => {
       from_date,
       to_date,
     },
-    'pengajuan.update_tmt': { dokumen: dokumen_id },
+    'pengajuan.update_tmt': { no_surat, dokumen: dokumen_id },
   })
 
   await pemantauanModel.create({
@@ -305,3 +398,49 @@ exports.editTmt = handleError(async (req, res) => {
     data,
   })
 })
+
+exports.addPesertaPleno = handleError(async (req, res) => {
+  const isValid = validate(res, req.body, {
+    laporan_id: 'string',
+    nama: 'string',
+  })
+  if (!isValid) return
+
+  const { laporan_id, nama } = req.body
+
+  const laporan = await laporanModel.findOne({
+    _id: laporan_id,
+    // sanksi: {
+    //   $eq: null,
+    //   $exists: false
+    // }
+  })
+  if (!laporan) return response.error(res, {
+    code: 404,
+    message: 'laporan_id tidak ada'
+  })
+
+  const file = req.file
+  if (!file) {
+    return response.error(res, {
+      message: 'ttd harus ada',
+    })
+  }
+  const dokumen = await addDokumen(file)
+
+  await laporanModel.findOneAndUpdate(
+    { _id: laporan._id },
+    {
+      $push: {
+        peserta_penetapan_sanksi: {
+          nama,
+          ttd: dokumen.id
+        }
+      }
+    }
+  )
+
+  return response.success(res, {
+    message: 'Berhasil tambah peserta pleno',
+  })
+})

+ 40 - 13
controller/sanksi/banding.controller.js

@@ -55,21 +55,32 @@ exports.create = handleError(async (req, res) => {
     keterangan: 'Mengajukan Banding',
     dokumen: dokumen_id,
   })
-  const notif = await notifWA(TEMPLATE_BANDING, [
-    { key: '1', value: 'pt', value_text: sanksi.laporan.pt.nama },
-    {
-      key: '2',
-      value: 'pemberi_sanksi',
-      value_text: `${sanksi.user.nama} - ${sanksi.user.role.nama}`,
-    },
-    { key: '3', value: 'no_laporan', value_text: sanksi.laporan.no_laporan },
-  ])
 
   let contacts = await kontakModel.find()
   contacts = contacts.map((e) => e.nama).join(', ')
-  if (notif[0].status == 'success') {
+  try {
+    const notif = await notifWA(TEMPLATE_BANDING, [
+      { key: '1', value: 'pt', value_text: sanksi.laporan.pt.nama },
+      {
+        key: '2',
+        value: 'pemberi_sanksi',
+        value_text: `${sanksi.user.nama} - ${sanksi.user.role.nama}`,
+      },
+      { key: '3', value: 'no_laporan', value_text: sanksi.laporan.no_laporan },
+    ])
+
+    if (notif[0].status == 'success') {
+      await logModel.create({
+        aktivitas: `Server berhasil mengirim notif wa kepada ${contacts} untuk Mengajukan Banding dari PT ${sanksi.laporan.pt.nama}`,
+      })
+    } else {
+      await logModel.create({
+        aktivitas: `Server gagal mengirim notif wa kepada ${contacts} untuk Mengajukan Banding dari PT ${sanksi.laporan.pt.nama}, Error: ${JSON.stringify(notif)}`,
+      })
+    }
+  } catch (error) {
     await logModel.create({
-      aktivitas: `Server berhasil mengirim notif wa kepada ${contacts} untuk Mengajukan Banding dari PT ${sanksi.laporan.pt.nama}`,
+      aktivitas: `Server gagal mengirim notif wa kepada ${contacts} untuk Mengajukan Banding dari PT ${sanksi.laporan.pt.nama}, Error: ${error.message}`,
     })
   }
 
@@ -85,22 +96,33 @@ exports.createJawaban = handleError(async (req, res) => {
 
   const sanksi = await cekSatuDataSanksi(res, user, sanksi_id, {
     banding: true,
+    is_pengajuan_banding: true,
   })
   if (!sanksi) return
 
   const isValid = validate(res, req.body, {
     status: 'string',
+    no_banding: { type: 'string', optional: true },
+    tanggal_terima_banding: { type: 'string', optional: true },
+    tanggal_surat_banding: { type: 'string', optional: true },
   })
   if (!isValid) return
 
-  const files = req.files
+  const { dokumen: files, dokumen_terima_banding } = req.files
+
+  let dokumenTerimaBanding_id = []
+  if (dokumen_terima_banding?.length) {
+    const dokumenTerimaBanding = await addManyDokumen(dokumen_terima_banding)
+    dokumenTerimaBanding_id = dokumenTerimaBanding.map((e) => e._id)
+  }
+
   let dokumen_id = []
   if (files?.length) {
     const dokumen = await addManyDokumen(files)
     dokumen_id = dokumen.map((e) => e._id)
   }
 
-  const { status } = req.body
+  const { status, tanggal_terima_banding, tanggal_surat_banding, no_banding } = req.body
 
   const data = await sanksiModel.findOneAndUpdate(
     {
@@ -109,8 +131,13 @@ exports.createJawaban = handleError(async (req, res) => {
       ['pengajuan.banding']: { $exists: true, $ne: null },
     },
     {
+      last_step: 'Jawaban Atas Permohonan Banding',
       ['jawaban.banding']: {
+        no_banding,
+        tanggal_terima_banding,
+        tanggal_surat_banding,
         status,
+        dokumen_terima_banding: dokumenTerimaBanding_id,
         dokumen: dokumen_id,
       },
     }

+ 9 - 7
controller/sanksi/cabutSanksi.controller.js

@@ -30,6 +30,7 @@ exports.create = handleError(async (req, res) => {
       ['pengajuan.cabut_sanksi']: { $exists: false, $eq: null },
     },
     {
+      last_step: 'Permohonan Pencabutan Sanksi',
       ['pengajuan.cabut_sanksi']: {
         dokumen: dokumen_id,
       },
@@ -69,16 +70,16 @@ exports.createJawaban = handleError(async (req, res) => {
   if (!isValid) return
 
   let dokumen_id = null
-  if (req.body.status === 'Diterima') {
-    const files = req.files
-    if (!files?.length) {
-      return response.error(res, {
-        message: 'dokumen harus ada',
-      })
-    }
+  // if (req.body.status === 'Diterima') {
+  const files = req.files
+  if (files?.length) {
+    // return response.error(res, {
+    //  message: 'dokumen harus ada',
+    // })
     const dokumen = await addManyDokumen(files)
     dokumen_id = dokumen.map((e) => e._id)
   }
+  // }
 
   const { status, keterangan } = req.body
   const data = await sanksiModel.findOneAndUpdate(
@@ -89,6 +90,7 @@ exports.createJawaban = handleError(async (req, res) => {
     },
     {
       aktif: status === 'Diterima' ? false : true,
+      last_step: 'Jawaban Atas Permohonan Pencabutan Sanksi',
       ['jawaban.cabut_sanksi']: {
         status,
         keterangan,

+ 43 - 14
controller/sanksi/keberatan.controller.js

@@ -20,7 +20,9 @@ exports.create = handleError(async (req, res) => {
     })
   }
 
-  const sanksi = await cekSatuDataSanksi(res, user, sanksi_id)
+  const sanksi = await cekSatuDataSanksi(res, user, sanksi_id, {
+    is_pengajuan_keberatan: true,
+  })
   if (!sanksi) return
 
   const files = req.files
@@ -59,21 +61,32 @@ exports.create = handleError(async (req, res) => {
     keterangan: 'Mengajukan Keberatan',
     dokumen: dokumen_id,
   })
-  const notif = await notifWA(TEMPLATE_KEBERATAN, [
-    { key: '1', value: 'pt', value_text: sanksi.laporan.pt.nama },
-    {
-      key: '2',
-      value: 'pemberi_sanksi',
-      value_text: `${sanksi.user.nama} - ${sanksi.user.role.nama}`,
-    },
-    { key: '3', value: 'no_laporan', value_text: sanksi.laporan.no_laporan },
-  ])
 
   let contacts = await kontakModel.find()
   contacts = contacts.map((e) => e.nama).join(', ')
-  if (notif[0].status == 'success') {
+  try {
+    const notif = await notifWA(TEMPLATE_KEBERATAN, [
+      { key: '1', value: 'pt', value_text: sanksi.laporan.pt.nama },
+      {
+        key: '2',
+        value: 'pemberi_sanksi',
+        value_text: `${sanksi.user.nama} - ${sanksi.user.role.nama}`,
+      },
+      { key: '3', value: 'no_laporan', value_text: sanksi.laporan.no_laporan },
+    ])
+    
+    if (notif[0].status == 'success') {
+      await logModel.create({
+        aktivitas: `Server berhasil mengirim notif wa kepada ${contacts} untuk Mengajukan Keberatan dari PT ${sanksi.laporan.pt.nama}`,
+      })
+    } else {
+      await logModel.create({
+        aktivitas: `Server gagal mengirim notif wa kepada ${contacts} untuk Mengajukan Keberatan dari PT ${sanksi.laporan.pt.nama}, Error: ${JSON.stringify(notif)}`,
+      })
+    }
+  } catch (error) {
     await logModel.create({
-      aktivitas: `Server berhasil mengirim notif wa kepada ${contacts} untuk Mengajukan Keberatan dari PT ${sanksi.laporan.pt.nama}`,
+      aktivitas: `Server gagal mengirim notif wa kepada ${contacts} untuk Mengajukan Keberatan dari PT ${sanksi.laporan.pt.nama}, Error: ${error.message}`,
     })
   }
 
@@ -98,17 +111,27 @@ exports.createJawaban = handleError(async (req, res) => {
   const isValid = validate(res, req.body, {
     status: 'string',
     keterangan: 'string',
+    no_keberatan: { type: 'string', optional: true },
+    tanggal_terima_keberatan: { type: 'string', optional: true },
+    tanggal_surat_keberatan: { type: 'string', optional: true },
+    tanggal_akhir_banding: { type: 'string', optional: true },
   })
   if (!isValid) return
 
-  const files = req.files
+  const { dokumen: files, dokumen_terima_keberatan } = req.files
+
+  let dokumenTerimaKeberatan_id = []
+  if (dokumen_terima_keberatan?.length) {
+    const dokumenTerimaKeberatan = await addManyDokumen(dokumen_terima_keberatan)
+    dokumenTerimaKeberatan_id = dokumenTerimaKeberatan.map((e) => e._id)
+  }
   let dokumen_id = []
   if (files?.length) {
     const dokumen = await addManyDokumen(files)
     dokumen_id = dokumen.map((e) => e._id)
   }
 
-  const { status, keterangan } = req.body
+  const { status, keterangan, tanggal_terima_keberatan, tanggal_surat_keberatan, no_keberatan, tanggal_akhir_banding } = req.body
   const data = await sanksiModel.findOneAndUpdate(
     {
       laporan: sanksi.laporan._id,
@@ -116,7 +139,13 @@ exports.createJawaban = handleError(async (req, res) => {
       ['pengajuan.keberatan']: { $exists: true, $ne: null },
     },
     {
+      last_step: 'Jawaban Atas Permohonan Keberatan',
       ['jawaban.keberatan']: {
+        dokumen_terima_keberatan: dokumenTerimaKeberatan_id,
+        no_keberatan,
+        tanggal_terima_keberatan,
+        tanggal_surat_keberatan,
+        tanggal_akhir_banding,
         status,
         keterangan,
         dokumen: dokumen_id,

+ 53 - 12
controller/sanksi/perbaikan.controller.js

@@ -37,13 +37,43 @@ exports.add = handleError(async (req, res) => {
       laporan: sanksi.laporan._id,
       _id: sanksi._id,
       aktif: true,
-      ['pengajuan.banding']: { $exists: true, $ne: null },
+      $or: [
+        {
+          ['pengajuan.banding']: { $exists: true, $ne: null },
+          ['pengajuan.cabut_sanksi']: {
+            $exists: false,
+            $eq: null,
+          },
+        },
+        {
+          is_pengajuan_keberatan: false,
+          ['pengajuan.cabut_sanksi']: {
+            $exists: false,
+            $eq: null,
+          },
+        },
+        {
+          is_pengajuan_banding: false,
+          ['pengajuan.cabut_sanksi']: {
+            $exists: false,
+            $eq: null,
+          },
+        },
+        {
+          'jawaban.cabut_sanksi': { $exists: true, $ne: null },
+          ['jawaban.cabut_sanksi.status']: {
+            $exists: true,
+            $eq: 'Rekomendasi Perbaikan'
+          }
+        }
+      ],
       // ['pengajuan.cabut_sanksi']: {
       //   $exists: false,
       //   $eq: null,
       // },
     },
     {
+      last_step: 'Dokumen Perbaikan',
       $push: {
         perbaikan: {
           keterangan,
@@ -66,21 +96,32 @@ exports.add = handleError(async (req, res) => {
     keterangan: 'Melakukan Perbaikan Dokumen',
     dokumen: dokumen_id,
   })
-  const notif = await notifWA(TEMPLATE_PERBAIKAN_DOKUMEN, [
-    { key: '1', value: 'pt', value_text: sanksi.laporan.pt.nama },
-    {
-      key: '2',
-      value: 'pemberi_sanksi',
-      value_text: `${sanksi.user.nama} - ${sanksi.user.role.nama}`,
-    },
-    { key: '3', value: 'no_laporan', value_text: sanksi.laporan.no_laporan },
-  ])
 
   let contacts = await kontakModel.find()
   contacts = contacts.map((e) => e.nama).join(', ')
-  if (notif[0].status == 'success') {
+  try {
+    const notif = await notifWA(TEMPLATE_PERBAIKAN_DOKUMEN, [
+      { key: '1', value: 'pt', value_text: sanksi.laporan.pt.nama },
+      {
+        key: '2',
+        value: 'pemberi_sanksi',
+        value_text: `${sanksi.user.nama} - ${sanksi.user.role.nama}`,
+      },
+      { key: '3', value: 'no_laporan', value_text: sanksi.laporan.no_laporan },
+    ])
+
+    if (notif[0].status == 'success') {
+      await logModel.create({
+        aktivitas: `Server berhasil mengirim notif wa kepada ${contacts} perihal Dokumen Perbaikan dari PT ${sanksi.laporan.pt.nama}`,
+      })
+    } else {
+      await logModel.create({
+        aktivitas: `Server gagal mengirim notif wa kepada ${contacts} perihal Dokumen Perbaikan dari PT ${sanksi.laporan.pt.nama}, Error: ${JSON.stringify(notif)}`,
+      })
+    }
+  } catch (error) {
     await logModel.create({
-      aktivitas: `Server berhasil mengirim notif wa kepada ${contacts} perihal Dokumen Perbaikan dari PT ${sanksi.laporan.pt.nama}`,
+      aktivitas: `Server gagal mengirim notif wa kepada ${contacts} perihal Dokumen Perbaikan dari PT ${sanksi.laporan.pt.nama}, Error: ${error.message}`,
     })
   }
 

+ 0 - 9
env.bak

@@ -1,9 +0,0 @@
-BASE_URL=http://localhost:5000
-PORT=5000
-SECRET=3d3eb3d842f4e595048f1806ca815f8092e29fb6b98a30dff0b8241ad0e6c273
-
-MONGO_URL=mongodb://localhost:27017/ptb-db
-TOKEN_DEVELOPMENT=77aecfec-10ac-3b4f-ab59-3fbfbeed6324
-TOKEN_PRODUCTION=5b62f743-eef2-3370-8c66-6951b2e9c2c5
-
-ENV=production

+ 1 - 1
model/autoSave.model.js

@@ -9,7 +9,7 @@ module.exports = mongoose.model(
         laporan_id: { type: Types.ObjectId, ref: laporan },
         sanksi_id: { type: Types.ObjectId, ref: sanksi },
         sanksi: { type: Object },
-        laporan: { type: Object }
+        laporan: { type: Object },
     }, {
         timestamps: true,
     }),

+ 14 - 0
model/laporan.model.js

@@ -41,6 +41,20 @@ module.exports = mongoose.model(
         sampai_tanggal: Date,
         warna: String,
       },
+      peserta_penetapan_sanksi: [
+        new Schema(
+          {
+            nama: String,
+            ttd: {
+              type: Types.ObjectId,
+              ref: dokumen,
+            },
+          },
+          {
+            timestamps: true
+          }
+        )
+      ],
       evaluasi: [
         new Schema(
           {

+ 1 - 0
model/pemantauan.model.js

@@ -18,6 +18,7 @@ module.exports = mongoose.model(
       alasan: String,
       jawaban: String,
       dokumen: [{ type: Types.ObjectId, ref: dokumen }],
+      data: { type: Object },
       jadwal: {
         dari_tanggal: Date,
         sampai_tanggal: Date,

+ 32 - 6
model/sanksi.model.js

@@ -15,12 +15,22 @@ module.exports = mongoose.model(
       sanksi: [{ description: String, label: String, level: Number }],
       pelanggaran: [{ type: Types.ObjectId, ref: pelanggaran }],
       keterangan: String,
+      is_read: Boolean,
+      last_step: String,
+      is_pengajuan_keberatan: Boolean,
+      is_pengajuan_banding: Boolean,
+      tanggal_terima_sanksi: Date,
+      dokumen_terima_sanksi: [{
+        type: Types.ObjectId,
+        ref: dokumen,
+      }],
+      tanggal_akhir_keberatan: Date,
       aktif: { type: Boolean, default: true },
-      berita_acara: 
-        {
-          type: Types.ObjectId,
-          ref: dokumen,
-        },
+      berita_acara:
+      {
+        type: Types.ObjectId,
+        ref: dokumen,
+      },
       dokumen: [
         {
           type: Types.ObjectId,
@@ -42,6 +52,14 @@ module.exports = mongoose.model(
           {
             status: String,
             keterangan: String,
+            no_keberatan: String,
+            tanggal_terima_keberatan: Date,
+            tanggal_surat_keberatan: Date,
+            dokumen_terima_keberatan: [{
+              type: Types.ObjectId,
+              ref: dokumen,
+            }],
+            tanggal_akhir_banding: Date,
             dokumen: [
               {
                 type: Types.ObjectId,
@@ -53,6 +71,13 @@ module.exports = mongoose.model(
         ),
         banding: new Schema(
           {
+            no_banding: String,
+            tanggal_terima_banding: Date,
+            tanggal_surat_banding: Date,
+            dokumen_terima_banding: [{
+              type: Types.ObjectId,
+              ref: dokumen,
+            }],
             status: String,
             dokumen: [
               {
@@ -113,6 +138,7 @@ module.exports = mongoose.model(
         ),
         update_tmt: new Schema(
           {
+            no_surat: String,
             dokumen: [
               {
                 type: Types.ObjectId,
@@ -127,7 +153,7 @@ module.exports = mongoose.model(
         new Schema(
           {
             no_sanksi: String,
-            laporan: { type: Types.ObjectId, unique: true, ref: laporan },
+            laporan: { type: Types.ObjectId, ref: laporan },
             user: { type: Types.ObjectId, ref: user },
             pelanggaran: [{ type: Types.ObjectId, ref: pelanggaran }],
             keterangan: String,

+ 31 - 5
model/sanksi2.model.js

@@ -13,12 +13,22 @@ module.exports = mongoose.model(
       pelanggaran: [{ type: Types.ObjectId, ref: pelanggaran }],
       sanksi: [{ description: String, label: String, level: Number }],
       keterangan: String,
+      is_read: Boolean,
+      last_step: String,
+      is_pengajuan_keberatan: Boolean,
+      is_pengajuan_banding: Boolean,
+      tanggal_terima_sanksi: Date,
+      dokumen_terima_sanksi: [{
+        type: Types.ObjectId,
+        ref: dokumen,
+      }],
+      tanggal_akhir_keberatan: Date,
       aktif: { type: Boolean, default: true },
-      berita_acara: 
-        {
-          type: Types.ObjectId,
-          ref: dokumen,
-        },
+      berita_acara:
+      {
+        type: Types.ObjectId,
+        ref: dokumen,
+      },
       dokumen: [
         {
           type: Types.ObjectId,
@@ -40,6 +50,14 @@ module.exports = mongoose.model(
           {
             status: String,
             keterangan: String,
+            no_keberatan: String,
+            tanggal_terima_keberatan: Date,
+            tanggal_surat_keberatan: Date,
+            dokumen_terima_keberatan: [{
+              type: Types.ObjectId,
+              ref: dokumen,
+            }],
+            tanggal_akhir_banding: Date,
             dokumen: [
               {
                 type: Types.ObjectId,
@@ -51,6 +69,13 @@ module.exports = mongoose.model(
         ),
         banding: new Schema(
           {
+            no_banding: String,
+            tanggal_terima_banding: Date,
+            tanggal_surat_banding: Date,
+            dokumen_terima_banding: [{
+              type: Types.ObjectId,
+              ref: dokumen,
+            }],
             status: String,
             dokumen: [
               {
@@ -111,6 +136,7 @@ module.exports = mongoose.model(
         ),
         update_tmt: new Schema(
           {
+            no_surat: String,
             dokumen: [
               {
                 type: Types.ObjectId,

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

@@ -9,6 +9,6 @@ router.get('/reminder-keberatan', verify, auto.reminderKeberatan)
 router.get('/reminder-banding', verify, auto.reminderBanding)
 router.get('/status-sanksi', verify, auto.updateStatusSanksi)
 router.post('/save/:id', auth, auto.save)
-router.get('/save/:id', auth, auto.getSave)
+router.get('/save/:id', auto.getSave)
 
 module.exports = router

+ 1 - 0
routes/v1/index.js

@@ -23,5 +23,6 @@ router.use('/log', require('./log.routes'))
 router.use('/auto', require('./auto.routes'))
 router.use('/pengunjung', require('./pengunjung.routes'))
 router.use('/rekomendasi', auth, require('./rekomendasi.routes'))
+router.use('/migrasi', auth, roleId([2020, 2023]), require('./migration.routes'))
 
 module.exports = router

+ 3 - 1
routes/v1/public.routes.js

@@ -7,11 +7,12 @@ const pemantauan = require('../../controller/pemantauan.controller')
 const handleDokumen = require('../../utils/handleDokumen')
 const auth = require('../../middleware/verifyTokenPublic')
 const pengunjung = require('../../controller/pengunjung.controller')
+const sanksi = require('../../controller/sanksi.controller')
 
 router.get('/pt', pt.public)
 router.get('/pelanggaran', pelanggaran.public)
 router.get('/pemantauan', pemantauan.public)
-
+router.get('/laporan/:no_laporan', laporan.getLaporanByNoLaporanAndId)
 router.post(
   '/laporan/create',
   auth,
@@ -19,6 +20,7 @@ router.post(
   laporan.public
 )
 router.post('/user/create', handleDokumen.single('foto'), user.addUserPublic)
+router.post('/sanksi/add-peserta-pleno', handleDokumen.single('ttd'), sanksi.addPesertaPleno)
 router.get('/pengunjung', pengunjung.getPengunjungPublic)
 
 module.exports = router

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

@@ -13,7 +13,7 @@ router.post(
 router.post(
   '/jawaban/create/:sanksi_id',
   roleId([2020, 2021, 2023]),
-  handleDokumen.array('dokumen'),
+  handleDokumen.fields([{ name: 'dokumen' }, { name: 'dokumen_terima_banding' }]),
   banding.createJawaban
 )
 

+ 6 - 1
routes/v1/sanksi/index.js

@@ -6,7 +6,7 @@ const roleId = require('../../../middleware/role')
 router.post(
   '/create/:laporan_id',
   roleId([2020, 2021, 2023]),
-  handleDokumen.fields([{name: 'dokumen'}, {name: 'berita_acara', maxCount: 1}]),
+  handleDokumen.fields([{ name: 'dokumen' }, { name: 'berita_acara', maxCount: 1 }, { name: 'dokumen_terima_sanksi' }]),
   sanksi.create
 )
 router.put(
@@ -15,6 +15,11 @@ router.put(
   handleDokumen.array('dokumen'),
   sanksi.update
 )
+router.put(
+  '/update-pt/:sanksi_id',
+  roleId(2022),
+  sanksi.updatePt
+)
 router.put(
   '/tmt/update/:id',
   roleId([2020, 2021, 2023]),

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

@@ -13,7 +13,7 @@ router.post(
 router.post(
   '/jawaban/create/:sanksi_id',
   roleId([2020, 2021, 2023]),
-  handleDokumen.array('dokumen'),
+  handleDokumen.fields([{ name: 'dokumen' }, { name: 'dokumen_terima_keberatan' }]),
   keberatan.createJawaban
 )
 

+ 21 - 6
utils/cekData.js

@@ -49,6 +49,7 @@ exports.cekSatuDataLaporan = async (
     .populate({ path: 'pelanggaran', select: 'pelanggaran' })
     .populate({ path: 'sanksi', populate: ['pelanggaran'] })
     .populate('dokumen')
+    .populate('peserta_penetapan_sanksi.ttd')
     .populate({ path: 'evaluasi', populate: ['user', 'dokumen'] })
   // .populate('evaluasi.user')
   if (!laporan) {
@@ -125,15 +126,16 @@ exports.cekSatuDataSanksi = async (
       } else if (!where.banding) w.role_data = 'dikti'
       break
     case 2021:
-      w.role_data = 'lldikti'
       w['pt.pembina.id'] = user.lembaga.id
+      // w.role_data = 'lldikti'
+      if (!where.banding) w.role_data = 'lldikti'
       break
     case 2022:
       w['pt.id'] = user.lembaga.id
       break
   }
   let sanksi = await sanksiModel
-    .findOne({ _id: sanksi_id, aktif: true, ...where })
+    .findOne({ _id: sanksi_id, ...where })
     .populate({
       path: 'laporan',
       select: w.select,
@@ -143,11 +145,14 @@ exports.cekSatuDataSanksi = async (
     .populate('berita_acara')
     .populate('pelanggaran')
     .populate('user')
+    .populate('dokumen_terima_sanksi')
     .populate('pengajuan.keberatan.dokumen')
     .populate('jawaban.keberatan.dokumen')
+    .populate('jawaban.keberatan.dokumen_terima_keberatan')
     .populate('pengajuan.banding.dokumen')
     .populate('pengajuan.update_tmt.dokumen')
     .populate('jawaban.banding.dokumen')
+    .populate('jawaban.banding.dokumen_terima_banding')
     .populate('pengajuan.cabut_sanksi.dokumen')
     .populate('jawaban.cabut_sanksi.dokumen')
     .populate('rekomendasi.dokumen')
@@ -181,16 +186,16 @@ exports.cekBanyakDataSanksi = async (user, where = {}, q = {}) => {
       // else if (!where.banding) w.role_data = 'dikti'
       break
     case 2021:
-      w['role_data'] = 'lldikti'
       w['pt.pembina.id'] = user.lembaga.id
       if (where.banding) w.level_sanksi = 1
+      else w['role_data'] = 'lldikti'
       break
     case 2022:
       w['pt.id'] = user.lembaga.id
       break
   }
   let data = await sanksiModel
-    .find({ aktif: where.aktif || true, ...where })
+    .find({ ...where })
     .populate({
       path: 'laporan',
       select: w.select || '-sanksi',
@@ -198,13 +203,23 @@ exports.cekBanyakDataSanksi = async (user, where = {}, q = {}) => {
       populate: ['pelanggaran'],
     })
     .populate('user')
-    .populate({ path: 'pelanggaran', match: w })
+    .populate('pelanggaran')
     .populate('riwayat_sanksi.dokumen')
     .select('-dokumen')
     .sort({
       createdAt: -1,
     })
-  data = data.filter((e) => e.laporan !== null && e.pelanggaran.length)
+  data = data.filter((e) => {
+    if (where.banding) {
+      switch (user.role.id) {
+        case 2020:
+          return e.pelanggaran.some(e2 => e2.level_sanksi !== 1) && e.laporan !== null
+        case 2021:
+          return e.pelanggaran.filter(e2 => e2.level_sanksi === 1).length === e.pelanggaran.length && e.laporan !== null
+      }
+    }
+    return e.laporan !== null
+  })
   return data
 }