const auth = require('../../middleware/verifyToken') const forRole = require('../../middleware/role') const { PTB_DIKTI, PTB_LLDIKTI, SELESAI, CREATE_SANKSI, PTB_PT, PTB_ADMIN, PTB_READ, TRUE, KEBERATAN, BANDING, CABUT_SANKSI, PERBAIKAN, LLDIKTI, DIKTI, FALSE, UPDATE_LAPORAN, UPDATE_SANKSI } = require('../../utils/constanta') const checkData = require('../../middleware/checkData') const laporanModel = require('../../model/laporan.model') const sanksiModel = require('../../model/sanksi.model') const uploadFile = require('../../middleware/uploadFile') const { validation } = require('../../middleware/validation') const pelanggaranModel = require('../../model/pelanggaran.model') const response = require('../../utils/responseHandler') const { addManyDokumen } = require('../../utils/dokumenFunction') const isUnique = require('../../middleware/isUnique') const autoSaveModel = require('../../model/autoSave.model') const { hariKerja } = require('../../utils/hariKerja') const pemantauanModel = require('../../model/pemantauan.model') const { SANKSI } = require('../../utils/constanta') const logModel = require('../../model/log.model') const pddiktiService = require('../../services/v2/pddikti.service') exports.create = [ auth, forRole([PTB_DIKTI, PTB_LLDIKTI]), checkData((req) => req.params.laporan_id, async (id) => laporanModel.findByIdAndUpdate(id), 'laporan'), uploadFile.fields([{ name: 'dokumen' }, { name: 'dokumen_berita_acara' }]), validation((req) => req.body, { no_sanksi: 'string', keterangan: 'string', pelanggaran_id: 'string', tanggal_terima_sanksi: { type: 'date', convert: true }, tanggal_akhir_keberatan: { type: 'date', convert: true }, dokumen: { type: 'array', items: { type: 'object', buffer: { type: 'class', instanceOf: Buffer } } } }), checkData((req) => req.body.pelanggaran_id, (data) => { const pelanggaran_id = data.split(',') return pelanggaranModel.find({ _id: { $in: pelanggaran_id } }) }, 'pelanggaran' ), isUnique((req) => req.params.laporan_id, (id) => sanksiModel.findOne({ laporan: id })), async (req, res) => { const { no_sanksi, keterangan, from_date, to_date, tanggal_terima_sanksi, tanggal_akhir_keberatan, dokumen_terima_sanksi, dokumen } = req.body const { laporan, pelanggaran } = req.data const user = req.user const dokumen_id = (await addManyDokumen(dokumen)).map((e) => e._id) let dokumenTerimaSanksi_id = [] if (dokumen_terima_sanksi) dokumenTerimaSanksi_id = (await addManyDokumen(dokumen_terima_sanksi)).map((e) => e._id) const data = await sanksiModel.create({ no_sanksi, laporan: laporan._id, user: user._id, pelanggaran: pelanggaran.map(e => e._id), keterangan, dokumen: dokumen_id, sanksi: pelanggaran.map(e => ({ label: e.label_sanksi, value: e.sanksi, level: e.level_sanksi })), tanggal_terima_sanksi, dokumen_terima_sanksi: dokumenTerimaSanksi_id, tanggal_akhir_keberatan, masa_berlaku: from_date && to_date ? { from_date, to_date } : null, batas_waktu: from_date ? { keberatan: hariKerja(10, from_date) } : null, aktif: !!from_date }) const autoSave = await autoSaveModel.findOne({ laporan_id: laporan._id }).populate('laporan') await laporanModel.findByIdAndUpdate(laporan._id, { sanksi: data._id, berita_acara: autoSave?.laporan?.PenetapanSanksi, flag: from_date ? SANKSI : SELESAI, $push: { step: from_date ? SANKSI : SELESAI } }) await pemantauanModel.create({ laporan: laporan._id, sanksi: data._id, action: CREATE_SANKSI, pt_id: laporan.pt.id, user: user._id, keterangan: 'Melakukan penetapan Sanksi', dokumen: dokumen_id }) return response.success(res, { message: 'Berhasil menambahkan sanksi', code: 201 }) } ] exports.updatePDDIKTI = [ auth, forRole([PTB_DIKTI, PTB_LLDIKTI]), checkData((req) => req.params.laporan_id, async (id) => sanksiModel.findOne({ _id: sanksi_id }).populate('pelanggaran').populate('laporan'), 'sanksi'), async (req, res) => { const { sanksi } = req.data const user = req.user try { await pddiktiService.updatePDDIKTI({ ptKode: sanksi.laporan.pt.kode, noSanksi: sanksi.no_sanksi, terimaSanksi: sanksi.tanggal_terima_sanksi, fromDate: sanksi.masa_berlaku.from_date, pelanggaran: sanksi.pelanggaran }) await logModel.create({ user: user._id, aktivitas: `Server berhasil mengirimkan data Ke API PDDIKTI untuk update Status PT ${sanksi.laporan.pt.nama}` }) } catch (e) { await Promise.all([ laporanModel.updateOne({ _id: laporan._id }, { sanksi: null }), sanksiModel.deleteOne({ _id: data._id }), logModel.create({ user: user._id, aktivitas: `Server gagal mengirimkan data Ke API PDDIKTI untuk update Status PT ${sanksi.laporan.pt.nama}, dengan error ${e.message}` }), pemantauanModel.deleteOne({ laporan: sanksi.laporan._id, sanksi: sanksi._id, action: CREATE_SANKSI }) ]) return response.error(res, { message: 'Gagal Membuat Sanksi', error: e.message }) } return response.success(res, { message: 'Berhasil mengirim data ke PDDIKTI' }) } ] exports.getAll = [ auth, forRole([PTB_DIKTI, PTB_LLDIKTI, PTB_PT, PTB_ADMIN, PTB_READ]), async (req, res) => { const user = req.user const { keberatan, jawaban, banding, cabutSanksi, perbaikan, aktif, delegasi, naikSanksi, turunSanksi, pengajuan_keberatan, bypassCabutSanksi } = req.query const query = {} const query2 = {} switch (user.role.id) { case PTB_DIKTI: query2.role_data = DIKTI break case PTB_LLDIKTI: query2['pt.pembina.id'] = user.lembaga.id query2.role_data = LLDIKTI break case PTB_PT: query['masa_berlaku.from_date'] = { $exists: true, $ne: null, $lt: new Date() } query['masa_berlaku.to_date'] = { $exists: true, $ne: null, $gte: new Date() } query2['pt.id'] = user.lembaga.id query2.step = { $in: [SANKSI] } break } if (keberatan === TRUE) { query2.step = { $in: [KEBERATAN] } if (jawaban === TRUE) { query.pengajuan = { keberatan: { $exists: true, $ne: null } } } } if (banding === TRUE) { query2.step = { $in: [BANDING] } if (jawaban === TRUE) { query.pengajuan = { banding: { $exists: true, $ne: null } } } } if (perbaikan === TRUE) query2.step = { $in: [PERBAIKAN] } if (cabutSanksi === TRUE) { query2.step = { $in: [CABUT_SANKSI] } if (jawaban === TRUE) { query.pengajuan = { cabut_sanksi: { $exists: true, $ne: null } } } } const data = (await sanksiModel.find(query).populate({ path: 'laporan', match: query2 })).filter(e => e.laporan !== null) return response.success(res, { message: 'Berhasil mendapatkan data', data }) } ] exports.getOne = [ auth, forRole([PTB_DIKTI, PTB_LLDIKTI, PTB_PT]), checkData((req) => req.params.sanksi_id, async (id) => sanksiModel.findById(id).populate('laporan').populate('pelanggaran'), 'sanksi'), async (req, res) => { const { sanksi } = req.data return response.success(res, { message: 'Berhasil mendapatkan data', data: sanksi }) } ] exports.updatePt = [ checkData(req => req.params.sanksi_id, (sanksi_id) => sanksiModel.findById(id), 'sanksi'), validation((req) => req.body, { is_pengajuan_keberatan: { type: 'string', optional: true }, is_pengajuan_banding: { type: 'string', optional: true }, is_dokumen_perbaikan: { type: 'string', optional: true } }), async (req, res) => { const { is_pengajuan_keberatan, is_pengajuan_banding, is_dokumen_perbaikan } = req.body const user = req.user const { sanksi } = req.data let data = {} let data2 = {} let keterangan = '' let last_step = '' let flag if (is_pengajuan_keberatan) { if (is_pengajuan_keberatan === TRUE) { last_step = 'Permohonan Keberatan' keterangan = 'Menerima Pengajuan Keberatan' } else if (is_pengajuan_keberatan === FALSE) { keterangan = 'Membatalkan Pengajuan Keberatan' last_step = 'Dokumen Perbaikan' } data = { is_pengajuan_keberatan: is_pengajuan_keberatan === TRUE } flag = is_pengajuan_keberatan === TRUE ? KEBERATAN : PERBAIKAN } if (is_pengajuan_banding) { if (is_pengajuan_banding === TRUE) { last_step = 'Permohonan Banding' keterangan = 'Menerima Pengajuan Banding' } else if (is_pengajuan_banding === FALSE) { keterangan = 'Membatalkan Pengajuan Banding' last_step = 'Dokumen Perbaikan' } data = { is_pengajuan_banding: is_pengajuan_banding === TRUE } flag = is_pengajuan_banding === TRUE ? BANDING : PERBAIKAN } if (is_dokumen_perbaikan === TRUE) { last_step = 'Dokumen Perbaikan' keterangan = 'Mengupload Dokumen Perbaikan' flag = PERBAIKAN } if (!last_step) { return response.error(res, { message: 'Gagal merubah Sanksi' }) } await pemantauanModel.create({ laporan: sanksi.laporan._id, sanksi: sanksi._id, action: UPDATE_SANKSI, pt_id: sanksi.laporan.pt.id, user: user._id, keterangan }) data.last_step = last_step data2.flag = flag const checkStep = await laporanModel.findOne({ sanksi: sanksi._id, step: flag}) if (!checkStep) data2.$push = { step: flag } await laporanModel.findOneAndUpdate({ sanksi: sanksi._id }, data2) await sanksiModel.updateOne( { _id: sanksi._id }, data ) return response.success(res, { message: 'Berhasil merubah Sanksi' }) } ]