const laporanModel = require('../model/laporan.model') const pelanggaranModel = require('../model/pelanggaran.model') const sanksiModel = require('../model/sanksi.model') const response = require('../utils/responseHandler') exports.cekSatuDataLaporan = async ( res, user, laporan_id, where = { delegasi: false, aktif: true } ) => { const w = { _id: laporan_id, aktif: where.aktif || true, ...where } switch (user.role.id) { case 2020: if (where.all) { // w.role_asal = 'dikti' // w['$or'] = [ // { role_asal : 'dikti' }, // { role_asal: 'lldikti', role_data: 'dikti' }, // ] break } else if (!where.delegasi) { w.role_data = 'dikti' } else { w.role_data = 'lldikti' w.role_asal = 'dikti' } break case 2021: 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 2022: w['pt.id'] = user.lembaga.id break } 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('evaluasi.user') if (!laporan) { response.error(res, { message: 'laporan_id tidak ada', code: 404, }) return false } return laporan } exports.cekBanyakDataLaporan = async (user, where = { delegasi: false }) => { const w = { aktif: where.aktif || true, ...where } switch (user.role.id) { case 2020: if (where.all) { // w.role_asal = 'dikti' // w['$or'] = [ // { role_asal : 'dikti' }, // { role_asal: 'lldikti', role_data: 'dikti' }, // ] break } else if (!where.delegasi) { w.role_data = 'dikti' } else { w.role_data = 'lldikti' w.role_asal = 'dikti' } break case 2021: 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 2022: w['pt.id'] = user.lembaga.id break } const data = await laporanModel .find(w) .populate('user') .populate({ path: 'sanksi', populate: ['pelanggaran'] }) .select(w.select || ' -pelanggaran -aktif -dokumen') .limit(w.limit) .sort({ createdAt: -1, }) return data } exports.cekSatuDataSanksi = async ( res, user, sanksi_id, where = { banding: false } ) => { const w = { aktif: where.aktif || true } switch (user.role.id) { case 2020: // if (where.all) w.role_asal = '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 2021: w['pt.pembina.id'] = user.lembaga.id // w.role_data = 'lldikti' if (!where.banding) w.role_data = 'lldikti' break case 2022: w['pt.id'] = user.lembaga.id break } 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) w.role_asal = 'dikti' 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' // else if (!where.banding) 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 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 2020: return e.pelanggaran.some(e2 => e2.level_sanksi !== 1) && e.laporan !== null case 2021: return e.pelanggaran.filter(e2 => e2.level_sanksi === 1).length === e.pelanggaran.length && e.laporan !== null } } 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 = async (user, where, aggregate) => { const w = { ...where } 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 } const laporan = await laporanModel.aggregate([ { $match: w }, { $group: aggregate }, { $sort: { ['_id.bulan']: 1, }, }, ]) return laporan }