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