auto.controller.js 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446
  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. if (
  128. e.batas_waktu.jawaban_keberatan &&
  129. new Date() >
  130. moment(e.batas_waktu.jawaban_keberatan).add(-7, 'days').toDate() &&
  131. new Date() < e.batas_waktu.jawaban_keberatan
  132. ) {
  133. const dayLeft = moment(e.batas_waktu.jawaban_keberatan).diff(
  134. new Date(),
  135. 'days'
  136. )
  137. try {
  138. await notifWA(TEMPLATE_REMINDER, [
  139. {
  140. key: '1',
  141. value: 'no_laporan',
  142. value_text: e.laporan.no_laporan,
  143. },
  144. {
  145. key: '2',
  146. value: 'keterangan',
  147. value_text: 'Proses Menjawab Pengajuan Keberatan',
  148. },
  149. {
  150. key: '3',
  151. value: 'pt',
  152. value_text: e.laporan.pt.nama,
  153. },
  154. {
  155. key: '4',
  156. value: 'masa',
  157. value_text: `menjawab pengajuan keberatan tersisa ${dayLeft} hari lagi.`,
  158. },
  159. ])
  160. } catch (error) {
  161. return response.error(res, {
  162. message: 'Notifikasi gagal terkirim',
  163. error: error.message,
  164. })
  165. }
  166. }
  167. })
  168. )
  169. let message = 'Tidak ada notifikasi yang dikirim'
  170. if (notif.length) message = 'Notifikasi berhasil terkirim'
  171. return response.success(res, {
  172. message,
  173. })
  174. })
  175. exports.reminderBanding = handleError(async (req, res) => {
  176. let dataSanksi = await sanksiModel
  177. .find({
  178. 'batas_waktu.jawaban_banding': {
  179. $exists: true,
  180. $ne: null,
  181. },
  182. 'jawaban.banding': {
  183. $exists: false,
  184. $eq: null,
  185. },
  186. })
  187. .populate('user')
  188. .populate('laporan')
  189. const notif = await Promise.all(
  190. dataSanksi.map(async (e) => {
  191. if (
  192. e.batas_waktu.jawaban_banding &&
  193. new Date() >
  194. moment(e.batas_waktu.jawaban_banding).add(-7, 'days').toDate() &&
  195. new Date() < e.batas_waktu.jawaban_banding
  196. ) {
  197. const dayLeft = moment(e.batas_waktu.jawaban_banding).diff(
  198. new Date(),
  199. 'days'
  200. )
  201. try {
  202. await notifWA(TEMPLATE_REMINDER, [
  203. {
  204. key: '1',
  205. value: 'no_laporan',
  206. value_text: e.laporan.no_laporan,
  207. },
  208. {
  209. key: '2',
  210. value: 'keterangan',
  211. value_text: 'Proses Menjawab Pengajuan Banding',
  212. },
  213. {
  214. key: '3',
  215. value: 'pt',
  216. value_text: e.laporan.pt.nama,
  217. },
  218. {
  219. key: '4',
  220. value: 'masa',
  221. value_text: `menjawab pengajuan banding tersisa ${dayLeft} hari lagi.`,
  222. },
  223. ])
  224. } catch (error) {
  225. return response.error(res, {
  226. message: 'Notifikasi gagal terkirim',
  227. error: error.message,
  228. })
  229. }
  230. }
  231. })
  232. )
  233. let message = 'Tidak ada notifikasi yang dikirim'
  234. if (notif.length) message = 'Notifikasi berhasil terkirim'
  235. return response.success(res, {
  236. message,
  237. })
  238. })
  239. exports.updateStatusSanksi = handleError(async (req, res) => {
  240. const sanksi = await sanksiModel.find({
  241. 'masa_berlaku.to_date': {
  242. $lte: new Date().toISOString(),
  243. },
  244. aktif: true,
  245. })
  246. Promise.all(
  247. sanksi.map(async (e) =>
  248. sanksiModel.findByIdAndUpdate(e._id, {
  249. aktif: false,
  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.backup = handleError(async (req, res) => {
  335. const dataBakup = await Promise.all([
  336. (async () => {
  337. const path = 'backup/' + new Date().getTime() + '-sanksi.json'
  338. const sanksi = await sanksiModel.find()
  339. fs.writeFileSync(path, JSON.stringify(sanksi))
  340. const { size } = fs.statSync(path)
  341. const mimetype = 'application/json'
  342. const buffer = fs.readFileSync(path)
  343. return { buffer, mimetype, size, originalname: 'sanksi.json' }
  344. })(),
  345. (async () => {
  346. const path = 'backup/' + new Date().getTime() + '-laporan.json'
  347. const laporan = await laporanModel.find()
  348. fs.writeFileSync(path, JSON.stringify(laporan))
  349. const { size } = fs.statSync(path)
  350. const mimetype = 'application/json'
  351. const buffer = fs.readFileSync(path)
  352. return { buffer, mimetype, size, originalname: 'laporan.json' }
  353. })(),
  354. (async () => {
  355. const path = 'backup/' + new Date().getTime() + '-user.json'
  356. const user = await userModel.find()
  357. fs.writeFileSync(path, JSON.stringify(user))
  358. const { size } = fs.statSync(path)
  359. const mimetype = 'application/json'
  360. const buffer = fs.readFileSync(path)
  361. return { buffer, mimetype, size, originalname: 'user.json' }
  362. })()
  363. ])
  364. const dokumen = await addManyDokumen(dataBakup)
  365. const tes = await backupModel.create({
  366. dokumen: dokumen.map(e => e._id)
  367. })
  368. return response.success(res, {
  369. message: 'berhasil membuat backup',
  370. data: tes
  371. })
  372. })
  373. exports.getBackup = handleError(async (req, res) => {
  374. const { id } = req.params
  375. const data = await backupModel.findById(id).populate('dokumen')
  376. if (!data) return response.error(res, {
  377. code: 404,
  378. message: 'Not Found',
  379. })
  380. return response.success(res, {
  381. message: 'berhasil mengambil data backup',
  382. data: data.dokumen
  383. })
  384. })
  385. exports.berakhirSanksi = handleError(async (req, res) => {
  386. const sanksi = await sanksiModel.find().populate('laporan')
  387. await Promise.all(sanksi.map(async e => {
  388. const dayLeft = e.masa_berlaku.to_date && moment(e.masa_berlaku.from_date).add(6, 'month').diff(
  389. new Date(),
  390. 'days')
  391. if (dayLeft < 7 &&
  392. dayLeft > 0 &&
  393. e.masa_berlaku &&
  394. moment(e.masa_berlaku).add(-7, 'day') < moment()
  395. )
  396. await notifWA(TEMPLATE_REMINDER2, [
  397. {
  398. key: '1',
  399. value: 'no_sanksi',
  400. value_text: `nomor sanksi ${e.no_sanksi}`,
  401. },
  402. {
  403. key: '2',
  404. value: 'nama_pt',
  405. value_text: `${e.laporan.pt.nama}`,
  406. },
  407. {
  408. key: '3',
  409. value: 'keterangan',
  410. value_text: `habis masa berlaku sanksi tersisa ${dayLeft} hari lagi.`,
  411. }
  412. ])
  413. }))
  414. return response.success(res, {
  415. message: 'Notifikasi berhasil terkirim',
  416. })
  417. })