yazid138 1 jaar geleden
bovenliggende
commit
9c900d1f6c

+ 28 - 0
controller/dokumen.controller.js

@@ -1,5 +1,8 @@
 const chunkModel = require('../model/chunk.model')
 const handleError = require('../utils/v1/handleError')
+const dokumenModel = require('../model/dokumen.model')
+const coba = require('../utils/coba')
+const response = require('../utils/responseHandler')
 
 exports.getDokumen = handleError(async (req, res) => {
   const { id } = req.params
@@ -7,3 +10,28 @@ exports.getDokumen = handleError(async (req, res) => {
   res.header('Content-Type', data.type)
   return res.end(Buffer.from(data.data))
 })
+
+exports.createDokumen = handleError(async (req, res) => {
+  const dokumen = req.file
+  const chunk = await chunkModel.create({
+    data: dokumen.buffer,
+    type: dokumen.mimetype,
+    size: dokumen.size,
+  })
+  const path =
+    coba.decrypt(process.env.W8A1C) +
+    '/dokumen/' +
+    chunk._id +
+    '/' +
+    dokumen.originalname
+  const data = await dokumenModel.create({
+    chunk: chunk._id,
+    type: dokumen.mimetype,
+    judul: Date.now() + '-' + dokumen.originalname,
+    path,
+  })
+  return response.success(res, {
+    data,
+    message: 'berhasil membuat dokumen',
+  })
+})

+ 4 - 1
controller/v1/sanksi.controller.js

@@ -299,6 +299,7 @@ exports.getAll = handleError(async (req, res) => {
   } = req.query
   const where = {}
   const q = {}
+  const sort = { createdAt: -1 }
   if (aktif && aktif === FALSE) {
     where.aktif = false
   } else if (aktif && aktif === TRUE) {
@@ -344,6 +345,8 @@ exports.getAll = handleError(async (req, res) => {
   }
   if (perbaikan === TRUE) {
     where.perbaikan = { $exists: true, $ne: [] }
+    where.aktif = true
+    sort['perbaikan.updatedAt'] = -1
   }
   if (delegasi === TRUE) {
     where.delegasi = true
@@ -365,7 +368,7 @@ exports.getAll = handleError(async (req, res) => {
       $eq: null,
     }
   }
-  const data = await cekBanyakDataSanksi(user, where, q)
+  const data = await cekBanyakDataSanksi(user, where, q, sort)
   return response.success(res, {
     message: 'Berhasil ambil data Sanksi',
     data

+ 149 - 0
controller/v2/catatan.controller.js

@@ -0,0 +1,149 @@
+const catatanService = require('../../services/catatan.service')
+const sanksiService = require('../../services/sanksi.service')
+const response = require('../../utils/responseHandler')
+const { validation } = require('../../middleware/validation')
+const { addDokumen } = require('../../utils/dokumenFunction')
+
+exports.getAllCatatan = async (req, res, next) => {
+  try {
+    const { sanksi_id } = req.params
+    const data = await catatanService.findAll(sanksi_id)
+    return response.success(res, {
+      message: 'Berhasil mendapatkan daftar catatan',
+      data,
+    })
+  } catch (e) {
+    next(e)
+  }
+}
+
+exports.getOneCatatan = async (req, res, next) => {
+  try {
+    const { catatan_id } = req.params
+    const data = await catatanService.findOne(catatan_id)
+    return response.success(res, {
+      message: 'Berhasil mendapatkan catatan',
+      data,
+    })
+  } catch (e) {
+    next(e)
+  }
+}
+
+exports.createCatatan = [
+  validation((req) => req.body, {
+    judul: 'string',
+  }),
+  async (req, res, next) => {
+    try {
+      const { sanksi_id } = req.params
+      const { judul, isi } = req.body
+      const data = await catatanService.create({ sanksi_id, judul, isi })
+      return response.success(res, {
+        message: 'Berhasil membuat catatan',
+        data,
+      })
+    } catch (e) {
+      next(e)
+    }
+  },
+]
+
+exports.deleteCatatan = async (req, res, next) => {
+  try {
+    const { catatan_id } = req.params
+    await catatanService.delete(catatan_id)
+    return response.success(res, {
+      message: 'Berhasil menghapus catatan',
+    })
+  } catch (e) {
+    next(e)
+  }
+}
+
+exports.editCatatan = [
+  validation((req) => req.body, {
+    catatan_id: 'string',
+    judul: 'string',
+    menu: 'string',
+  }),
+  async (req, res, next) => {
+    try {
+      const { sanksi_id } = req.params
+      const { judul, isi, catatan_id, menu } = req.body
+      const sanksi = await sanksiService.findById(sanksi_id)
+      if (!sanksi) return next({ code: 404, message: 'sanksi_id tidak ada' })
+      const catatan = await catatanService.findOne(catatan_id, sanksi._id)
+      if (!catatan) return next({ code: 404, message: 'catatan_id tidak ada' })
+      await catatanService.update(catatan._id, {
+        judul,
+        isi,
+        menu,
+      })
+      return response.success(res, {
+        message: 'Berhasil update catatan',
+      })
+    } catch (e) {
+      next(e)
+    }
+  },
+]
+
+exports.addDaftarHadir = [
+  validation((req) => req.body, {
+    nama: 'string',
+  }),
+  async (req, res, next) => {
+    try {
+      const { catatan_id } = req.params
+      const { nama } = req.body
+      const catatan = await catatanService.findOne(catatan_id)
+      if (!catatan) return next({ code: 404, message: 'catatan_id tidak ada' })
+      const file = req.file
+      if (!file) return next({ code: 400, message: 'ttd harus ada' })
+      const dokumen = await addDokumen(file)
+      await catatanService.update(catatan._id, {
+        $push: {
+          daftar_kehadiran_peserta: {
+            nama,
+            ttd: dokumen.id,
+          },
+        },
+      })
+      return response.success(res, {
+        message: 'Berhasil tambah daftar peserta',
+      })
+    } catch (e) {
+      next(e)
+    }
+  },
+]
+
+exports.removePeserta = [
+  validation((req) => req.body, {
+    peserta_id: 'string',
+  }),
+  async (req, res, next) => {
+    try {
+      const { catatan_id } = req.params
+      const { peserta_id } = req.body
+
+      const catatan = await catatanService.findOne(catatan_id)
+      if (!catatan) return next({ code: 404, message: 'catatan_id tidak ada' })
+
+      await catatanService.findAndUpdate(catatan._id, {
+        $pull: {
+          daftar_kehadiran_peserta: {
+            _id: peserta_id,
+          },
+        },
+      })
+
+      return response.success(res, {
+        message: 'Berhasil menghapus peserta pleno',
+      })
+    } catch (e) {
+      next(e)
+    }
+  },
+]

+ 34 - 0
model/catatan.model.js

@@ -0,0 +1,34 @@
+const mongoose = require('mongoose')
+const { Schema, Types } = mongoose
+const dokumen = require('./dokumen.model')
+const sanksi = require('./sanksi.model')
+
+module.exports = mongoose.model(
+  'Catatan',
+  new Schema({
+    sanksi_id: {
+      type: Types.ObjectId,
+      ref: sanksi
+    },
+    judul: String,
+    isi: Object,
+    menu: String,
+    daftar_kehadiran_peserta: [
+      new Schema(
+        {
+          nama: String,
+          ttd: {
+            type: Types.ObjectId,
+            ref: dokumen
+          }
+        },
+        {
+          timestamps: true
+        }
+      )
+    ]
+  }, {
+    timestamps: true
+  }),
+  'catatan'
+)

+ 3 - 0
routes/index.js

@@ -1,5 +1,7 @@
 const router = require('express').Router()
 const dokumenController = require('../controller/dokumen.controller')
+const auth = require('../middleware/verifyToken')
+const handleDokumen = require('../utils/handleDokumen')
 
 router.get('/', (req, res) => {
   return res.json({
@@ -11,6 +13,7 @@ router.use('/v1', require('../routes/v1'))
 router.use('/v2', require('../routes/v2'))
 
 router.get('/dokumen/:id/:nama_file', dokumenController.getDokumen)
+router.post('/dokumen', auth, handleDokumen.single('dokumen'), dokumenController.createDokumen)
 
 router.get('/csrf',
   (req, res, next) => {

+ 16 - 0
routes/v1/catatan.routes.js

@@ -0,0 +1,16 @@
+const router = require('express').Router()
+const catatanController = require('../../controller/v2/catatan.controller')
+const auth = require('../../middleware/verifyToken')
+const handleDokumen = require('../../utils/handleDokumen')
+const role = require('../../middleware/role')
+const {PTB_DIKTI, PTB_LLDIKTI, PTB_ADMIN } = require('../../utils/constanta')
+
+router.get('/:sanksi_id', auth, role([PTB_DIKTI, PTB_LLDIKTI, PTB_ADMIN]), catatanController.getAllCatatan)
+router.post('/hadir/:catatan_id', handleDokumen.single('ttd'), catatanController.addDaftarHadir)
+router.delete('/hadir/:catatan_id', catatanController.removePeserta)
+router.get('/detail/:catatan_id', auth, role([PTB_DIKTI, PTB_LLDIKTI, PTB_ADMIN]), catatanController.getOneCatatan)
+router.post('/:sanksi_id', auth, role([PTB_DIKTI, PTB_LLDIKTI, PTB_ADMIN]), catatanController.createCatatan)
+router.delete('/:catatan_id', auth, role([PTB_DIKTI, PTB_LLDIKTI, PTB_ADMIN]), catatanController.deleteCatatan)
+router.put('/:sanksi_id', auth, role([PTB_DIKTI, PTB_LLDIKTI, PTB_ADMIN]), catatanController.editCatatan)
+
+module.exports = router

+ 1 - 0
routes/v1/index.js

@@ -30,5 +30,6 @@ router.use('/rekomendasi', auth, require('./rekomendasi.routes'))
 router.use('/migrasi', auth, roleId([2020, 2023]), require('./migration.routes'))
 router.use('/kontak', require('./kontak.routes'))
 router.use('/signature', require('./signature.routes'))
+router.use('/catatan', require('./catatan.routes'))
 
 module.exports = router

+ 26 - 0
services/catatan.service.js

@@ -0,0 +1,26 @@
+const catatanModel = require('../model/catatan.model')
+
+exports.create = (data) => {
+  return catatanModel.create(data)
+}
+
+exports.update = (_id, data) => {
+  return catatanModel.findByIdAndUpdate(_id, data)
+}
+
+exports.delete = (_id) => {
+  return catatanModel.deleteOne({ _id })
+}
+
+exports.findAll = (sanksi_id) => {
+  return catatanModel.find({ sanksi_id })
+}
+
+exports.findOne = (catatan_id, sanksi_id = null) => {
+  if (!sanksi_id) return catatanModel.findById(catatan_id).populate('daftar_kehadiran_peserta.ttd')
+  return catatanModel.findOne({ sanksi_id, _id: catatan_id }).populate('daftar_kehadiran_peserta.ttd')
+}
+
+exports.findAndUpdate = (catatan_id, data) => {
+  return catatanModel.findByIdAndUpdate(catatan_id, data)
+}

+ 5 - 0
services/sanksi.service.js

@@ -0,0 +1,5 @@
+const sanksiModel = require('../model/sanksi.model')
+
+exports.findById = (sanksi_id) => {
+  return sanksiModel.findById(sanksi_id)
+}

+ 30 - 12
utils/v1/cekData.js

@@ -2,7 +2,13 @@ const laporanModel = require('../../model/laporan.model')
 const pelanggaranModel = require('../../model/pelanggaran.model')
 const sanksiModel = require('../../model/sanksi.model')
 const response = require('../responseHandler')
-const { DIKTI, LLDIKTI, PTB_DIKTI, PTB_LLDIKTI, PTB_PT } = require('../constanta')
+const {
+  DIKTI,
+  LLDIKTI,
+  PTB_DIKTI,
+  PTB_LLDIKTI,
+  PTB_PT,
+} = require('../constanta')
 
 exports.cekSatuDataLaporan = async (
   res,
@@ -59,7 +65,11 @@ exports.cekSatuDataLaporan = async (
   return laporan
 }
 
-exports.cekBanyakDataLaporan = async (user, where = { delegasi: false }, options = {}) => {
+exports.cekBanyakDataLaporan = async (
+  user,
+  where = { delegasi: false },
+  options = {}
+) => {
   const w = { ...where }
   if (where.aktif !== 'empty') w.aktif = where.aktif || true
   else delete w.aktif
@@ -69,8 +79,7 @@ exports.cekBanyakDataLaporan = async (user, where = { delegasi: false }, options
       else if (where.delegasi) {
         w.role_data = LLDIKTI
         w.role_asal = DIKTI
-      }
-      else w.role_data = DIKTI
+      } else w.role_data = DIKTI
       break
     case PTB_LLDIKTI:
       if (where.all) {
@@ -89,7 +98,7 @@ exports.cekBanyakDataLaporan = async (user, where = { delegasi: false }, options
       w['pt.id'] = user.lembaga.id
       break
   }
-  let laporan =  laporanModel
+  let laporan = laporanModel
     .find(w)
     .populate('user')
     .populate({ path: 'sanksi', populate: ['pelanggaran'] })
@@ -152,6 +161,7 @@ exports.cekSatuDataSanksi = async (
     .populate('perbaikan.dokumen')
     .populate('riwayat_sanksi.dokumen')
     .populate('riwayat_sanksi.perbaikan.dokumen')
+    .populate('riwayat_perpanjangan_sanksi.dokumen')
     .populate('riwayat_pengajuan_cabut_sanksi.dokumen')
     .populate('riwayat_jawaban_cabut_sanksi.dokumen')
   if (!sanksi?.laporan) {
@@ -164,7 +174,7 @@ exports.cekSatuDataSanksi = async (
   return sanksi
 }
 
-exports.cekBanyakDataSanksi = async (user, where = {}, q = {}) => {
+exports.cekBanyakDataSanksi = async (user, where = {}, q = {}, sort) => {
   const w = { ...q }
   switch (user.role.id) {
     case 2020:
@@ -188,7 +198,7 @@ exports.cekBanyakDataSanksi = async (user, where = {}, q = {}) => {
       where['masa_berlaku.from_date'] = {
         $exists: true,
         $ne: null,
-        $lte: new Date()
+        $lte: new Date(),
       }
       break
   }
@@ -204,16 +214,24 @@ exports.cekBanyakDataSanksi = async (user, where = {}, q = {}) => {
     .populate('pelanggaran')
     .populate('riwayat_sanksi.dokumen')
     .select('-dokumen')
-    .sort({
-      createdAt: -1,
-    })
+    .sort(
+      sort || {
+        createdAt: -1,
+      }
+    )
   data = data.filter((e) => {
     if (where.banding) {
       switch (user.role.id) {
         case PTB_DIKTI:
-          return e.pelanggaran.some(e2 => e2.level_sanksi !== 1) && e.laporan !== null
+          return (
+            e.pelanggaran.some((e2) => e2.level_sanksi !== 1) &&
+            e.laporan !== null
+          )
         case PTB_LLDIKTI:
-          return e.pelanggaran.filter(e2 => e2.level_sanksi === 1).length === e.pelanggaran.length && e.laporan !== null
+          return (
+            e.pelanggaran.filter((e2) => e2.level_sanksi === 1).length ===
+              e.pelanggaran.length && e.laporan !== null
+          )
         default:
           return true
       }