auto.controller.js 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454
  1. const handleError = require('../../utils/v1/handleError')
  2. const response = require('../../utils/responseHandler')
  3. const { notifWA } = require('../../utils/v1/notifFunction')
  4. const sanksiModel = require('../../model/sanksi.model')
  5. const laporanModel = require('../../model/laporan.model')
  6. const {
  7. TEMPLATE_REMINDER,
  8. TEMPLATE_REMINDER2, TRUE, UPDATE_SANKSI, CREATE_SANKSI, PTB_ADMIN, PTB_DIKTI, PTB_LLDIKTI
  9. } = require('../../utils/constanta')
  10. const moment = require('moment')
  11. const autoSaveModel = require('../../model/autoSave.model')
  12. const { cekSatuDataSanksi, cekSatuDataLaporan } = require('../../utils/v1/cekData')
  13. const logModel = require('../../model/log.model')
  14. const kontakModel = require('../../model/kontak.model')
  15. const pemantauanModel = require('../../model/pemantauan.model')
  16. const batchModel = require('../../model/batch.model')
  17. const pddiktiService = require('../../services/v2/pddikti.service')
  18. exports.keberatan = handleError(async (req, res) => {
  19. const dataSanksi = await sanksiModel
  20. .find({
  21. 'tanggal_akhir_keberatan': {
  22. $lte: moment().toISOString()
  23. },
  24. 'is_pengajuan_keberatan': {
  25. $exists: false,
  26. $eq: null
  27. }
  28. })
  29. .populate('user')
  30. .populate('laporan')
  31. if (!dataSanksi.length) {
  32. return response.success(res, {
  33. message: 'Tidak ada keberatan yang diubah'
  34. })
  35. }
  36. await Promise.all(
  37. dataSanksi.map(
  38. async (sanksi) =>
  39. await sanksiModel.findByIdAndUpdate(sanksi._id, {
  40. is_pengajuan_keberatan: false,
  41. last_step: 'Dokumen Perbaikan'
  42. })
  43. )
  44. )
  45. await logModel.create({
  46. aktivitas: `Server berhasil merubah last_step PT ${dataSanksi.map((e) => e.laporan.pt.nama).join(', ')} menjadi Dokumen Perbaikan`
  47. })
  48. return response.success(res, {
  49. message: 'Notifikasi berhasil terkirim'
  50. })
  51. })
  52. exports.banding = handleError(async (req, res) => {
  53. const dataSanksi = await sanksiModel
  54. .find({
  55. 'tanggal_akhir_banding': {
  56. $lt: moment().toISOString()
  57. },
  58. 'is_pengajuan_banding': {
  59. $exists: false,
  60. $eq: null
  61. },
  62. 'jawaban.keberatan': {
  63. $exists: true,
  64. $ne: null
  65. }
  66. })
  67. .populate('user')
  68. .populate('laporan')
  69. if (!dataSanksi.length) {
  70. return response.success(res, {
  71. message: 'Tidak ada banding yang diubah'
  72. })
  73. }
  74. await Promise.all(
  75. dataSanksi.map(
  76. async (sanksi) => {
  77. await sanksiModel.findByIdAndUpdate(sanksi._id, {
  78. is_pengajuan_banding: false,
  79. last_step: 'Dokumen Perbaikan'
  80. })
  81. }
  82. )
  83. )
  84. await logModel.create({
  85. aktivitas: `Server berhasil merubah last_step PT ${dataSanksi.map((e) => e.laporan.pt.nama).join(', ')} menjadi Dokumen Perbaikan`
  86. })
  87. return response.success(res, {
  88. message: 'Notifikasi berhasil terkirim'
  89. })
  90. })
  91. exports.reminderKeberatan = handleError(async (req, res) => {
  92. let dataSanksi = await sanksiModel
  93. .find({
  94. 'tanggal_akhir_keberatan': {
  95. $exists: true,
  96. $ne: null
  97. },
  98. 'jawaban.keberatan': {
  99. $exists: false,
  100. $eq: null
  101. }
  102. })
  103. .populate('user')
  104. .populate('laporan')
  105. const notif = await Promise.all(
  106. dataSanksi.map(async (e) => {
  107. const dayLeft = moment(e.batas_waktu.jawaban_keberatan).diff(
  108. new Date(),
  109. 'days'
  110. )
  111. if (dayLeft > 0 && dayLeft <= 7) {
  112. try {
  113. await notifWA(TEMPLATE_REMINDER, [
  114. {
  115. key: '1',
  116. value: 'no_laporan',
  117. value_text: e.laporan.no_laporan
  118. },
  119. {
  120. key: '2',
  121. value: 'keterangan',
  122. value_text: 'Proses Menjawab Pengajuan Keberatan'
  123. },
  124. {
  125. key: '3',
  126. value: 'pt',
  127. value_text: e.laporan.pt.nama
  128. },
  129. {
  130. key: '4',
  131. value: 'masa',
  132. value_text: `menjawab pengajuan keberatan tersisa ${dayLeft} hari lagi.`
  133. }
  134. ])
  135. const contacts = await kontakModel.find({
  136. 'role.id': {
  137. $in: [PTB_ADMIN, PTB_DIKTI, PTB_LLDIKTI]
  138. }
  139. })
  140. await logModel.create({
  141. 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`
  142. })
  143. } catch (error) {
  144. return response.error(res, {
  145. message: 'Notifikasi gagal terkirim',
  146. error: error.message
  147. })
  148. }
  149. }
  150. })
  151. )
  152. let message = 'Tidak ada notifikasi yang dikirim'
  153. if (notif.length) message = 'Notifikasi berhasil terkirim'
  154. return response.success(res, {
  155. message
  156. })
  157. })
  158. exports.reminderBanding = handleError(async (req, res) => {
  159. let dataSanksi = await sanksiModel
  160. .find({
  161. 'tanggal_akhir_banding': {
  162. $exists: true,
  163. $ne: null
  164. },
  165. 'jawaban.banding': {
  166. $exists: false,
  167. $eq: null
  168. }
  169. })
  170. .populate('user')
  171. .populate('laporan')
  172. const notif = await Promise.all(
  173. dataSanksi.map(async (e) => {
  174. const dayLeft = moment(e.batas_waktu.jawaban_banding).diff(
  175. new Date(),
  176. 'days'
  177. )
  178. if (dayLeft > 0 && dayLeft <= 7) {
  179. try {
  180. await notifWA(TEMPLATE_REMINDER, [
  181. {
  182. key: '1',
  183. value: 'no_laporan',
  184. value_text: e.laporan.no_laporan
  185. },
  186. {
  187. key: '2',
  188. value: 'keterangan',
  189. value_text: 'Proses Menjawab Pengajuan Banding'
  190. },
  191. {
  192. key: '3',
  193. value: 'pt',
  194. value_text: e.laporan.pt.nama
  195. },
  196. {
  197. key: '4',
  198. value: 'masa',
  199. value_text: `menjawab pengajuan banding tersisa ${dayLeft} hari lagi.`
  200. }
  201. ])
  202. const contacts = await kontakModel.find({
  203. 'role.id': {
  204. $in: [PTB_ADMIN, PTB_DIKTI, PTB_LLDIKTI]
  205. }
  206. })
  207. await logModel.create({
  208. 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`
  209. })
  210. } catch (error) {
  211. return response.error(res, {
  212. message: 'Notifikasi gagal terkirim',
  213. error: error.message
  214. })
  215. }
  216. }
  217. })
  218. )
  219. let message = 'Tidak ada notifikasi yang dikirim'
  220. if (notif.length) message = 'Notifikasi berhasil terkirim'
  221. return response.success(res, {
  222. message
  223. })
  224. })
  225. exports.updateStatusSanksi = handleError(async (req, res) => {
  226. const sanksi = await sanksiModel.find({
  227. 'masa_berlaku.to_date': {
  228. $lte: new Date().toISOString()
  229. },
  230. aktif: true,
  231. 'masa_berlaku.berakhir': {
  232. $exists: false,
  233. $eq: null
  234. }
  235. }).populate('laporan')
  236. await Promise.all(
  237. sanksi.map(async (e) => {
  238. await pemantauanModel.create({
  239. laporan: e.laporan._id,
  240. sanksi: e._id,
  241. action: UPDATE_SANKSI,
  242. pt_id: e.laporan.pt.id,
  243. keterangan: 'Masa berlaku sanksi sudah melewati TMT',
  244. levelSanksi: 0
  245. })
  246. await sanksiModel.findByIdAndUpdate(e._id, { 'masa_berlaku.berakhir': true })
  247. await batchModel.create({
  248. sanksi: e._id,
  249. type: UPDATE_SANKSI
  250. })
  251. })
  252. )
  253. return response.success(res, {
  254. message: 'update status sanksi berhasil'
  255. })
  256. })
  257. exports.save = handleError(async (req, res) => {
  258. const { id } = req.params
  259. const { laporan: isLaporan, sanksi: isSanksi } = req.query
  260. const user = req.user
  261. let autoData = null
  262. let laporan = null
  263. let sanksi = null
  264. if (isLaporan === TRUE) {
  265. laporan = await cekSatuDataLaporan(res, user, id)
  266. if (!laporan) return
  267. autoData = await autoSaveModel.findOne({ laporan_id: laporan._id })
  268. } else if (isSanksi === TRUE) {
  269. sanksi = await cekSatuDataSanksi(res, user, id)
  270. if (!sanksi) return
  271. autoData = await autoSaveModel.findOne({ sanksi_id: sanksi._id })
  272. } else {
  273. return response.error(res, {
  274. message: 'query harus sanksi atau laporan yg bernilai true'
  275. })
  276. }
  277. if (autoData) {
  278. if (isLaporan) {
  279. const dataSave = await autoSaveModel.findOne({ laporan_id: laporan._id })
  280. await autoSaveModel.updateOne({ laporan_id: laporan._id }, {
  281. laporan: {
  282. ...req.body, PenetapanSanksi: {
  283. dataSuratBA: req.body?.PenetapanSanksi?.dataSuratBA || dataSave.laporan.PenetapanSanksi?.dataSuratBA,
  284. dataUpload: req.body?.PenetapanSanksi?.dataUpload || dataSave.laporan.PenetapanSanksi?.dataUpload,
  285. dataPelanggaran: req.body?.PenetapanSanksi?.dataPelanggaran || dataSave.laporan.PenetapanSanksi?.dataPelanggaran,
  286. activeStep: req.body?.PenetapanSanksi?.activeStep || dataSave.laporan.PenetapanSanksi?.activeStep
  287. }
  288. }
  289. })
  290. } else {
  291. await autoSaveModel.updateOne({ sanksi_id: sanksi._id }, { sanksi: req.body })
  292. }
  293. } else {
  294. if (isLaporan) {
  295. await autoSaveModel.create({ laporan_id: laporan._id, laporan: req.body })
  296. } else {
  297. await autoSaveModel.create({ sanksi_id: sanksi._id, sanksi: req.body })
  298. }
  299. }
  300. return response.success(res, {
  301. message: 'Berhasil menyimpan data auto save'
  302. })
  303. })
  304. exports.getSave = handleError(async (req, res) => {
  305. const { id } = req.params
  306. const { laporan: isLaporan, sanksi: isSanksi } = req.query
  307. let data = null
  308. let laporan = null
  309. let sanksi = null
  310. if (isLaporan === TRUE) {
  311. laporan = await laporanModel.findById(id)
  312. if (!laporan) return response.error(res, {
  313. code: 404,
  314. message: 'laporan_id tidak ada'
  315. })
  316. data = (await autoSaveModel.findOne({ laporan_id: laporan._id })).laporan
  317. } else if (isSanksi === 'true') {
  318. sanksi = await sanksiModel.findById(id)
  319. if (!sanksi) return response.error(res, {
  320. code: 404,
  321. message: 'sanksi_id tidak ada'
  322. })
  323. data = (await autoSaveModel.findOne({ sanksi_id: sanksi._id })).sanksi
  324. } else {
  325. return response.error(res, {
  326. message: 'harus terdapat query sanksi atau laporan yg bernilai true'
  327. })
  328. }
  329. return response.success(res, {
  330. message: 'Berhasil mengambil data auto save',
  331. data: data
  332. })
  333. })
  334. exports.berakhirSanksi = handleError(async (req, res) => {
  335. const sanksi = await sanksiModel.find({
  336. 'masa_berlaku.to_date': {
  337. $ne: null,
  338. $exists: true
  339. }
  340. }).populate('laporan')
  341. let count = 0
  342. await Promise.all(sanksi.map(async e => {
  343. const dayLeft = moment(e.masa_berlaku.to_date).diff(
  344. new Date(),
  345. 'days'
  346. )
  347. if (dayLeft > 0 && dayLeft <= 7) {
  348. try {
  349. await notifWA(TEMPLATE_REMINDER2, [
  350. {
  351. key: '1',
  352. value: 'no_sanksi',
  353. value_text: `nomor sanksi ${e.no_sanksi}`
  354. },
  355. {
  356. key: '2',
  357. value: 'nama_pt',
  358. value_text: `${e.laporan.pt.nama}`
  359. },
  360. {
  361. key: '3',
  362. value: 'keterangan',
  363. value_text: `habis masa berlaku sanksi tersisa ${dayLeft} hari lagi.`
  364. }
  365. ])
  366. count++
  367. const contacts = await kontakModel.find({
  368. 'role.id': {
  369. $in: [PTB_ADMIN, PTB_DIKTI, PTB_LLDIKTI]
  370. }
  371. })
  372. await logModel.create({
  373. 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.`
  374. })
  375. } catch (error) {
  376. return response.error(res, {
  377. message: 'Notifikasi gagal terkirim',
  378. error: error.message
  379. })
  380. }
  381. }
  382. }))
  383. let message = 'Notifikasi berhasil terkirim'
  384. if (count === 0) message = 'tidak ada notifikasi yg dikirim'
  385. return response.success(res, {
  386. message
  387. })
  388. })
  389. exports.batchUpdateSanksi = handleError(async (req, res) => {
  390. const data = await batchModel.find({
  391. type: UPDATE_SANKSI
  392. })
  393. .populate({
  394. path: 'sanksi',
  395. populate: ['laporan']
  396. })
  397. let error = []
  398. await Promise.all(data.map(async e => {
  399. const { sanksi } = e
  400. if (!sanksi?.laporan) return
  401. try {
  402. await pddiktiService.updatePDDIKTI({
  403. ptKode: sanksi.laporan.pt.kode,
  404. noSanksi: sanksi.laporan.no_laporan,
  405. fromDate: moment(sanksi.masa_berlaku.from_date).format('YYYY-MM-DD'),
  406. levelSanksi: sanksi.levelSanksi,
  407. terimaSanksi: moment(sanksi.tanggal_terima_sanksi).format('YYYY-MM-DD')
  408. })
  409. await logModel.create({
  410. aktivitas: `Server berhasil mengirimkan data Ke API PDDIKTI untuk update Status PT ${sanksi.laporan.pt.nama}`
  411. })
  412. await batchModel.deleteOne(e._id)
  413. } catch (e) {
  414. error.push(e.message)
  415. await Promise.all([
  416. logModel.create({
  417. aktivitas: `Server gagal mengirimkan data Ke API PDDIKTI untuk update Status PT ${sanksi.laporan.pt.nama}, dengan error ${e.message}`
  418. }),
  419. pemantauanModel.deleteOne({
  420. laporan: sanksi.laporan._id,
  421. sanksi: sanksi._id,
  422. action: CREATE_SANKSI
  423. })
  424. ])
  425. }
  426. }))
  427. return response.success(res, {
  428. message: error.length ? 'Ada beberapa data yang tidak bisa dikirim ke PDDIKTI' : 'Berhasil mengirim data ke PDDIKTI',
  429. data: { error },
  430. })
  431. })