auto.controller.js 13 KB

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