auto.controller.js 13 KB

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