yazid138 1 year ago
parent
commit
c9c2db03eb

+ 1 - 1
app.js

@@ -14,7 +14,7 @@ app.use(express.json())
 app.use(cors({ origin: true, credentials: true }))
 app.use(express.urlencoded({ extended: false }))
 app.use(cookieParser(process.env.SRU51))
-// app.use(csrf( ['GET', 'HEAD', 'OPTIONS'], ['/v1/auth/login', /\/v1\/auto\//i]))
+// app.use(csrf( ['GET', 'HEAD', 'OPTIONS'], ['/v1/auth/login', /\/v1\/auto\//i, /v2/i]))
 
 app.use(express.static(path.join(__dirname, 'public')))
 app.use((req, res, next) => {req.data = {}; return next()})

+ 7 - 15
controller/v1/auto.controller.js

@@ -17,24 +17,20 @@ const pemantauanModel = require('../../model/pemantauan.model')
 exports.keberatan = handleError(async (req, res) => {
   const dataSanksi = await sanksiModel
     .find({
-      'batas_waktu.keberatan': {
-        $lt: moment().toISOString(),
+      'tanggal_akhir_keberatan': {
+        $lte: moment().toISOString(),
       },
       'is_pengajuan_keberatan': {
         $exists: false,
         $eq: null,
       },
-      'pengajuan.cabut_sanksi': {
-        $exists: false,
-        $eq: null,
-      },
     })
     .populate('user')
     .populate('laporan')
 
   if (!dataSanksi.length) {
     return response.success(res, {
-      message: 'Tidak ada notifikasi yg dikirim',
+      message: 'Tidak ada keberatan yang diubah',
     })
   }
 
@@ -58,7 +54,7 @@ exports.keberatan = handleError(async (req, res) => {
 exports.banding = handleError(async (req, res) => {
   const dataSanksi = await sanksiModel
     .find({
-      'batas_waktu.banding': {
+      'tanggal_akhir_banding': {
         $lt: moment().toISOString(),
       },
       'is_pengajuan_banding': {
@@ -69,17 +65,13 @@ exports.banding = handleError(async (req, res) => {
         $exists: true,
         $ne: null,
       },
-      'pengajuan.cabut_sanksi': {
-        $exists: false,
-        $eq: null,
-      },
     })
     .populate('user')
     .populate('laporan')
 
   if (!dataSanksi.length) {
     return response.success(res, {
-      message: 'Tidak ada notifikasi yg dikirim',
+      message: 'Tidak ada banding yang diubah',
     })
   }
 
@@ -104,7 +96,7 @@ exports.banding = handleError(async (req, res) => {
 exports.reminderKeberatan = handleError(async (req, res) => {
   let dataSanksi = await sanksiModel
     .find({
-      'batas_waktu.jawaban_keberatan': {
+      'tanggal_akhir_keberatan': {
         $exists: true,
         $ne: null,
       },
@@ -169,7 +161,7 @@ exports.reminderKeberatan = handleError(async (req, res) => {
 exports.reminderBanding = handleError(async (req, res) => {
   let dataSanksi = await sanksiModel
     .find({
-      'batas_waktu.jawaban_banding': {
+      'tanggal_akhir_banding': {
         $exists: true,
         $ne: null,
       },

+ 18 - 15
controller/v1/kontak.controller.js

@@ -5,10 +5,12 @@ const role = require('../../middleware/role')
 const checkData = require('../../middleware/checkData')
 const verifyOtp = require('../../middleware/verifyOTP')
 const { validation } = require('../../middleware/validation')
+const { PTB_PT } = require('../../utils/constanta')
 
 exports.getKontak = [
   auth,
-  checkData((req) => req.user, (user) => kontakModel.find({ pt_id: user.lembaga.id }), 'kontak'),
+  role(PTB_PT),
+  checkData((req) => req.user, (user) => kontakModel.find({ 'lembaga.id': user.lembaga.id, 'role.id': PTB_PT }), 'kontak'),
   async (req, res) =>
     response.success(res, {
       status: 'success',
@@ -20,25 +22,26 @@ exports.getKontak = [
 exports.addKontak = [
   auth,
   ...verifyOtp,
-  validation((req) => req.body, {
-    no_hp: 'string'
-  }),
   async (req, res) => {
   const user = req.user
-    let no_hp = req.body.no_hp
-    no_hp = req.body.no_hp.substring(0, 1) === '0' ? '62' + no_hp.substring(1) : no_hp
-    const kontak = new kontakModel({
-      nama: user.nama,
-      no_hp,
-      role: user.role.id,
-      lembaga: user.lembaga.id,
-    })
+  const no_hp = req.no_hp
     try {
-      await kontak.save()
+      if (!await kontakModel.findOne({ 'lembaga.id': user.lembaga.id })) {
+        await kontakModel.create({
+          nama: user.nama,
+          no_hp,
+          role: user.role,
+          lembaga: user.lembaga,
+        })
+        return response.success(res, {
+          status: 'success',
+          message: 'Berhasil menambahkan kontak',
+        })
+      }
+      await kontakModel.updateOne({ 'lembaga.id': user.lembaga.id }, { no_hp, })
       return response.success(res, {
         status: 'success',
-        message: 'Berhasil menambahkan kontak',
-        data: kontak
+        message: 'Berhasil mengubah kontak'
       })
     } catch (e) {
       return response.error(res, {

+ 2 - 2
controller/v1/sanksi.controller.js

@@ -94,7 +94,7 @@ exports.create = handleError(async (req, res) => {
     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,
+    batas_waktu: from_date ? { keberatan: tanggal_akhir_keberatan } : null,
     aktif: from_date ? true : false
   })
   await laporanModel.findByIdAndUpdate(laporan._id, {
@@ -412,7 +412,7 @@ exports.getOne = handleError(async (req, res) => {
   if (all === TRUE) {
     w.all = true
   }
-  if (aktif && aktif === TRUE) {
+  if (aktif === FALSE) {
     w.aktif = false
   }
 

+ 26 - 7
controller/v1/sanksi/cabutSanksi.controller.js

@@ -31,7 +31,11 @@ exports.create = handleError(async (req, res) => {
       _id: sanksi._id,
       $or: [{
         perbaikan: { $exists: true, $ne: [] },
-        'pengajuan.cabut_sanksi': { $exists: false, $eq: null }
+        $or: [{
+          'pengajuan.cabut_sanksi': { $exists: false, $eq: null }
+        }, {
+          is_finalisasi: true
+        }],
       }, {
         bypass_cabut_sanksi: {
           $eq: true
@@ -43,6 +47,12 @@ exports.create = handleError(async (req, res) => {
       'pengajuan.cabut_sanksi': {
         dokumen: dokumen_id
       },
+      $push: {
+        riwayat_pengajuan_cabut_sanksi: {
+          index: sanksi.index_perbaikan-1,
+          dokumen: dokumen_id
+        }
+      }
     }
   )
   if (!data) {
@@ -50,10 +60,10 @@ exports.create = handleError(async (req, res) => {
       message: 'cabut_sanksi sudah ada'
     })
   }
-  await laporanModel.findOneAndUpdate({_id: sanksi.laporan._id},{
+  await laporanModel.findOneAndUpdate({ _id: sanksi.laporan._id }, {
     flag: CABUT_SANKSI,
     $push: {
-      step: CABUT_SANKSI,
+      step: CABUT_SANKSI
     }
   })
   await pemantauanModel.create({
@@ -101,12 +111,21 @@ exports.createJawaban = handleError(async (req, res) => {
       ]
     },
     {
+      is_finalisasi: false,
       aktif: status !== 'Diterima',
       last_step: 'Jawaban Atas Permohonan Pencabutan Sanksi',
       'jawaban.cabut_sanksi': {
         status,
         keterangan,
         dokumen: dokumen_id
+      },
+      $push: {
+        riwayat_jawaban_cabut_sanksi: {
+          index: sanksi.index_perbaikan,
+          status,
+          keterangan,
+          dokumen: dokumen_id
+        }
       }
     }
   )
@@ -115,10 +134,10 @@ exports.createJawaban = handleError(async (req, res) => {
       message: 'cabut_sanksi tidak ada'
     })
   }
-  await laporanModel.findOneAndUpdate({_id: sanksi.laporan._id},{
-    flag: status === 'Diterima'? 'diterima' : 'cabut_sanksi',
+  await laporanModel.findOneAndUpdate({ _id: sanksi.laporan._id }, {
+    flag: status === 'Diterima' ? 'diterima' : 'cabut_sanksi',
     $push: {
-      step: status === 'Diterima'? 'diterima' : 'cabut_sanksi',
+      step: status === 'Diterima' ? 'diterima' : 'cabut_sanksi'
     }
   })
 
@@ -141,7 +160,7 @@ exports.createJawaban = handleError(async (req, res) => {
     for_public
   })
   return response.success(res, {
-    message: "Berhasil menjawab Pengajuan Cabut Sanksi",
+    message: 'Berhasil menjawab Pengajuan Cabut Sanksi',
     data
   })
 })

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

@@ -151,7 +151,7 @@ exports.createJawaban = handleError(async (req, res) => {
       keterangan,
       dokumen: dokumen_id,
     },
-    'batas_waktu.banding': hariKerja(21),
+    'batas_waktu.banding': tanggal_akhir_banding,
   }
   if (status !== capitalize(DITUTUP)) {
     value.last_step = 'Jawaban Atas Permohonan Keberatan'

+ 22 - 1
controller/v1/sanksi/perbaikan.controller.js

@@ -38,6 +38,7 @@ exports.add = handleError(async (req, res) => {
       laporan: sanksi.laporan._id,
       _id: sanksi._id,
       aktif: true,
+      is_finalisasi: false,
       $or: [
         {
           'pengajuan.banding': { $exists: true, $ne: null },
@@ -75,9 +76,9 @@ exports.add = handleError(async (req, res) => {
       $push: {
         perbaikan: {
           keterangan,
+          index: sanksi.index_perbaikan,
           dokumen: dokumen_id,
         },
-
       },
     }
   )
@@ -135,3 +136,23 @@ exports.add = handleError(async (req, res) => {
     message: 'Berhasil menambah Perbaikan',
   })
 })
+
+exports.finalisasi = handleError(async (req, res) => {
+  const user = req.user
+  const { sanksi_id } = req.params
+
+  const sanksi = await cekSatuDataSanksi(res, user, sanksi_id)
+  if (!sanksi) return
+
+  await sanksiModel.findOneAndUpdate({
+    _id: sanksi._id,
+    is_finalisasi: false,
+  },{
+    index_perbaikan: sanksi.index_perbaikan + 1,
+    is_finalisasi: true,
+  })
+
+  return response.success(res, {
+    message: 'Berhasil memfinalisasi dokumen perbaikan',
+  })
+})

+ 2 - 3
controller/v1/user.controller.js

@@ -2,7 +2,6 @@ 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 { addDokumen } = require('../../utils/dokumenFunction')
 const jwt = require('jsonwebtoken')
 const { TEMPLATE_VERIFIKASI, TRUE, FALSE } = require('../../utils/constanta')
@@ -64,9 +63,9 @@ exports.addUserPublic = handleError(async (req, res) => {
 
   let notif = null
   if (isVerify !== FALSE && no_hp) {
-    notifWA2(
+    pddiktiService.whatsapp(
       TEMPLATE_VERIFIKASI,
-      { nama: nama || 'rahasia', no_hp: no_hp2 },
+      [{ nama: nama || 'rahasia', no_hp: no_hp2 }],
       [
         { key: '1', value: 'pt', value_text: pt[0].nama },
         { key: '3', value: 'no_verifikasi', value_text: no_verifikasi },

+ 26 - 15
controller/v2/auth.controller.js

@@ -7,9 +7,8 @@ const jwt = require('jsonwebtoken')
 const moment = require('moment')
 const logModel = require('../../model/log.model')
 const auth = require('../../middleware/verifyToken')
-const otp = require('../../utils/otp')
+const generateOTP = require('../../utils/otp')
 const { genSaltSync, compareSync, hashSync } = require('bcrypt')
-const { notifWA2 } = require('../../utils/v1/notifFunction')
 const role = require('../../middleware/role')
 const pddiktiService = require('../../services/v2/pddikti.service')
 
@@ -108,11 +107,11 @@ exports.loginToPT = [
     let dataLembaga
 
     try {
-      const userResponse = await pddiktiService.login({username: user.email, password})
+      const userResponse = await pddiktiService.login({ username: user.email, password })
       if (userResponse.code && userResponse.code !== 200) {
         return response.error(res, {
           code: 401,
-          message: userResponse.message,
+          message: userResponse.message
         })
       }
       dataLembaga = await pddiktiService.getPT(lembaga_id)
@@ -179,22 +178,34 @@ exports.sendOTP = [
     const user = req.user
     let no_hp = req.body.no_hp
     no_hp = req.body.no_hp.substring(0, 1) === '0' ? '62' + no_hp.substring(1) : no_hp
-    const generatedOtp = otp.generate()
-    res.cookie('sidali-otp', hashSync(generatedOtp, genSaltSync(10)), {
+    const generatedOtp = generateOTP(4)
+    res.cookie('sidali-otp', jwt.sign({ no_hp, otp: generatedOtp }, process.env.SRU51, {
+      expiresIn: '5m'
+    }), {
       httpOnly: true,
-      secure: true
+      secure: true,
+      expires: moment().add(5, 'minutes').toDate()
     })
-    await notifWA2(
-      TEMPLATE_VERIFIKASI,
-      { nama: user.nama, no_hp: no_hp },
-      [
+    try {
+      const waResult = await pddiktiService.whatsapp(TEMPLATE_VERIFIKASI, [{ name: user.nama, number: no_hp }], [
         { key: '1', value: 'pt', value_text: user.lembaga.nama },
         { key: '3', value: 'no_verifikasi', value_text: generatedOtp },
-        { key: '2', value: 'no_laporan', value_text: '' }
-      ]
-    )
+        { key: '2', value: 'no_laporan', value_text: '-' }
+      ])
+      if ([200, 201].includes(waResult.status)) {
+        return response.error(res, {
+          code: waResult[0].error.code,
+          error: waResult[0].error.messages
+        })
+      }
+    } catch (e) {
+      return response.error(res, {
+        code: 500,
+        message: e.message
+      })
+    }
     return response.success(res, {
-      message: 'Berhasil mengirimkan OTP'
+      message: 'Berhasil mengirimkan OTP',
     })
   }
 ]

+ 27 - 10
middleware/verifyOTP.js

@@ -1,18 +1,35 @@
 const { validation } = require('./validation')
-const { compareSync } = require('bcrypt')
-const otp = require('../utils/otp')
 const response = require('../utils/responseHandler')
+const jwt = require('jsonwebtoken')
 
 module.exports = [
   validation((req) => req.body, { otp: 'string' }),
   (req, res, next) => {
-    if (!req.cookies['sidali-otp'] || req.cookies['sidali-otp'] && !compareSync(req.body.otp, req.cookies['sidali-otp']) || !otp.validate({ token: req.body.otp })) {
-      return response.error(res, {
-        message: 'OTP tidak valid',
-        code: 401
-      })
-    }
-    res.clearCookie('sidali-otp')
-    return next()
+  if (!req.cookies['sidali-otp']) {
+    return response.error(res, {
+      code: 401,
+      message: 'Unauthorized',
+    })
+  }
+  const token = req.cookies['sidali-otp']
+    jwt.verify(token, process.env.SRU51, async (err, data) => {
+      if (err) {
+        return response.error(res, {
+          code: 401,
+          message: 'Unauthorized',
+        })
+      }
+      if (req.body.otp !== data.otp) {
+        return response.error(res, {
+          message: 'OTP tidak valid',
+          code: 401
+        })
+      }
+      req.no_hp = data.no_hp
+      res.clearCookie('sidali-otp')
+      return next()
+
+    })
+
   }
 ]

+ 113 - 55
model/sanksi.model.js

@@ -19,10 +19,12 @@ module.exports = mongoose.model(
       last_step: String,
       is_pengajuan_keberatan: Boolean,
       is_pengajuan_banding: Boolean,
+      is_finalisasi: { type: Boolean, default: false },
+      is_cabut_sanksi: Boolean,
       tanggal_terima_sanksi: Date,
       dokumen_terima_sanksi: [{
         type: Types.ObjectId,
-        ref: dokumen,
+        ref: dokumen
       }],
       tanggal_akhir_keberatan: Date,
       aktif: { type: Boolean, default: true },
@@ -32,31 +34,31 @@ module.exports = mongoose.model(
         dokumen: [
           {
             type: Types.ObjectId,
-            ref: dokumen,
-          },
-        ],
+            ref: dokumen
+          }
+        ]
       },
       berita_acara:
-      {
-        type: Types.ObjectId,
-        ref: dokumen,
-      },
-      dokumen: [
         {
           type: Types.ObjectId,
-          ref: dokumen,
+          ref: dokumen
         },
+      dokumen: [
+        {
+          type: Types.ObjectId,
+          ref: dokumen
+        }
       ],
       masa_berlaku: new Schema({
         from_date: Date,
         to_date: Date,
-        berakhir: Boolean,
+        berakhir: Boolean
       }),
       batas_waktu: {
         keberatan: Date,
         jawaban_keberatan: Date,
         banding: Date,
-        jawaban_banding: Date,
+        jawaban_banding: Date
       },
       jawaban: {
         keberatan: new Schema(
@@ -68,15 +70,15 @@ module.exports = mongoose.model(
             tanggal_surat_keberatan: Date,
             dokumen_terima_keberatan: [{
               type: Types.ObjectId,
-              ref: dokumen,
+              ref: dokumen
             }],
             tanggal_akhir_banding: Date,
             dokumen: [
               {
                 type: Types.ObjectId,
-                ref: dokumen,
-              },
-            ],
+                ref: dokumen
+              }
+            ]
           },
           { timestamps: true }
         ),
@@ -87,31 +89,35 @@ module.exports = mongoose.model(
             tanggal_surat_banding: Date,
             dokumen_terima_banding: [{
               type: Types.ObjectId,
-              ref: dokumen,
+              ref: dokumen
             }],
             status: String,
             dokumen: [
               {
                 type: Types.ObjectId,
-                ref: dokumen,
-              },
-            ],
+                ref: dokumen
+              }
+            ]
           },
           { timestamps: true }
         ),
         cabut_sanksi: new Schema(
           {
+            index: {
+              type: Number,
+              default: 0
+            },
             status: String,
             keterangan: String,
             dokumen: [
               {
                 type: Types.ObjectId,
-                ref: dokumen,
-              },
-            ],
+                ref: dokumen
+              }
+            ]
           },
           { timestamps: true }
-        ),
+        )
       },
       pengajuan: {
         keberatan: new Schema(
@@ -119,9 +125,9 @@ module.exports = mongoose.model(
             dokumen: [
               {
                 type: Types.ObjectId,
-                ref: dokumen,
-              },
-            ],
+                ref: dokumen
+              }
+            ]
           },
           { timestamps: true }
         ),
@@ -130,9 +136,9 @@ module.exports = mongoose.model(
             dokumen: [
               {
                 type: Types.ObjectId,
-                ref: dokumen,
-              },
-            ],
+                ref: dokumen
+              }
+            ]
           },
           { timestamps: true }
         ),
@@ -141,9 +147,9 @@ module.exports = mongoose.model(
             dokumen: [
               {
                 type: Types.ObjectId,
-                ref: dokumen,
-              },
-            ],
+                ref: dokumen
+              }
+            ]
           },
           { timestamps: true }
         ),
@@ -153,12 +159,12 @@ module.exports = mongoose.model(
             dokumen: [
               {
                 type: Types.ObjectId,
-                ref: dokumen,
-              },
-            ],
+                ref: dokumen
+              }
+            ]
           },
           { timestamps: true }
-        ),
+        )
       },
       riwayat_sanksi: [
         new Schema(
@@ -172,44 +178,96 @@ module.exports = mongoose.model(
             dokumen: [
               {
                 type: Types.ObjectId,
-                ref: dokumen,
-              },
+                ref: dokumen
+              }
             ],
             masa_berlaku: new Schema({
               from_date: Date,
-              to_date: Date,
+              to_date: Date
             }),
+            index_perbaikan: {
+              type: Number,
+              default: 0
+            },
             perbaikan: [
               new Schema(
                 {
                   keterangan: String,
+                  index: {
+                    type: Number,
+                    default: 0
+                  },
                   dokumen: [
                     {
                       type: Types.ObjectId,
-                      ref: dokumen,
-                    },
-                  ],
+                      ref: dokumen
+                    }
+                  ]
                 },
                 { timestamps: true }
-              ),
-            ],
+              )
+            ]
           },
           { timestamps: true }
-        ),
+        )
       ],
+      riwayat_pengajuan_cabut_sanksi: [
+        new Schema(
+          {
+            index: {
+              default: 0,
+              type: Number
+            },
+            dokumen: [
+              {
+                type: Types.ObjectId,
+                ref: dokumen
+              }
+            ]
+          },
+          { timestamps: true }
+        )
+      ],
+      riwayat_jawaban_cabut_sanksi: [
+        new Schema(
+          {
+            index: {
+              default: 0,
+              type: Number
+            },
+            status: String,
+            keterangan: String,
+            dokumen: [
+              {
+                type: Types.ObjectId,
+                ref: dokumen
+              }
+            ]
+          },
+          { timestamps: true }
+        )
+      ],
+      index_perbaikan: {
+        type: Number,
+        default: 0
+      },
       perbaikan: [
         new Schema(
           {
             keterangan: String,
+            index: {
+              type: Number,
+              default: 0
+            },
             dokumen: [
               {
                 type: Types.ObjectId,
-                ref: dokumen,
-              },
-            ],
+                ref: dokumen
+              }
+            ]
           },
           { timestamps: true }
-        ),
+        )
       ],
       rekomendasi: [
         new Schema(
@@ -217,14 +275,14 @@ module.exports = mongoose.model(
             dokumen: [
               {
                 type: Types.ObjectId,
-                ref: dokumen,
-              },
-            ],
+                ref: dokumen
+              }
+            ]
           },
           { timestamps: true }
-        ),
+        )
       ],
-      bypass_cabut_sanksi: Boolean,
+      bypass_cabut_sanksi: Boolean
     },
     { timestamps: true }
   ),

+ 65 - 11
model/sanksi2.model.js

@@ -17,6 +17,8 @@ module.exports = mongoose.model(
       last_step: String,
       is_pengajuan_keberatan: Boolean,
       is_pengajuan_banding: Boolean,
+      is_finalisasi: { type: Boolean, default: false },
+      is_cabut_sanksi: Boolean,
       tanggal_terima_sanksi: Date,
       dokumen_terima_sanksi: [{
         type: Types.ObjectId,
@@ -98,18 +100,22 @@ module.exports = mongoose.model(
           { timestamps: true }
         ),
         cabut_sanksi: new Schema(
-          {
-            status: String,
-            keterangan: String,
-            dokumen: [
-              {
-                type: Types.ObjectId,
-                ref: dokumen,
+            {
+              index: {
+                type: Number,
+                default: 0,
               },
-            ],
-          },
-          { timestamps: true }
-        ),
+              status: String,
+              keterangan: String,
+              dokumen: [
+                {
+                  type: Types.ObjectId,
+                  ref: dokumen,
+                },
+              ],
+            },
+            { timestamps: true }
+          ),
       },
       pengajuan: {
         keberatan: new Schema(
@@ -176,6 +182,10 @@ module.exports = mongoose.model(
               from_date: Date,
               to_date: Date,
             }),
+            index_perbaikan: {
+              type: Number,
+              default: 0,
+            },
             perbaikan: [
               new Schema(
                 {
@@ -194,10 +204,54 @@ module.exports = mongoose.model(
           { timestamps: true }
         ),
       ],
+      riwayat_pengajuan_cabut_sanksi: [
+        new Schema(
+          {
+            index: {
+              default: 0,
+              type: Number
+            },
+            dokumen: [
+              {
+                type: Types.ObjectId,
+                ref: dokumen
+              }
+            ]
+          },
+          { timestamps: true }
+        )
+      ],
+      riwayat_jawaban_cabut_sanksi: [
+        new Schema(
+          {
+            index: {
+              default: 0,
+              type: Number,
+            },
+            status: String,
+            keterangan: String,
+            dokumen: [
+              {
+                type: Types.ObjectId,
+                ref: dokumen,
+              },
+            ],
+          },
+          { timestamps: true }
+        ),
+      ],
+      index_perbaikan: {
+        type: Number,
+        default: 0,
+      },
       perbaikan: [
         new Schema(
           {
             keterangan: String,
+            index: {
+              type: Number,
+              default: 0,
+            },
             dokumen: [
               {
                 type: Types.ObjectId,

+ 0 - 1
package.json

@@ -25,7 +25,6 @@
     "mongoose": "^6.2.7",
     "morgan": "~1.9.1",
     "multer": "^1.4.4",
-    "otpauth": "^9.1.5",
     "xlsx": "^0.18.5"
   },
   "devDependencies": {

+ 1 - 0
routes/v1/index.js

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

+ 1 - 0
routes/v1/kontak.routes.js

@@ -2,5 +2,6 @@ const router = require('express').Router()
 const kontak = require('../../controller/v1/kontak.controller')
 
 router.post('/', ...kontak.addKontak)
+router.get('/', ...kontak.getKontak)
 
 module.exports = router

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

@@ -1,6 +1,7 @@
 const router = require('express').Router()
 const laporan = require('../../../controller/v1/laporan.controller')
 const handleDokumen = require('../../../utils/handleDokumen')
+const roleId = require('../../../middleware/role')
 
 router.get('/', laporan.getAll)
 router.get('/jumlah', laporan.jumlahLaporan)

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

@@ -2,12 +2,19 @@ const router = require('express').Router()
 const perbaikan = require('../../../controller/v1/sanksi/perbaikan.controller')
 const handleDokumen = require('../../../utils/handleDokumen')
 const roleId = require('../../../middleware/role')
+const { PTB_PT } = require('../../../utils/constanta')
 
 router.post(
   '/add/:sanksi_id',
-  roleId(2022),
+  roleId(PTB_PT),
   handleDokumen.array('dokumen'),
   perbaikan.add
 )
 
+router.put(
+  '/finalisasi/:sanksi_id',
+  roleId(PTB_PT),
+  perbaikan.finalisasi
+)
+
 module.exports = router

+ 2 - 2
utils/hariKerja.js

@@ -6,8 +6,8 @@ exports.hariKerja = (n, fromDate = null) => {
     // Pindahkan ke hari berikutnya
     today.setDate(today.getDate() + 1);
 
-    // Periksa apakah hari saat ini adalah hari kerja (senin hingga jumat)
-    if (today.getDay() !== 0 && today.getDay() !== 6) {
+    // Periksa apakah hari saat ini adalah hari (sabtu || minggu)
+    if (today.getDay() !== 6 && today.getDay() !== 7) {
       dayCount++;
     }
   }

+ 16 - 7
utils/otp.js

@@ -1,10 +1,19 @@
 require('dotenv').config()
-const {HOTP} = require('otpauth')
+// const {HOTP} = require('otpauth')
 // const coba = require('../utils/coba')
 
- module.exports = new HOTP({
-  algorithm: 'SHA256',
-  digits: 6,
-  period: 30,
-  secret: 'tes'
-})
+//  module.exports = new HOTP({
+//   algorithm: 'SHA256',
+//   digits: 6,
+//   period: 30,
+//   secret: 'tes'
+// })
+
+module.exports = (limit = 4) => {
+  const digits = '0123456789'
+  let OTP = ''
+  for (let i = 0; i < limit; i++) {
+    OTP += digits[Math.floor(Math.random() * 10)]
+  }
+  return OTP
+}

+ 4 - 4
utils/v1/notifFunction.js

@@ -1,5 +1,6 @@
 const kontakModel = require('../../model/kontak.model')
 const pddiktiService = require('../../services/v2/pddikti.service')
+const { PTB_DIKTI } = require('../constanta')
 
 /**
  *
@@ -9,7 +10,7 @@ const pddiktiService = require('../../services/v2/pddikti.service')
  * @returns {Promise<*>}
  */
 exports.notifWA = async (templateId, data, where = {}) => {
-  const kontak = await kontakModel.find({ ...where, 'role.id': { $ne: 2022 } })
+  const kontak = await kontakModel.find({ ...where, 'role.id': PTB_DIKTI })
   const contacts = kontak.map((e) => ({ name: e.nama, number: e.no_hp }))
   return pddiktiService.whatsapp(templateId, contacts, data)
 }
@@ -17,9 +18,8 @@ exports.notifWA = async (templateId, data, where = {}) => {
 /**
  *
  * @param templateId
- * @param nama
- * @param no_hp
+ * @param contacts
  * @param data
  * @returns {Promise<*>}
  */
-exports.notifWA2 = async (templateId, { nama, no_hp }, data) => pddiktiService.whatsapp(templateId, {name: nama, number: no_hp}, data)
+exports.notifWA2 = async (templateId, contacts, data) => pddiktiService.whatsapp(templateId, contacts, data)