andifebri 3 tahun lalu
induk
melakukan
b7e1523666
4 mengubah file dengan 254 tambahan dan 1 penghapusan
  1. 225 0
      controller/graph.controller.js
  2. 6 0
      routes/v1/graph.routes.js
  3. 1 0
      routes/v1/index.js
  4. 22 1
      utils/cekData.js

+ 225 - 0
controller/graph.controller.js

@@ -0,0 +1,225 @@
+const handleError = require('../utils/handleError')
+const response = require('../utils/responseHandler')
+const {
+  cekBanyakDataLaporan,
+  dataLaporanAggregate,
+} = require('../utils/cekData')
+
+exports.laporan = handleError(async (req, res) => {
+  const user = req.user
+  const data = {}
+  const date = new Date()
+
+  // let berdasarkan_tahun = {}
+  const {
+    jumlahLaporan,
+    jadwal,
+    evaluasi,
+    sanksi,
+    newLaporan,
+    laporanBulan,
+    laporanTahun,
+    bulan,
+    tahun,
+    listJadwal,
+  } = req.query
+
+  // if (tahun) {
+  berdasarkan_tahun = {
+    $and: [
+      {
+        createdAt: {
+          $gte: new Date(`${tahun || date.getFullYear()}`),
+        },
+      },
+      {
+        createdAt: {
+          $lt: new Date(`${parseInt(tahun) + 1 || date.getFullYear() + 1}`),
+        },
+      },
+    ],
+  }
+  // }
+
+  const laporan = await cekBanyakDataLaporan(user, { ...berdasarkan_tahun })
+
+  if (jumlahLaporan == 'true') {
+    const delegasi = await cekBanyakDataLaporan(user, {
+      delegasi: true,
+      ...berdasarkan_tahun,
+    })
+    const ditutup = await cekBanyakDataLaporan(user, {
+      aktif: false,
+      ...berdasarkan_tahun,
+    })
+
+    data.jumlah_laporan = {
+      dikti: laporan.length,
+      lldikti: delegasi.length,
+      ditutup: ditutup.length,
+      tes: {
+        delegasi: true,
+        ...berdasarkan_tahun,
+      },
+    }
+  }
+
+  if (jadwal == 'true') {
+    const hasJadwal = laporan.filter((e) => e.jadwal.judul).length
+    const notHasJadwal = laporan.filter((e) => !e.jadwal.judul).length
+
+    data.jadwal = {
+      hasJadwal,
+      notHasJadwal,
+    }
+  }
+
+  if (evaluasi == 'true') {
+    const hasEvaluasi = laporan.filter(
+      (e) => e.evaluasi.length && e.jadwal.judul
+    ).length
+    const notHasEvaluasi = laporan.filter(
+      (e) => e.evaluasi.length == 0 && e.jadwal.judul
+    ).length
+
+    data.evaluasi = {
+      hasEvaluasi,
+      notHasEvaluasi,
+    }
+  }
+
+  if (sanksi == 'true') {
+    const hasSanksi = laporan.filter(
+      (e) => e.sanksi && e.evaluasi.length
+    ).length
+    const notHasSanksi = laporan.filter(
+      (e) => !e.sanksi && e.evaluasi.length
+    ).length
+
+    data.sanksi = {
+      hasSanksi,
+      notHasSanksi,
+    }
+  }
+
+  if (newLaporan == 'true') {
+    data.newLaporan = await cekBanyakDataLaporan(user, {
+      limit: 3,
+      select: 'no_laporan pt.nama -user createdAt',
+    })
+  }
+
+  if (laporanBulan == 'true') {
+    let date = {}
+    if (bulan || (bulan && tahun)) {
+      const temp = new Date()
+      date = {
+        $expr: {
+          $and: [
+            { $eq: [{ $month: '$createdAt' }, parseInt(bulan)] },
+            {
+              $eq: [
+                { $year: '$createdAt' },
+                parseInt(tahun) || temp.getFullYear(),
+              ],
+            },
+          ],
+        },
+      }
+    }
+
+    data.laporan_perbulan = await dataLaporanAggregate(
+      user,
+      { ...date },
+      {
+        _id: {
+          bulan: {
+            $month: '$createdAt',
+          },
+          tahun: {
+            $year: '$createdAt',
+          },
+        },
+        jumlah_laporan: {
+          $sum: 1,
+        },
+      }
+    )
+  } else if (laporanTahun == 'true') {
+    const temp = new Date()
+    let date = {
+      $expr: {
+        $eq: [{ $year: '$createdAt' }, parseInt(tahun) || temp.getFullYear()],
+      },
+    }
+
+    data.laporan_perTahun = await dataLaporanAggregate(
+      user,
+      { ...date },
+      {
+        _id: {
+          bulan: {
+            $month: '$createdAt',
+          },
+          tahun: {
+            $year: '$createdAt',
+          },
+        },
+        jumlah_laporan: {
+          $sum: 1,
+        },
+      }
+    )
+  }
+
+  if (listJadwal == 'true') {
+    const temp = new Date()
+    let date = {
+      $expr: {
+        $and: [
+          {
+            $eq: [
+              { $month: '$jadwal.dari_tanggal' },
+              parseInt(bulan) || temp.getMonth() + 1,
+            ],
+          },
+          {
+            $eq: [
+              { $year: '$jadwal.dari_tanggal' },
+              parseInt(tahun) || temp.getFullYear(),
+            ],
+          },
+        ],
+      },
+    }
+
+    data.list_jadwal = await dataLaporanAggregate(
+      user,
+      {
+        ...date,
+        jadwal: {
+          $ne: null,
+          $exists: true,
+        },
+      },
+      {
+        _id: {
+          bulan: {
+            $month: '$jadwal.dari_tanggal',
+          },
+          tahun: {
+            $year: '$jadwal.dari_tanggal',
+          },
+        },
+        jadwal: {
+          $push: '$jadwal',
+        },
+      }
+    )
+  }
+
+  return response.success(res, {
+    message: 'Berhasil menganalisis data',
+    data,
+  })
+})

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

@@ -0,0 +1,6 @@
+const router = require('express').Router()
+const graph = require('../../controller/graph.controller')
+
+router.get('/', graph.laporan)
+
+module.exports = router

+ 1 - 0
routes/v1/index.js

@@ -18,5 +18,6 @@ router.use('/pemantauan', auth, require('./pemantauan.routes'))
 router.use('/pt', auth, require('./pt.routes'))
 router.use('/pelanggaran', auth, require('./pelanggaran.routes'))
 router.use('/lembaga', auth, roleId(2020), require('./lembaga.routes'))
+router.use('/graph', auth, roleId([2020, 2021]), require('./graph.routes'))
 
 module.exports = router

+ 22 - 1
utils/cekData.js

@@ -77,7 +77,8 @@ exports.cekBanyakDataLaporan = async (user, where = { delegasi: false }) => {
   const data = await laporanModel
     .find(w)
     .populate('user')
-    .select(' -pelanggaran -aktif -dokumen')
+    .select(w.select || ' -pelanggaran -aktif -dokumen')
+    .limit(w.limit)
     .sort({
       createdAt: -1,
     })
@@ -187,3 +188,23 @@ exports.cekBanyakDataPelanggaran = async (res, pelanggaran_id) => {
   }
   return pelanggaran.map((e) => e._id)
 }
+
+exports.dataLaporanAggregate = async (user, where, aggregate) => {
+  const w = { ...where }
+  switch (user.role.id) {
+    case 2020:
+      w.role_asal = 'dikti'
+      break
+    case 2021:
+      w.role_asal = 'lldikti'
+      w['pt.pembina.id'] = user.lembaga.id
+      break
+  }
+  
+  const laporan = await laporanModel.aggregate([
+    { $match: w },
+    { $group: aggregate },
+  ])
+
+  return laporan
+}