yazid138 2 tahun lalu
induk
melakukan
6f3a667207
71 mengubah file dengan 1772 tambahan dan 419 penghapusan
  1. 3 9
      app.js
  2. 1 1
      controller/dokumen.controller.js
  3. 32 24
      controller/v1/auth.controller.js
  4. 15 16
      controller/v1/auto.controller.js
  5. 18 114
      controller/v1/graph.controller.js
  6. 177 64
      controller/v1/laporan.controller.js
  7. 11 8
      controller/v1/laporan/evaluasi.controller.js
  8. 14 9
      controller/v1/laporan/jadwal.controller.js
  9. 3 3
      controller/v1/lembaga.controller.js
  10. 4 4
      controller/v1/log.controller.js
  11. 27 5
      controller/v1/migrasi.controller.js
  12. 3 3
      controller/v1/pelanggaran.controller.js
  13. 7 7
      controller/v1/pemantauan.controller.js
  14. 4 4
      controller/v1/pengunjung.controller.js
  15. 3 4
      controller/v1/pt.controller.js
  16. 6 6
      controller/v1/rekomendasi.controller.js
  17. 78 40
      controller/v1/sanksi.controller.js
  18. 19 12
      controller/v1/sanksi/banding.controller.js
  19. 23 9
      controller/v1/sanksi/cabutSanksi.controller.js
  20. 19 12
      controller/v1/sanksi/keberatan.controller.js
  21. 20 11
      controller/v1/sanksi/perbaikan.controller.js
  22. 8 8
      controller/v1/user.controller.js
  23. 180 0
      controller/v2/auth.controller.js
  24. 245 0
      controller/v2/laporan.controller.js
  25. 119 0
      controller/v2/pemeriksaan.controller.js
  26. 67 0
      controller/v2/penjadwalan.controller.js
  27. 353 0
      controller/v2/sanksi.controller.js
  28. 23 0
      middleware/checkData.js
  29. 19 0
      middleware/isUnique.js
  30. 35 0
      middleware/uploadFile.js
  31. 14 0
      middleware/validation.js
  32. 1 2
      middleware/verifyToken.js
  33. 5 0
      model/laporan.model.js
  34. 10 0
      model/sanksi.model.js
  35. 10 0
      model/sanksi2.model.js
  36. 28 0
      routes/index.js
  37. 1 1
      routes/v1/auth.routes.js
  38. 1 1
      routes/v1/auto.routes.js
  39. 1 1
      routes/v1/graph.routes.js
  40. 2 2
      routes/v1/index.js
  41. 1 1
      routes/v1/laporan/evaluasi.routes.js
  42. 1 1
      routes/v1/laporan/index.js
  43. 1 1
      routes/v1/laporan/jadwal.routes.js
  44. 1 1
      routes/v1/lembaga.routes.js
  45. 1 1
      routes/v1/log.routes.js
  46. 2 1
      routes/v1/migration.routes.js
  47. 1 1
      routes/v1/pelanggaran.routes.js
  48. 1 1
      routes/v1/pemantauan.routes.js
  49. 1 1
      routes/v1/pengunjung.routes.js
  50. 1 1
      routes/v1/pt.routes.js
  51. 7 7
      routes/v1/public.routes.js
  52. 1 1
      routes/v1/rekomendasi.routes.js
  53. 1 1
      routes/v1/sanksi/banding.routes.js
  54. 1 1
      routes/v1/sanksi/cabutSanksi.routes.js
  55. 1 1
      routes/v1/sanksi/index.js
  56. 1 1
      routes/v1/sanksi/keberatan.routes.js
  57. 1 1
      routes/v1/sanksi/perbaikan.routes.js
  58. 1 1
      routes/v1/user.routes.js
  59. 8 0
      routes/v2/auth.routes.js
  60. 16 0
      routes/v2/index.js
  61. 9 0
      routes/v2/laporan.routes.js
  62. 6 0
      routes/v2/pemeriksaan.routes.js
  63. 6 0
      routes/v2/penjadwalan.routes.js
  64. 8 0
      routes/v2/sanksi.routes.js
  65. 35 0
      services/v2/notifikasi.service.js
  66. 32 0
      utils/constanta.js
  67. 1 2
      utils/dokumenFunction.js
  68. 13 9
      utils/v1/cekData.js
  69. 1 1
      utils/v1/handleError.js
  70. 2 2
      utils/v1/notifFunction.js
  71. 1 1
      utils/v1/validation.js

+ 3 - 9
app.js

@@ -5,7 +5,6 @@ const logger = require('morgan')
 const cors = require('cors')
 const csrf = require('./middleware/csrf')
 const response = require('./utils/responseHandler')
-const dokumenController = require('./controller/dokumen.controller')
 const app = express()
 
 require('./config/db')()
@@ -18,15 +17,10 @@ app.use(cookieParser(process.env.SRU51))
 // app.use(csrf( ['GET', 'HEAD', 'OPTIONS'], ['/v1/auth/login', /\/v1\/auto\//i]))
 
 app.use(express.static(path.join(__dirname, 'public')))
+app.use((req, res, next) => {req.data = {}; return next()})
 
-app.get('/', (req, res) => {
-  return res.json({
-    message: 'API SIDALI'
-  })
-})
-// route version
-app.use('/v1', require('./routes/v1'))
-app.get('/dokumen/:id/:nama_file', dokumenController.getDokumen)
+// routes
+app.use('/', require('./routes'))
 
 app.use((req, res) =>
   response.error(res, { code: 404, message: 'request not found' })

+ 1 - 1
controller/dokumen.controller.js

@@ -1,5 +1,5 @@
 const chunkModel = require('../model/chunk.model')
-const handleError = require('../utils/handleError')
+const handleError = require('../utils/v1/handleError')
 
 exports.getDokumen = handleError(async (req, res) => {
   const { id } = req.params

+ 32 - 24
controller/auth.controller.js → controller/v1/auth.controller.js

@@ -1,15 +1,15 @@
-const handleError = require('../utils/handleError')
-const response = require('../utils/responseHandler')
-const userModel = require('../model/user.model')
+const handleError = require('../../utils/v1/handleError')
+const response = require('../../utils/responseHandler')
+const userModel = require('../../model/user.model')
 const jwt = require('jsonwebtoken')
-const { validate } = require('../utils/validation')
-const axios = require('../utils/axios')
+const { validate } = require('../../utils/v1/validation')
+const axios = require('../../utils/axios')
 const qs = require('qs')
-const convertRole = require('../utils/convertRole')
-const { roleData, roleDataProduction } = require('../utils/constanta')
-const logModel = require('../model/log.model')
+const convertRole = require('../../utils/convertRole')
+const { roleData, roleDataProduction } = require('../../utils/constanta')
+const logModel = require('../../model/log.model')
 const ip = require('ip')
-const osValue = require('../utils/osValue')
+const osValue = require('../../utils/osValue')
 
 exports.login = handleError(async (req, res) => {
   const isValid = validate(res, req.body, {
@@ -95,9 +95,9 @@ exports.login = handleError(async (req, res) => {
     })
   } else {
     //if (process.env.ENV === 'production') {
-    if (cekUser.role.id !== role.peran.id) {
-      await userModel.updateOne({ _id: cekUser._id }, { role: dataRole })
-    }
+    // if (cekUser.role.id !== role.peran.id) {
+    //   await userModel.updateOne({ _id: cekUser._id }, { role: dataRole })
+    // }
     if (!cekUser.lembaga) {
       await userModel.updateOne(
         { _id: cekUser._id },
@@ -168,28 +168,36 @@ exports.loginToPT = handleError(async (req, res) => {
     message: 'password salah',
   })
 
-  const dataUser = await userModel.findOne({
-    'lembaga.id': lembaga_id
-  })
+  const dataLembaga = await axios.get(`https://api.kemdikbud.go.id:8243/pddikti/1.2/pt/${lembaga_id}`)
 
-  if (!dataUser) return response.error(res, {
-    code: 400,
-    message: 'lembaga tidak ditemukan',
-  })
+  // const dataUser = await userModel.findOne({
+  //   'lembaga.id': lembaga_id
+  // })
+  //
+  // if (!dataUser) return response.error(res, {
+  //   code: 400,
+  //   message: 'lembaga tidak ditemukan',
+  // })
 
-  const lembaga = dataUser.lembaga
-  const role = dataUser.role
+  // const lembaga = dataUser.lembaga
+  // const role = dataUser.role
 
   await userModel.updateOne({
     _id: user._id
   },{
-    lembaga,
-    role
+    lembaga: {
+      id: dataLembaga[0].id,
+      nama: dataLembaga[0].nama,
+    },
+    role: {
+      id: 2022,
+      nama: 'PTB PT',
+    }
   })
   user = await userModel.findOne({_id: user._id})
   await logModel.create({
     user: user._id,
-    aktivitas: `${user.nama} berhasil masuk ke PT ${lembaga.nama}`
+    aktivitas: `${user.nama} berhasil masuk ke PT ${dataLembaga[0].nama}`
   })
 
   const accessToken = jwt.sign({ _id: user._id }, process.env.SRU51, {

+ 15 - 16
controller/auto.controller.js → controller/v1/auto.controller.js

@@ -1,26 +1,25 @@
-const handleError = require('../utils/handleError')
-const response = require('../utils/responseHandler')
-const { notifWA } = require('../utils/notifFunction')
-const sanksiModel = require('../model/sanksi.model')
-const laporanModel = require('../model/laporan.model')
-const chunkModel = require('../model/chunk.model')
-const dokumenModel = require('../model/dokumen.model')
-const backupModel = require('../model/backup.model')
-const pemantauanModel = require('../model/pemantauan.model')
+const handleError = require('../../utils/v1/handleError')
+const response = require('../../utils/responseHandler')
+const { notifWA } = require('../../utils/v1/notifFunction')
+const sanksiModel = require('../../model/sanksi.model')
+const laporanModel = require('../../model/laporan.model')
+const chunkModel = require('../../model/chunk.model')
+const dokumenModel = require('../../model/dokumen.model')
+const pemantauanModel = require('../../model/pemantauan.model')
 const fs = require('fs')
 const {
   TEMPLATE_KEBERATAN,
   TEMPLATE_BANDING,
   TEMPLATE_REMINDER,
   TEMPLATE_REMINDER2,
-} = require('../utils/constanta')
+} = require('../../utils/constanta')
 const moment = require('moment')
-const autoSaveModel = require('../model/autoSave.model')
-const { cekSatuDataSanksi, cekSatuDataLaporan } = require('../utils/cekData')
-const userModel = require('../model/user.model')
-const { addManyDokumen } = require('../utils/dokumenFunction')
-const logModel = require('../model/log.model')
-const kontakModel = require('../model/kontak.model')
+const autoSaveModel = require('../../model/autoSave.model')
+const { cekSatuDataSanksi, cekSatuDataLaporan } = require('../../utils/v1/cekData')
+const userModel = require('../../model/user.model')
+const { addManyDokumen } = require('../../utils/dokumenFunction')
+const logModel = require('../../model/log.model')
+const kontakModel = require('../../model/kontak.model')
 
 exports.keberatan = handleError(async (req, res) => {
   const dataSanksi = await sanksiModel

+ 18 - 114
controller/graph.controller.js → controller/v1/graph.controller.js

@@ -1,13 +1,13 @@
-const handleError = require('../utils/handleError')
-const excel = require('../utils/excel')
-const response = require('../utils/responseHandler')
+const handleError = require('../../utils/v1/handleError')
+const excel = require('../../utils/excel')
+const response = require('../../utils/responseHandler')
 const {
   cekBanyakDataLaporan,
   dataLaporanAggregate,
   cekBanyakDataSanksi,
-} = require('../utils/cekData')
-const laporanModel = require('../model/laporan.model')
-const sanksiModel = require('../model/sanksi.model')
+} = require('../../utils/v1/cekData')
+const laporanModel = require('../../model/laporan.model')
+const sanksiModel = require('../../model/sanksi.model')
 const moment = require('moment')
 
 exports.laporan = handleError(async (req, res) => {
@@ -412,116 +412,20 @@ exports.jumlahStatusLaporan = handleError(async (req, res) => {
 
   let data = await Promise.all(
     dataPembina.map(async (e) => {
+      const dataLaporan = await laporanModel.find({'pt.pembina.id': e.id}).populate('sanksi').lean()
       return {
         pembina: e,
-        laporan: await cekBanyakDataLaporan(user, {
-          all: true,
-          ['pt.pembina.id']: e.id,
-        }),
-        sanksi: (
-          await cekBanyakDataSanksi(
-            user,
-            { all: true },
-            { ['pt.pembina.id']: e.id }
-          )
-        ).filter((e) => e.laporan != null),
-        jumlah_jadwal_evaluasi: await laporanModel
-          .find({
-            aktif: true,
-            jadwal: {
-              $ne: null,
-              $exists: true,
-            },
-            'pt.pembina.id': e.id,
-          })
-          .count(),
-        jumlah_pemeriksaan: await laporanModel
-          .find({
-            aktif: true,
-            evaluasi: {
-              $ne: null,
-              $not: {
-                $size: 0,
-              },
-              $exists: true,
-            },
-            'pt.pembina.id': e.id,
-          })
-          .count(),
-        jumlah_sanksi: await laporanModel
-          .find({
-            aktif: true,
-            sanksi: {
-              $ne: null,
-              $exists: true,
-            },
-            'pt.pembina.id': e.id,
-          })
-          .count(),
-        jumlah_keberatan: (
-          await sanksiModel
-            .find({
-              aktif: true,
-              'pengajuan.keberatan': {
-                $ne: null,
-                $exists: true,
-              },
-            })
-            .populate({
-              path: 'laporan',
-              match: {
-                'pt.pembina.id': e.id,
-              },
-            })
-        ).filter((e) => e.laporan != null).length,
-        jumlah_banding: (
-          await sanksiModel
-            .find({
-              aktif: true,
-              'pengajuan.banding': {
-                $ne: null,
-                $exists: true,
-              },
-            })
-            .populate({
-              path: 'laporan',
-              match: {
-                'pt.pembina.id': e.id,
-              },
-            })
-        ).filter((e) => e.laporan != null).length,
-        jumlah_pemantauan_perbaikan: (
-          await sanksiModel
-            .find({
-              aktif: true,
-              perbaikan: {
-                $ne: [],
-                $exists: true,
-              },
-            })
-            .populate({
-              path: 'laporan',
-              match: {
-                'pt.pembina.id': e.id,
-              },
-            })
-        ).filter((e) => e.laporan != null).length,
-        jumlah_pencabutan_sanksi: (
-          await sanksiModel
-            .find({
-              aktif: true,
-              'pengajuan.cabut_sanksi': {
-                $ne: null,
-                $exists: true,
-              },
-            })
-            .populate({
-              path: 'laporan',
-              match: {
-                'pt.pembina.id': e.id,
-              },
-            })
-        ).filter((e) => e.laporan != null).length,
+        jumlah_laporan: dataLaporan.length,
+        jumlah_jadwal_evaluasi: dataLaporan.filter(e => e.jadwal).length,
+        jumlah_delegasi: dataLaporan.filter(e => e.role_asal === 'dikti' && e.role_data === 'lldikti').length,
+        jumlah_pemeriksaan: dataLaporan.filter(e => e.evaluasi.length).length,
+        jumlah_sanksi: dataLaporan.filter(e => e.sanksi).length,
+        jumlah_keberatan: dataLaporan.filter(e => e.sanksi?.pengajuan?.keberatan).length,
+        jumlah_banding: dataLaporan.filter(e => e.sanksi?.pengajuan?.banding).length,
+        jumlah_pemantauan_perbaikan: dataLaporan.filter(e => e.sanksi?.perbaikan?.length).length,
+        jumlah_pencabutan_sanksi: dataLaporan.filter(e => e.sanksi?.pengajuan?.cabut_sanksi).length,
+        jumlah_diterima: dataLaporan.filter(e => e.sanksi?.jawaban?.cabut_sanksi?.status === 'Diterima').length,
+        jumlah_ditutup: dataLaporan.filter(e => !e.aktif).length,
       }
     })
   )

+ 177 - 64
controller/laporan.controller.js → controller/v1/laporan.controller.js

@@ -1,21 +1,22 @@
-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 axios = require('../../utils/axios')
+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,
   cekBanyakDataSanksi,
-} = require('../utils/cekData')
-const { TEMPLATE_LAPORAN } = require('../utils/constanta')
-const logModel = require('../model/log.model')
-const kontakModel = require('../model/kontak.model')
+} = require('../../utils/v1/cekData')
+const { TEMPLATE_LAPORAN, PELAPORAN, CREATE_LAPORAN, DIKTI, LLDIKTI, DITUTUP, DELEGASI, TRUE, FALSE } = require('../../utils/constanta')
+const logModel = require('../../model/log.model')
+const kontakModel = require('../../model/kontak.model')
+const sanksiModel = require('../../model/sanksi.model')
 const { isValidObjectId } = require('mongoose')
 
 exports.create = handleError(async (req, res) => {
@@ -62,9 +63,11 @@ exports.create = handleError(async (req, res) => {
     pt: pt[0],
     pelanggaran: pelanggaran_id,
     keterangan,
-    role_data: user.role.id === 2020 ? 'dikti' : 'lldikti',
-    role_asal: user.role.id === 2020 ? 'dikti' : 'lldikti',
+    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)
@@ -100,7 +103,7 @@ exports.create = handleError(async (req, res) => {
 
   await pemantauanModel.create({
     laporan: data._id,
-    action: 'CREATE LAPORAN',
+    action: CREATE_LAPORAN,
     pt_id: pt[0].id,
     user: user._id,
     keterangan: 'Membuat Laporan',
@@ -346,7 +349,7 @@ exports.getLaporanByNoLaporanAndId = handleError(async (req, res) => {
 exports.getAll = handleError(async (req, res) => {
   const user = req.user
   const where = {}
-  const { no_laporan, pt_id, jadwal, evaluasi, aktif, delegasi, all, sanksi } =
+  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
@@ -372,8 +375,41 @@ exports.getAll = handleError(async (req, res) => {
       $exists: true,
       $ne: null,
     }
+  } else if (tuntas === 'true') {
+    let dataLaporan = (await cekBanyakDataLaporan(user, { aktif: 'empty', all: true,  }, {lean: true}))
+      .filter(e => e.tuntas?.keterangan || e.aktif === false || e.aktif === true && e.sanksi?.jawaban?.cabut_sanksi?.status === 'Diterima' || e.sanksi?.aktif === false && !e.sanksi?.masa_berlaku?.from_date)
+      .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' }))
+    // let dataSanksi = await cekBanyakDataSanksi(user, {
+    //   aktif: false, 'jawaban.cabut_sanksi.status': 'Diterima'
+    // })
+    // const w = {}
+    // switch (user.role.id) {
+    //   case 2020:
+    //     w.$or = [{
+    //       role_asal: DIKTI
+    //     }, {
+    //       role_data: DIKTI
+    //     }]
+    //     break
+    //   case 2021:
+    //     w.$or = [{
+    //       role_asal: LLDIKTI
+    //     }, {
+    //       role_data: LLDIKTI
+    //     }]
+    //     w['pt.pembina.id'] = user.lembaga.id
+    //     break
+    // }
+    // const dataLaporan = (await laporanModel.find(w).populate('sanksi').lean())
+    //   .filter(e => e.aktif === false || e.tuntas?.keterangan || e.sanksi?.jawaban?.cabut_sanksi === 'Diterima' && e.sanksi?.aktif === false || !e.sanksi?.masa_berlaku)
+    //   .map(e => ({...e, status: e.aktif === false || e.tuntas?.keterangan ? 'Ditutup' : e.sanksi?.jawaban?.cabut_sanksi === '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)
+
+  let data = (await cekBanyakDataLaporan(user, where)).filter(e => !e.sanksi || e.sanksi.aktif === true)
   return response.success(res, {
     message: 'Berhasil ambil data laporan',
     data,
@@ -385,10 +421,10 @@ exports.getOne = handleError(async (req, res) => {
   const user = req.user
   const { aktif, delegasi, all } = req.query
   const where = {}
-  if (aktif) where.aktif = aktif === 'true'
+  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)
+  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',
@@ -404,8 +440,8 @@ exports.update = handleError(async (req, res) => {
   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'] },
+    change_role: { type: 'string', optional: true, enum: [TRUE, FALSE] },
+    aktif: { type: 'string', optional: true, enum: [TRUE, FALSE] },
     keterangan: 'string',
   })
   if (!isValid) return
@@ -415,10 +451,10 @@ exports.update = handleError(async (req, res) => {
   let alasan = ''
   const { change_role, aktif } = req.body
   const keterangan2 = req.body.keterangan
-  if (change_role === 'true') {
+  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'
-      }`
+    keterangan = `Laporan didelegasi ke ${user.role.id === 2020 ? 'LLDIKTI' : 'DIKTI'}`
     alasan = keterangan2
     data.alasan_delegasi = keterangan2
     // if (laporan.jadwal) {
@@ -439,6 +475,7 @@ exports.update = handleError(async (req, res) => {
     } else {
       keterangan = `Laporan ditutup`
       alasan = keterangan2
+      data.flag = DITUTUP
       data.tuntas = {
         keterangan: keterangan2,
         dokumen: dokumen_id,
@@ -506,9 +543,12 @@ exports.laporanByPembina = handleError(async (req, res) => {
     banding,
     perbaikan,
     cabutSanksi,
+    delegasi,
+    ditutup,
+    diterima
   } = req.query
-  const user = req.user
-  const where = {}
+  let where = {}
+  let where2 = {}
   let isLaporan = true
   let isSanksi = false
 
@@ -540,20 +580,25 @@ exports.laporanByPembina = handleError(async (req, res) => {
     isSanksi = true
   }
   if (keberatan === 'true') {
-    where['pengajuan.keberatan'] = { $exists: true, $ne: null }
+    where2['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 }
+    where2['pengajuan.banding'] = { $exists: true, $ne: null }
     isLaporan = false
     isSanksi = true
   }
   if (cabutSanksi === 'true') {
-    where.perbaikan = {
+    where2['pengajuan.cabut_sanksi'] = {
+      $exists: true,
+      $ne: null,
+    }
+    isLaporan = false
+    isSanksi = true
+  }
+  if (perbaikan === 'true') {
+    where2.perbaikan = {
       $exists: true,
       $ne: null,
       $not: {
@@ -563,51 +608,119 @@ exports.laporanByPembina = handleError(async (req, res) => {
     isLaporan = false
     isSanksi = true
   }
-  if (perbaikan === 'true') {
-    where['jawaban.banding'] = { $exists: true, $ne: null }
+  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
   }
 
-  const [laporan, dataSanksi] = await Promise.all([
-    (async () => {
-      let laporan = isLaporan
-        ? await cekBanyakDataLaporan(user, {
-          'pt.pembina.id': idPembina,
-          all: true,
-          ...where,
-        }, {lean: true})
-        : []
-      if (!laporan.length) return []
-      laporan = laporan.map(e => {
+  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 }
       })
-      return laporan
-    })(),
-    (async () =>
-      isSanksi
-        ? (
-          await cekBanyakDataSanksi(
-            user,
-            { all: true, ...where },
-            {
-              ['pt.pembina.id']: idPembina,
-            }
-          )
-        ).filter((e) => e.laporan != null)
-        : [])(),
-  ])
+  } 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 }
+      })
+  }
+
+  // if (isSanksi === true) {
+  //   laporan = (await sanksiModel.find(where).populate({path: 'laporan', match: {'pt.pembina.id': idPembina} }).lean())
+  //     .filter(e => e.laporan)
+  //     .map(e => {
+  //       let step = 'Sanksi'
+  //       if (e.pengajuan?.cabut_sanksi) step = 'Cabut Sanksi'
+  //       else if (e.pengajuan?.keberatan && !e.sanksi?.pengajuan?.banding) step = 'Keberatan'
+  //       else if (e.pengajuan?.banding) step = 'Banding'
+  //       else if (e.aktif === false && !e.masa_berlaku?.from_date) step = 'Selesai'
+  //       else if (e.aktif === false && e.jawaban?.cabut_sanksi?.status === 'Diterima') step = 'Diterima'
+  //       return { ...e, step }
+  //     })
+  // } else {
+  //   laporan = (await laporanModel.find({ ...where, 'pt.pembina.id': idPembina }).lean().populate('sanksi').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 }
+  //     })
+  // }
+
+  // const [laporan, dataSanksi] = await Promise.all([
+  //   (async () => {
+  //     let laporan = isLaporan
+  //       ? await cekBanyakDataLaporan(user, {
+  //         'pt.pembina.id': idPembina,
+  //         all: true,
+  //         ...where,
+  //       }, {lean: true})
+  //       : []
+  //     if (!laporan.length) return []
+
+  //     return laporan
+  //   })(),
+  //   (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 },
+    data: laporan,
   })
 })
 

+ 11 - 8
controller/laporan/evaluasi.controller.js → controller/v1/laporan/evaluasi.controller.js

@@ -1,10 +1,11 @@
-const laporanModel = require('../../model/laporan.model')
-const handleError = require('../../utils/handleError')
-const response = require('../../utils/responseHandler')
-const { validate } = require('../../utils/validation')
-const { addManyDokumen } = require('../../utils/dokumenFunction')
-const { cekSatuDataLaporan } = require('../../utils/cekData')
-const pemantauanModel = require('../../model/pemantauan.model')
+const laporanModel = require('../../../model/laporan.model')
+const handleError = require('../../../utils/v1/handleError')
+const response = require('../../../utils/responseHandler')
+const { validate } = require('../../../utils/v1/validation')
+const { addManyDokumen } = require('../../../utils/dokumenFunction')
+const { cekSatuDataLaporan } = require('../../../utils/v1/cekData')
+const pemantauanModel = require('../../../model/pemantauan.model')
+const { PEMERIKSAAN, ADD_EVALUASI } = require('../../../utils/constanta')
 
 exports.add = handleError(async (req, res) => {
   const user = req.user
@@ -37,6 +38,7 @@ exports.add = handleError(async (req, res) => {
       },
     },
     {
+      flag: PEMERIKSAAN,
       $push: {
         evaluasi: {
           dari: user._id,
@@ -44,6 +46,7 @@ exports.add = handleError(async (req, res) => {
           tanggal,
           dokumen: dokumen_id,
         },
+        step: PEMERIKSAAN
       },
     },
     {
@@ -59,7 +62,7 @@ exports.add = handleError(async (req, res) => {
   await pemantauanModel.create({
     laporan: laporan._id,
     user: user._id,
-    action: 'ADD EVALUASI',
+    action: ADD_EVALUASI,
     pt_id: laporan.pt.id,
     keterangan: 'Melakukan evaluasi',
     dokumen: dokumen_id,

+ 14 - 9
controller/laporan/jadwal.controller.js → controller/v1/laporan/jadwal.controller.js

@@ -1,12 +1,13 @@
-const laporanModel = require('../../model/laporan.model')
-const { cekSatuDataLaporan } = require('../../utils/cekData')
-const handleError = require('../../utils/handleError')
-const response = require('../../utils/responseHandler')
-const { validate } = require('../../utils/validation')
-const pemantauanModel = require('../../model/pemantauan.model')
-const logModel = require('../../model/log.model')
+const laporanModel = require('../../../model/laporan.model')
+const { cekSatuDataLaporan } = require('../../../utils/v1/cekData')
+const handleError = require('../../../utils/v1/handleError')
+const response = require('../../../utils/responseHandler')
+const { validate } = require('../../../utils/v1/validation')
+const pemantauanModel = require('../../../model/pemantauan.model')
+const logModel = require('../../../model/log.model')
 const ip = require('ip')
-const osValue = require('../../utils/osValue')
+const osValue = require('../../../utils/osValue')
+const { PENJADWALAN, ADD_JADWAL } = require('../../../utils/constanta')
 
 exports.update = handleError(async (req, res) => {
   const user = req.user
@@ -33,12 +34,16 @@ exports.update = handleError(async (req, res) => {
   const data = await laporanModel.findByIdAndUpdate(
     laporan._id,
     {
+      flag: PENJADWALAN,
       jadwal: {
         judul,
         dari_tanggal,
         sampai_tanggal,
         warna,
       },
+      $push: {
+        step: PENJADWALAN
+      }
     },
     {
       new: true,
@@ -50,7 +55,7 @@ exports.update = handleError(async (req, res) => {
   await pemantauanModel.create({
     laporan: laporan._id,
     user: user._id,
-    action: 'ADD JADWAL',
+    action: ADD_JADWAL,
     pt_id: laporan.pt.id,
     keterangan: message,
     jadwal: {

+ 3 - 3
controller/lembaga.controller.js → controller/v1/lembaga.controller.js

@@ -1,6 +1,6 @@
-const axios = require('../utils/axios')
-const handleError = require('../utils/handleError')
-const response = require('../utils/responseHandler')
+const axios = require('../../utils/axios')
+const handleError = require('../../utils/v1/handleError')
+const response = require('../../utils/responseHandler')
 
 exports.get = handleError(async (req, res) => {
   const { search } = req.query

+ 4 - 4
controller/log.controller.js → controller/v1/log.controller.js

@@ -1,7 +1,7 @@
-const logModel = require('../model/log.model')
-const handleError = require('../utils/handleError')
-const response = require('../utils/responseHandler')
-const { validate } = require('../utils/validation')
+const logModel = require('../../model/log.model')
+const handleError = require('../../utils/v1/handleError')
+const response = require('../../utils/responseHandler')
+const { validate } = require('../../utils/v1/validation')
 
 exports.create = handleError(async (req, res) => {
   const user = req.user

+ 27 - 5
controller/migrasi.controller.js → controller/v1/migrasi.controller.js

@@ -1,8 +1,9 @@
-const sanksiModel = require('../model/sanksi.model')
-const dokumenModel = require('../model/dokumen.model')
-const handleError = require('../utils/handleError')
-const response = require('../utils/responseHandler')
-const coba = require('../utils/coba')
+const sanksiModel = require('../../model/sanksi.model')
+const dokumenModel = require('../../model/dokumen.model')
+const laporanModel = require('../../model/laporan.model')
+const handleError = require('../../utils/v1/handleError')
+const response = require('../../utils/responseHandler')
+const coba = require('../../utils/coba')
 
 exports.pengajuan = handleError(async (req, res) => {
   const [keberatan, banding] = await Promise.all([
@@ -67,4 +68,25 @@ exports.pelanggaranSanksi = handleError(async (req, res) => {
   })
 })
 
+exports.tambahStep = handleError(async (req, res) => {
+  const laporan = await laporanModel.find()
+  await Promise.all(laporan.map(e => {
+    let step = ['pelaporan']
+    if (e.jadwal) step.push('penjadwalan')
+    if (e.evaluasi.length) step.push('pemeriksaan')
+    if (e.sanksi) step.push('sanksi')
+    return laporanModel.updateOne({ _id: e._id }, { step })
+  }))
+  const sanksi = await sanksiModel.find()
+  await Promise.all(sanksi.map(e => {
+    let step = []
+    if (e.pengajuan?.keberatan) step.push('keberatan')
+    if (e.pengajuan?.banding) step.push('banding')
+    if (e.perbaikan.length) step.push('dokumen_perbaikan')
+    if (e.pengajuan?.cabut_sanksi) step.push('cabut_sanksi')
+    return sanksiModel.updateOne({ _id: e._id }, { step })
+  }))
+  return laporan
+})
+
 

+ 3 - 3
controller/pelanggaran.controller.js → controller/v1/pelanggaran.controller.js

@@ -1,6 +1,6 @@
-const handleError = require('../utils/handleError')
-const response = require('../utils/responseHandler')
-const pelanggaranModel = require('../model/pelanggaran.model')
+const handleError = require('../../utils/v1/handleError')
+const response = require('../../utils/responseHandler')
+const pelanggaranModel = require('../../model/pelanggaran.model')
 
 exports.getAll = handleError(async (req, res) => {
   const user = req.user

+ 7 - 7
controller/pemantauan.controller.js → controller/v1/pemantauan.controller.js

@@ -1,10 +1,10 @@
-const axios = require('../utils/axios')
-const handleError = require('../utils/handleError')
-const response = require('../utils/responseHandler')
-const pemantauanModel = require('../model/pemantauan.model')
-const { cekSatuDataLaporan, cekSatuDataSanksi } = require('../utils/cekData')
-const laporanModel = require('../model/laporan.model')
-const userModel = require('../model/user.model')
+const axios = require('../../utils/axios')
+const handleError = require('../../utils/v1/handleError')
+const response = require('../../utils/responseHandler')
+const pemantauanModel = require('../../model/pemantauan.model')
+const { cekSatuDataLaporan, cekSatuDataSanksi } = require('../../utils/v1/cekData')
+const laporanModel = require('../../model/laporan.model')
+const userModel = require('../../model/user.model')
 
 exports.get = handleError(async (req, res) => {
   const user = req.user

+ 4 - 4
controller/pengunjung.controller.js → controller/v1/pengunjung.controller.js

@@ -1,7 +1,7 @@
-const pengunjungModel = require('../model/pengunjung.model')
-const handleError = require('../utils/handleError')
-const response = require('../utils/responseHandler')
-const { validate } = require('../utils/validation')
+const pengunjungModel = require('../../model/pengunjung.model')
+const handleError = require('../../utils/v1/handleError')
+const response = require('../../utils/responseHandler')
+const { validate } = require('../../utils/v1/validation')
 
 exports.create = handleError(async (req, res) => {
   const { os, ipv4, location } = req.body

+ 3 - 4
controller/pt.controller.js → controller/v1/pt.controller.js

@@ -1,8 +1,7 @@
-// const axios = require('../utils/axios')
-const handleError = require('../utils/handleError')
-const response = require('../utils/responseHandler')
+const handleError = require('../../utils/v1/handleError')
+const response = require('../../utils/responseHandler')
 const axios2 = require('axios')
-const coba = require('../utils/coba')
+const coba = require('../../utils/coba')
 const https = require('https')
 
 const axios= {

+ 6 - 6
controller/rekomendasi.controller.js → controller/v1/rekomendasi.controller.js

@@ -1,9 +1,9 @@
-const handleError = require('../utils/handleError')
-const response = require('../utils/responseHandler')
-const { addManyDokumen } = require('../utils/dokumenFunction')
-const { cekSatuDataSanksi } = require('../utils/cekData')
-const pemantauanModel = require('../model/pemantauan.model')
-const sanksiModel = require('../model/sanksi.model')
+const handleError = require('../../utils/v1/handleError')
+const response = require('../../utils/responseHandler')
+const { addManyDokumen } = require('../../utils/dokumenFunction')
+const { cekSatuDataSanksi } = require('../../utils/v1/cekData')
+const pemantauanModel = require('../../model/pemantauan.model')
+const sanksiModel = require('../../model/sanksi.model')
 
 exports.createRekomendasi = handleError(async (req, res) => {
   const user = req.user

+ 78 - 40
controller/sanksi.controller.js → controller/v1/sanksi.controller.js

@@ -1,22 +1,23 @@
-const sanksiModel = require('../model/sanksi.model')
-const autoSaveModel = require('../model/autoSave.model')
-const handleError = require('../utils/handleError')
-const response = require('../utils/responseHandler')
-const { addManyDokumen, addDokumen } = require('../utils/dokumenFunction')
-const { validate } = require('../utils/validation')
-const pemantauanModel = require('../model/pemantauan.model')
-const pelanggaranModel = require('../model/pelanggaran.model')
-const logModel = require('../model/log.model')
-const { hariKerja } = require('../utils/hariKerja')
-const coba = require('../utils/coba')
-const axios = require('../utils/axios')
+const sanksiModel = require('../../model/sanksi.model')
+const autoSaveModel = require('../../model/autoSave.model')
+const handleError = require('../../utils/v1/handleError')
+const response = require('../../utils/responseHandler')
+const { addManyDokumen, addDokumen } = require('../../utils/dokumenFunction')
+const { validate } = require('../../utils/v1/validation')
+const pemantauanModel = require('../../model/pemantauan.model')
+const pelanggaranModel = require('../../model/pelanggaran.model')
+const logModel = require('../../model/log.model')
+const { hariKerja } = require('../../utils/hariKerja')
+const coba = require('../../utils/coba')
+const axios = require('../../utils/axios')
 const {
   cekSatuDataSanksi,
   cekSatuDataLaporan,
   cekBanyakDataPelanggaran,
   cekBanyakDataSanksi
-} = require('../utils/cekData')
-const laporanModel = require('../model/laporan.model')
+} = require('../../utils/v1/cekData')
+const laporanModel = require('../../model/laporan.model')
+const { SANKSI, SELESAI, TRUE, FALSE, KEBERATAN, PERBAIKAN, BANDING } = require('../../utils/constanta')
 
 exports.create = handleError(async (req, res) => {
   const { no_sanksi, keterangan, from_date, to_date, tanggal_terima_sanksi, tanggal_akhir_keberatan } = req.body
@@ -92,12 +93,14 @@ exports.create = handleError(async (req, res) => {
     tanggal_terima_sanksi,
     dokumen_terima_sanksi: dokumenTerimaSanksi_id,
     tanggal_akhir_keberatan,
-    masa_berlaku: from_date && to_date ? { from_date, to_date} : null,
+    masa_berlaku: from_date && to_date ? { from_date, to_date } : null,
     batas_waktu: from_date ? { keberatan: hariKerja(10, from_date) } : null,
-    aktif: from_date ? true : false,
+    aktif: from_date ? true : false
   })
   await laporanModel.findByIdAndUpdate(laporan._id, {
-    sanksi: data._id
+    sanksi: data._id,
+    $push: { step: from_date ? SANKSI : SELESAI },
+    flag: from_date ? SANKSI : SELESAI
     // aktif: false,
   })
   await pemantauanModel.create({
@@ -265,22 +268,45 @@ exports.updatePt = handleError(async (req, res) => {
   const sanksi = await cekSatuDataSanksi(res, user, sanksi_id)
   if (!sanksi) return
 
+  let data = {}
+  let data2 = {}
   let keterangan = ''
   let last_step = ''
-  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'
+  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_pengajuan_banding == 'true') {
-    last_step = 'Permohonan Banding'
-    keterangan = 'Menerima Pengajuan Banding'
-  } else if (is_pengajuan_banding == 'false') {
-    keterangan = 'Membatalkan Pengajuan Banding'
+  if (is_dokumen_perbaikan === TRUE) {
     last_step = 'Dokumen Perbaikan'
+    flag = PERBAIKAN
+  }
+
+  if (!last_step) {
+    return response.error(res, {
+      message: 'Gagal merubah Sanksi'
+    })
   }
 
   await pemantauanModel.create({
@@ -292,13 +318,14 @@ exports.updatePt = handleError(async (req, res) => {
     keterangan
   })
 
-  if (is_dokumen_perbaikan == 'true') {
-    last_step = 'Dokumen Perbaikan'
-  }
-
+  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 },
-    { is_pengajuan_keberatan: is_pengajuan_keberatan == 'true' , is_pengajuan_banding: is_pengajuan_banding == 'true', last_step }
+    data
   )
 
   return response.success(res, {
@@ -325,6 +352,8 @@ exports.getAll = handleError(async (req, res) => {
   const q = {}
   if (aktif && aktif === 'false') {
     where.aktif = false
+  } else if (aktif && aktif === 'true') {
+    where.aktif = true
   }
   if (pengajuan_keberatan === 'true') {
     where.is_pengajuan_keberatan = true
@@ -355,10 +384,11 @@ exports.getAll = handleError(async (req, res) => {
     if (jawaban === 'false') {
       where.$or = [
         {
-          "pengajuan.cabut_sanksi": {
-            $exists: true, $ne: null},
+          'pengajuan.cabut_sanksi': {
+            $exists: true, $ne: null
+          }
         }, {
-          bypass_cabut_sanksi: true,
+          bypass_cabut_sanksi: true
         }
       ]
       where.aktif = true
@@ -384,10 +414,18 @@ exports.getAll = handleError(async (req, res) => {
     where['sanksi.level'] = { $in: [2, 3] }
   }
   if (bypassCabutSanksi === 'true') {
-    where.bypass_cabut_sanksi = {
-      $exists: false,
-      $eq: null
-    }
+    where.$or = [
+      {
+        'jawaban.cabut_sanksi.status': { $ne: 'Diterima' }
+      },
+      {
+        masa_berlaku: {
+          $exists: true,
+          $ne: null
+        }
+      }
+    ]
+    where.aktif = true
   }
   const data = await cekBanyakDataSanksi(user, where, q)
   return response.success(res, {

+ 19 - 12
controller/sanksi/banding.controller.js → controller/v1/sanksi/banding.controller.js

@@ -1,15 +1,16 @@
-const handleError = require('../../utils/handleError')
-const sanksiModel = require('../../model/sanksi.model')
-const { addManyDokumen } = require('../../utils/dokumenFunction')
-const { validate } = require('../../utils/validation')
-const { cekSatuDataSanksi } = require('../../utils/cekData')
-const response = require('../../utils/responseHandler')
-const { hariKerja } = require('../../utils/hariKerja')
-const pemantauanModel = require('../../model/pemantauan.model')
-const { notifWA } = require('../../utils/notifFunction')
-const { TEMPLATE_BANDING } = require('../../utils/constanta')
-const kontakModel = require('../../model/kontak.model')
-const logModel = require('../../model/log.model')
+const handleError = require('../../../utils/v1/handleError')
+const sanksiModel = require('../../../model/sanksi.model')
+const laporanModel = require('../../../model/laporan.model')
+const { addManyDokumen } = require('../../../utils/dokumenFunction')
+const { validate } = require('../../../utils/v1/validation')
+const { cekSatuDataSanksi } = require('../../../utils/v1/cekData')
+const response = require('../../../utils/responseHandler')
+const { hariKerja } = require('../../../utils/hariKerja')
+const pemantauanModel = require('../../../model/pemantauan.model')
+const { notifWA } = require('../../../utils/v1/notifFunction')
+const { TEMPLATE_BANDING, BANDING } = require('../../../utils/constanta')
+const kontakModel = require('../../../model/kontak.model')
+const logModel = require('../../../model/log.model')
 
 exports.create = handleError(async (req, res) => {
   const user = req.user
@@ -41,6 +42,12 @@ exports.create = handleError(async (req, res) => {
       ['batas_waktu.jawaban_banding']: hariKerja(10),
     }
   )
+  await laporanModel.findOneAndUpdate({_id: sanksi.laporan._id},{
+    flag: BANDING,
+    $push: {
+      step: BANDING,
+    }
+  })
   if (!data) {
     return response.error(res, {
       message: 'pengajuan banding sudah ada atau jawaban keberatan belum ada',

+ 23 - 9
controller/sanksi/cabutSanksi.controller.js → controller/v1/sanksi/cabutSanksi.controller.js

@@ -1,11 +1,13 @@
-const handleError = require('../../utils/handleError')
-const sanksiModel = require('../../model/sanksi.model')
-const logModel = require('../../model/log.model')
-const { addManyDokumen } = require('../../utils/dokumenFunction')
-const { validate } = require('../../utils/validation')
-const { cekSatuDataSanksi, cekSatuDataLaporan } = require('../../utils/cekData')
-const response = require('../../utils/responseHandler')
-const pemantauanModel = require('../../model/pemantauan.model')
+const handleError = require('../../../utils/v1/handleError')
+const sanksiModel = require('../../../model/sanksi.model')
+const logModel = require('../../../model/log.model')
+const { addManyDokumen } = require('../../../utils/dokumenFunction')
+const { validate } = require('../../../utils/v1/validation')
+const { cekSatuDataSanksi, cekSatuDataLaporan } = require('../../../utils/v1/cekData')
+const response = require('../../../utils/responseHandler')
+const pemantauanModel = require('../../../model/pemantauan.model')
+const laporanModel = require('../../../model/laporan.model')
+const { CABUT_SANKSI } = require('../../../utils/constanta')
 
 exports.create = handleError(async (req, res) => {
   const user = req.user
@@ -40,7 +42,7 @@ exports.create = handleError(async (req, res) => {
       last_step: 'Permohonan Pencabutan Sanksi',
       ['pengajuan.cabut_sanksi']: {
         dokumen: dokumen_id
-      }
+      },
     }
   )
   if (!data) {
@@ -48,6 +50,12 @@ exports.create = handleError(async (req, res) => {
       message: 'cabut_sanksi sudah ada'
     })
   }
+  await laporanModel.findOneAndUpdate({_id: sanksi.laporan._id},{
+    flag: CABUT_SANKSI,
+    $push: {
+      step: CABUT_SANKSI,
+    }
+  })
   await pemantauanModel.create({
     laporan: sanksi.laporan._id,
     sanksi: sanksi._id,
@@ -113,6 +121,12 @@ exports.createJawaban = handleError(async (req, res) => {
       message: 'cabut_sanksi tidak ada'
     })
   }
+  await laporanModel.findOneAndUpdate({_id: sanksi.laporan._id},{
+    flag: status === 'Diterima'? 'diterima' : 'cabut_sanksi',
+    $push: {
+      step: status === 'Diterima'? 'diterima' : 'cabut_sanksi',
+    }
+  })
 
   let message = 'Menjawab Pengajuan Pencabutan Sanksi'
   let for_public = true

+ 19 - 12
controller/sanksi/keberatan.controller.js → controller/v1/sanksi/keberatan.controller.js

@@ -1,15 +1,16 @@
-const handleError = require('../../utils/handleError')
-const sanksiModel = require('../../model/sanksi.model')
-const { addManyDokumen } = require('../../utils/dokumenFunction')
-const { validate } = require('../../utils/validation')
-const { cekSatuDataSanksi } = require('../../utils/cekData')
-const response = require('../../utils/responseHandler')
-const { hariKerja } = require('../../utils/hariKerja')
-const pemantauanModel = require('../../model/pemantauan.model')
-const { notifWA } = require('../../utils/notifFunction')
-const { TEMPLATE_KEBERATAN } = require('../../utils/constanta')
-const kontakModel = require('../../model/kontak.model')
-const logModel = require('../../model/log.model')
+const handleError = require('../../../utils/v1/handleError')
+const sanksiModel = require('../../../model/sanksi.model')
+const { addManyDokumen } = require('../../../utils/dokumenFunction')
+const { validate } = require('../../../utils/v1/validation')
+const { cekSatuDataSanksi } = require('../../../utils/v1/cekData')
+const response = require('../../../utils/responseHandler')
+const { hariKerja } = require('../../../utils/hariKerja')
+const pemantauanModel = require('../../../model/pemantauan.model')
+const { notifWA } = require('../../../utils/v1/notifFunction')
+const { TEMPLATE_KEBERATAN, KEBERATAN } = require('../../../utils/constanta')
+const kontakModel = require('../../../model/kontak.model')
+const logModel = require('../../../model/log.model')
+const laporanModel = require('../../../model/laporan.model')
 
 exports.create = handleError(async (req, res) => {
   const user = req.user
@@ -52,6 +53,12 @@ exports.create = handleError(async (req, res) => {
       message: 'Pengajuan Keberatan sudah ada',
     })
   }
+  await laporanModel.findOneAndUpdate({_id: sanksi.laporan._id},{
+    flag: KEBERATAN,
+    $push: {
+      step: KEBERATAN
+    },
+  })
   await pemantauanModel.create({
     laporan: sanksi.laporan._id,
     sanksi: sanksi._id,

+ 20 - 11
controller/sanksi/perbaikan.controller.js → controller/v1/sanksi/perbaikan.controller.js

@@ -1,14 +1,15 @@
-const handleError = require('../../utils/handleError')
-const sanksiModel = require('../../model/sanksi.model')
-const { addManyDokumen } = require('../../utils/dokumenFunction')
-const { validate } = require('../../utils/validation')
-const { cekSatuDataSanksi } = require('../../utils/cekData')
-const response = require('../../utils/responseHandler')
-const pemantauanModel = require('../../model/pemantauan.model')
-const { notifWA } = require('../../utils/notifFunction')
-const { TEMPLATE_PERBAIKAN_DOKUMEN } = require('../../utils/constanta')
-const kontakModel = require('../../model/kontak.model')
-const logModel = require('../../model/log.model')
+const handleError = require('../../../utils/v1/handleError')
+const sanksiModel = require('../../../model/sanksi.model')
+const { addManyDokumen } = require('../../../utils/dokumenFunction')
+const { validate } = require('../../../utils/v1/validation')
+const { cekSatuDataSanksi } = require('../../../utils/v1/cekData')
+const response = require('../../../utils/responseHandler')
+const pemantauanModel = require('../../../model/pemantauan.model')
+const { notifWA } = require('../../../utils/v1/notifFunction')
+const { TEMPLATE_PERBAIKAN_DOKUMEN, PERBAIKAN } = require('../../../utils/constanta')
+const kontakModel = require('../../../model/kontak.model')
+const logModel = require('../../../model/log.model')
+const laporanModel = require('../../../model/laporan.model')
 
 exports.add = handleError(async (req, res) => {
   const user = req.user
@@ -73,12 +74,14 @@ exports.add = handleError(async (req, res) => {
       // },
     },
     {
+      flag: 'dokumen_perbaikan',
       last_step: 'Dokumen Perbaikan',
       $push: {
         perbaikan: {
           keterangan,
           dokumen: dokumen_id,
         },
+
       },
     }
   )
@@ -87,6 +90,12 @@ exports.add = handleError(async (req, res) => {
       message: 'Pengajuan banding atau cabut sanksi tidak ada',
     })
   }
+  await laporanModel.findOneAndUpdate({_id: sanksi.laporan._id},{
+    flag: PERBAIKAN,
+    $push: {
+      step: PERBAIKAN,
+    }
+  })
   await pemantauanModel.create({
     laporan: sanksi.laporan._id,
     sanksi: sanksi._id,

+ 8 - 8
controller/user.controller.js → controller/v1/user.controller.js

@@ -1,12 +1,12 @@
-const handleError = require('../utils/handleError')
-const response = require('../utils/responseHandler')
-const userModel = require('../model/user.model')
-const { validate } = require('../utils/validation')
-const { notifWA2 } = require('../utils/notifFunction')
-const axios = require('../utils/axios')
-const { addDokumen } = require('../utils/dokumenFunction')
+const handleError = require('../../utils/v1/handleError')
+const response = require('../../utils/responseHandler')
+const userModel = require('../../model/user.model')
+const { validate } = require('../../utils/v1/validation')
+const { notifWA2 } = require('../../utils/v1/notifFunction')
+const axios = require('../../utils/axios')
+const { addDokumen } = require('../../utils/dokumenFunction')
 const jwt = require('jsonwebtoken')
-const { TEMPLATE_VERIFIKASI } = require('../utils/constanta')
+const { TEMPLATE_VERIFIKASI } = require('../../utils/constanta')
 
 exports.addUserPublic = handleError(async (req, res) => {
   const { no_laporan, pt_id, nama, email, no_hp, alamat, is_private, isVerify } = req.body

+ 180 - 0
controller/v2/auth.controller.js

@@ -0,0 +1,180 @@
+const { validation } = require('../../middleware/validation')
+const axios = require('../../utils/axios')
+const qs = require('qs')
+const response = require('../../utils/responseHandler')
+const userModel = require('../../model/user.model')
+const { roleDataProduction } = require('../../utils/constanta')
+const convertRole = require('../../utils/convertRole')
+const jwt = require('jsonwebtoken')
+const moment = require('moment')
+const logModel = require('../../model/log.model')
+const auth = require('../../middleware/verifyToken')
+
+exports.login = [
+  validation((req) => req.body, {
+    username: { type: 'string', empty: false },
+    password: { type: 'string', empty: false }
+  }),
+  async (req, res) => {
+    const { username, password } = req.body
+    let userResponse
+
+    try {
+      userResponse = await axios.post(
+        'https://api.kemdikbud.go.id:8243/manakses/2.0/auth',
+        qs.stringify({
+          username,
+          password
+        }),
+        {
+          'Content-Type': 'application/x-www-form-urlencoded'
+        }
+      )
+      if (userResponse.code === 400) {
+        return response.error(res, {
+          code: 401,
+          message: userResponse.message
+        })
+      }
+    } catch (e) {
+      return response.error(res, {
+        code: 500,
+        message: e.message
+      })
+    }
+
+    let role = userResponse.peran.filter((e) => roleDataProduction.includes(e.peran.id))[0]
+    role.peran.id = convertRole(role.peran.id)
+
+    let user = await userModel.findOne({ user_id: userResponse.id })
+    if (!user) {
+      await userModel.create({
+        user_id: userResponse.id,
+        nama: userResponse.nama,
+        lembaga: role.organisasi,
+        email: userResponse.username,
+        no_hp: userResponse.no_hp,
+        alamat: userResponse.alamat,
+        role: role.peran,
+        isPublic: false,
+        isPrivate: false
+      })
+    } else {
+      await userModel.findOneAndUpdate({ user_id: userResponse.id }, {
+        lembaga: role.organisasi,
+        role: {
+          id: username.toLowerCase() === 'rizqevo@outlook.com' ? 2020 : username.toLowerCase() === 'sugiyanto@gmail.com' ? 2024 : role.peran.id,
+          nama: username.toLowerCase() === 'rizqevo@outlook.com' ? 'PTB Dikti' : username.toLowerCase() === 'sugiyanto@gmail.com' ? 'ReadOnly' : role.peran.nama,
+          menu: role.peran.menu
+        }
+      })
+    }
+    user = await userModel.findOne({ user_id: userResponse.id })
+
+    const accessToken = jwt.sign({ _id: user._id }, process.env.SRU51, {
+      expiresIn: '1d'
+    })
+    res.cookie('sidali-cookie', accessToken, {
+      httpOnly: true,
+      expires: moment().add(1, 'day').toDate()
+    })
+
+    return response.success(res, {
+      message: 'Berhasil Login',
+      data: {
+        token: `Bearer ${accessToken}`,
+        user
+      }
+    })
+  }
+]
+
+exports.loginToPT = [
+  auth,
+  validation((req) => req.body, {
+    lembaga_id: 'string',
+    password: 'string'
+  }),
+  async (req, res) => {
+    let user = req.user
+    const { lembaga_id, password } = req.body
+
+    try {
+      const userResponse = await axios.post(
+        'https://api.kemdikbud.go.id:8243/manakses/2.0/auth',
+        qs.stringify({
+          username: user.email,
+          password
+        }),
+        {
+          'Content-Type': 'application/x-www-form-urlencoded'
+        }
+      )
+      if (userResponse.code === 400) {
+        return response.error(res, {
+          code: 401,
+          message: userResponse.message
+        })
+      }
+    } catch (e) {
+      return response.error(res, {
+        code: 500,
+        message: e.message
+      })
+    }
+
+    let dataLembaga
+    try {
+      dataLembaga = await axios.get(`https://api.kemdikbud.go.id:8243/pddikti/1.2/pt/${lembaga_id}`)
+    } catch (e) {
+      return response.error(res, {
+        code: e.response.status,
+        message: e.message
+      })
+    }
+
+    await userModel.updateOne({
+      _id: user._id
+    }, {
+      lembaga: {
+        id: dataLembaga[0].id,
+        nama: dataLembaga[0].nama
+      },
+      role: {
+        id: 2022,
+        nama: 'PTB PT'
+      }
+    })
+    user = await userModel.findOne({ _id: user._id })
+    await logModel.create({
+      user: user._id,
+      aktivitas: `${user.nama} berhasil masuk ke PT ${dataLembaga[0].nama}`
+    })
+
+    const accessToken = jwt.sign({ _id: user._id }, process.env.SRU51, {
+      expiresIn: '1d'
+    })
+    const data = {
+      token: `Bearer ${accessToken}`,
+      user
+    }
+
+    res.cookie('sidali-cookie', accessToken, {
+      httpOnly: true,
+      expires: moment().add(1, 'day').toDate()
+    })
+
+    response.success(res, {
+      message: 'Berhasil Login',
+      data
+    })
+  }
+]
+
+exports.logout = (req, res) => {
+  res.clearCookie('sidali-cookie')
+
+  response.success(res, {
+    message: 'Berhasil Logout'
+  })
+}

+ 245 - 0
controller/v2/laporan.controller.js

@@ -0,0 +1,245 @@
+const auth = require('../../middleware/verifyToken')
+const { validation } = require('../../middleware/validation')
+const uploadFile = require('../../middleware/uploadFile')
+const response = require('../../utils/responseHandler')
+const { addManyDokumen } = require('../../utils/dokumenFunction')
+const checkData = require('../../middleware/checkData')
+const pelanggaranModel = require('../../model/pelanggaran.model')
+const axios = require('../../utils/axios')
+const laporanModel = require('../../model/laporan.model')
+const pemantauanModel = require('../../model/pemantauan.model')
+const { sendWaCreateLaporan } = require('../../services/v2/notifikasi.service')
+const isUnique = require('../../middleware/isUnique')
+const {
+  CREATE_LAPORAN, PELAPORAN, DIKTI, TRUE, LLDIKTI, PENJADWALAN, PEMERIKSAAN, PTB_DIKTI, PTB_LLDIKTI, PTB_PT,
+  PTB_ADMIN, PTB_READ, FALSE, DELEGASI, DITUTUP, UPDATE_LAPORAN
+} = require('../../utils/constanta')
+const forRole = require('../../middleware/role')
+const handleDokumen = require('../../utils/handleDokumen')
+
+exports.create = [
+  auth,
+  uploadFile.array('dokumen'),
+  validation((req) => req.body, {
+    no_laporan: 'string',
+    pt_id: 'string',
+    pelanggaran_id: 'string',
+    keterangan: 'string'
+  }),
+  isUnique((req) => req.body.no_laporan, (no_laporan) => laporanModel.findOne({ no_laporan })),
+  checkData((req) => req.body.pt_id, (pt_id) => axios.get(`https://api.kemdikbud.go.id:8243/pddikti/1.2/pt/${pt_id}`), 'pt'),
+  checkData((req) => req.body.pelanggaran_id, (data) => {
+      const pelanggaran_id = data.split(',')
+      return pelanggaranModel.find({
+        _id: {
+          $in: pelanggaran_id
+        }
+      })
+    },
+    'pelanggaran'
+  ),
+  async (req, res) => {
+    const { no_laporan, keterangan, dokumen } = req.body
+    const { pt, pelanggaran } = req.data
+    const user = req.user
+    let dokumen_id = []
+    if (dokumen.length) dokumen_id = (await addManyDokumen(dokumen)).map(e => e._id)
+
+    try {
+      const data = await laporanModel.create({
+        no_laporan,
+        user: user._id,
+        dokumen: dokumen_id,
+        pt: pt[0],
+        pelanggaran: pelanggaran.map(e => e._id),
+        keterangan,
+        role_data: user.role.id === 2021 ? LLDIKTI : DIKTI,
+        role_asal: user.role.id === 2021 ? LLDIKTI : DIKTI,
+        step: [PELAPORAN],
+        flag: PELAPORAN
+      })
+
+      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
+      })
+
+      await sendWaCreateLaporan({ user, pt, keterangan, no_laporan })
+    } catch (e) {
+      return response.error(res, {
+        message: e.message,
+        code: 500
+      })
+    }
+
+    return response.success(res, {
+      message: 'Berhasil menambah laporan',
+      code: 201
+    })
+  }
+]
+
+exports.getAll = [
+  auth,
+  forRole([PTB_DIKTI, PTB_LLDIKTI, PTB_ADMIN, PTB_READ]),
+  async (req, res) => {
+    const user = req.user
+    const { no_laporan, pt_id, penjadwalan, pemeriksaan, aktif, delegasi, all, sanksi, tuntas } = req.query
+    let query = {}
+
+    switch (user.role.id) {
+      case PTB_DIKTI:
+        query.$or = [
+          { role_asal: DIKTI },
+          { role_data: DIKTI }
+        ]
+        if (delegasi === TRUE) {
+          query = {
+            role_asal: DIKTI,
+            role_data: LLDIKTI
+          }
+        }
+        break
+      case PTB_LLDIKTI:
+        query.$or = [
+          { role_asal: LLDIKTI },
+          { role_data: LLDIKTI }
+        ]
+        if (delegasi === TRUE) {
+          query = {
+            role_asal: LLDIKTI,
+            role_data: DIKTI
+          }
+        }
+        query['pt.pembina.id'] = user.lembaga.id
+        break
+    }
+
+    query.step = { $in: [PELAPORAN] }
+    if (penjadwalan === TRUE) {
+      query.step = { $in: [PENJADWALAN] }
+    }
+    if (pemeriksaan === TRUE) {
+      query.step = { $in: [PEMERIKSAAN] }
+    }
+
+    let data
+    try {
+      data = await laporanModel
+        .find(query)
+        .populate('user')
+        .populate({ path: 'sanksi', populate: ['pelanggaran'] })
+        .sort({
+          createdAt: -1
+        })
+    } catch (e) {
+      return response.error(res, {
+        message: e.message,
+        code: 500
+      })
+    }
+
+    return response.success(res, {
+      message: 'Berhasil mendapatkan data',
+      data
+    })
+  }
+]
+
+exports.getOne = [
+  auth,
+  forRole([PTB_DIKTI, PTB_LLDIKTI, PTB_PT]),
+  checkData((req) => req.params.id, (id) =>
+      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'] })
+        .populate('tuntas.dokumen'),
+    'laporan'
+  ),
+  async (req, res) => {
+    const { laporan } = req.data
+
+    return response.success(res, {
+      message: 'Berhasil mendapatkan data',
+      data: laporan
+    })
+  }
+]
+
+exports.update = [
+  auth,
+  forRole([PTB_DIKTI, PTB_LLDIKTI, PTB_PT]),
+  checkData((req) => req.params.id, (id) => laporanModel.findById(id), 'laporan'),
+  (req, res, next) => {
+    if (req.query['redudansi'] === 'true') return handleDokumen.array('dokumen')(req, res, next)
+    return next()
+  },
+  (req, res, next) => {
+    req.body['dokumen'] = req.files
+    return next()
+  },
+  validation((req) => req.body, {
+    change_role: { type: 'string', optional: true, enum: [TRUE, FALSE] },
+    aktif: { type: 'string', optional: true, enum: [TRUE, FALSE] },
+    keterangan: 'string'
+  }),
+  async (req, res) => {
+    let { keterangan, dokumen } = req.body
+    const user = req.user
+    const data = {}
+    let message = ''
+    const { change_role, aktif } = req.body
+    const { laporan } = req.data
+
+    if (change_role === 'true') {
+      data.flag = DELEGASI
+      data.role_data = user.role.id === 2020 ? LLDIKTI : DIKTI
+      message = `Laporan didelegasi ke ${user.role.id === 2020 ? LLDIKTI : DIKTI}`
+      data.alasan_delegasi = keterangan
+    }
+    if (aktif) {
+      data.aktif = aktif === TRUE
+      let dokumen_id = []
+      if (dokumen) dokumen_id = (await addManyDokumen(dokumen)).map((e) => e._id)
+      if (aktif === TRUE) {
+        message = 'Laporan dibuka'
+      } else {
+        message = `Laporan ditutup`
+        alasan = keterangan
+        data.flag = DITUTUP
+        data.tuntas = {
+          keterangan,
+          dokumen: dokumen_id
+        }
+        data.sebelum_ditutup = {
+          step : laporan.step
+        }
+        data.step = []
+      }
+    }
+
+    await laporanModel.findByIdAndUpdate(laporan._id, data)
+    await pemantauanModel.create({
+      action: UPDATE_LAPORAN,
+      laporan: laporan._id,
+      pt_id: laporan.pt.id,
+      user: user._id,
+      keterangan: message,
+      alasan: keterangan,
+      for_pt: false
+    })
+
+    return response.success(res, {
+      message: 'Berhasil update laporan'
+    })
+  }
+]

+ 119 - 0
controller/v2/pemeriksaan.controller.js

@@ -0,0 +1,119 @@
+const auth = require('../../middleware/verifyToken')
+const checkData = require('../../middleware/checkData')
+const laporanModel = require('../../model/laporan.model')
+const response = require('../../utils/responseHandler')
+const { validation } = require('../../middleware/validation')
+const uploadFile = require('../../middleware/uploadFile')
+const { PEMERIKSAAN, ADD_EVALUASI, EDIT_EVALUASI, PTB_DIKTI, PTB_LLDIKTI } = require('../../utils/constanta')
+const { addManyDokumen } = require('../../utils/dokumenFunction')
+const pemantauanModel = require('../../model/pemantauan.model')
+const forRole = require('../../middleware/role')
+
+exports.create = [
+  auth,
+  forRole([PTB_DIKTI, PTB_LLDIKTI]),
+  checkData((req) => req.params.laporan_id, (id) => laporanModel.findById({ _id: id }), 'laporan'),
+  uploadFile.array('dokumen'),
+  validation((req) => req.body, {
+    judul: 'string',
+    tanggal: { type: 'date', convert: true },
+    dokumen: {
+      type: 'array',
+      items: {
+        type: 'object',
+        buffer: { type: 'class', instanceOf: Buffer }
+      }
+    }
+  }),
+  async (req, res) => {
+    const { judul, tanggal, dokumen } = req.body
+    const { laporan } = req.data
+    const user = req.user
+
+    try {
+      const dokumen_id = (await addManyDokumen(dokumen)).map((e) => e._id)
+
+      const data = {
+        flag: PEMERIKSAAN,
+        $push: {
+          evaluasi: {
+            dari: user._id,
+            judul,
+            tanggal,
+            dokumen: dokumen_id
+          }
+        }
+      }
+      if (!laporan.step.includes(PEMERIKSAAN)) data.$push = { step: PEMERIKSAAN }
+      await laporanModel.findOneAndUpdate({ _id: laporan._id }, data)
+
+      let for_public = true
+      if (laporan.evaluasi.length > 0) for_public = false
+
+      await pemantauanModel.create({
+        laporan: laporan._id,
+        user: user._id,
+        action: ADD_EVALUASI,
+        pt_id: laporan.pt.id,
+        keterangan: 'Melakukan evaluasi',
+        dokumen: dokumen_id,
+        for_pt: false,
+        for_public
+      })
+    } catch (e) {
+      return response.error(res, {
+        message: e.message,
+        code: 500
+      })
+    }
+
+    return response.success(res, {
+      message: 'Berhasil membuat evaluasi pemeriksaan',
+      code: 201
+    })
+  }
+]
+
+exports.edit = [
+  auth,
+  checkData((req) => req.params.id, (id) => laporanModel.findById({ _id: id })),
+  uploadFile.array('dokumen'),
+  validation((req) => req.body, {
+    judul: 'string',
+    tanggal: { type: 'date', convert: true }
+  }),
+  async (req, res) => {
+    const user = req.user
+    const { laporan } = req.data
+    const { judul, tanggal, dokumen } = req.body
+
+    let dokumen_id
+    if (dokumen.length) dokumen_id = (await addManyDokumen(dokumen)).map((e) => e._id)
+
+    const data = await laporanModel.findOneAndUpdate({ _id: laporan._id },
+      {
+        $set: {
+          'evaluasi.$.judul': judul,
+          'evaluasi.$.tanggal': tanggal,
+          'evaluasi.$.dokumen': dokumen_id
+        }
+      }
+    )
+
+    await pemantauanModel.create({
+      laporan: laporan._id,
+      user: user._id,
+      action: EDIT_EVALUASI,
+      pt_id: laporan.pt.id,
+      keterangan: 'Melakukan edit evaluasi',
+      dokumen: dokumen_id,
+      for_pt: false,
+      for_public: true
+    })
+
+    return response.success(res, {
+      message: 'Berhasil edit evaluasi',
+      data
+    })
+  }
+]

+ 67 - 0
controller/v2/penjadwalan.controller.js

@@ -0,0 +1,67 @@
+const auth = require('../../middleware/verifyToken')
+const checkData = require('../../middleware/checkData')
+const laporanModel = require('../../model/laporan.model')
+const response = require('../../utils/responseHandler')
+const { validation } = require('../../middleware/validation')
+const forRole = require('../../middleware/role')
+const { PTB_DIKTI, PTB_LLDIKTI, PENJADWALAN, ADD_JADWAL } = require('../../utils/constanta')
+const uploadFile = require('../../middleware/uploadFile')
+const pemantauanModel = require('../../model/pemantauan.model')
+
+exports.create = [
+  auth,
+  forRole([PTB_DIKTI, PTB_LLDIKTI]),
+  checkData((req) => req.params.laporan_id, (id) => laporanModel.findById({ _id: id }), 'laporan'),
+  uploadFile.array('dokumen'),
+  validation((req) => req.body, {
+    judul: 'string',
+    dari_tanggal: { type: 'date', convert: true },
+    sampai_tanggal: { type: 'date', convert: true },
+    warna: 'string'
+  }),
+  async (req, res) => {
+    const { judul, dari_tanggal, sampai_tanggal, warna } = req.body
+    const { laporan } = req.data
+    const user = req.user
+
+    try {
+      const data = {
+        flag: PENJADWALAN,
+        jadwal: {
+          judul,
+          dari_tanggal,
+          sampai_tanggal,
+          warna
+        }
+      }
+      if (!laporan.step.includes(PENJADWALAN)) data.$push = { step: PENJADWALAN }
+      await laporanModel.findOneAndUpdate({ _id: laporan._id }, data)
+
+      let for_public = true
+      if (laporan.evaluasi.length > 0) for_public = false
+
+      await pemantauanModel.create({
+        laporan: laporan._id,
+        user: user._id,
+        action: ADD_JADWAL,
+        pt_id: laporan.pt.id,
+        keterangan: 'Membuat Jadwal Pemeriksaan',
+        jadwal: {
+          dari_tanggal,
+          sampai_tanggal
+        },
+        for_public
+      })
+    } catch (e) {
+      return response.error(res, {
+        message: e.message,
+        code: 500
+      })
+    }
+
+    return response.success(res, {
+      message: 'Berhasil membuat jadwal pemeriksaan',
+      code: 201
+    })
+  }
+]

+ 353 - 0
controller/v2/sanksi.controller.js

@@ -0,0 +1,353 @@
+const auth = require('../../middleware/verifyToken')
+const forRole = require('../../middleware/role')
+const {
+  PTB_DIKTI,
+  PTB_LLDIKTI,
+  PENJADWALAN,
+  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 axios = require('../../utils/axios')
+const logModel = require('../../model/log.model')
+const handleError = require('../../utils/v1/handleError')
+const { validate } = require('../../utils/v1/validation')
+const { cekSatuDataSanksi } = require('../../utils/v1/cekData')
+
+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 ? true : false
+    })
+    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 axios.post(
+        `https://api.kemdikbud.go.id:8243/pddikti/1.2/pt/${sanksi.laporan.pt.kode}/sanksi`,
+        {
+          noSanksi: sanksi.no_sanksi,
+          tmtBerlaku: sanksi.masa_berlaku.from_date,
+          tstBerlaku: sanksi.tanggal_terima_sanksi,
+          idJenisSanksi: Math.max(...sanksi.pelanggaran.map(e => e.level_sanksi)),
+          alasan: 'Penetapan sanksi'
+        }, {
+          'Content-Type': 'application/json'
+        })
+      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'
+      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'
+    })
+  }
+]

+ 23 - 0
middleware/checkData.js

@@ -0,0 +1,23 @@
+const response = require('../utils/responseHandler')
+
+module.exports = (fromField, callback, nameVariable = null) => async (req, res, next) => {
+  const field = fromField.toString().split('.').pop()
+  let data = null
+  try {
+    data = await callback(fromField(req))
+    if (!Object.keys(data).length) {
+      return response.error(res, {
+        message: `${field} tidak ditemukan`,
+        code: 404
+      })
+    }
+  } catch (e) {
+    return response.error(res, {
+      message: e.message,
+      code: e.response?.status || 500
+    })
+  }
+  if (nameVariable) req.data[nameVariable] = data
+  else req.data[field] = data
+  return next()
+}

+ 19 - 0
middleware/isUnique.js

@@ -0,0 +1,19 @@
+const response = require('../utils/responseHandler')
+
+module.exports = (fromField, callback) => async(req, res, next) => {
+  try {
+    const data = await callback(fromField(req))
+    if (data || data?.length) {
+      return response.error(res, {
+        message: `${fromField.toString().split('.').pop()} sudah ada`,
+        code: 409
+      })
+    }
+  } catch (e) {
+    return response.error(res, {
+      message: e.message,
+      code: e.response.status || 500
+    })
+  }
+  return next()
+}

+ 35 - 0
middleware/uploadFile.js

@@ -0,0 +1,35 @@
+const multer = require('multer')
+const storage = multer.memoryStorage()
+
+const handleDokumen = multer({
+  storage,
+  limits: {
+    fileSize: 15 * 1024 * 1024
+  }
+})
+
+exports.single = (name) => [
+  handleDokumen.single(name),
+  (req, res, next) => {
+    req.body[name] = req.file
+    return next()
+  }
+]
+
+exports.array = (name, maxCount) => [
+  handleDokumen.array(name, maxCount),
+  (req, res, next) => {
+    req.body[name] = req.files
+    return next()
+  }
+]
+
+exports.fields = (data) => [
+  handleDokumen.fields(data),
+  (req, res, next) => {
+    data.forEach((e) => {
+      req.body[e.name] = req.files[e.name]
+    })
+    return next()
+  }
+]

+ 14 - 0
middleware/validation.js

@@ -0,0 +1,14 @@
+const Validator = require("fastest-validator");
+
+exports.validation = (valueFrom, schema, ) => (req, res, next) => {
+  const v = new Validator();
+  const check = v.compile(schema);
+  const validationError = check(valueFrom(req))
+  if (validationError.length) {
+    return res.status(400).json({
+      message: 'Validation Error',
+      error: validationError
+    })
+  }
+  next()
+}

+ 1 - 2
middleware/verifyToken.js

@@ -24,8 +24,7 @@ module.exports = (req, res, next) => {
     }
 
     try {
-      const user = await userModel.findById(data._id)
-      req.user = user
+      req.user = await userModel.findById(data._id)
       next()
     } catch (error) {
       return response.error(res, {

+ 5 - 0
model/laporan.model.js

@@ -18,6 +18,7 @@ module.exports = mongoose.model(
       pelanggaran: [{ type: Types.ObjectId, ref: pelanggaran }],
       alasan_delegasi: String,
       level: { type: Number, enum: [1, 2, 3] },
+      flag: String,
       role_asal: {
         type: String,
         enum: ['dikti', 'lldikti'],
@@ -28,6 +29,10 @@ module.exports = mongoose.model(
         enum: ['dikti', 'lldikti'],
         default: 'dikti',
       },
+      sebelum_ditutup: {
+        step: [String],
+      },
+      step: [{type: String, enum: ['pelaporan', 'penjadwalan', 'pemeriksaan', 'sanksi', 'ditutup', 'delegasi', 'selesai', 'cabut_sanksi', 'keberatan', 'banding'] }],
       aktif: { type: Boolean, default: true },
       tuntas: {
         keterangan: String,

+ 10 - 0
model/sanksi.model.js

@@ -26,6 +26,16 @@ module.exports = mongoose.model(
       }],
       tanggal_akhir_keberatan: Date,
       aktif: { type: Boolean, default: true },
+      step: [{ type: String, enum: ['keberatan', 'banding', 'cabut_sanksi', 'dokumen_perbaikan'] }],
+      tuntas: {
+        keterangan: String,
+        dokumen: [
+          {
+            type: Types.ObjectId,
+            ref: dokumen,
+          },
+        ],
+      },
       berita_acara:
       {
         type: Types.ObjectId,

+ 10 - 0
model/sanksi2.model.js

@@ -24,6 +24,16 @@ module.exports = mongoose.model(
       }],
       tanggal_akhir_keberatan: Date,
       aktif: { type: Boolean, default: true },
+      step: [{ type: String, enum: ['keberatan', 'banding', 'cabut_sanksi', 'dokumen_perbaikan'] }],
+      tuntas: {
+        keterangan: String,
+        dokumen: [
+          {
+            type: Types.ObjectId,
+            ref: dokumen,
+          },
+        ],
+      },
       berita_acara:
       {
         type: Types.ObjectId,

+ 28 - 0
routes/index.js

@@ -0,0 +1,28 @@
+const router = require('express').Router()
+const dokumenController = require('../controller/dokumen.controller')
+
+router.get('/', (req, res) => {
+  return res.json({
+    message: 'API SIDALI'
+  })
+})
+
+router.use('/v1', require('../routes/v1'))
+router.use('/v2', require('../routes/v2'))
+
+router.get('/dokumen/:id/:nama_file', dokumenController.getDokumen)
+
+router.get('/csrf',
+  (req, res, next) => {
+    // if (req.headers['x3u2-y4w1r'] !== Date.now().toString().slice(0, 10) + '51d@l!') {
+    if (req.headers['x3u2-y4w1r'] !== '51d@l!') {
+      return res.status(401).json({ message: 'unauthorized' })
+    }
+    next()
+  },
+  (req, res) => {
+    return res.json({ token: null })
+  }
+)
+
+module.exports = router

+ 1 - 1
routes/v1/auth.routes.js

@@ -1,5 +1,5 @@
 const router = require('express').Router()
-const auth = require('../../controller/auth.controller')
+const auth = require('../../controller/v1/auth.controller')
 const verify = require('../../middleware/verifyToken')
 const blacklistUser = require('../../middleware/blacklistUser')
 const role = require('../../middleware/role')

+ 1 - 1
routes/v1/auto.routes.js

@@ -1,5 +1,5 @@
 const router = require('express').Router()
-const auto = require('../../controller/auto.controller')
+const auto = require('../../controller/v1/auto.controller')
 const verify = require('../../middleware/verifyTokenAuto')
 const auth = require('../../middleware/verifyToken')
 

+ 1 - 1
routes/v1/graph.routes.js

@@ -1,5 +1,5 @@
 const router = require('express').Router()
-const graph = require('../../controller/graph.controller')
+const graph = require('../../controller/v1/graph.controller')
 const auth = require('../../middleware/verifyToken')
 const roleId = require('../../middleware/role')
 

+ 2 - 2
routes/v1/index.js

@@ -12,7 +12,7 @@ router.get('/csrf',  (req, res) => {
   return res.json({token: 'null'})
 })
 
-router.use('/laporan', auth, roleId([2020, 2021, 2023]), require('./laporan'))
+router.use('/laporan', auth, roleId([2020, 2021, 2023, 2024]), require('./laporan'))
 router.use('/sanksi', auth, require('./sanksi'))
 router.use('/public', require('./public.routes'))
 router.use('/auth', require('./auth.routes'))
@@ -20,7 +20,7 @@ router.use('/user', auth, require('./user.routes'))
 router.use('/pemantauan', auth, require('./pemantauan.routes'))
 router.use('/pt', auth, require('./pt.routes'))
 router.use('/pelanggaran', auth, require('./pelanggaran.routes'))
-router.use('/lembaga', auth, roleId([2020, 2023]), require('./lembaga.routes'))
+router.use('/lembaga', auth, roleId([2020, 2023, 2024]), require('./lembaga.routes'))
 router.use('/graph', require('./graph.routes'))
 router.use('/log', require('./log.routes'))
 router.use('/auto', require('./auto.routes'))

+ 1 - 1
routes/v1/laporan/evaluasi.routes.js

@@ -1,5 +1,5 @@
 const router = require('express').Router()
-const evaluasi = require('../../../controller/laporan/evaluasi.controller')
+const evaluasi = require('../../../controller/v1/laporan/evaluasi.controller')
 const handleDokumen = require('../../../utils/handleDokumen')
 
 router.post('/add/:id', handleDokumen.array('dokumen'), evaluasi.add)

+ 1 - 1
routes/v1/laporan/index.js

@@ -1,5 +1,5 @@
 const router = require('express').Router()
-const laporan = require('../../../controller/laporan.controller')
+const laporan = require('../../../controller/v1/laporan.controller')
 const handleDokumen = require('../../../utils/handleDokumen')
 const roleId = require('../../../middleware/role')
 

+ 1 - 1
routes/v1/laporan/jadwal.routes.js

@@ -1,5 +1,5 @@
 const router = require('express').Router()
-const jadwal = require('../../../controller/laporan/jadwal.controller')
+const jadwal = require('../../../controller/v1/laporan/jadwal.controller')
 
 router.put('/update/:id', jadwal.update)
 

+ 1 - 1
routes/v1/lembaga.routes.js

@@ -1,5 +1,5 @@
 const router = require('express').Router()
-const lembaga = require('../../controller/lembaga.controller')
+const lembaga = require('../../controller/v1/lembaga.controller')
 
 router.get('/', lembaga.get)
 

+ 1 - 1
routes/v1/log.routes.js

@@ -1,5 +1,5 @@
 const router = require('express').Router()
-const log = require('../../controller/log.controller')
+const log = require('../../controller/v1/log.controller')
 const auth = require('../../middleware/verifyToken')
 const roleId = require('../../middleware/role')
 

+ 2 - 1
routes/v1/migration.routes.js

@@ -1,8 +1,9 @@
 const router = require('express').Router()
-const migrasi = require('../../controller/migrasi.controller')
+const migrasi = require('../../controller/v1/migrasi.controller')
 
 router.put('/pengajuan', migrasi.pengajuan)
 router.put('/dokumen', migrasi.dokumen)
 router.put('/pelanggaran-sanksi', migrasi.pelanggaranSanksi)
+router.put('/tambah-step', migrasi.tambahStep)
 
 module.exports = router

+ 1 - 1
routes/v1/pelanggaran.routes.js

@@ -1,5 +1,5 @@
 const router = require('express').Router()
-const pelanggaran = require('../../controller/pelanggaran.controller')
+const pelanggaran = require('../../controller/v1/pelanggaran.controller')
 const roleId = require('../../middleware/role')
 const auth = require('../../middleware/verifyToken')
 

+ 1 - 1
routes/v1/pemantauan.routes.js

@@ -1,5 +1,5 @@
 const router = require('express').Router()
-const pemantauan = require('../../controller/pemantauan.controller')
+const pemantauan = require('../../controller/v1/pemantauan.controller')
 const roleId = require('../../middleware/role')
 
 router.get('/pt', roleId(2022), pemantauan.getPT)

+ 1 - 1
routes/v1/pengunjung.routes.js

@@ -1,5 +1,5 @@
 const router = require('express').Router()
-const pengunjung = require('../../controller/pengunjung.controller')
+const pengunjung = require('../../controller/v1/pengunjung.controller')
 const auth = require('../../middleware/verifyToken')
 
 router.post('/create', pengunjung.create)

+ 1 - 1
routes/v1/pt.routes.js

@@ -1,5 +1,5 @@
 const router = require('express').Router()
-const pt = require('../../controller/pt.controller')
+const pt = require('../../controller/v1/pt.controller')
 const roleId = require('../../middleware/role')
 
 router.get('/', pt.getAll)

+ 7 - 7
routes/v1/public.routes.js

@@ -1,13 +1,13 @@
 const router = require('express').Router()
-const user = require('../../controller/user.controller')
-const pt = require('../../controller/pt.controller')
-const pelanggaran = require('../../controller/pelanggaran.controller')
-const laporan = require('../../controller/laporan.controller')
-const pemantauan = require('../../controller/pemantauan.controller')
+const user = require('../../controller/v1/user.controller')
+const pt = require('../../controller/v1/pt.controller')
+const pelanggaran = require('../../controller/v1/pelanggaran.controller')
+const laporan = require('../../controller/v1/laporan.controller')
+const pemantauan = require('../../controller/v1/pemantauan.controller')
 const handleDokumen = require('../../utils/handleDokumen')
 const auth = require('../../middleware/verifyTokenPublic')
-const pengunjung = require('../../controller/pengunjung.controller')
-const sanksi = require('../../controller/sanksi.controller')
+const pengunjung = require('../../controller/v1/pengunjung.controller')
+const sanksi = require('../../controller/v1/sanksi.controller')
 
 router.get('/pt', pt.public)
 router.get('/pelanggaran', pelanggaran.public)

+ 1 - 1
routes/v1/rekomendasi.routes.js

@@ -1,5 +1,5 @@
 const router = require('express').Router()
-const rekomendasi = require('../../controller/rekomendasi.controller')
+const rekomendasi = require('../../controller/v1/rekomendasi.controller')
 const handleDokumen = require('../../utils/handleDokumen')
 const roleId = require('../../middleware/role')
 

+ 1 - 1
routes/v1/sanksi/banding.routes.js

@@ -1,5 +1,5 @@
 const router = require('express').Router()
-const banding = require('../../../controller/sanksi/banding.controller')
+const banding = require('../../../controller/v1/sanksi/banding.controller')
 const handleDokumen = require('../../../utils/handleDokumen')
 const roleId = require('../../../middleware/role')
 

+ 1 - 1
routes/v1/sanksi/cabutSanksi.routes.js

@@ -1,5 +1,5 @@
 const router = require('express').Router()
-const cabutSanksi = require('../../../controller/sanksi/cabutSanksi.controller')
+const cabutSanksi = require('../../../controller/v1/sanksi/cabutSanksi.controller')
 const handleDokumen = require('../../../utils/handleDokumen')
 const roleId = require('../../../middleware/role')
 

+ 1 - 1
routes/v1/sanksi/index.js

@@ -1,5 +1,5 @@
 const router = require('express').Router()
-const sanksi = require('../../../controller/sanksi.controller')
+const sanksi = require('../../../controller/v1/sanksi.controller')
 const handleDokumen = require('../../../utils/handleDokumen')
 const roleId = require('../../../middleware/role')
 const checkEnv = require('../../../middleware/checkEnv')

+ 1 - 1
routes/v1/sanksi/keberatan.routes.js

@@ -1,5 +1,5 @@
 const router = require('express').Router()
-const keberatan = require('../../../controller/sanksi/keberatan.controller')
+const keberatan = require('../../../controller/v1/sanksi/keberatan.controller')
 const handleDokumen = require('../../../utils/handleDokumen')
 const roleId = require('../../../middleware/role')
 

+ 1 - 1
routes/v1/sanksi/perbaikan.routes.js

@@ -1,5 +1,5 @@
 const router = require('express').Router()
-const perbaikan = require('../../../controller/sanksi/perbaikan.controller')
+const perbaikan = require('../../../controller/v1/sanksi/perbaikan.controller')
 const handleDokumen = require('../../../utils/handleDokumen')
 const roleId = require('../../../middleware/role')
 

+ 1 - 1
routes/v1/user.routes.js

@@ -1,5 +1,5 @@
 const router = require('express').Router()
-const user = require('../../controller/user.controller')
+const user = require('../../controller/v1/user.controller')
 const handleDokumen = require('../../utils/handleDokumen')
 
 router.get('/', user.get)

+ 8 - 0
routes/v2/auth.routes.js

@@ -0,0 +1,8 @@
+const router = require('express').Router()
+const authController = require('../../controller/v2/auth.controller')
+
+router.post('/login', ...authController.login)
+router.post('/loginToPT', ...authController.loginToPT)
+router.delete('/logout', authController.logout)
+
+module.exports = router

+ 16 - 0
routes/v2/index.js

@@ -0,0 +1,16 @@
+const router = require('express').Router()
+
+router.get('/', (req, res) => {
+  return res.json({
+    message: 'welcome to api v2',
+    version: 2,
+  })
+})
+
+router.use('/auth', require('./auth.routes'))
+router.use('/laporan', require('./laporan.routes'))
+router.use('/penjadwalan', require('./penjadwalan.routes'))
+router.use('/pemeriksaan', require('./pemeriksaan.routes'))
+router.use('/sanksi', require('./sanksi.routes'))
+
+module.exports = router

+ 9 - 0
routes/v2/laporan.routes.js

@@ -0,0 +1,9 @@
+const router = require('express').Router()
+const laporanController = require('../../controller/v2/laporan.controller')
+
+router.post('/', ...laporanController.create)
+router.put('/:id', ...laporanController.update)
+router.get('/', ...laporanController.getAll)
+router.get('/:id', ...laporanController.getOne)
+
+module.exports = router

+ 6 - 0
routes/v2/pemeriksaan.routes.js

@@ -0,0 +1,6 @@
+const router = require('express').Router()
+const pemeriksaanController = require('../../controller/v2/pemeriksaan.controller')
+
+router.post('/:laporan_id', ...pemeriksaanController.create)
+
+module.exports = router

+ 6 - 0
routes/v2/penjadwalan.routes.js

@@ -0,0 +1,6 @@
+const router = require('express').Router()
+const penjadwalanController = require('../../controller/v2/penjadwalan.controller')
+
+router.post('/:laporan_id', ...penjadwalanController.create)
+
+module.exports = router

+ 8 - 0
routes/v2/sanksi.routes.js

@@ -0,0 +1,8 @@
+const router = require('express').Router()
+const sanksiController = require('../../controller/v2/sanksi.controller')
+
+router.post('/:laporan_id', ...sanksiController.create)
+router.get('/', ...sanksiController.getAll)
+router.get('/:sanksi_id', ...sanksiController.getOne)
+
+module.exports = router

+ 35 - 0
services/v2/notifikasi.service.js

@@ -0,0 +1,35 @@
+const kontakModel = require('../../model/kontak.model')
+const { notifWA } = require('../../utils/v1/notifFunction')
+const { TEMPLATE_LAPORAN } = require('../../utils/constanta')
+const logModel = require('../../model/log.model')
+
+exports.sendWaCreateLaporan = async ({ user, pt, keterangan, no_laporan }) => {
+  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}`,
+    })
+  }
+}

+ 32 - 0
utils/constanta.js

@@ -10,3 +10,35 @@ exports.TEMPLATE_PERBAIKAN_DOKUMEN = '891ee9c7-39f8-416e-af5c-6b3a10e9dbec'
 exports.TEMPLATE_VERIFIKASI = '37a9ccba-e1bc-4d02-86e0-3be4c718af2a'
 exports.TEMPLATE_REMINDER = '960eaacb-0dd9-42a6-b331-60fac972eb96'
 exports.TEMPLATE_REMINDER2 = 'd4f02018-2063-4d29-bd05-9f9468d71bf1'
+
+exports.LLDIKTI = 'lldikti'
+exports.DIKTI = 'dikti'
+
+exports.PELAPORAN = 'pelaporan'
+exports.PENJADWALAN = 'penjadwalan'
+exports.PEMERIKSAAN = 'pemeriksaan'
+exports.KEBERATAN = 'keberatan'
+exports.BANDING = 'banding'
+exports.CABUT_SANKSI = 'cabut_sanksi'
+exports.PERBAIKAN = 'perbaikan'
+exports.SANKSI = 'sanksi'
+exports.SELESAI = 'selesai'
+exports.DELEGASI = 'delegasi'
+exports.DITUTUP = 'ditutup'
+
+exports.CREATE_LAPORAN = 'CREATE LAPORAN'
+exports.ADD_EVALUASI = 'ADD EVALUASI'
+exports.EDIT_EVALUASI = 'EDIT EVALUASI'
+exports.ADD_JADWAL = 'ADD JADWAL'
+exports.CREATE_SANKSI = 'CREATE SANKSI'
+exports.UPDATE_LAPORAN = 'UPDATE LAPORAN'
+exports.UPDATE_SANKSI = 'UPDATE SANKSI'
+
+exports.TRUE = 'true'
+exports.FALSE = 'false'
+
+exports.PTB_DIKTI = 2020
+exports.PTB_LLDIKTI = 2021
+exports.PTB_PT = 2022
+exports.PTB_ADMIN = 2023
+exports.PTB_READ = 2024

+ 1 - 2
utils/dokumenFunction.js

@@ -30,7 +30,7 @@ exports.addManyDokumen = async (dokumenArray) => {
         type: dokumen.mimetype,
         size: dokumen.size,
       })
-      const data = await dokumenModel.create({
+      return await dokumenModel.create({
         chunk: chunk._id,
         type: dokumen.mimetype,
         judul: Date.now() + '-' + dokumen.originalname,
@@ -41,7 +41,6 @@ exports.addManyDokumen = async (dokumenArray) => {
           '/' +
           dokumen.originalname,
       })
-      return data
     })
   )
 }

+ 13 - 9
utils/cekData.js → utils/v1/cekData.js

@@ -1,7 +1,7 @@
-const laporanModel = require('../model/laporan.model')
-const pelanggaranModel = require('../model/pelanggaran.model')
-const sanksiModel = require('../model/sanksi.model')
-const response = require('../utils/responseHandler')
+const laporanModel = require('../../model/laporan.model')
+const pelanggaranModel = require('../../model/pelanggaran.model')
+const sanksiModel = require('../../model/sanksi.model')
+const response = require('../responseHandler')
 
 exports.cekSatuDataLaporan = async (
   res,
@@ -9,7 +9,8 @@ exports.cekSatuDataLaporan = async (
   laporan_id,
   where = { delegasi: false, aktif: true }
 ) => {
-  let w = { _id: laporan_id, aktif: where.aktif || true, ...where }
+  let w = { _id: laporan_id, ...where }
+  // if (where.aktif !== 'empty') w.aktif = where.aktif || true
   switch (user.role.id) {
     case 2020:
       if (where.all) {
@@ -65,7 +66,9 @@ exports.cekSatuDataLaporan = async (
 }
 
 exports.cekBanyakDataLaporan = async (user, where = { delegasi: false }, options = {}) => {
-  const w = { aktif: where.aktif || true, ...where }
+  const w = { ...where }
+  if (where.aktif !== 'empty') w.aktif = where.aktif || true
+  else delete w.aktif
   switch (user.role.id) {
     case 2020:
       if (where.all) {
@@ -103,13 +106,13 @@ exports.cekBanyakDataLaporan = async (user, where = { delegasi: false }, options
     .find(w)
     .populate('user')
     .populate({ path: 'sanksi', populate: ['pelanggaran'] })
-    .select(w.select || ' -pelanggaran -aktif -dokumen')
+    .select(w.select || ' -pelanggaran -dokumen')
     .limit(w.limit)
     .sort({
       createdAt: -1,
     })
   if (options.lean) laporan = laporan.lean()
-  return await laporan
+  return laporan
 }
 
 exports.cekSatuDataSanksi = async (
@@ -118,7 +121,8 @@ exports.cekSatuDataSanksi = async (
   sanksi_id,
   where = { banding: false }
 ) => {
-  let w = { aktif: where.aktif || true }
+  // let w = { aktif: where.aktif || true }
+  let w = {}
   switch (user.role.id) {
     case 2020:
       // if (where.all) w.role_asal = 'dikti'

+ 1 - 1
utils/handleError.js → utils/v1/handleError.js

@@ -1,4 +1,4 @@
-const response = require('../utils/responseHandler')
+const response = require('../responseHandler')
 
 module.exports = (callback) => async (req, res, next) => {
   try {

+ 2 - 2
utils/notifFunction.js → utils/v1/notifFunction.js

@@ -1,5 +1,5 @@
-const axios = require('../utils/axios')
-const kontakModel = require('../model/kontak.model')
+const axios = require('../axios')
+const kontakModel = require('../../model/kontak.model')
 
 exports.notifWA = async (templateId, data, where = {}) => {
   const kontak = await kontakModel.find(where)

+ 1 - 1
utils/validation.js → utils/v1/validation.js

@@ -1,6 +1,6 @@
 const Validator = require('fastest-validator')
 const v = new Validator()
-const response = require('./responseHandler')
+const response = require('../responseHandler')
 
 exports.validate = (res, data, schema, payload) => {
   const check = v.compile(schema)