const axios = require('../utils/axios') const handleError = require('../utils/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/validation') const { notifWA } = require('../utils/notifFunction') const { addManyDokumen } = require('../utils/dokumenFunction') const userModel = require('../model/user.model') const { cekSatuDataLaporan, cekBanyakDataLaporan, cekBanyakDataSanksi, } = require('../utils/cekData') const { TEMPLATE_LAPORAN } = require('../utils/constanta') const logModel = require('../model/log.model') const kontakModel = require('../model/kontak.model') 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 axios.get( `https://api.kemdikbud.go.id:8243/pddikti/1.2/pt/${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 === 2020 ? 'dikti' : 'lldikti', role_asal: user.role.id === 2020 ? 'dikti' : 'lldikti', level: 2, } data = await laporanModel.create(data) 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 }, ]) let contacts = await kontakModel.find() contacts = contacts.map((e) => e.nama).join(', ') if (notif[0].status == 'success') { await logModel.create({ aktivitas: `Server berhasil mengirim notif wa kepada ${contacts} untuk Pembuatan Laporan`, }) } 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 isValid = validate(res, req.body, { // nama: 'string', // email: 'email', // alamat: 'string', // no_hp: 'string', // no_laporan: 'string', // pt_id: 'string', // pelanggaran_id: 'string', // keterangan: 'string', // is_private: { type: 'string', enum: ['true', 'false'] }, // }) // if (!isValid) return // const { // no_laporan, // pt_id, // keterangan, // nama, // email, // alamat, // no_hp, // is_private, // } = req.body // let { pelanggaran_id } = req.body // const pt = await axios.get( // `https://api.kemdikbud.go.id:8243/pddikti/1.2/pt/${pt_id}` // ) // if (!pt) { // return response.error(res, { // message: 'pt_id tidak ditemukan', // }) // } // const { dokumen, foto } = req.files // if (!foto.length) { // return response.error(res, { // message: 'foto harus ada', // }) // } // const foto_id = await addDokumen(foto[0]) // const user = await userModel.create({ // nama, // email, // no_hp, // alamat, // isPublic: true, // isPrivate: is_private === 'true', // foto: foto_id, // }) // let dokumen_id = [] // if (dokumen?.length) { // const dataDokumen = await addManyDokumen(dokumen) // dokumen_id = dataDokumen.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', // } // data = await laporanModel.create(data) // await pemantauanModel.create({ // laporan: data._id, // pt_id: pt[0].id, // user: user._id, // keterangan: 'Mengajukan Laporan', // dokumen: dokumen_id, // for_pt: false, // }) // await notifWA('d5609c3c-e9e9-4dbe-9a4e-e8fa772d6770', [ // { key: '1', value: 'nama', value_text: 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 }, // ]) // 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', // no_verifikasi: '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 axios.get( `https://api.kemdikbud.go.id:8243/pddikti/1.2/pt/${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 }) 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 }, ]) let contacts = await kontakModel.find() contacts = contacts.map((e) => e.nama).join(', ') if (notif[0].status == 'success') { await logModel.create({ aktivitas: `Server berhasil mengirim notif wa kepada ${contacts} untuk Pembuatan Laporan`, }) } return response.success(res, { message: 'Berhasil menambah 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 } = 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, } } let data = await cekBanyakDataLaporan(user, where) 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, where) 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 laporan = await cekSatuDataLaporan(res, user, id) 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.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 (laporan.jadwal) { // await laporanModel.findByIdAndUpdate(laporan._id, { // $unset: { jadwal: 1 }, // }) // } } if (aktif) { data.aktif = aktif === 'true' if (aktif === 'true') { keterangan = 'Laporan dibuka' } else { keterangan = `Laporan ditutup` alasan = keterangan2 } } 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 = handleError(async (req, res) => { const { idPembina } = req.params const { penjadwalan, pemeriksaan, sanksi, keberatan, banding, perbaikan, cabutSanksi, } = req.query const user = req.user const where = {} let isLaporan = true let isSanksi = true 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') { where['pengajuan.keberatan'] = { $exists: true, $ne: null } isLaporan = false isSanksi = true } if (banding === 'true') { where.banding = true where['pengajuan.keberatan'] = { $exists: true, $ne: null } where['jawaban.keberatan'] = { $exists: true, $ne: null } where['pengajuan.banding'] = { $exists: true, $ne: null } isLaporan = false isSanksi = true } if (cabutSanksi === 'true') { where.perbaikan = { $exists: true, $ne: null, $not: { $size: 0, }, } isLaporan = false isSanksi = true } if (perbaikan === 'true') { where['jawaban.banding'] = { $exists: true, $ne: null } isLaporan = false isSanksi = true } const [laporan, dataSanksi] = await Promise.all([ (async () => isLaporan ? await cekBanyakDataLaporan(user, { 'pt.pembina.id': idPembina, all: true, ...where, }) : [])(), (async () => isSanksi ? ( await cekBanyakDataSanksi( user, { all: true, ...where }, { ['pt.pembina.id']: idPembina, } ) ).filter((e) => e.laporan != null) : [])(), ]) return response.success(res, { message: 'berhasil get laporan by pembina', data: { laporan, sanksi: dataSanksi }, }) })