auto.controller.js 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448
  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
  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. await logModel.create({
  137. 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`
  138. })
  139. } catch (error) {
  140. return response.error(res, {
  141. message: 'Notifikasi gagal terkirim',
  142. error: error.message
  143. })
  144. }
  145. }
  146. })
  147. )
  148. let message = 'Tidak ada notifikasi yang dikirim'
  149. if (notif.length) message = 'Notifikasi berhasil terkirim'
  150. return response.success(res, {
  151. message
  152. })
  153. })
  154. exports.reminderBanding = handleError(async (req, res) => {
  155. let dataSanksi = await sanksiModel
  156. .find({
  157. 'tanggal_akhir_banding': {
  158. $exists: true,
  159. $ne: null
  160. },
  161. 'jawaban.banding': {
  162. $exists: false,
  163. $eq: null
  164. }
  165. })
  166. .populate('user')
  167. .populate('laporan')
  168. const notif = await Promise.all(
  169. dataSanksi.map(async (e) => {
  170. const dayLeft = moment(e.batas_waktu.jawaban_banding).diff(
  171. new Date(),
  172. 'days'
  173. )
  174. if (dayLeft > 0 && dayLeft <= 7) {
  175. try {
  176. await notifWA(TEMPLATE_REMINDER, [
  177. {
  178. key: '1',
  179. value: 'no_laporan',
  180. value_text: e.laporan.no_laporan
  181. },
  182. {
  183. key: '2',
  184. value: 'keterangan',
  185. value_text: 'Proses Menjawab Pengajuan Banding'
  186. },
  187. {
  188. key: '3',
  189. value: 'pt',
  190. value_text: e.laporan.pt.nama
  191. },
  192. {
  193. key: '4',
  194. value: 'masa',
  195. value_text: `menjawab pengajuan banding tersisa ${dayLeft} hari lagi.`
  196. }
  197. ])
  198. const contacts = await kontakModel.find()
  199. await logModel.create({
  200. 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`
  201. })
  202. } catch (error) {
  203. return response.error(res, {
  204. message: 'Notifikasi gagal terkirim',
  205. error: error.message
  206. })
  207. }
  208. }
  209. })
  210. )
  211. let message = 'Tidak ada notifikasi yang dikirim'
  212. if (notif.length) message = 'Notifikasi berhasil terkirim'
  213. return response.success(res, {
  214. message
  215. })
  216. })
  217. exports.updateStatusSanksi = handleError(async (req, res) => {
  218. const sanksi = await sanksiModel.find({
  219. 'masa_berlaku.to_date': {
  220. $lte: new Date().toISOString()
  221. },
  222. aktif: true,
  223. 'masa_berlaku.berakhir': {
  224. $exists: false,
  225. $eq: null
  226. }
  227. }).populate('laporan')
  228. await Promise.all(
  229. sanksi.map(async (e) => {
  230. await pemantauanModel.create({
  231. laporan: e.laporan._id,
  232. sanksi: e._id,
  233. action: UPDATE_SANKSI,
  234. pt_id: e.laporan.pt.id,
  235. keterangan: 'Masa berlaku sanksi sudah melewati TMT',
  236. levelSanksi: 0
  237. })
  238. await sanksiModel.findByIdAndUpdate(e._id, { 'masa_berlaku.berakhir': true })
  239. await batchModel.create({
  240. sanksi: e._id,
  241. type: UPDATE_SANKSI
  242. })
  243. })
  244. )
  245. return response.success(res, {
  246. message: 'update status sanksi berhasil'
  247. })
  248. })
  249. exports.save = handleError(async (req, res) => {
  250. const { id } = req.params
  251. const { laporan: isLaporan, sanksi: isSanksi } = req.query
  252. const user = req.user
  253. let autoData = null
  254. let laporan = null
  255. let sanksi = null
  256. if (isLaporan === TRUE) {
  257. laporan = await cekSatuDataLaporan(res, user, id)
  258. if (!laporan) return
  259. autoData = await autoSaveModel.findOne({ laporan_id: laporan._id })
  260. } else if (isSanksi === TRUE) {
  261. sanksi = await cekSatuDataSanksi(res, user, id)
  262. if (!sanksi) return
  263. autoData = await autoSaveModel.findOne({ sanksi_id: sanksi._id })
  264. } else {
  265. return response.error(res, {
  266. message: 'query harus sanksi atau laporan yg bernilai true'
  267. })
  268. }
  269. if (autoData) {
  270. if (isLaporan) {
  271. const dataSave = await autoSaveModel.findOne({ laporan_id: laporan._id })
  272. await autoSaveModel.updateOne({ laporan_id: laporan._id }, {
  273. laporan: {
  274. ...req.body, PenetapanSanksi: {
  275. dataSuratBA: req.body?.PenetapanSanksi?.dataSuratBA || dataSave.laporan.PenetapanSanksi?.dataSuratBA,
  276. dataUpload: req.body?.PenetapanSanksi?.dataUpload || dataSave.laporan.PenetapanSanksi?.dataUpload,
  277. dataPelanggaran: req.body?.PenetapanSanksi?.dataPelanggaran || dataSave.laporan.PenetapanSanksi?.dataPelanggaran,
  278. activeStep: req.body?.PenetapanSanksi?.activeStep || dataSave.laporan.PenetapanSanksi?.activeStep
  279. }
  280. }
  281. })
  282. } else {
  283. await autoSaveModel.updateOne({ sanksi_id: sanksi._id }, { sanksi: req.body })
  284. }
  285. } else {
  286. if (isLaporan) {
  287. await autoSaveModel.create({ laporan_id: laporan._id, laporan: req.body })
  288. } else {
  289. await autoSaveModel.create({ sanksi_id: sanksi._id, sanksi: req.body })
  290. }
  291. }
  292. return response.success(res, {
  293. message: 'Berhasil menyimpan data auto save'
  294. })
  295. })
  296. exports.getSave = handleError(async (req, res) => {
  297. const { id } = req.params
  298. const { laporan: isLaporan, sanksi: isSanksi } = req.query
  299. let data = null
  300. let laporan = null
  301. let sanksi = null
  302. if (isLaporan === TRUE) {
  303. laporan = await laporanModel.findById(id)
  304. if (!laporan) return response.error(res, {
  305. code: 404,
  306. message: 'laporan_id tidak ada'
  307. })
  308. data = (await autoSaveModel.findOne({ laporan_id: laporan._id })).laporan
  309. } else if (isSanksi === 'true') {
  310. sanksi = await sanksiModel.findById(id)
  311. if (!sanksi) return response.error(res, {
  312. code: 404,
  313. message: 'sanksi_id tidak ada'
  314. })
  315. data = (await autoSaveModel.findOne({ sanksi_id: sanksi._id })).sanksi
  316. } else {
  317. return response.error(res, {
  318. message: 'harus terdapat query sanksi atau laporan yg bernilai true'
  319. })
  320. }
  321. return response.success(res, {
  322. message: 'Berhasil mengambil data auto save',
  323. data: data
  324. })
  325. })
  326. exports.berakhirSanksi = handleError(async (req, res) => {
  327. const sanksi = await sanksiModel.find({
  328. 'masa_berlaku.to_date': {
  329. $ne: null,
  330. $exists: true
  331. }
  332. }).populate('laporan')
  333. let count = 0
  334. await Promise.all(sanksi.map(async e => {
  335. const dayLeft = moment(e.masa_berlaku.to_date).diff(
  336. new Date(),
  337. 'days'
  338. )
  339. if (dayLeft > 0 && dayLeft <= 7) {
  340. try {
  341. await notifWA(TEMPLATE_REMINDER2, [
  342. {
  343. key: '1',
  344. value: 'no_sanksi',
  345. value_text: `nomor sanksi ${e.no_sanksi}`
  346. },
  347. {
  348. key: '2',
  349. value: 'nama_pt',
  350. value_text: `${e.laporan.pt.nama}`
  351. },
  352. {
  353. key: '3',
  354. value: 'keterangan',
  355. value_text: `habis masa berlaku sanksi tersisa ${dayLeft} hari lagi.`
  356. }
  357. ])
  358. count++
  359. const contacts = await kontakModel.find()
  360. await logModel.create({
  361. 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.`
  362. })
  363. } catch (error) {
  364. return response.error(res, {
  365. message: 'Notifikasi gagal terkirim',
  366. error: error.message
  367. })
  368. }
  369. }
  370. }))
  371. let message = 'Notifikasi berhasil terkirim'
  372. if (count === 0) message = 'tidak ada notifikasi yg dikirim'
  373. return response.success(res, {
  374. message
  375. })
  376. })
  377. exports.batchUpdateSanksi = handleError(async (req, res) => {
  378. const data = await batchModel.find({
  379. type: UPDATE_SANKSI
  380. })
  381. .populate({
  382. path: 'sanksi',
  383. populate: ['laporan']
  384. })
  385. let error = []
  386. await Promise.all(data.map(async e => {
  387. const { sanksi } = e
  388. try {
  389. await pddiktiService.updatePDDIKTI({
  390. ptKode: sanksi.laporan.pt.kode,
  391. noSanksi: sanksi.no_sanksi,
  392. fromDate: sanksi.masa_berlaku.from_date,
  393. levelSanksi: sanksi.levelSanksi,
  394. terimaSanksi: sanksi.tanggal_terima_sanksi
  395. })
  396. await logModel.create({
  397. aktivitas: `Server berhasil mengirimkan data Ke API PDDIKTI untuk update Status PT ${sanksi.laporan.pt.nama}`
  398. })
  399. await batchModel.deleteOne(e._id)
  400. } catch (e) {
  401. error.push(e.message)
  402. await Promise.all([
  403. laporanModel.updateOne({
  404. _id: sanksi.laporan._id
  405. }, {
  406. sanksi: null
  407. }),
  408. sanksiModel.deleteOne({
  409. _id: sanksi._id
  410. }),
  411. logModel.create({
  412. aktivitas: `Server gagal mengirimkan data Ke API PDDIKTI untuk update Status PT ${sanksi.laporan.pt.nama}, dengan error ${e.message}`
  413. }),
  414. pemantauanModel.deleteOne({
  415. laporan: sanksi.laporan._id,
  416. sanksi: sanksi._id,
  417. action: CREATE_SANKSI
  418. })
  419. ])
  420. }
  421. }))
  422. return response.success(res, {
  423. message: error.length ? 'Ada beberapa data yang tidak bisa dikirim ke PDDIKTI' : 'Berhasil mengirim data ke PDDIKTI'
  424. })
  425. })