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 { addDokumen, addManyDokumen } = require('../utils/dokumenFunction') const userModel = require('../model/user.model') const { cekSatuDataLaporan, cekBanyakDataLaporan } = require('../utils/cekData') exports.create = handleError(async (req, res) => { 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) return response.error(res, { message: 'pt_id tidak ditemukan', }) const files = req.files 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' }) const user = req.user 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', } data = await laporanModel.create(data) await pemantauanModel.create({ laporan: data._id, 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, }) 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 } = 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 (jadwal === 'true') { where.jadwal = { $exists: true, $ne: null, } } else if (evaluasi === 'true') { where.evaluasi = { $exists: true, $ne: null, $not: { $size: 0, }, } } 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 } = req.query const where = { } if (aktif) where.aktif = aktif === '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'] }, }) if (!isValid) return const data = {} let keterangan = '' const { change_role, aktif } = req.body if (change_role === 'true') { data.role_data = user.role.id === 2020 ? 'lldikti' : 'dikti' keterangan = `Delegasi ke ${user.role.id === 2020 ? 'LLDIKTI' : 'DIKTI'}` 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' } } const update = await laporanModel.findByIdAndUpdate(laporan._id, data) if (change_role || aktif) { await pemantauanModel.create({ laporan: laporan._id, pt_id: laporan.pt.id, user: user._id, keterangan, for_pt: false, }) } return response.success(res, { message: 'Berhasil update laporan', data: update, }) })