auto.controller.js 12 KB

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