auto.controller.js 14 KB

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