andi 3 anni fa
parent
commit
b15d3786f3

+ 134 - 1
controller/auto.controller.js

@@ -2,7 +2,12 @@ const handleError = require('../utils/handleError')
 const response = require('../utils/responseHandler')
 const { notifWA } = require('../utils/notifFunction')
 const sanksiModel = require('../model/sanksi.model')
-const { TEMPLATE_KEBERATAN, TEMPLATE_BANDING } = require('../utils/constanta')
+const {
+  TEMPLATE_KEBERATAN,
+  TEMPLATE_BANDING,
+  TEMPLATE_REMINDER,
+} = require('../utils/constanta')
+const moment = require('moment')
 
 exports.keberatan = handleError(async (req, res) => {
   const dataSanksi = await sanksiModel
@@ -101,3 +106,131 @@ exports.banding = handleError(async (req, res) => {
     message: 'Notifikasi berhasil terkirim',
   })
 })
+
+exports.reminderKeberatan = handleError(async (req, res) => {
+  let dataSanksi = await sanksiModel
+    .find({
+      'batas_waktu.jawaban_keberatan': {
+        $exists: true,
+        $ne: null,
+      },
+      'jawaban.keberatan': {
+        $exists: false,
+        $eq: null,
+      },
+    })
+    .populate('user')
+    .populate('laporan')
+  Promise.all(
+    dataSanksi.map(async (e) => {
+      if (
+        e.batas_waktu.jawaban_keberatan &&
+        new Date() >
+          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(
+          new Date(),
+          'days'
+        )
+        try {
+          await notifWA(TEMPLATE_REMINDER, [
+            {
+              key: '1',
+              value: 'no_sanksi',
+              value_text: e.no_sanksi,
+            },
+            {
+              key: '2',
+              value: 'keterangan',
+              value_text: 'Proses Menjawab Pengajuan Keberatan',
+            },
+            {
+              key: '3',
+              value: 'pt',
+              value_text: e.laporan.pt.nama,
+            },
+            {
+              key: '4',
+              value: 'masa',
+              value_text: `menjawab pengajuan keberatan tersisa ${dayLeft} hari lagi.`,
+            },
+          ])
+        } catch (error) {
+          return response.error(res, {
+            message: 'Notifikasi gagal terkirim',
+            error: error.message,
+          })
+        }
+      }
+    })
+  )
+
+  return response.success(res, {
+    message: 'Notifikasi berhasil terkirim',
+  })
+})
+
+exports.reminderBanding = handleError(async (req, res) => {
+  let dataSanksi = await sanksiModel
+    .find({
+      'batas_waktu.jawaban_banding': {
+        $exists: true,
+        $ne: null,
+      },
+      'jawaban.banding': {
+        $exists: false,
+        $eq: null,
+      },
+    })
+    .populate('user')
+    .populate('laporan')
+  Promise.all(
+    dataSanksi.map(async (e) => {
+      if (
+        e.batas_waktu.jawaban_banding &&
+        new Date() >
+          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(
+          new Date(),
+          'days'
+        )
+        try {
+          await notifWA(TEMPLATE_REMINDER, [
+            {
+              key: '1',
+              value: 'no_sanksi',
+              value_text: e.no_sanksi,
+            },
+            {
+              key: '2',
+              value: 'keterangan',
+              value_text: 'Proses Menjawab Pengajuan Banding',
+            },
+            {
+              key: '3',
+              value: 'pt',
+              value_text: e.laporan.pt.nama,
+            },
+            {
+              key: '4',
+              value: 'masa',
+              value_text: `menjawab pengajuan banding tersisa ${dayLeft} hari lagi.`,
+            },
+          ])
+        } catch (error) {
+          return response.error(res, {
+            message: 'Notifikasi gagal terkirim',
+            error: error.message,
+          })
+        }
+      }
+    })
+  )
+
+  return response.success(res, {
+    message: 'Notifikasi berhasil terkirim',
+  })
+})

+ 19 - 0
controller/graph.controller.js

@@ -4,6 +4,7 @@ const response = require('../utils/responseHandler')
 const {
   cekBanyakDataLaporan,
   dataLaporanAggregate,
+  cekBanyakDataSanksi,
 } = require('../utils/cekData')
 const laporanModel = require('../model/laporan.model')
 const moment = require('moment')
@@ -373,3 +374,21 @@ exports.excel = handleError(async (req, res) => {
   )
   return res.end(Buffer.from(buffer))
 })
+
+exports.laporanSelesai = handleError(async (req, res) => {
+  const user = req.user
+
+  laporan = await cekBanyakDataLaporan(user, { aktif: false })
+  sanksi = await cekBanyakDataSanksi(user, { aktif: false })
+  const data = {
+    laporan,
+    sanksi,
+    jumlah_selesai: sanksi.length,
+    jumlah_ditutup: laporan.length,
+  }
+
+  return response.success(res, {
+    message: 'Berhasil menganalisis data',
+    data,
+  })
+})

+ 36 - 6
controller/laporan.controller.js

@@ -10,6 +10,8 @@ const { addManyDokumen } = require('../utils/dokumenFunction')
 const userModel = require('../model/user.model')
 const { cekSatuDataLaporan, cekBanyakDataLaporan } = require('../utils/cekData')
 const { TEMPLATE_LAPORAN } = require('../utils/constanta')
+const logModel = require('../model/log.model')
+const kontakModel = require('../model/kontak.model')
 
 exports.create = handleError(async (req, res) => {
   const user = req.user
@@ -61,6 +63,26 @@ 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') {
+    await logModel.create({
+      aktivitas: `Server berhasil mengirim notif wa kepada ${contacts} untuk Pembuatan Laporan`,
+    })
+  }
+
   await pemantauanModel.create({
     laporan: data._id,
     action: 'CREATE LAPORAN',
@@ -247,7 +269,7 @@ exports.public = handleError(async (req, res) => {
 
   if (no_verifikasi)
     await userModel.findByIdAndUpdate(user._id, { verified: true })
-  await notifWA(TEMPLATE_LAPORAN, [
+  const notif = await notifWA(TEMPLATE_LAPORAN, [
     {
       key: '1',
       value: 'nama',
@@ -258,6 +280,14 @@ exports.public = handleError(async (req, res) => {
     { 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') {
+    await logModel.create({
+      aktivitas: `Server berhasil mengirim notif wa kepada ${contacts} untuk Pembuatan Laporan`,
+    })
+  }
+
   return response.success(res, {
     message: 'Berhasil menambah laporan',
     data,
@@ -333,11 +363,11 @@ exports.update = handleError(async (req, res) => {
     }`
     alasan = keterangan2
     data.alasan_delegasi = keterangan2
-    if (laporan.jadwal) {
-      await laporanModel.findByIdAndUpdate(laporan._id, {
-        $unset: { jadwal: 1 },
-      })
-    }
+    // if (laporan.jadwal) {
+    //   await laporanModel.findByIdAndUpdate(laporan._id, {
+    //     $unset: { jadwal: 1 },
+    //   })
+    // }
   }
   if (aktif) {
     data.aktif = aktif === 'true'

+ 1 - 0
controller/laporan/evaluasi.controller.js

@@ -42,6 +42,7 @@ exports.add = handleError(async (req, res) => {
     {
       $push: {
         evaluasi: {
+          dari: user._id,
           judul,
           tanggal,
           dokumen: dokumen_id,

+ 11 - 0
controller/pelanggaran.controller.js

@@ -27,3 +27,14 @@ exports.public = handleError(async (req, res) => {
     data,
   })
 })
+
+exports.sanksi = handleError(async (req, res) => {
+  const user = req.user
+  const w = {} 
+  if(user.role.id === 2021) {w.level_sanksi = 1} else {w.level_sanksi = {$nin: [0, 1] }}
+  const data = await pelanggaranModel.find(w).distinct('sanksi')
+  return response.success(res, {
+    message: 'Berhasil ambil data Pelanggaran',
+    data,
+  })
+})

+ 16 - 4
controller/sanksi.controller.js

@@ -4,7 +4,6 @@ const response = require('../utils/responseHandler')
 const { addManyDokumen } = require('../utils/dokumenFunction')
 const { validate } = require('../utils/validation')
 const pemantauanModel = require('../model/pemantauan.model')
-const logModel = require('../model/log.model')
 const { hariKerja } = require('../utils/hariKerja')
 const {
   cekSatuDataSanksi,
@@ -17,7 +16,7 @@ const ip = require('ip')
 const osValue = require('../utils/osValue')
 
 exports.create = handleError(async (req, res) => {
-  const { no_sanksi, keterangan } = req.body
+  const { no_sanksi, keterangan, from_date, to_date } = req.body
   let { pelanggaran_id } = req.body
   const { laporan_id } = req.params
   const files = req.files
@@ -27,6 +26,8 @@ exports.create = handleError(async (req, res) => {
     no_sanksi: 'string',
     keterangan: 'string',
     pelanggaran_id: 'string',
+    from_date: 'string',
+    to_date: 'string',
   })
   if (!isValid) return
 
@@ -60,6 +61,10 @@ exports.create = handleError(async (req, res) => {
     pelanggaran: pelanggaran_id,
     keterangan,
     dokumen: dokumen_id,
+    masa_berlaku: {
+      from_date,
+      to_date,
+    },
     batas_waktu: {
       keberatan: hariKerja(10),
     },
@@ -83,8 +88,12 @@ exports.create = handleError(async (req, res) => {
 
 exports.getAll = handleError(async (req, res) => {
   const user = req.user
-  const { keberatan, jawaban, banding, cabutSanksi, perbaikan } = req.query
+  const { keberatan, jawaban, banding, cabutSanksi, perbaikan, aktif } =
+    req.query
   const where = {}
+  if (aktif && aktif === 'false') {
+    where.aktif = false
+  }
   if (keberatan === 'true') {
     where['pengajuan.keberatan'] = { $exists: true, $ne: null }
     if (jawaban === 'true') {
@@ -119,13 +128,16 @@ exports.getOne = handleError(async (req, res) => {
   const { sanksi_id } = req.params
 
   const w = {}
-  const { banding } = req.query
+  const { banding, aktif } = req.query
   if (banding === 'true') {
     w.banding = true
     w['pengajuan.keberatan'] = { $exists: true, $ne: null }
     w['jawaban.keberatan'] = { $exists: true, $ne: null }
     w['pengajuan.banding'] = { $exists: true, $ne: null }
   }
+  if (aktif && aktif === 'false') {
+    w.aktif = false
+  }
 
   const sanksi = await cekSatuDataSanksi(res, user, sanksi_id, w)
   if (!sanksi) return

+ 12 - 1
controller/sanksi/banding.controller.js

@@ -8,6 +8,8 @@ const { hariKerja } = require('../../utils/hariKerja')
 const pemantauanModel = require('../../model/pemantauan.model')
 const { notifWA } = require('../../utils/notifFunction')
 const { TEMPLATE_BANDING } = require('../../utils/constanta')
+const kontakModel = require('../../model/kontak.model')
+const logModel = require('../../model/log.model')
 
 exports.create = handleError(async (req, res) => {
   const user = req.user
@@ -53,7 +55,7 @@ exports.create = handleError(async (req, res) => {
     keterangan: 'Mengajukan Banding',
     dokumen: dokumen_id,
   })
-  await notifWA(TEMPLATE_BANDING, [
+  const notif = await notifWA(TEMPLATE_BANDING, [
     { key: '1', value: 'pt', value_text: sanksi.laporan.pt.nama },
     {
       key: '2',
@@ -62,6 +64,15 @@ exports.create = handleError(async (req, res) => {
     },
     { key: '3', value: 'no_sanksi', value_text: sanksi.no_sanksi },
   ])
+
+  let contacts = await kontakModel.find()
+  contacts = contacts.map((e) => e.nama).join(', ')
+  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}`,
+    })
+  }
+
   return response.success(res, {
     data,
     message: 'Berhasil menambah pengajuan banding',

+ 1 - 0
controller/sanksi/cabutSanksi.controller.js

@@ -84,6 +84,7 @@ exports.createJawaban = handleError(async (req, res) => {
       ['pengajuan.cabut_sanksi']: { $exists: true, $ne: null },
     },
     {
+      aktif: status === 'Diterima' ? false : true,
       ['jawaban.cabut_sanksi']: {
         status,
         keterangan,

+ 12 - 1
controller/sanksi/keberatan.controller.js

@@ -8,6 +8,8 @@ const { hariKerja } = require('../../utils/hariKerja')
 const pemantauanModel = require('../../model/pemantauan.model')
 const { notifWA } = require('../../utils/notifFunction')
 const { TEMPLATE_KEBERATAN } = require('../../utils/constanta')
+const kontakModel = require('../../model/kontak.model')
+const logModel = require('../../model/log.model')
 
 exports.create = handleError(async (req, res) => {
   const user = req.user
@@ -57,7 +59,7 @@ exports.create = handleError(async (req, res) => {
     keterangan: 'Mengajukan Keberatan',
     dokumen: dokumen_id,
   })
-  await notifWA(TEMPLATE_KEBERATAN, [
+  const notif = await notifWA(TEMPLATE_KEBERATAN, [
     { key: '1', value: 'pt', value_text: sanksi.laporan.pt.nama },
     {
       key: '2',
@@ -66,6 +68,15 @@ exports.create = handleError(async (req, res) => {
     },
     { key: '3', value: 'no_sanksi', value_text: sanksi.no_sanksi },
   ])
+
+  let contacts = await kontakModel.find()
+  contacts = contacts.map((e) => e.nama).join(', ')
+  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}`,
+    })
+  }
+
   return response.success(res, {
     data,
     message: 'Berhasil menambah keberatan',

+ 16 - 5
controller/sanksi/perbaikan.controller.js

@@ -7,6 +7,8 @@ const response = require('../../utils/responseHandler')
 const pemantauanModel = require('../../model/pemantauan.model')
 const { notifWA } = require('../../utils/notifFunction')
 const { TEMPLATE_PERBAIKAN_DOKUMEN } = require('../../utils/constanta')
+const kontakModel = require('../../model/kontak.model')
+const logModel = require('../../model/log.model')
 
 exports.add = handleError(async (req, res) => {
   const user = req.user
@@ -35,10 +37,10 @@ exports.add = handleError(async (req, res) => {
       laporan: sanksi.laporan._id,
       _id: sanksi._id,
       ['pengajuan.banding']: { $exists: true, $ne: null },
-      ['pengajuan.cabut_sanksi']: {
-        $exists: false,
-        $eq: null,
-      },
+      // ['pengajuan.cabut_sanksi']: {
+      //   $exists: false,
+      //   $eq: null,
+      // },
     },
     {
       $push: {
@@ -63,7 +65,7 @@ exports.add = handleError(async (req, res) => {
     keterangan: 'Melakukan Perbaikan Dokumen',
     dokumen: dokumen_id,
   })
-  await notifWA(TEMPLATE_PERBAIKAN_DOKUMEN, [
+  const notif = await notifWA(TEMPLATE_PERBAIKAN_DOKUMEN, [
     { key: '1', value: 'pt', value_text: sanksi.laporan.pt.nama },
     {
       key: '2',
@@ -72,6 +74,15 @@ exports.add = handleError(async (req, res) => {
     },
     { key: '3', value: 'no_sanksi', value_text: sanksi.no_sanksi },
   ])
+
+  let contacts = await kontakModel.find()
+  contacts = contacts.map((e) => e.nama).join(', ')
+  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}`,
+    })
+  }
+
   return response.success(res, {
     data,
     message: 'Berhasil menambah Perbaikan',

+ 1 - 0
model/laporan.model.js

@@ -42,6 +42,7 @@ module.exports = mongoose.model(
       evaluasi: [
         new Schema(
           {
+            dari: { type: Types.ObjectId, ref: user },
             judul: String,
             tanggal: Date,
             dokumen: [

+ 5 - 1
model/sanksi.model.js

@@ -10,7 +10,7 @@ module.exports = mongoose.model(
   new Schema(
     {
       no_sanksi: String,
-      laporan: { type: Types.ObjectId, ref: laporan },
+      laporan: { type: Types.ObjectId, unique: true, ref: laporan },
       user: { type: Types.ObjectId, ref: user },
       pelanggaran: [{ type: Types.ObjectId, ref: pelanggaran }],
       keterangan: String,
@@ -21,6 +21,10 @@ module.exports = mongoose.model(
           ref: dokumen,
         },
       ],
+      masa_berlaku: new Schema({
+        from_date: Date,
+        to_date: Date,
+      }),
       batas_waktu: {
         keberatan: Date,
         jawaban_keberatan: Date,

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

@@ -3,5 +3,7 @@ const auto = require('../../controller/auto.controller')
 
 router.get('/keberatan', auto.keberatan)
 router.get('/banding', auto.banding)
+router.get('/reminder-keberatan', auto.reminderKeberatan)
+router.get('/reminder-banding', auto.reminderBanding)
 
 module.exports = router

+ 6 - 0
routes/v1/graph.routes.js

@@ -4,6 +4,12 @@ const auth = require('../../middleware/verifyToken')
 const roleId = require('../../middleware/role')
 
 router.get('/', auth, roleId([2020, 2021, 2023]), graph.laporan)
+router.get(
+  '/laporanSelesai',
+  auth,
+  roleId([2020, 2021, 2023]),
+  graph.laporanSelesai
+)
 router.get('/:token/:nama_file', auth, roleId([2020, 2021, 2023]), graph.excel)
 
 module.exports = router

+ 2 - 0
routes/v1/pelanggaran.routes.js

@@ -1,7 +1,9 @@
 const router = require('express').Router()
 const pelanggaran = require('../../controller/pelanggaran.controller')
 const roleId = require('../../middleware/role')
+const auth = require('../../middleware/verifyToken')
 
 router.get('/', roleId([2020, 2021, 2023]), pelanggaran.getAll)
+router.get('/sanksi', auth,roleId([2020, 2021, 2023]), pelanggaran.sanksi)
 
 module.exports = router

+ 10 - 11
utils/cekData.js

@@ -7,10 +7,9 @@ exports.cekSatuDataLaporan = async (
   res,
   user,
   laporan_id,
-  where = { delegasi: false }
+  where = { delegasi: false, aktif: true }
 ) => {
-  const w = { _id: laporan_id, aktif: true, ...where }
-  if (where.aktif === false) w.aktif = false
+  const w = { _id: laporan_id, aktif: where.aktif || true, ...where }
   switch (user.role.id) {
     case 2020:
       if (!where.delegasi) w.role_data = 'dikti'
@@ -38,7 +37,8 @@ exports.cekSatuDataLaporan = async (
     .populate({ path: 'user', populate: 'foto' })
     .populate({ path: 'pelanggaran', select: 'pelanggaran' })
     .populate('dokumen')
-    .populate('evaluasi.dokumen')
+    .populate({path: 'evaluasi', populate: ['user', 'dokumen']})
+    // .populate('evaluasi.user')
   if (!laporan) {
     response.error(res, {
       message: 'laporan_id tidak ada',
@@ -50,8 +50,7 @@ exports.cekSatuDataLaporan = async (
 }
 
 exports.cekBanyakDataLaporan = async (user, where = { delegasi: false }) => {
-  const w = { aktif: true, ...where }
-  if (where.aktif === false) w.aktif = false
+  const w = { aktif: where.aktif || true, ...where }
   switch (user.role.id) {
     case 2020:
       if (!where.delegasi) w.role_data = 'dikti'
@@ -91,7 +90,7 @@ exports.cekSatuDataSanksi = async (
   sanksi_id,
   where = { banding: false }
 ) => {
-  const w = { aktif: true }
+  const w = { aktif: where.aktif || true }
   switch (user.role.id) {
     case 2020:
       if (!where.banding) w.role_data = 'dikti'
@@ -133,7 +132,7 @@ exports.cekSatuDataSanksi = async (
 }
 
 exports.cekBanyakDataSanksi = async (user, where = { banding: false }) => {
-  const w = { aktif: true }
+  const w = {}
   switch (user.role.id) {
     case 2020:
       if (!where.banding) {
@@ -149,14 +148,14 @@ exports.cekBanyakDataSanksi = async (user, where = { banding: false }) => {
       break
   }
   let data = await sanksiModel
-    .find({ aktif: true, ...where })
+    .find({ aktif: where.aktif || true, ...where })
     .populate({
       path: 'laporan',
-      select: 'pt',
+      select: 'pt no_laporan',
       match: w,
     })
     .populate('user')
-    .select('-batas_waktu -aktif -dokumen -pelanggaran')
+    .select('-batas_waktu -dokumen -pelanggaran')
     .sort({
       createdAt: -1,
     })

+ 2 - 1
utils/constanta.js

@@ -6,4 +6,5 @@ exports.TEMPLATE_KEBERATAN = '8d2d8bfd-4100-4f78-b877-caffded2d56a'
 exports.TEMPLATE_BANDING = '2bbc0080-1187-4213-8017-b6d1d6ec3cbb'
 exports.TEMPLATE_LAPORAN = 'd5609c3c-e9e9-4dbe-9a4e-e8fa772d6770'
 exports.TEMPLATE_PERBAIKAN_DOKUMEN = '891ee9c7-39f8-416e-af5c-6b3a10e9dbec'
-exports.TEMPLATE_VERIFIKASI = '37a9ccba-e1bc-4d02-86e0-3be4c718af2a'
+exports.TEMPLATE_VERIFIKASI = '37a9ccba-e1bc-4d02-86e0-3be4c718af2a'
+exports.TEMPLATE_REMINDER = '960eaacb-0dd9-42a6-b331-60fac972eb96'