const handleError = require('../../utils/v1/handleError') const response = require('../../utils/responseHandler') const laporanModel = require('../../model/laporan.model') const pelanggaranModel = require('../../model/pelanggaran.model') const pemantauanModel = require('../../model/pemantauan.model') const { validate } = require('../../utils/v1/validation') const { notifWA } = require('../../utils/v1/notifFunction') const { addManyDokumen } = require('../../utils/dokumenFunction') const userModel = require('../../model/user.model') const { cekSatuDataLaporan, cekBanyakDataLaporan, } = require('../../utils/v1/cekData') const { TEMPLATE_LAPORAN, PELAPORAN, CREATE_LAPORAN, DIKTI, LLDIKTI, DITUTUP, DELEGASI, TRUE, FALSE, ADD_JADWAL, PTB_DIKTI, PTB_ADMIN, PTB_READ, SUCCESS, UPDATE_LAPORAN, DITERIMA } = require('../../utils/constanta') const logModel = require('../../model/log.model') const kontakModel = require('../../model/kontak.model') const { isValidObjectId } = require('mongoose') const roleId = require('../../middleware/role') const pddiktiService = require('../../services/v2/pddikti.service') exports.create = handleError(async (req, res) => { const user = req.user const files = req.files const isValid = validate(res, req.body, { no_laporan: 'string', pt_id: 'string', pelanggaran_id: 'string', keterangan: 'string', }) if (!isValid) return const { no_laporan, pt_id, keterangan } = req.body let { pelanggaran_id } = req.body const pt = await pddiktiService.getPT(pt_id) if (pt.length === 0) return response.error(res, { message: 'pt_id tidak ditemukan', }) let dokumen_id = [] if (files.length) { const dokumen = await addManyDokumen(files) dokumen_id = dokumen.map((e) => e._id) } pelanggaran_id = pelanggaran_id.split(',') const pelanggaran = await pelanggaranModel.find({ _id: { $in: pelanggaran_id, }, }) if (!pelanggaran.length) return response.error(res, { message: 'pelanggaran_id tidak ada' }) let data = { no_laporan, user: user._id, dokumen: dokumen_id, pt: pt[0], pelanggaran: pelanggaran_id, keterangan, role_data: user.role.id === 2021 ? LLDIKTI : DIKTI, role_asal: user.role.id === 2021 ? LLDIKTI : DIKTI, level: 2, step: [PELAPORAN], flag: PELAPORAN, } data = await laporanModel.create(data) let contacts = await kontakModel.find() contacts = contacts.map((e) => e.nama).join(', ') try { const notif = await notifWA(TEMPLATE_LAPORAN, [ { key: '1', value: 'nama', value_text: user.nama, }, { key: '2', value: 'pt', value_text: pt[0].nama }, { key: '3', value: 'keterangan', value_text: keterangan }, { key: '4', value: 'no_laporan', value_text: no_laporan }, ]) if (notif[0].status === SUCCESS) { await logModel.create({ aktivitas: `Server berhasil mengirim notif wa kepada ${contacts} untuk Pembuatan Laporan`, }) } else { await logModel.create({ aktivitas: `Server gagal mengirim notif wa kepada ${contacts} untuk Pembuatan Laporan, Error: ${JSON.stringify(notif)}`, }) } } catch (error) { await logModel.create({ aktivitas: `Server gagal mengirim notif wa kepada ${contacts} untuk Pembuatan Laporan, Error: ${error.message}`, }) } 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, }) return response.success(res, { message: 'Berhasil menambah laporan', data, }) }) exports.public = handleError(async (req, res) => { const user = req.user const no_laporan = req.no_laporan let level = req.level const files = req.files const isValid = validate(res, req.body, { pt_id: 'string', pelanggaran_id: 'string', keterangan: 'string', }) if (!isValid) return const { pt_id, keterangan, no_verifikasi } = req.body let { pelanggaran_id } = req.body if (no_verifikasi && user.no_verifikasi !== no_verifikasi) { return response.error(res, { message: 'no_verifikasi tidak sesuai', error: { no_verifikasi: 'No. Verifikasi tidak sesuai' }, }) } else if (no_verifikasi && user.no_verifikasi === no_verifikasi) { level = 3 } const pt = await pddiktiService.getPT(pt_id) if (pt.length === 0) return response.error(res, { message: 'pt_id tidak ditemukan', }) let dokumen_id = [] if (files.length) { const dokumen = await addManyDokumen(files) dokumen_id = dokumen.map((e) => e._id) } pelanggaran_id = pelanggaran_id.split(',') const pelanggaran = await pelanggaranModel.find({ _id: { $in: pelanggaran_id, }, }) if (!pelanggaran.length) return response.error(res, { message: 'pelanggaran_id tidak ada' }) let data = { no_laporan, user: user._id, dokumen: dokumen_id, pt: pt[0], pelanggaran: pelanggaran_id, keterangan, role_data: DIKTI, role_asal: DIKTI, level, } data = await laporanModel.create(data) 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, }) if (no_verifikasi) await userModel.findByIdAndUpdate(user._id, { verified: true }) let contacts = await kontakModel.find() contacts = contacts.map((e) => e.nama).join(', ') try { const notif = await notifWA(TEMPLATE_LAPORAN, [ { key: '1', value: 'nama', value_text: user.isPrivate || !user.nama ? 'rahasia' : user.nama, }, { key: '2', value: 'pt', value_text: pt[0].nama }, { key: '3', value: 'keterangan', value_text: keterangan }, { key: '4', value: 'no_laporan', value_text: no_laporan }, ]) if (notif[0].status === SUCCESS) { await logModel.create({ aktivitas: `Server berhasil mengirim notif wa kepada ${contacts} untuk Pembuatan Laporan`, }) } else { await logModel.create({ aktivitas: `Server gagal mengirim notif wa kepada ${contacts} untuk Pembuatan Laporan, Error: ${JSON.stringify(notif)}`, }) } } catch (error) { await logModel.create({ aktivitas: `Server gagal mengirim notif wa kepada ${contacts} untuk Pembuatan Laporan, Error: ${error.message}`, }) } return response.success(res, { message: 'Berhasil menambah laporan', data, }) }) exports.getLaporanByNoLaporanAndId = handleError(async (req, res) => { const { no_laporan } = req.params let where = { evaluasi: { $exists: true, $ne: [] } } if (isValidObjectId(no_laporan)) where._id = no_laporan else where.no_laporan = no_laporan const data = await laporanModel.findOne(where) .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'] }) if (!data) { return response.error(res, { message: 'no_laporan atau id tidak ada', code: 404, }) } return response.success(res, { message: 'Berhasil ambil data laporan', data, }) }) exports.getAll = handleError(async (req, res) => { const user = req.user const where = {} const { no_laporan, pt_id, jadwal, evaluasi, aktif, delegasi, all, sanksi, tuntas } = req.query if (no_laporan) where.no_laporan = no_laporan if (pt_id) where['pt.id'] = pt_id if (aktif) where.aktif = aktif === TRUE if (all) where.all = true else if (delegasi) where.delegasi = delegasi === TRUE if (jadwal === TRUE) { where.jadwal = { $exists: true, $ne: null, } } else if (evaluasi === TRUE) { where.evaluasi = { $exists: true, $ne: null, $not: { $size: 0, }, } } else if (sanksi === TRUE) { where.sanksi = { $exists: true, $ne: null, } } else if (tuntas === TRUE) { let dataLaporan = (await cekBanyakDataLaporan(user, { aktif: 'empty', all: true, }, { lean: true })) .filter(e => e.aktif === false || e.sanksi?.aktif === false) .map(e => ({ ...e, status: e.aktif === false || e.tuntas?.keterangan ? 'Ditutup' : e.sanksi?.jawaban?.cabut_sanksi?.status === 'Diterima' ? 'Diterima' : !e.sanksi?.masa_berlaku ? 'Selesai' : 'Ditutup' })) return response.success(res, { message: 'Berhasil ambil data laporan dan sanksi tuntas dan ditutup', data: dataLaporan }) } let data = (await cekBanyakDataLaporan(user, where)) if (!all) data = data.filter(e => !e.sanksi || e.sanksi?.aktif === true) return response.success(res, { message: 'Berhasil ambil data laporan', data, }) }) exports.getOne = handleError(async (req, res) => { const { id } = req.params const user = req.user const { aktif, delegasi, all } = req.query const where = {} if (aktif) where.aktif = aktif === TRUE if (all) where.all = true else if (delegasi) where.delegasi = delegasi === TRUE const data = await cekSatuDataLaporan(res, user, id, { normal: true }) if (!data) return return response.success(res, { message: 'Berhasil ambil data Laporan', data, }) }) exports.update = handleError(async (req, res) => { const { id } = req.params const user = req.user const files = req.files const laporan = await cekSatuDataLaporan(res, user, id, { normal: true }) if (!laporan) return const isValid = validate(res, req.body, { change_role: { type: 'string', optional: true, enum: [TRUE, FALSE] }, aktif: { type: 'string', optional: true, enum: [TRUE, FALSE] }, keterangan: 'string', }) if (!isValid) return const data = {} let keterangan = '' let alasan = '' const { change_role, aktif } = req.body const keterangan2 = req.body.keterangan if (change_role === TRUE) { data.flag = DELEGASI data.role_data = user.role.id === 2020 ? 'lldikti' : 'dikti' keterangan = `Laporan didelegasi ke ${user.role.id === 2020 ? 'LLDIKTI' : 'DIKTI'}` alasan = keterangan2 data.alasan_delegasi = keterangan2 } if (aktif) { let dokumen_id = [] data.aktif = aktif === TRUE if (files) { const dokumen = await addManyDokumen(files) dokumen_id = dokumen.map((e) => e._id) } if (aktif === 'true') { keterangan = 'Laporan dibuka' } else { keterangan = `Laporan ditutup` alasan = keterangan2 data.flag = DITUTUP data.tuntas = { keterangan: keterangan2, dokumen: dokumen_id, } } } const update = await laporanModel.findByIdAndUpdate(laporan._id, data) if (change_role || aktif) { await pemantauanModel.create({ action: UPDATE_LAPORAN, laporan: laporan._id, pt_id: laporan.pt.id, user: user._id, keterangan, alasan, for_pt: false, }) } return response.success(res, { message: 'Berhasil update laporan', data: update, }) }) exports.jumlahLaporan = handleError(async (req, res) => { const laporan = await laporanModel.aggregate([ { $match: { aktif: true, }, }, { $group: { _id: '$pt.pembina.nama', jumlah_laporan: { $sum: 1, }, propinsi: { $addToSet: '$pt.propinsi.nama', }, }, }, { $sort: { _id: 1, }, }, ]) return response.success(res, { message: 'Jumlah Laporan', data: laporan, }) }) exports.laporanByPembina = [ roleId([PTB_DIKTI,PTB_ADMIN, PTB_READ]), handleError(async (req, res) => { const { idPembina } = req.params const { penjadwalan, pemeriksaan, sanksi, keberatan, banding, perbaikan, cabutSanksi, delegasi, ditutup, diterima } = req.query let where = {} let where2 = {} let isLaporan = true let isSanksi = false if (penjadwalan === TRUE) { where.jadwal = { $exists: true, $ne: null, } isLaporan = true isSanksi = false } if (pemeriksaan === TRUE) { where.evaluasi = { $exists: true, $ne: null, $not: { $size: 0, }, } isLaporan = true isSanksi = false } if (sanksi === TRUE) { where.sanksi = { $exists: true, $ne: null, } isLaporan = false isSanksi = true } if (keberatan === TRUE) { where2['pengajuan.keberatan'] = { $exists: true, $ne: null } isLaporan = false isSanksi = true } if (banding === TRUE) { where2['pengajuan.banding'] = { $exists: true, $ne: null } isLaporan = false isSanksi = true } if (cabutSanksi === TRUE) { where2['pengajuan.cabut_sanksi'] = { $exists: true, $ne: null, } isLaporan = false isSanksi = true } if (perbaikan === TRUE) { where2.perbaikan = { $exists: true, $ne: null, $not: { $size: 0, }, } isLaporan = false isSanksi = true } if (delegasi === TRUE) { where = { role_asal: DIKTI, role_data: LLDIKTI } isLaporan = true isSanksi = false } if (ditutup === TRUE) { where.aktif = false isLaporan = true isSanksi = false } if (diterima === TRUE) { where2 = { 'jawaban.cabut_sanksi.status': DITERIMA, aktif: false } isLaporan = false isSanksi = true } let laporan = [] if (isSanksi) { laporan = (await laporanModel.find({ ...where, 'pt.pembina.id': idPembina }).lean().populate({ path: 'sanksi', match: where2 }).lean()) .filter(e => e.sanksi) .map(e => { let step = 'Pelaporan' if (e.jadwal && !e.evaluasi.length) step = 'Penjadwalan' else if (e.evaluasi.length && !e.sanksi) step = 'Pemeriksaan' else if (e.sanksi?.pengajuan?.cabut_sanksi) step = 'Cabut Sanksi' else if (e.sanksi?.pengajuan?.keberatan && !e.sanksi?.pengajuan?.banding) step = 'Keberatan' else if (e.sanksi?.aktif === false && !e.sanksi?.masa_berlaku?.from_date) step = 'Selesai' else if (e.sanksi?.aktif === false && e.jawaban?.cabut_sanksi?.status === 'Diterima') step = 'Diterima' else if (e.sanksi?.pengajuan?.banding) step = 'Banding' else if (e.sanksi) step = 'Sanksi' return { ...e, step } }) } else if (isLaporan) { laporan = (await laporanModel.find({ ...where, 'pt.pembina.id': idPembina }).lean().populate({ path: 'sanksi', match: where2 }).lean()) .map(e => { let step = 'Pelaporan' if (e.jadwal && !e.evaluasi.length) step = 'Penjadwalan' else if (e.evaluasi.length && !e.sanksi) step = 'Pemeriksaan' else if (e.sanksi?.pengajuan?.cabut_sanksi) step = 'Cabut Sanksi' else if (e.sanksi?.pengajuan?.keberatan && !e.sanksi?.pengajuan?.banding) step = 'Keberatan' else if (e.sanksi?.aktif === false && !e.sanksi?.masa_berlaku?.from_date) step = 'Selesai' else if (e.sanksi?.aktif === false && e.jawaban?.cabut_sanksi?.status === 'Diterima') step = 'Diterima' else if (e.sanksi?.pengajuan?.banding) step = 'Banding' else if (e.sanksi) step = 'Sanksi' return { ...e, step } }) } return response.success(res, { message: 'berhasil get laporan by pembina', data: laporan, }) })] exports.getOneLaporanPublic = handleError(async (req, res) => { const { id } = req.params const data = await 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'] }) console.log(data) if (!data) return response.error(res, { code: 404, message: 'laporan_id tidak ada' }) return response.success(res, { message: 'Berhasil ambil satu data Laporan', data, }) })