Explorar el Código

add excel from be

yazid138 hace 3 años
padre
commit
2a6e1a6049

+ 1 - 1
controller/dokumen.controller.js

@@ -5,5 +5,5 @@ exports.getDokumen = handleError(async (req, res) => {
   const { id } = req.params
   const data = await chunkModel.findById(id)
   res.header('Content-Type', data.type)
-  return res.end(new Buffer(data.data, 'base64'))
+  return res.end(Buffer.from(data.data))
 })

+ 154 - 0
controller/graph.controller.js

@@ -1,9 +1,12 @@
 const handleError = require('../utils/handleError')
+const excel = require('../utils/excel')
 const response = require('../utils/responseHandler')
 const {
   cekBanyakDataLaporan,
   dataLaporanAggregate,
 } = require('../utils/cekData')
+const laporanModel = require('../model/laporan.model')
+const moment = require('moment')
 
 exports.laporan = handleError(async (req, res) => {
   const user = req.user
@@ -223,3 +226,154 @@ exports.laporan = handleError(async (req, res) => {
     data,
   })
 })
+
+exports.excel = handleError(async (req, res) => {
+  const user = req.user
+  const w = {}
+  const date = new Date()
+  switch (user.role.id) {
+    case 2020:
+      w['$or'] = [
+        {
+          role_asal: 'dikti',
+        },
+        {
+          role_data: 'dikti',
+        },
+      ]
+      break
+    case 2021:
+      w['$or'] = [
+        {
+          role_asal: 'lldikti',
+        },
+        {
+          role_data: 'lldikti',
+        },
+      ]
+      w['pt.pembina.id'] = user.lembaga.id
+      break
+    default:
+      return response.error(res, {
+        message: 'Forbidden',
+        code: 403,
+      })
+  }
+
+  const { tahun } = req.query
+
+  berdasarkan_tahun = {
+    $and: [
+      {
+        createdAt: {
+          $gte: new Date(`${tahun || date.getFullYear()}`),
+        },
+      },
+      {
+        createdAt: {
+          $lt: new Date(`${parseInt(tahun) + 1 || date.getFullYear() + 1}`),
+        },
+      },
+    ],
+  }
+
+  const laporan = await laporanModel
+    .find({ ...w, ...berdasarkan_tahun })
+    .populate('user')
+
+  const dataDelegasi = laporan.map((value) => ({
+    Tanggal: moment(value.createdAt).format('DD-MMMM-YYYY'),
+    'No. Laporan': value.no_laporan,
+    'Nama Perguruan Tinggi': value.pt.nama,
+    'Keterangan Laporan': value.keterangan,
+    'Dibuat Oleh': value.user.nama,
+    Status: !value.aktif
+      ? 'Ditutup'
+      : (value.role_asal === 'dikti' && value.role_data === 'dikti') ||
+        (value.role_data == 'dikti' && user.role.id === 2020) ||
+        (value.role_asal === 'lldikti' && value.role_data === 'lldikti') ||
+        (value.role_data == 'lldikti' && user.role.id === 2021)
+      ? `Ditindaklanjuti ${value.role_data === 'dikti' ? 'DIKTI' : 'LLDIKTI'}`
+      : `Delegasi Ke ${value.role_data === 'dikti' ? 'DIKTI' : 'LLDIKTI'}`,
+  }))
+
+  const dataLaporan = laporan.map((value) => ({
+    Tanggal: moment(value.createdAt).format('DD-MMMM-YYYY'),
+    'No. Laporan': value.no_laporan,
+    'Nama Perguruan Tinggi': value.pt.nama,
+    'Keterangan Laporan': value.keterangan,
+    'Dibuat Oleh': value.user.nama,
+    Status:
+      value.sanksi || value.aktif === false
+        ? 'Pelaporan Selesai'
+        : 'Pelaporan Belum Selesai',
+  }))
+
+  const dataJadwal = laporan
+    .filter((e) => e.aktif === true)
+    .map((value) => ({
+      Tanggal: moment(value.createdAt).format('DD-MMMM-YYYY'),
+      'No. Laporan': value.no_laporan,
+      'Nama Perguruan Tinggi': value.pt.nama,
+      'Keterangan Laporan': value.keterangan,
+      'Dibuat Oleh': value.user.nama,
+      'Dari Tanggal':
+        value.jadwal.judul &&
+        moment(value.jadwal.dari_tanggal).format('DD-MMMM-YYYY'),
+      'Sampai Tanggal':
+        value.jadwal.judul &&
+        moment(value.jadwal.sampai_tanggal).format('DD-MMMM-YYYY'),
+      Status: value.jadwal.judul ? 'Sudah ada jadwal' : 'Belum ada jadwal',
+    }))
+
+  const dataPemeriksaan = laporan
+    .filter((e) => e.aktif === true && e.jadwal.judul)
+    .map((value) => ({
+      Tanggal: moment(value.createdAt).format('DD-MMMM-YYYY'),
+      'No. Laporan': value.no_laporan,
+      'Nama Perguruan Tinggi': value.pt.nama,
+      'Keterangan Laporan': value.keterangan,
+      'Dibuat Oleh': value.user.nama,
+      Status: value.evaluasi.length ? 'Sudah diperiksa' : 'Belum diperiksa',
+    }))
+
+  const dataSanksi = laporan
+    .filter((e) => e.aktif === true && e.evaluasi.length)
+    .map((value) => ({
+      Tanggal: moment(value.createdAt).format('DD-MMMM-YYYY'),
+      'No. Laporan': value.no_laporan,
+      'Nama Perguruan Tinggi': value.pt.nama,
+      'Keterangan Laporan': value.keterangan,
+      'Dibuat Oleh': value.user.nama,
+      Status: value.sanksi ? 'Sudah ditetapkan' : 'Belum ditetapkan',
+    }))
+
+  const buffer = excel.to_excel([
+    {
+      SheetNames: 'Delegasi',
+      data: dataDelegasi,
+    },
+    {
+      SheetNames: 'Pelaporan',
+      data: dataLaporan,
+    },
+    {
+      SheetNames: 'Penjadwalan',
+      data: dataJadwal,
+    },
+    {
+      SheetNames: 'Pemeriksaan',
+      data: dataPemeriksaan,
+    },
+    {
+      SheetNames: 'Sanksi',
+      data: dataSanksi,
+    },
+  ])
+
+  res.header(
+    'Content-Type',
+    'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
+  )
+  return res.end(Buffer.from(buffer))
+})

+ 3 - 1
middleware/verifyToken.js

@@ -4,7 +4,9 @@ const response = require('../utils/responseHandler')
 
 module.exports = (req, res, next) => {
   const authHeader = req.headers.authorization
-  const token = authHeader && authHeader.split(' ')[1]
+  const token =
+    (req.params.token && req.params.token.split(' ')[1]) ||
+    (authHeader && authHeader.split(' ')[1])
 
   if (!token)
     return response.error(res, {

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

@@ -1,6 +1,9 @@
 const router = require('express').Router()
 const graph = require('../../controller/graph.controller')
+const auth = require('../../middleware/verifyToken')
+const roleId = require('../../middleware/role')
 
-router.get('/', graph.laporan)
+router.get('/', auth, roleId([2020, 2021]), graph.laporan)
+router.get('/:token/:nama_file', auth, roleId([2020, 2021]), graph.excel)
 
 module.exports = router

+ 1 - 1
routes/v1/index.js

@@ -18,6 +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'))
+router.use('/graph', require('./graph.routes'))
 
 module.exports = router

+ 24 - 0
utils/excel.js

@@ -0,0 +1,24 @@
+const XLSX = require('xlsx')
+
+module.exports.to_excel = (
+  table = [
+    {
+      SheetNames,
+      data: [],
+    },
+  ]
+) => {
+  let wb = XLSX.utils.book_new()
+  wb.Props = {
+    Title: 'Laporan',
+    Author: 'RISTEK DIKTI',
+    CreatedDate: new Date(),
+  }
+
+  table.forEach((e) => {
+    wb.SheetNames.push(e.SheetNames)
+    wb.Sheets[e.SheetNames] = XLSX.utils.json_to_sheet(e.data)
+  })
+
+  return XLSX.write(wb, { type: 'buffer' })
+}