| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346 | 
							- 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'
 
-     })
 
-   }
 
- ]
 
 
  |