Переглянути джерело

Merge branch 'master' of https://source.dev-sidali.sixsenz.net/appsptb/ptb-be

andi 3 роки тому
батько
коміт
512e8378d9

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

+ 25 - 5
controller/laporan.controller.js

@@ -63,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',
@@ -343,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,

+ 20 - 0
controller/pelanggaran.controller.js

@@ -27,3 +27,23 @@ 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] }
+  }
+  let data = await pelanggaranModel.find(w)
+  data = [
+    ...new Set(
+      data.map((e) => `${e.sanksi} - Sanksi Administratif ${e.label_sanksi}`)
+    ),
+  ]
+  return response.success(res, {
+    message: 'Berhasil ambil data Pelanggaran',
+    data,
+  })
+})

+ 9 - 2
controller/sanksi.controller.js

@@ -88,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') {
@@ -124,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

+ 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,

+ 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: [

+ 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'