| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454 |
- 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 {
- TEMPLATE_REMINDER,
- TEMPLATE_REMINDER2, TRUE, UPDATE_SANKSI, CREATE_SANKSI, PTB_ADMIN, PTB_DIKTI, PTB_LLDIKTI
- } = require('../../utils/constanta')
- const moment = require('moment')
- const autoSaveModel = require('../../model/autoSave.model')
- const { cekSatuDataSanksi, cekSatuDataLaporan } = require('../../utils/v1/cekData')
- const logModel = require('../../model/log.model')
- const kontakModel = require('../../model/kontak.model')
- const pemantauanModel = require('../../model/pemantauan.model')
- const batchModel = require('../../model/batch.model')
- const pddiktiService = require('../../services/v2/pddikti.service')
- exports.keberatan = handleError(async (req, res) => {
- const dataSanksi = await sanksiModel
- .find({
- 'tanggal_akhir_keberatan': {
- $lte: moment().toISOString()
- },
- 'is_pengajuan_keberatan': {
- $exists: false,
- $eq: null
- }
- })
- .populate('user')
- .populate('laporan')
- if (!dataSanksi.length) {
- return response.success(res, {
- message: 'Tidak ada keberatan yang diubah'
- })
- }
- await Promise.all(
- dataSanksi.map(
- async (sanksi) =>
- await sanksiModel.findByIdAndUpdate(sanksi._id, {
- is_pengajuan_keberatan: false,
- last_step: 'Dokumen Perbaikan'
- })
- )
- )
- await logModel.create({
- aktivitas: `Server berhasil merubah last_step PT ${dataSanksi.map((e) => e.laporan.pt.nama).join(', ')} menjadi Dokumen Perbaikan`
- })
- return response.success(res, {
- message: 'Notifikasi berhasil terkirim'
- })
- })
- exports.banding = handleError(async (req, res) => {
- const dataSanksi = await sanksiModel
- .find({
- 'tanggal_akhir_banding': {
- $lt: moment().toISOString()
- },
- 'is_pengajuan_banding': {
- $exists: false,
- $eq: null
- },
- 'jawaban.keberatan': {
- $exists: true,
- $ne: null
- }
- })
- .populate('user')
- .populate('laporan')
- if (!dataSanksi.length) {
- return response.success(res, {
- message: 'Tidak ada banding yang diubah'
- })
- }
- await Promise.all(
- dataSanksi.map(
- async (sanksi) => {
- await sanksiModel.findByIdAndUpdate(sanksi._id, {
- is_pengajuan_banding: false,
- last_step: 'Dokumen Perbaikan'
- })
- }
- )
- )
- await logModel.create({
- aktivitas: `Server berhasil merubah last_step PT ${dataSanksi.map((e) => e.laporan.pt.nama).join(', ')} menjadi Dokumen Perbaikan`
- })
- return response.success(res, {
- message: 'Notifikasi berhasil terkirim'
- })
- })
- exports.reminderKeberatan = handleError(async (req, res) => {
- let dataSanksi = await sanksiModel
- .find({
- 'tanggal_akhir_keberatan': {
- $exists: true,
- $ne: null
- },
- 'jawaban.keberatan': {
- $exists: false,
- $eq: null
- }
- })
- .populate('user')
- .populate('laporan')
- const notif = await Promise.all(
- dataSanksi.map(async (e) => {
- const dayLeft = moment(e.batas_waktu.jawaban_keberatan).diff(
- new Date(),
- 'days'
- )
- if (dayLeft > 0 && dayLeft <= 7) {
- try {
- await notifWA(TEMPLATE_REMINDER, [
- {
- key: '1',
- value: 'no_laporan',
- value_text: e.laporan.no_laporan
- },
- {
- key: '2',
- value: 'keterangan',
- value_text: 'Proses Menjawab Pengajuan Keberatan'
- },
- {
- key: '3',
- value: 'pt',
- value_text: e.laporan.pt.nama
- },
- {
- key: '4',
- value: 'masa',
- value_text: `menjawab pengajuan keberatan tersisa ${dayLeft} hari lagi.`
- }
- ])
- const contacts = await kontakModel.find({
- 'role.id': {
- $in: [PTB_ADMIN, PTB_DIKTI, PTB_LLDIKTI]
- }
- })
- await logModel.create({
- aktivitas: `Server berhasil mengirim notifikasi Whatsapp kepada ${contacts.map((e) => e.nama).join(', ')} dengan Nomor Laporan ${e.laporan.no_laporan} terhadap ${e.laporan.pt.nama} untuk Mengajukan Keberatan`
- })
- } catch (error) {
- return response.error(res, {
- message: 'Notifikasi gagal terkirim',
- error: error.message
- })
- }
- }
- })
- )
- let message = 'Tidak ada notifikasi yang dikirim'
- if (notif.length) message = 'Notifikasi berhasil terkirim'
- return response.success(res, {
- message
- })
- })
- exports.reminderBanding = handleError(async (req, res) => {
- let dataSanksi = await sanksiModel
- .find({
- 'tanggal_akhir_banding': {
- $exists: true,
- $ne: null
- },
- 'jawaban.banding': {
- $exists: false,
- $eq: null
- }
- })
- .populate('user')
- .populate('laporan')
- const notif = await Promise.all(
- dataSanksi.map(async (e) => {
- const dayLeft = moment(e.batas_waktu.jawaban_banding).diff(
- new Date(),
- 'days'
- )
- if (dayLeft > 0 && dayLeft <= 7) {
- try {
- await notifWA(TEMPLATE_REMINDER, [
- {
- key: '1',
- value: 'no_laporan',
- value_text: e.laporan.no_laporan
- },
- {
- key: '2',
- value: 'keterangan',
- value_text: 'Proses Menjawab Pengajuan Banding'
- },
- {
- key: '3',
- value: 'pt',
- value_text: e.laporan.pt.nama
- },
- {
- key: '4',
- value: 'masa',
- value_text: `menjawab pengajuan banding tersisa ${dayLeft} hari lagi.`
- }
- ])
- const contacts = await kontakModel.find({
- 'role.id': {
- $in: [PTB_ADMIN, PTB_DIKTI, PTB_LLDIKTI]
- }
- })
- await logModel.create({
- aktivitas: `Server berhasil mengirim notifikasi Whatsapp kepada ${contacts.map((e) => e.nama).join(', ')} dengan Nomor Laporan ${e.laporan.no_laporan} terhadap ${e.laporan.pt.nama} untuk Mengajukan Banding`
- })
- } catch (error) {
- return response.error(res, {
- message: 'Notifikasi gagal terkirim',
- error: error.message
- })
- }
- }
- })
- )
- let message = 'Tidak ada notifikasi yang dikirim'
- if (notif.length) message = 'Notifikasi berhasil terkirim'
- return response.success(res, {
- message
- })
- })
- exports.updateStatusSanksi = handleError(async (req, res) => {
- const sanksi = await sanksiModel.find({
- 'masa_berlaku.to_date': {
- $lte: new Date().toISOString()
- },
- aktif: true,
- 'masa_berlaku.berakhir': {
- $exists: false,
- $eq: null
- }
- }).populate('laporan')
- await Promise.all(
- sanksi.map(async (e) => {
- await pemantauanModel.create({
- laporan: e.laporan._id,
- sanksi: e._id,
- action: UPDATE_SANKSI,
- pt_id: e.laporan.pt.id,
- keterangan: 'Masa berlaku sanksi sudah melewati TMT',
- levelSanksi: 0
- })
- await sanksiModel.findByIdAndUpdate(e._id, { 'masa_berlaku.berakhir': true })
- await batchModel.create({
- sanksi: e._id,
- type: UPDATE_SANKSI
- })
- })
- )
- return response.success(res, {
- message: 'update status sanksi berhasil'
- })
- })
- exports.save = handleError(async (req, res) => {
- const { id } = req.params
- const { laporan: isLaporan, sanksi: isSanksi } = req.query
- const user = req.user
- let autoData = null
- let laporan = null
- let sanksi = null
- if (isLaporan === TRUE) {
- laporan = await cekSatuDataLaporan(res, user, id)
- if (!laporan) return
- autoData = await autoSaveModel.findOne({ laporan_id: laporan._id })
- } else if (isSanksi === TRUE) {
- sanksi = await cekSatuDataSanksi(res, user, id)
- if (!sanksi) return
- autoData = await autoSaveModel.findOne({ sanksi_id: sanksi._id })
- } else {
- return response.error(res, {
- message: 'query harus sanksi atau laporan yg bernilai true'
- })
- }
- if (autoData) {
- if (isLaporan) {
- const dataSave = await autoSaveModel.findOne({ laporan_id: laporan._id })
- await autoSaveModel.updateOne({ laporan_id: laporan._id }, {
- laporan: {
- ...req.body, PenetapanSanksi: {
- dataSuratBA: req.body?.PenetapanSanksi?.dataSuratBA || dataSave.laporan.PenetapanSanksi?.dataSuratBA,
- dataUpload: req.body?.PenetapanSanksi?.dataUpload || dataSave.laporan.PenetapanSanksi?.dataUpload,
- dataPelanggaran: req.body?.PenetapanSanksi?.dataPelanggaran || dataSave.laporan.PenetapanSanksi?.dataPelanggaran,
- activeStep: req.body?.PenetapanSanksi?.activeStep || dataSave.laporan.PenetapanSanksi?.activeStep
- }
- }
- })
- } else {
- await autoSaveModel.updateOne({ sanksi_id: sanksi._id }, { sanksi: req.body })
- }
- } else {
- if (isLaporan) {
- await autoSaveModel.create({ laporan_id: laporan._id, laporan: req.body })
- } else {
- await autoSaveModel.create({ sanksi_id: sanksi._id, sanksi: req.body })
- }
- }
- return response.success(res, {
- message: 'Berhasil menyimpan data auto save'
- })
- })
- exports.getSave = handleError(async (req, res) => {
- const { id } = req.params
- const { laporan: isLaporan, sanksi: isSanksi } = req.query
- let data = null
- let laporan = null
- let sanksi = null
- if (isLaporan === TRUE) {
- laporan = await laporanModel.findById(id)
- if (!laporan) return response.error(res, {
- code: 404,
- message: 'laporan_id tidak ada'
- })
- data = (await autoSaveModel.findOne({ laporan_id: laporan._id })).laporan
- } else if (isSanksi === 'true') {
- sanksi = await sanksiModel.findById(id)
- if (!sanksi) return response.error(res, {
- code: 404,
- message: 'sanksi_id tidak ada'
- })
- data = (await autoSaveModel.findOne({ sanksi_id: sanksi._id })).sanksi
- } else {
- return response.error(res, {
- message: 'harus terdapat query sanksi atau laporan yg bernilai true'
- })
- }
- return response.success(res, {
- message: 'Berhasil mengambil data auto save',
- data: data
- })
- })
- exports.berakhirSanksi = handleError(async (req, res) => {
- const sanksi = await sanksiModel.find({
- 'masa_berlaku.to_date': {
- $ne: null,
- $exists: true
- }
- }).populate('laporan')
- let count = 0
- await Promise.all(sanksi.map(async e => {
- const dayLeft = moment(e.masa_berlaku.to_date).diff(
- new Date(),
- 'days'
- )
- if (dayLeft > 0 && dayLeft <= 7) {
- try {
- await notifWA(TEMPLATE_REMINDER2, [
- {
- key: '1',
- value: 'no_sanksi',
- value_text: `nomor sanksi ${e.no_sanksi}`
- },
- {
- key: '2',
- value: 'nama_pt',
- value_text: `${e.laporan.pt.nama}`
- },
- {
- key: '3',
- value: 'keterangan',
- value_text: `habis masa berlaku sanksi tersisa ${dayLeft} hari lagi.`
- }
- ])
- count++
- const contacts = await kontakModel.find({
- 'role.id': {
- $in: [PTB_ADMIN, PTB_DIKTI, PTB_LLDIKTI]
- }
- })
- await logModel.create({
- aktivitas: `Server berhasil mengirim notifikasi reminder Whatsapp kepada ${contacts.map((e) => e.nama).join(', ')} dengan Nomor Sanksi ${e.no_sanksi} terhadap ${e.laporan.pt.nama} bahwa Masa Berlaku Sanksi tersisa ${dayLeft} hari lagi.`
- })
- } catch (error) {
- return response.error(res, {
- message: 'Notifikasi gagal terkirim',
- error: error.message
- })
- }
- }
- }))
- let message = 'Notifikasi berhasil terkirim'
- if (count === 0) message = 'tidak ada notifikasi yg dikirim'
- return response.success(res, {
- message
- })
- })
- exports.batchUpdateSanksi = handleError(async (req, res) => {
- const data = await batchModel.find({
- type: UPDATE_SANKSI
- })
- .populate({
- path: 'sanksi',
- populate: ['laporan']
- })
- let error = []
- await Promise.all(data.map(async e => {
- const { sanksi } = e
- if (!sanksi?.laporan) return
- try {
- await pddiktiService.updatePDDIKTI({
- ptKode: sanksi.laporan.pt.kode,
- noSanksi: sanksi.laporan.no_laporan,
- fromDate: moment(sanksi.masa_berlaku.from_date).format('YYYY-MM-DD'),
- levelSanksi: sanksi.levelSanksi,
- terimaSanksi: moment(sanksi.tanggal_terima_sanksi).format('YYYY-MM-DD')
- })
- await logModel.create({
- aktivitas: `Server berhasil mengirimkan data Ke API PDDIKTI untuk update Status PT ${sanksi.laporan.pt.nama}`
- })
- await batchModel.deleteOne(e._id)
- } catch (e) {
- error.push(e.message)
- await Promise.all([
- logModel.create({
- 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.success(res, {
- message: error.length ? 'Ada beberapa data yang tidak bisa dikirim ke PDDIKTI' : 'Berhasil mengirim data ke PDDIKTI',
- data: { error },
- })
- })
|