const laporanModel = require('../../model/laporan.model') const pelanggaranModel = require('../../model/pelanggaran.model') const sanksiModel = require('../../model/sanksi.model') const response = require('../responseHandler') const { DIKTI, LLDIKTI, PTB_DIKTI, PTB_LLDIKTI, PTB_PT } = require('../constanta') exports.cekSatuDataLaporan = async ( res, user, laporan_id, where = { delegasi: false, aktif: true } ) => { let w = { _id: laporan_id, ...where } switch (user.role.id) { case PTB_DIKTI: if (where.all) { break } else if (!where.delegasi) { w.role_data = DIKTI } else { w.role_data = LLDIKTI w.role_asal = DIKTI } break case PTB_LLDIKTI: 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 { w.role_asal = LLDIKTI w.role_data = DIKTI w['pt.pembina.id'] = user.lembaga.id } break case PTB_PT: w['pt.id'] = user.lembaga.id break } if (where.normal) w = { _id: laporan_id } const laporan = await laporanModel .findOne(w) .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') if (!laporan) { response.error(res, { message: 'laporan_id tidak ada', code: 404, }) return false } return laporan } exports.cekBanyakDataLaporan = async (user, where = { delegasi: false }, options = {}) => { const w = { ...where } if (where.aktif !== 'empty') w.aktif = where.aktif || true else delete w.aktif switch (user.role.id) { case PTB_DIKTI: if (where.all) break else if (where.delegasi) { w.role_data = LLDIKTI w.role_asal = DIKTI } else w.role_data = DIKTI break case PTB_LLDIKTI: 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 { w.role_asal = LLDIKTI w.role_data = DIKTI w['pt.pembina.id'] = user.lembaga.id } break case PTB_PT: w['pt.id'] = user.lembaga.id break } let laporan = laporanModel .find(w) .populate('user') .populate({ path: 'sanksi', populate: ['pelanggaran'] }) .select(w.select || ' -pelanggaran -dokumen') .limit(w.limit) .sort({ createdAt: -1, }) if (options.lean) laporan = laporan.lean() return laporan } exports.cekSatuDataSanksi = async ( res, user, sanksi_id, where = { banding: false } ) => { let w = {} switch (user.role.id) { case PTB_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 PTB_LLDIKTI: w['pt.pembina.id'] = user.lembaga.id if (!where.banding) w.role_data = LLDIKTI break case PTB_PT: w['pt.id'] = user.lembaga.id break } if (where.normal) w = { _id: sanksi_id } let sanksi = await sanksiModel .findOne({ _id: sanksi_id, ...where }) .populate({ path: 'laporan', select: w.select, match: w, }) .populate('dokumen') .populate('berita_acara') .populate('pelanggaran') .populate('user') .populate('dokumen_terima_sanksi') .populate('pengajuan.keberatan.dokumen') .populate('jawaban.keberatan.dokumen') .populate('jawaban.keberatan.dokumen_terima_keberatan') .populate('pengajuan.banding.dokumen') .populate('pengajuan.update_tmt.dokumen') .populate('jawaban.banding.dokumen') .populate('jawaban.banding.dokumen_terima_banding') .populate('pengajuan.cabut_sanksi.dokumen') .populate('jawaban.cabut_sanksi.dokumen') .populate('rekomendasi.dokumen') .populate('perbaikan.dokumen') .populate('riwayat_sanksi.dokumen') .populate('riwayat_sanksi.perbaikan.dokumen') if (!sanksi?.laporan) { response.error(res, { message: 'sanksi_id tidak ada', code: 404, }) return false } return sanksi } exports.cekBanyakDataSanksi = async (user, where = {}, q = {}) => { const w = { ...q } switch (user.role.id) { case 2020: if (where.all) break else if (where.delegasi) { w.role_data = LLDIKTI w.role_asal = DIKTI } else if (where.banding) w.level_sanksi = { $in: [2, 3], } else w.role_data = DIKTI break case 2021: w['pt.pembina.id'] = user.lembaga.id if (where.banding) w.level_sanksi = 1 else w.role_data = LLDIKTI break case 2022: w['pt.id'] = user.lembaga.id where['masa_berlaku.from_date'] = { $exists: true, $ne: null, $lte: new Date() } break } let data = await sanksiModel .find({ ...where }) .populate({ path: 'laporan', select: w.select || '-sanksi', match: w, populate: ['pelanggaran'], }) .populate('user') .populate('pelanggaran') .populate('riwayat_sanksi.dokumen') .select('-dokumen') .sort({ createdAt: -1, }) data = data.filter((e) => { if (where.banding) { switch (user.role.id) { case PTB_DIKTI: return e.pelanggaran.some(e2 => e2.level_sanksi !== 1) && e.laporan !== null case PTB_LLDIKTI: return e.pelanggaran.filter(e2 => e2.level_sanksi === 1).length === e.pelanggaran.length && e.laporan !== null default: return true } } return e.laporan !== null }) return data } exports.cekBanyakDataDokumen = async (res, files) => { if (!files.length) { response.error(res, { message: 'dokumen harus ada', }) return false } const dokumen = await addManyDokumen(files) return dokumen.map((e) => e._id) } exports.cekBanyakDataPelanggaran = async (res, pelanggaran_id) => { id_pelanggaran = pelanggaran_id.split(',') const pelanggaran = await pelanggaranModel.find({ _id: { $in: id_pelanggaran, }, }) if (!pelanggaran.length) { response.error(res, { message: 'pelanggaran_id tidak ada' }) return false } return pelanggaran.map((e) => e._id) } exports.dataLaporanAggregate = (user, where, aggregate) => { const w = { ...where } switch (user.role.id) { case PTB_DIKTI: w.$or = [{ role_asal: DIKTI }, { role_data: DIKTI }] break case PTB_LLDIKTI: w.$or = [{ role_asal: LLDIKTI }, { role_data: LLDIKTI }] w['pt.pembina.id'] = user.lembaga.id break } return laporanModel.aggregate([ { $match: w }, { $group: aggregate }, { $sort: { '_id.bulan': 1, }, }, ]) }