yazid138 преди 2 години
родител
ревизия
7457bcff1b

+ 73 - 2
controller/auto.controller.js

@@ -8,6 +8,8 @@ const {
   TEMPLATE_REMINDER,
 } = require('../utils/constanta')
 const moment = require('moment')
+const autoSaveModel = require('../model/autoSave.model')
+const { cekSatuDataSanksi, cekSatuDataLaporan } = require('../utils/cekData')
 
 exports.keberatan = handleError(async (req, res) => {
   const dataSanksi = await sanksiModel
@@ -126,7 +128,7 @@ exports.reminderKeberatan = handleError(async (req, res) => {
       if (
         e.batas_waktu.jawaban_keberatan &&
         new Date() >
-          moment(e.batas_waktu.jawaban_keberatan).add(-7, 'days').toDate() &&
+        moment(e.batas_waktu.jawaban_keberatan).add(-7, 'days').toDate() &&
         new Date() < e.batas_waktu.jawaban_keberatan
       ) {
         const dayLeft = moment(e.batas_waktu.jawaban_keberatan).diff(
@@ -193,7 +195,7 @@ exports.reminderBanding = handleError(async (req, res) => {
       if (
         e.batas_waktu.jawaban_banding &&
         new Date() >
-          moment(e.batas_waktu.jawaban_banding).add(-7, 'days').toDate() &&
+        moment(e.batas_waktu.jawaban_banding).add(-7, 'days').toDate() &&
         new Date() < e.batas_waktu.jawaban_banding
       ) {
         const dayLeft = moment(e.batas_waktu.jawaban_banding).diff(
@@ -261,3 +263,72 @@ exports.updateStatusSanksi = handleError(async (req, res) => {
     message: 'update status sanksi berhasil',
   })
 })
+
+exports.save = handleError(async (req, res) => {
+  const { id } = req.params
+  const { laporan: isLaporan, sanksi: isSanksi } = req.query
+  const user = req.user
+
+  let autoData = null;
+  let laporan = null;
+  let sanksi = null;
+  if (isLaporan === 'true') {
+    laporan = await cekSatuDataLaporan(res, user, id, { all: true });
+    if (!laporan) return
+    autoData = await autoSaveModel.findOne({ laporan_id: laporan._id });
+  } else if (isSanksi === 'true') {
+    sanksi = await cekSatuDataSanksi(res, user, id, { all: true });
+    if (!sanksi) return
+    autoData = await autoSaveModel.findOne({ sanksi_id: sanksi._id });
+  } else {
+    return response.error(res, {
+      message: 'query harus sanksi atau laporan yg bernilai true',
+    })
+  }
+
+  if (autoData) {
+    if (isLaporan) {
+      await autoSaveModel.updateOne({ laporan_id: laporan._id }, { laporan: req.body })
+    } else {
+      await autoSaveModel.updateOne({ sanksi_id: sanksi._id }, { sanksi: req.body })
+    }
+  } else {
+    if (isLaporan) {
+      await autoSaveModel.create({ laporan_id: laporan._id, laporan: req.body })
+    } else {
+      await autoSaveModel.create({ sanksi_id: sanksi._id, sanksi: req.body })
+    }
+  }
+
+  return response.success(res, {
+    message: 'Berhasil menyimpan data auto save',
+  })
+})
+
+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;
+  } else if (isSanksi === 'true') {
+    sanksi = await cekSatuDataSanksi(res, user, id, { all: true });
+    if (!sanksi) return
+    data = (await autoSaveModel.findOne({ sanksi_id: sanksi._id})).sanksi;
+  } else {
+    return response.error(res, {
+      message: 'harus terdapat query sanksi atau laporan yg bernilai true',
+    })
+  }
+
+  return response.success(res, {
+    message: 'Berhasil mengambil data auto save',
+    data: data
+  })
+})

+ 65 - 27
controller/laporan.controller.js

@@ -68,22 +68,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 {
+    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 +281,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 {
+    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 +318,24 @@ exports.public = handleError(async (req, res) => {
   })
 })
 
+exports.getLaporanByNoLaporan = handleError(async (req, res) => {
+   const { no_laporan } = req.params
+   const data = await laporanModel.findOne({
+      no_laporan,
+      evaluasi: { $exists: true, $ne: [] },
+   })
+   if (!data) {
+      return response.error(res, {
+         message: 'no_laporan 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 = {}

+ 51 - 0
controller/migrasi.controller.js

@@ -0,0 +1,51 @@
+const sanksiModel = require('../model/sanksi.model')
+const dokumenModel = require('../model/dokumen.model')
+const handleError = require('../utils/handleError')
+const response = require('../utils/responseHandler')
+
+exports.pengajuan = handleError(async (req, res) => {
+  const [keberatan, banding] = await Promise.all([
+    (() =>
+      sanksiModel.find({
+        ['pengajuan.keberatan']: { $ne: null, $exists: true },
+        is_pengajuan_keberatan: { $eq: null, $exists: false },
+      }))(),
+    (() =>
+      sanksiModel.find({
+        ['jawaban.keberatan']: { $ne: null, $exists: true },
+        ['pengajuan.banding']: { $ne: null, $exists: true },
+        is_pengajuan_banding: { $eq: null, $exists: false },
+      }))()
+  ])
+  await Promise.all([
+    ...keberatan.map(async (e) => {
+      await sanksiModel.findOneAndUpdate({ _id: e._id }, { is_pengajuan_keberatan: true })
+    }),
+    ...banding.map(async (e) => {
+      await sanksiModel.findOneAndUpdate({ _id: e._id }, { is_pengajuan_banding: true })
+    })
+  ])
+
+  return response.success(res, {
+    message: 'Berhasil migrasi pengajuan',
+  })
+})
+
+exports.dokumen = handleError(async (req, res) => {
+  const dokumen = await dokumenModel.find({ path: /api.sidali.sixsenz.net/ })
+
+  if (dokumen?.length) await Promise.all(dokumen.map(async e => {
+    const path = e.path.split('/').slice(3).join('/')
+    await dokumenModel.findOneAndUpdate({
+      _id: e._id
+    }, {
+      path: `${process.env.BASE_URL}/${path}`
+    })
+  }))
+
+  return response.success(res, {
+    message: 'Berhasil migrasi dokumen',
+  })
+})
+
+

+ 82 - 4
controller/sanksi.controller.js

@@ -14,10 +14,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 files = req.files
+  const { dokumen: files, berita_acara, dokumen_terima_sanksi } = req.files
   const user = req.user
 
   const isValid = validate(res, req.body, {
@@ -26,6 +26,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
 
@@ -44,11 +46,21 @@ exports.create = handleError(async (req, res) => {
     })
   }
 
-  if (!files.length) {
+  if (!files) {
     return response.error(res, {
       message: 'dokumen harus ada',
     })
   }
+  let dokumenBeritaAcara_id = null
+  if (berita_acara) {
+    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)
@@ -59,6 +71,10 @@ exports.create = handleError(async (req, res) => {
     pelanggaran: pelanggaran_id,
     keterangan,
     dokumen: dokumen_id,
+    berita_acara: dokumenBeritaAcara_id,
+    tanggal_terima_sanksi,
+    dokumen_terima_sanksi: dokumenTerimaSanksi_id,
+    tanggal_akhir_keberatan,
     masa_berlaku: {
       from_date,
       to_date,
@@ -163,6 +179,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 {
@@ -175,20 +247,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 }
@@ -204,7 +282,7 @@ 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

+ 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 {
+    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 {
+    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}`,
     })
   }
 

+ 4 - 5
controller/user.controller.js

@@ -9,7 +9,7 @@ const jwt = require('jsonwebtoken')
 const { TEMPLATE_VERIFIKASI } = require('../utils/constanta')
 
 exports.addUserPublic = handleError(async (req, res) => {
-  const { no_laporan, pt_id, nama, email, no_hp, alamat, is_private } = req.body
+  const { no_laporan, pt_id, nama, email, no_hp, alamat, is_private, isVerify } = req.body
   const isValid = validate(res, req.body, {
     no_laporan: 'string',
     pt_id: 'string',
@@ -69,8 +69,8 @@ exports.addUserPublic = handleError(async (req, res) => {
   })
 
   let notif = null
-  if (no_hp) {
-    notif = await notifWA2(
+  if (isVerify !== 'false' && no_hp) {
+    notifWA2(
       TEMPLATE_VERIFIKASI,
       { nama: nama || 'rahasia', no_hp: no_hp2 },
       [
@@ -78,7 +78,7 @@ exports.addUserPublic = handleError(async (req, res) => {
         { key: '3', value: 'no_verifikasi', value_text: no_verifikasi },
         { key: '2', value: 'no_laporan', value_text: no_laporan },
       ]
-    )
+    ).catch()
   }
 
   const accessToken = jwt.sign(
@@ -95,7 +95,6 @@ exports.addUserPublic = handleError(async (req, res) => {
 
   data = {
     token: `Bearer ${accessToken}`,
-    no_hp_aktif: no_hp && notif[0].status == 'success' ? true : false,
   }
 
   return response.success(res, {

+ 17 - 0
model/auto.model.js

@@ -0,0 +1,17 @@
+const mongoose = require('mongoose')
+const { Schema, Types } = mongoose
+const laporan = require('./laporan.model')
+const sanksi = require('./sanksi.model')
+
+module.exports = mongoose.model(
+    'Auto',
+    new Schema({
+        laporan_id: { type: Types.ObjectId, ref: laporan },
+        sanksi_id: { type: Types.ObjectId, ref: sanksi },
+        sanksi: { type: Object },
+        laporan: { type: Object }
+    }, {
+        timestamps: true,
+    }),
+    'auto'
+)

+ 17 - 0
model/autoSave.model.js

@@ -0,0 +1,17 @@
+const mongoose = require('mongoose')
+const { Schema, Types } = mongoose
+const laporan = require('./laporan.model')
+const sanksi = require('./sanksi.model')
+
+module.exports = mongoose.model(
+    'AutoSave',
+    new Schema({
+        laporan_id: { type: Types.ObjectId, ref: laporan },
+        sanksi_id: { type: Types.ObjectId, ref: sanksi },
+        sanksi: { type: Object },
+        laporan: { type: Object }
+    }, {
+        timestamps: true,
+    }),
+    'autosave'
+)

+ 31 - 1
model/sanksi.model.js

@@ -15,7 +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,
+      },
       dokumen: [
         {
           type: Types.ObjectId,
@@ -37,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,
@@ -48,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: [
               {
@@ -122,7 +152,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,

+ 30 - 0
model/sanksi2.model.js

@@ -13,7 +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,
+      },
       dokumen: [
         {
           type: Types.ObjectId,
@@ -35,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,
@@ -46,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: [
               {

+ 9 - 5
routes/v1/auto.routes.js

@@ -1,10 +1,14 @@
 const router = require('express').Router()
 const auto = require('../../controller/auto.controller')
+const verify = require('../../middleware/verifyTokenAuto')
+const auth = require('../../middleware/verifyToken')
 
-router.get('/keberatan', auto.keberatan)
-router.get('/banding', auto.banding)
-router.get('/reminder-keberatan', auto.reminderKeberatan)
-router.get('/reminder-banding', auto.reminderBanding)
-router.get('/status-sanksi', auto.updateStatusSanksi)
+router.get('/keberatan', verify, auto.keberatan)
+router.get('/banding', verify, auto.banding)
+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)
 
 module.exports = router

+ 2 - 2
routes/v1/index.js

@@ -1,7 +1,6 @@
 const router = require('express').Router()
 const auth = require('../../middleware/verifyToken')
 const roleId = require('../../middleware/role')
-const verify = require('../../middleware/verifyTokenAuto')
 
 router.get('/', (req, res) => {
   return res.json({
@@ -21,8 +20,9 @@ router.use('/pelanggaran', auth, require('./pelanggaran.routes'))
 router.use('/lembaga', auth, roleId([2020, 2023]), require('./lembaga.routes'))
 router.use('/graph', require('./graph.routes'))
 router.use('/log', require('./log.routes'))
-router.use('/auto', verify, require('./auto.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

+ 7 - 0
routes/v1/migration.routes.js

@@ -0,0 +1,7 @@
+const router = require('express').Router()
+const migrasi = require('../../controller/migrasi.controller')
+
+router.put('/pengajuan', migrasi.pengajuan)
+router.put('/dokumen', migrasi.dokumen)
+
+module.exports = router

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

@@ -11,7 +11,7 @@ const pengunjung = require('../../controller/pengunjung.controller')
 router.get('/pt', pt.public)
 router.get('/pelanggaran', pelanggaran.public)
 router.get('/pemantauan', pemantauan.public)
-
+router.get('/laporan/:no_laporan', laporan.getLaporanByNoLaporan)
 router.post(
   '/laporan/create',
   auth,

+ 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.array('dokumen'),
+  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
 )
 

+ 1 - 0
utils/cekData.js

@@ -140,6 +140,7 @@ exports.cekSatuDataSanksi = async (
       match: w,
     })
     .populate('dokumen')
+    .populate('berita_acara')
     .populate('pelanggaran')
     .populate('user')
     .populate('pengajuan.keberatan.dokumen')