andi 3 gadi atpakaļ
vecāks
revīzija
0e14ee1077

+ 97 - 76
controller/graph.controller.js

@@ -395,100 +395,121 @@ exports.laporanSelesai = handleError(async (req, res) => {
 })
 
 exports.jumlahStatusLaporan = handleError(async (req, res) => {
-  const pembina = await laporanModel.distinct('pt.pembina.nama')
+  let dataPembina = await laporanModel.find()
+  const user = req.user
+
+  dataPembina = [
+    ...new Set(
+      dataPembina.map((e) => `${e.pt.pembina.id};${e.pt.pembina.nama}`)
+    ),
+  ]
+  dataPembina = dataPembina.map((e) => ({
+    id: e.split(';')[0],
+    name: e.split(';')[1],
+  }))
 
   let data = await Promise.all(
-    pembina.map(async (e) => {
+    dataPembina.map(async (e) => {
       return {
-        [e]: {
-          jumlah_jadwal_evaluasi: await laporanModel
+        pembina: e,
+        laporan: await cekBanyakDataLaporan(user, {
+          all: true,
+          ['pt.pembina.id']: e.id,
+        }),
+        sanksi: (
+          await cekBanyakDataSanksi(
+            user,
+            { all: true },
+            { ['pt.pembina.id']: e.id }
+          )
+        ).filter((e) => e.laporan != null),
+        jumlah_jadwal_evaluasi: await laporanModel
+          .find({
+            jadwal: {
+              $ne: null,
+              $exists: true,
+            },
+            'pt.pembina.id': e.id,
+          })
+          .count(),
+        jumlah_pemeriksaan: await laporanModel
+          .find({
+            evaluasi: {
+              $ne: [],
+              $exists: true,
+            },
+            'pt.pembina.id': e.id,
+          })
+          .count(),
+        jumlah_sanksi: await laporanModel
+          .find({
+            sanksi: {
+              $ne: null,
+              $exists: true,
+            },
+            'pt.pembina.id': e.id,
+          })
+          .count(),
+        jumlah_keberatan: (
+          await sanksiModel
+            .find({
+              'pengajuan.keberatan': {
+                $ne: null,
+                $exists: true,
+              },
+            })
+            .populate({
+              path: 'laporan',
+              match: {
+                'pt.pembina.id': e.id,
+              },
+            })
+        ).filter((e) => e.laporan != null).length,
+        jumlah_banding: (
+          await sanksiModel
             .find({
-              jadwal: {
+              'pengajuan.banding': {
                 $ne: null,
                 $exists: true,
               },
-              'pt.pembina.nama': e,
             })
-            .count(),
-          jumlah_pemeriksaan: await laporanModel
+            .populate({
+              path: 'laporan',
+              match: {
+                'pt.pembina.id': e.id,
+              },
+            })
+        ).filter((e) => e.laporan != null).length,
+        jumlah_pemantauan_perbaikan: (
+          await sanksiModel
             .find({
-              evaluasi: {
+              perbaikan: {
                 $ne: [],
                 $exists: true,
               },
-              'pt.pembina.nama': e,
             })
-            .count(),
-          jumlah_sanksi: await laporanModel
+            .populate({
+              path: 'laporan',
+              match: {
+                'pt.pembina.id': e.id,
+              },
+            })
+        ).filter((e) => e.laporan != null).length,
+        jumlah_pencabutan_sanksi: (
+          await sanksiModel
             .find({
-              sanksi: {
+              'pengajuan.cabut_sanksi': {
                 $ne: null,
                 $exists: true,
               },
-              'pt.pembina.nama': e,
             })
-            .count(),
-          jumlah_keberatan: (
-            await sanksiModel
-              .find({
-                'pengajuan.keberatan': {
-                  $ne: null,
-                  $exists: true,
-                },
-              })
-              .populate({
-                path: 'laporan',
-                match: {
-                  'pt.pembina.nama': e,
-                },
-              })
-          ).filter((e) => e.laporan != null).length,
-          jumlah_banding: (
-            await sanksiModel
-              .find({
-                'pengajuan.banding': {
-                  $ne: null,
-                  $exists: true,
-                },
-              })
-              .populate({
-                path: 'laporan',
-                match: {
-                  'pt.pembina.nama': e,
-                },
-              })
-          ).filter((e) => e.laporan != null).length,
-          jumlah_pemantauan_perbaikan: (
-            await sanksiModel
-              .find({
-                perbaikan: {
-                  $ne: [],
-                  $exists: true,
-                },
-              })
-              .populate({
-                path: 'laporan',
-                match: {
-                  'pt.pembina.nama': e,
-                },
-              })
-          ).filter((e) => e.laporan != null).length,
-          jumlah_pencabutan_sanksi: (
-            await sanksiModel
-              .find({
-                'pengajuan.cabut_sanksi': {
-                  $ne: null,
-                  $exists: true,
-                },
-              })
-              .populate({
-                path: 'laporan',
-                match: {
-                  'pt.pembina.nama': e,
-                },
-              })
-          ).filter((e) => e.laporan != null).length,
-        },
+            .populate({
+              path: 'laporan',
+              match: {
+                'pt.pembina.id': e.id,
+              },
+            })
+        ).filter((e) => e.laporan != null).length,
       }
     })
   )

+ 46 - 5
controller/laporan.controller.js

@@ -8,7 +8,11 @@ const { validate } = require('../utils/validation')
 const { notifWA } = require('../utils/notifFunction')
 const { addManyDokumen } = require('../utils/dokumenFunction')
 const userModel = require('../model/user.model')
-const { cekSatuDataLaporan, cekBanyakDataLaporan } = require('../utils/cekData')
+const {
+  cekSatuDataLaporan,
+  cekBanyakDataLaporan,
+  cekBanyakDataSanksi,
+} = require('../utils/cekData')
 const { TEMPLATE_LAPORAN } = require('../utils/constanta')
 const logModel = require('../model/log.model')
 const kontakModel = require('../model/kontak.model')
@@ -297,11 +301,14 @@ exports.public = handleError(async (req, res) => {
 exports.getAll = handleError(async (req, res) => {
   const user = req.user
   const where = {}
-  const { no_laporan, pt_id, jadwal, evaluasi, aktif, delegasi } = req.query
+  const { no_laporan, pt_id, jadwal, evaluasi, aktif, delegasi, all, sanksi } =
+    req.query
   if (no_laporan) where.no_laporan = no_laporan
   if (pt_id) where['pt.id'] = pt_id
   if (aktif) where.aktif = aktif === 'true'
-  if (delegasi) where.delegasi = delegasi === 'true'
+  if (all) where.all = true
+  else if (delegasi) where.delegasi = delegasi === 'true'
+
   if (jadwal === 'true') {
     where.jadwal = {
       $exists: true,
@@ -315,6 +322,11 @@ exports.getAll = handleError(async (req, res) => {
         $size: 0,
       },
     }
+  } else if (sanksi === 'true') {
+    where.sanksi = {
+      $exists: true,
+      $ne: null,
+    }
   }
   let data = await cekBanyakDataLaporan(user, where)
   return response.success(res, {
@@ -326,10 +338,11 @@ exports.getAll = handleError(async (req, res) => {
 exports.getOne = handleError(async (req, res) => {
   const { id } = req.params
   const user = req.user
-  const { aktif, delegasi } = req.query
+  const { aktif, delegasi, all } = req.query
   const where = {}
   if (aktif) where.aktif = aktif === 'true'
-  if (delegasi) where.delegasi = delegasi === 'true'
+  if (all) where.all = true
+  else if (delegasi) where.delegasi = delegasi === 'true'
   const data = await cekSatuDataLaporan(res, user, id, where)
   if (!data) return
   return response.success(res, {
@@ -428,3 +441,31 @@ exports.jumlahLaporan = handleError(async (req, res) => {
     data: laporan,
   })
 })
+
+exports.laporanByPembina = handleError(async (req, res) => {
+  const { idPembina } = req.params
+  const user = req.user
+
+  const [laporan, sanksi] = await Promise.all([
+    (async () =>
+      await cekBanyakDataLaporan(user, {
+        'pt.pembina.id': idPembina,
+        all: true,
+      }))(),
+    (async () =>
+      (
+        await cekBanyakDataSanksi(
+          user,
+          { all: true },
+          {
+            ['pt.pembina.id']: idPembina,
+          }
+        )
+      ).filter((e) => e.laporan != null))(),
+  ])
+
+  return response.success(res, {
+    message: 'berhasil get laporan by pembina',
+    data: { laporan, sanksi },
+  })
+})

+ 2 - 1
controller/pemantauan.controller.js

@@ -9,7 +9,7 @@ const userModel = require('../model/user.model')
 exports.get = handleError(async (req, res) => {
   const user = req.user
   const { laporan_id } = req.params
-  const { delegasi, asc } = req.query
+  const { delegasi, asc, all } = req.query
   // const pt = await axios.get(
   //   `https://api.kemdikbud.go.id:8243/pddikti/1.2/pt/${pt_id}`
   // )
@@ -25,6 +25,7 @@ exports.get = handleError(async (req, res) => {
   // }
   const where = {}
   if (delegasi) where.delegasi = true
+  if (all) where.all = true
   const laporan = await cekSatuDataLaporan(res, user, laporan_id, where)
   if (!laporan) return
 

+ 7 - 2
controller/sanksi.controller.js

@@ -88,7 +88,7 @@ exports.create = handleError(async (req, res) => {
 
 exports.getAll = handleError(async (req, res) => {
   const user = req.user
-  const { keberatan, jawaban, banding, cabutSanksi, perbaikan, aktif } =
+  const { keberatan, jawaban, banding, cabutSanksi, perbaikan, aktif, delegasi } =
     req.query
   const where = {}
   if (aktif && aktif === 'false') {
@@ -115,6 +115,8 @@ exports.getAll = handleError(async (req, res) => {
     }
   } else if (perbaikan === 'true') {
     where['jawaban.banding'] = { $exists: true, $ne: null }
+  } else if (delegasi === 'true') {
+    where.delegasi = true
   }
   const data = await cekBanyakDataSanksi(user, where)
   return response.success(res, {
@@ -128,13 +130,16 @@ exports.getOne = handleError(async (req, res) => {
   const { sanksi_id } = req.params
 
   const w = {}
-  const { banding, aktif } = req.query
+  const { banding, aktif, delegasi } = 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 (delegasi === 'true') {
+    w.delegasi = true
+  }
   if (aktif && aktif === 'false') {
     w.aktif = false
   }

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

@@ -68,14 +68,18 @@ exports.createJawaban = handleError(async (req, res) => {
   })
   if (!isValid) return
 
-  const files = req.files
-  if (!files?.length) {
-    return response.error(res, {
-      message: 'dokumen harus ada',
-    })
+  let dokumen_id = null
+  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 dokumen = await addManyDokumen(files)
-  const dokumen_id = dokumen.map((e) => e._id)
+
   const { status, keterangan } = req.body
   const data = await sanksiModel.findOneAndUpdate(
     {

+ 0 - 2
middleware/role.js

@@ -1,5 +1,3 @@
-const userModel = require('../model/user.model')
-const { array } = require('../utils/handleDokumen')
 const response = require('../utils/responseHandler')
 
 module.exports = (role) => async (req, res, next) => {

+ 3 - 1
model/laporan.model.js

@@ -3,6 +3,8 @@ const { Schema, Types } = mongoose
 const user = require('./user.model')
 const dokumen = require('./dokumen.model')
 const pelanggaran = require('./pelanggaran.model')
+const sanksi = require('./sanksi2.model')
+
 
 module.exports = mongoose.model(
   'Laporan',
@@ -10,7 +12,7 @@ module.exports = mongoose.model(
     {
       no_laporan: { type: String, unique: true },
       user: { type: Types.ObjectId, ref: user },
-      sanksi: { type: Types.ObjectId },
+      sanksi: { type: Types.ObjectId, ref: sanksi },
       pt: Object,
       keterangan: String,
       pelanggaran: [{ type: Types.ObjectId, ref: pelanggaran }],

+ 125 - 0
model/sanksi2.model.js

@@ -0,0 +1,125 @@
+const mongoose = require('mongoose')
+const { Schema, Types } = mongoose
+const dokumen = require('./dokumen.model')
+const user = require('./user.model')
+const pelanggaran = require('./pelanggaran.model')
+
+module.exports = mongoose.model(
+  'Sanksi2',
+  new Schema(
+    {
+      no_sanksi: String,
+      user: { type: Types.ObjectId, ref: user },
+      pelanggaran: [{ type: Types.ObjectId, ref: pelanggaran }],
+      keterangan: String,
+      aktif: { type: Boolean, default: true },
+      dokumen: [
+        {
+          type: Types.ObjectId,
+          ref: dokumen,
+        },
+      ],
+      masa_berlaku: new Schema({
+        from_date: Date,
+        to_date: Date,
+      }),
+      batas_waktu: {
+        keberatan: Date,
+        jawaban_keberatan: Date,
+        banding: Date,
+        jawaban_banding: Date,
+      },
+      jawaban: {
+        keberatan: new Schema(
+          {
+            status: String,
+            keterangan: String,
+            dokumen: [
+              {
+                type: Types.ObjectId,
+                ref: dokumen,
+              },
+            ],
+          },
+          { timestamps: true }
+        ),
+        banding: new Schema(
+          {
+            status: String,
+            dokumen: [
+              {
+                type: Types.ObjectId,
+                ref: dokumen,
+              },
+            ],
+          },
+          { timestamps: true }
+        ),
+        cabut_sanksi: new Schema(
+          {
+            status: String,
+            keterangan: String,
+            dokumen: [
+              {
+                type: Types.ObjectId,
+                ref: dokumen,
+              },
+            ],
+          },
+          { timestamps: true }
+        ),
+      },
+      pengajuan: {
+        keberatan: new Schema(
+          {
+            dokumen: [
+              {
+                type: Types.ObjectId,
+                ref: dokumen,
+              },
+            ],
+          },
+          { timestamps: true }
+        ),
+        banding: new Schema(
+          {
+            dokumen: [
+              {
+                type: Types.ObjectId,
+                ref: dokumen,
+              },
+            ],
+          },
+          { timestamps: true }
+        ),
+        cabut_sanksi: new Schema(
+          {
+            dokumen: [
+              {
+                type: Types.ObjectId,
+                ref: dokumen,
+              },
+            ],
+          },
+          { timestamps: true }
+        ),
+      },
+      perbaikan: [
+        new Schema(
+          {
+            keterangan: String,
+            dokumen: [
+              {
+                type: Types.ObjectId,
+                ref: dokumen,
+              },
+            ],
+          },
+          { timestamps: true }
+        ),
+      ],
+    },
+    { timestamps: true }
+  ),
+  'sanksi'
+)

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

@@ -10,7 +10,7 @@ router.get(
   roleId([2020, 2021, 2023]),
   graph.laporanSelesai
 )
-router.get('/jumlahStatusLaporan', graph.jumlahStatusLaporan)
+router.get('/jumlahStatusLaporan', auth, graph.jumlahStatusLaporan)
 router.get('/:token/:nama_file', auth, roleId([2020, 2021, 2023]), graph.excel)
 
 module.exports = router

+ 2 - 0
routes/v1/laporan/index.js

@@ -1,9 +1,11 @@
 const router = require('express').Router()
 const laporan = require('../../../controller/laporan.controller')
 const handleDokumen = require('../../../utils/handleDokumen')
+const roleId = require('../../../middleware/role')
 
 router.get('/', laporan.getAll)
 router.get('/jumlah', laporan.jumlahLaporan)
+router.get('/byPembina/:idPembina', roleId(2020),laporan.laporanByPembina)
 router.get('/:id', laporan.getOne)
 router.post('/create', handleDokumen.array('dokumen'), laporan.create)
 router.put('/update/:id', laporan.update)

+ 48 - 15
utils/cekData.js

@@ -12,14 +12,25 @@ exports.cekSatuDataLaporan = async (
   const w = { _id: laporan_id, aktif: where.aktif || true, ...where }
   switch (user.role.id) {
     case 2020:
-      if (!where.delegasi) w.role_data = 'dikti'
-      else {
+      if (where.all) {
+        // w.role_asal = 'dikti'
+        // w['$or'] = [
+        //   { role_asal : 'dikti' },
+        //   { role_asal: 'lldikti', role_data: 'dikti' },
+        // ]
+        break
+      } else if (!where.delegasi) {
+        w.role_data = 'dikti'
+      } else {
         w.role_data = 'lldikti'
         w.role_asal = 'dikti'
       }
       break
     case 2021:
-      if (!where.delegasi) {
+      if (where.all) {
+        w.role_asal = 'lldikti'
+        w['pt.pembina.id'] = user.lembaga.id
+      } else if (!where.delegasi) {
         w.role_data = 'lldikti'
         w['pt.pembina.id'] = user.lembaga.id
       } else {
@@ -37,8 +48,8 @@ exports.cekSatuDataLaporan = async (
     .populate({ path: 'user', populate: 'foto' })
     .populate({ path: 'pelanggaran', select: 'pelanggaran' })
     .populate('dokumen')
-    .populate({path: 'evaluasi', populate: ['user', 'dokumen']})
-    // .populate('evaluasi.user')
+    .populate({ path: 'evaluasi', populate: ['user', 'dokumen'] })
+  // .populate('evaluasi.user')
   if (!laporan) {
     response.error(res, {
       message: 'laporan_id tidak ada',
@@ -53,14 +64,25 @@ exports.cekBanyakDataLaporan = async (user, where = { delegasi: false }) => {
   const w = { aktif: where.aktif || true, ...where }
   switch (user.role.id) {
     case 2020:
-      if (!where.delegasi) w.role_data = 'dikti'
-      else {
+      if (where.all) {
+        // w.role_asal = 'dikti'
+        // w['$or'] = [
+        //   { role_asal : 'dikti' },
+        //   { role_asal: 'lldikti', role_data: 'dikti' },
+        // ]
+        break
+      } else if (!where.delegasi) {
+        w.role_data = 'dikti'
+      } else {
         w.role_data = 'lldikti'
         w.role_asal = 'dikti'
       }
       break
     case 2021:
-      if (!where.delegasi) {
+      if (where.all) {
+        w.role_asal = 'lldikti'
+        w['pt.pembina.id'] = user.lembaga.id
+      } else if (!where.delegasi) {
         w.role_data = 'lldikti'
         w['pt.pembina.id'] = user.lembaga.id
       } else {
@@ -76,6 +98,7 @@ exports.cekBanyakDataLaporan = async (user, where = { delegasi: false }) => {
   const data = await laporanModel
     .find(w)
     .populate('user')
+    .populate({ path: 'sanksi', populate: ['pelanggaran'] })
     .select(w.select || ' -pelanggaran -aktif -dokumen')
     .limit(w.limit)
     .sort({
@@ -93,8 +116,13 @@ exports.cekSatuDataSanksi = async (
   const w = { aktif: where.aktif || true }
   switch (user.role.id) {
     case 2020:
-      if (!where.banding) w.role_data = 'dikti'
-
+      // if (where.all) w.role_asal = 'dikti'
+      if (where.all) break
+      else if (where.delegasi) {
+        w.role_data = 'lldikti'
+        w.role_asal = 'dikti'
+      }
+      else if (!where.banding) w.role_data = 'dikti'
       break
     case 2021:
       w.role_data = 'lldikti'
@@ -131,13 +159,17 @@ exports.cekSatuDataSanksi = async (
   return sanksi
 }
 
-exports.cekBanyakDataSanksi = async (user, where = { banding: false }) => {
-  const w = {}
+exports.cekBanyakDataSanksi = async (user, where = {}, q = {}) => {
+  const w = { ...q }
   switch (user.role.id) {
     case 2020:
-      if (!where.banding) {
-        w.role_data = 'dikti'
+      // if (where.all) w.role_asal = 'dikti'
+      if (where.all) break
+      else if (where.delegasi) {
+        w.role_data = 'lldikti'
+        w.role_asal = 'dikti'
       }
+      else if (!where.banding) w.role_data = 'dikti'
       break
     case 2021:
       w['role_data'] = 'lldikti'
@@ -155,7 +187,8 @@ exports.cekBanyakDataSanksi = async (user, where = { banding: false }) => {
       match: w,
     })
     .populate('user')
-    .select('-batas_waktu -dokumen -pelanggaran')
+    .populate('pelanggaran')
+    .select('-dokumen')
     .sort({
       createdAt: -1,
     })