const auth = require('../../middleware/verifyToken') const { validation } = require('../../middleware/validation') const uploadFile = require('../../middleware/uploadFile') const response = require('../../utils/responseHandler') const { addManyDokumen } = require('../../utils/dokumenFunction') const checkData = require('../../middleware/checkData') const pelanggaranModel = require('../../model/pelanggaran.model') const laporanModel = require('../../model/laporan.model') const pemantauanModel = require('../../model/pemantauan.model') const { sendWaCreateLaporan } = require('../../services/v2/notifikasi.service') const isUnique = require('../../middleware/isUnique') const { CREATE_LAPORAN, PELAPORAN, DIKTI, TRUE, LLDIKTI, PENJADWALAN, PEMERIKSAAN, PTB_DIKTI, PTB_LLDIKTI, PTB_PT, PTB_ADMIN, PTB_READ, FALSE, DELEGASI, DITUTUP, UPDATE_LAPORAN } = require('../../utils/constanta') const forRole = require('../../middleware/role') const handleDokumen = require('../../utils/handleDokumen') const pddiktiService = require('../../services/v2/pddikti.service') exports.create = [ auth, uploadFile.array('dokumen'), validation((req) => req.body, { no_laporan: 'string', pt_id: 'string', pelanggaran_id: 'string', keterangan: 'string' }), isUnique((req) => req.body.no_laporan, (no_laporan) => laporanModel.findOne({ no_laporan })), checkData((req) => req.body.pt_id, (pt_id) => pddiktiService.getPT(pt_id), 'pt'), checkData((req) => req.body.pelanggaran_id, (data) => { const pelanggaran_id = data.split(',') return pelanggaranModel.find({ _id: { $in: pelanggaran_id } }) }, 'pelanggaran' ), async (req, res) => { const { no_laporan, keterangan, dokumen } = req.body const { pt, pelanggaran } = req.data const user = req.user let dokumen_id = [] if (dokumen.length) dokumen_id = (await addManyDokumen(dokumen)).map(e => e._id) try { const data = await laporanModel.create({ no_laporan, user: user._id, dokumen: dokumen_id, pt: pt[0], pelanggaran: pelanggaran.map(e => e._id), keterangan, role_data: user.role.id === 2021 ? LLDIKTI : DIKTI, role_asal: user.role.id === 2021 ? LLDIKTI : DIKTI, step: [PELAPORAN], flag: PELAPORAN }) await pemantauanModel.create({ laporan: data._id, action: CREATE_LAPORAN, pt_id: pt[0].id, user: user._id, keterangan: 'Membuat Laporan', dokumen: dokumen_id, for_pt: false }) await sendWaCreateLaporan({ user, pt, keterangan, no_laporan }) } catch (e) { return response.error(res, { message: e.message, code: 500 }) } return response.success(res, { message: 'Berhasil menambah laporan', code: 201 }) } ] exports.getAll = [ auth, forRole([PTB_DIKTI, PTB_LLDIKTI, PTB_ADMIN, PTB_READ]), async (req, res) => { const user = req.user const { no_laporan, pt_id, penjadwalan, pemeriksaan, aktif, delegasi, all, sanksi, tuntas } = req.query let query = {} switch (user.role.id) { case PTB_DIKTI: query.$or = [ { role_asal: DIKTI }, { role_data: DIKTI } ] if (delegasi === TRUE) { query = { role_asal: DIKTI, role_data: LLDIKTI } } break case PTB_LLDIKTI: query.$or = [ { role_asal: LLDIKTI }, { role_data: LLDIKTI } ] if (delegasi === TRUE) { query = { role_asal: LLDIKTI, role_data: DIKTI } } query['pt.pembina.id'] = user.lembaga.id break } query.step = { $in: [PELAPORAN] } if (penjadwalan === TRUE) { query.step = { $in: [PENJADWALAN] } } if (pemeriksaan === TRUE) { query.step = { $in: [PEMERIKSAAN] } } let data try { data = await laporanModel .find(query) .populate('user') .populate({ path: 'sanksi', populate: ['pelanggaran'] }) .sort({ createdAt: -1 }) } catch (e) { return response.error(res, { message: e.message, code: 500 }) } return response.success(res, { message: 'Berhasil mendapatkan data', data }) } ] exports.getOne = [ auth, forRole([PTB_DIKTI, PTB_LLDIKTI, PTB_PT]), checkData((req) => req.params.id, (id) => laporanModel.findById(id) .populate({ path: 'user', populate: 'foto' }) .populate({ path: 'pelanggaran', select: 'pelanggaran' }) .populate({ path: 'sanksi', populate: ['pelanggaran'] }) .populate('dokumen') .populate('peserta_penetapan_sanksi.ttd') .populate({ path: 'evaluasi', populate: ['user', 'dokumen'] }) .populate('tuntas.dokumen'), 'laporan' ), async (req, res) => { const { laporan } = req.data return response.success(res, { message: 'Berhasil mendapatkan data', data: laporan }) } ] exports.update = [ auth, forRole([PTB_DIKTI, PTB_LLDIKTI, PTB_PT]), checkData((req) => req.params.id, (id) => laporanModel.findById(id), 'laporan'), (req, res, next) => { if (req.query['redudansi'] === 'true') return handleDokumen.array('dokumen')(req, res, next) return next() }, (req, res, next) => { req.body['dokumen'] = req.files return next() }, validation((req) => req.body, { change_role: { type: 'string', optional: true, enum: [TRUE, FALSE] }, aktif: { type: 'string', optional: true, enum: [TRUE, FALSE] }, keterangan: 'string' }), async (req, res) => { let { keterangan, dokumen } = req.body const user = req.user const data = {} let message = '' const { change_role, aktif } = req.body const { laporan } = req.data if (change_role === 'true') { data.flag = DELEGASI data.role_data = user.role.id === 2020 ? LLDIKTI : DIKTI message = `Laporan didelegasi ke ${user.role.id === 2020 ? LLDIKTI : DIKTI}` data.alasan_delegasi = keterangan } if (aktif) { data.aktif = aktif === TRUE let dokumen_id = [] if (dokumen) dokumen_id = (await addManyDokumen(dokumen)).map((e) => e._id) if (aktif === TRUE) { message = 'Laporan dibuka' } else { message = `Laporan ditutup` alasan = keterangan data.flag = DITUTUP data.tuntas = { keterangan, dokumen: dokumen_id } data.sebelum_ditutup = { step : laporan.step } data.step = [] } } await laporanModel.findByIdAndUpdate(laporan._id, data) await pemantauanModel.create({ action: UPDATE_LAPORAN, laporan: laporan._id, pt_id: laporan.pt.id, user: user._id, keterangan: message, alasan: keterangan, for_pt: false }) return response.success(res, { message: 'Berhasil update laporan' }) } ]