auto.controller.js 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489
  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. const contacts = await kontakModel.find()
  161. await logModel.create({
  162. aktivitas: `Server berhasil mengirim notifikasi Whatsapp kepada ${contacts.map((e) => e.nama).join(', ')} dengan Nomor Laporan ${e.laporan.no_laporan} terhadap ${e.laporan.pt.nama} untuk Mengajukan Keberatan`
  163. })
  164. } catch (error) {
  165. return response.error(res, {
  166. message: 'Notifikasi gagal terkirim',
  167. error: error.message,
  168. })
  169. }
  170. }
  171. })
  172. )
  173. let message = 'Tidak ada notifikasi yang dikirim'
  174. if (notif.length) message = 'Notifikasi berhasil terkirim'
  175. return response.success(res, {
  176. message,
  177. })
  178. })
  179. exports.reminderBanding = handleError(async (req, res) => {
  180. let dataSanksi = await sanksiModel
  181. .find({
  182. 'batas_waktu.jawaban_banding': {
  183. $exists: true,
  184. $ne: null,
  185. },
  186. 'jawaban.banding': {
  187. $exists: false,
  188. $eq: null,
  189. },
  190. })
  191. .populate('user')
  192. .populate('laporan')
  193. const notif = await Promise.all(
  194. dataSanksi.map(async (e) => {
  195. const dayLeft = moment(e.batas_waktu.jawaban_banding).diff(
  196. new Date(),
  197. 'days'
  198. )
  199. if (dayLeft > 0 && dayLeft < 7) {
  200. try {
  201. await notifWA(TEMPLATE_REMINDER, [
  202. {
  203. key: '1',
  204. value: 'no_laporan',
  205. value_text: e.laporan.no_laporan,
  206. },
  207. {
  208. key: '2',
  209. value: 'keterangan',
  210. value_text: 'Proses Menjawab Pengajuan Banding',
  211. },
  212. {
  213. key: '3',
  214. value: 'pt',
  215. value_text: e.laporan.pt.nama,
  216. },
  217. {
  218. key: '4',
  219. value: 'masa',
  220. value_text: `menjawab pengajuan banding tersisa ${dayLeft} hari lagi.`,
  221. },
  222. ])
  223. const contacts = await kontakModel.find()
  224. await logModel.create({
  225. aktivitas: `Server berhasil mengirim notifikasi Whatsapp kepada ${contacts.map((e) => e.nama).join(', ')} dengan Nomor Laporan ${e.laporan.no_laporan} terhadap ${e.laporan.pt.nama} untuk Mengajukan Banding`
  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) message = 'Notifikasi berhasil terkirim'
  238. return response.success(res, {
  239. message,
  240. })
  241. })
  242. exports.updateStatusSanksi = handleError(async (req, res) => {
  243. const sanksi = await sanksiModel.find({
  244. 'masa_berlaku.to_date': {
  245. $lte: new Date().toISOString(),
  246. },
  247. aktif: true,
  248. })
  249. Promise.all(
  250. sanksi.map(async (e) =>
  251. sanksiModel.findByIdAndUpdate(e._id, {
  252. aktif: false,
  253. })
  254. )
  255. )
  256. return response.success(res, {
  257. message: 'update status sanksi berhasil',
  258. })
  259. })
  260. exports.save = handleError(async (req, res) => {
  261. const { id } = req.params
  262. const { laporan: isLaporan, sanksi: isSanksi } = req.query
  263. const user = req.user
  264. let autoData = null;
  265. let laporan = null;
  266. let sanksi = null;
  267. if (isLaporan === 'true') {
  268. laporan = await cekSatuDataLaporan(res, user, id);
  269. if (!laporan) return
  270. autoData = await autoSaveModel.findOne({ laporan_id: laporan._id });
  271. } else if (isSanksi === 'true') {
  272. sanksi = await cekSatuDataSanksi(res, user, id);
  273. if (!sanksi) return
  274. autoData = await autoSaveModel.findOne({ sanksi_id: sanksi._id });
  275. } else {
  276. return response.error(res, {
  277. message: 'query harus sanksi atau laporan yg bernilai true',
  278. })
  279. }
  280. if (autoData) {
  281. if (isLaporan) {
  282. const dataSave = await autoSaveModel.findOne({ laporan_id: laporan._id })
  283. await autoSaveModel.updateOne({ laporan_id: laporan._id }, {
  284. laporan: {
  285. ...req.body, PenetapanSanksi: {
  286. dataSuratBA: req.body?.PenetapanSanksi?.dataSuratBA || dataSave.laporan.PenetapanSanksi?.dataSuratBA,
  287. dataUpload: req.body?.PenetapanSanksi?.dataUpload || dataSave.laporan.PenetapanSanksi?.dataUpload,
  288. dataPelanggaran: req.body?.PenetapanSanksi?.dataPelanggaran || dataSave.laporan.PenetapanSanksi?.dataPelanggaran,
  289. activeStep: req.body?.PenetapanSanksi?.activeStep || dataSave.laporan.PenetapanSanksi?.activeStep,
  290. }
  291. }
  292. })
  293. } else {
  294. await autoSaveModel.updateOne({ sanksi_id: sanksi._id }, { sanksi: req.body })
  295. }
  296. } else {
  297. if (isLaporan) {
  298. await autoSaveModel.create({ laporan_id: laporan._id, laporan: req.body })
  299. } else {
  300. await autoSaveModel.create({ sanksi_id: sanksi._id, sanksi: req.body })
  301. }
  302. }
  303. return response.success(res, {
  304. message: 'Berhasil menyimpan data auto save',
  305. })
  306. })
  307. exports.getSave = handleError(async (req, res) => {
  308. const { id } = req.params
  309. const { laporan: isLaporan, sanksi: isSanksi } = req.query
  310. let data = null;
  311. let laporan = null;
  312. let sanksi = null;
  313. if (isLaporan === 'true') {
  314. laporan = await laporanModel.findById(id)
  315. if (!laporan) return response.error(res, {
  316. code: 404,
  317. message: 'laporan_id tidak ada'
  318. })
  319. data = (await autoSaveModel.findOne({ laporan_id: laporan._id })).laporan;
  320. } else if (isSanksi === 'true') {
  321. sanksi = await sanksiModel.findById(id)
  322. if (!sanksi) return response.error(res, {
  323. code: 404,
  324. message: 'sanksi_id tidak ada'
  325. })
  326. data = (await autoSaveModel.findOne({ sanksi_id: sanksi._id })).sanksi;
  327. } else {
  328. return response.error(res, {
  329. message: 'harus terdapat query sanksi atau laporan yg bernilai true',
  330. })
  331. }
  332. return response.success(res, {
  333. message: 'Berhasil mengambil data auto save',
  334. data: data
  335. })
  336. })
  337. exports.backup = handleError(async (req, res) => {
  338. const timeNow = new Date().getTime()
  339. const dataBakup = await Promise.all([
  340. (async () => {
  341. const path = 'backup/' + timeNow + '-sanksi.json'
  342. const sanksi = await sanksiModel.find()
  343. fs.writeFileSync(path, JSON.stringify(sanksi))
  344. const { size } = fs.statSync(path)
  345. const mimetype = 'application/json'
  346. const buffer = fs.readFileSync(path)
  347. return { buffer, mimetype, size, originalname: 'sanksi.json' }
  348. })(),
  349. (async () => {
  350. const path = 'backup/' + timeNow + '-laporan.json'
  351. const laporan = await laporanModel.find()
  352. fs.writeFileSync(path, JSON.stringify(laporan))
  353. const { size } = fs.statSync(path)
  354. const mimetype = 'application/json'
  355. const buffer = fs.readFileSync(path)
  356. return { buffer, mimetype, size, originalname: 'laporan.json' }
  357. })(),
  358. (async () => {
  359. const path = 'backup/' + timeNow + '-user.json'
  360. const user = await userModel.find()
  361. fs.writeFileSync(path, JSON.stringify(user))
  362. const { size } = fs.statSync(path)
  363. const mimetype = 'application/json'
  364. const buffer = fs.readFileSync(path)
  365. return { buffer, mimetype, size, originalname: 'user.json' }
  366. })(),
  367. (async () => {
  368. const path = 'backup/' + timeNow + '-chunk.json'
  369. const chunk = await chunkModel.find()
  370. fs.writeFileSync(path, JSON.stringify(chunk))
  371. // const { size } = fs.statSync(path)
  372. // const mimetype = 'application/json'
  373. // const buffer = fs.readFileSync(path)
  374. // return { buffer, mimetype, size, originalname: 'chunk.json' }
  375. })(),
  376. (async () => {
  377. const path = 'backup/' + new Date().getTime() + '-dokumen.json'
  378. const dokumen = await dokumenModel.find()
  379. fs.writeFileSync(path, JSON.stringify(dokumen))
  380. const { size } = fs.statSync(path)
  381. const mimetype = 'application/json'
  382. const buffer = fs.readFileSync(path)
  383. return { buffer, mimetype, size, originalname: 'dokumen.json' }
  384. })(),
  385. (async () => {
  386. const path = 'backup/' + new Date().getTime() + '-pemantauan.json'
  387. const pemantauan = await dokumenModel.find()
  388. fs.writeFileSync(path, JSON.stringify(pemantauan))
  389. const { size } = fs.statSync(path)
  390. const mimetype = 'application/json'
  391. const buffer = fs.readFileSync(path)
  392. return { buffer, mimetype, size, originalname: 'pemantauan.json' }
  393. })(),
  394. ])
  395. // const dokumen = await addManyDokumen(dataBakup)
  396. // const tes = await backupModel.create({
  397. // dokumen: dokumen.map(e => e._id)
  398. // })
  399. return response.success(res, {
  400. message: 'berhasil membuat backup',
  401. })
  402. })
  403. exports.getBackup = handleError(async (req, res) => {
  404. const { id } = req.params
  405. const data = await backupModel.findById(id).populate('dokumen')
  406. if (!data) return response.error(res, {
  407. code: 404,
  408. message: 'Not Found',
  409. })
  410. return response.success(res, {
  411. message: 'berhasil mengambil data backup',
  412. data: data.dokumen
  413. })
  414. })
  415. exports.berakhirSanksi = handleError(async (req, res) => {
  416. const sanksi = await sanksiModel.find({'masa_berlaku.to_date': {
  417. $ne: null,
  418. $exists: true
  419. }}).populate('laporan')
  420. let count = 0;
  421. await Promise.all(sanksi.map(async e => {
  422. const dayLeft = moment(e.masa_berlaku.to_date).diff(
  423. new Date(),
  424. 'days'
  425. )
  426. if (dayLeft > 0 && dayLeft < 7) {
  427. try {
  428. await notifWA(TEMPLATE_REMINDER2, [
  429. {
  430. key: '1',
  431. value: 'no_sanksi',
  432. value_text: `nomor sanksi ${e.no_sanksi}`
  433. },
  434. {
  435. key: '2',
  436. value: 'nama_pt',
  437. value_text: `${e.laporan.pt.nama}`
  438. },
  439. {
  440. key: '3',
  441. value: 'keterangan',
  442. value_text: `habis masa berlaku sanksi tersisa ${dayLeft} hari lagi.`
  443. }
  444. ])
  445. count++;
  446. const contacts = await kontakModel.find()
  447. await logModel.create({
  448. aktivitas: `Server berhasil mengirim notifikasi reminder Whatsapp kepada ${contacts.map((e) => e.nama).join(', ')} dengan Nomor Sanksi ${e.no_sanksi} terhadap ${e.laporan.pt.nama} bahwa Masa Berlaku Sanksi tersisa ${dayLeft} hari lagi.`
  449. })
  450. } catch (error) {
  451. return response.error(res, {
  452. message: 'Notifikasi gagal terkirim',
  453. error: error.message,
  454. })
  455. }
  456. }
  457. }))
  458. let message = 'Notifikasi berhasil terkirim'
  459. if (count === 0) message = 'tidak ada notifikasi yg dikirim'
  460. return response.success(res, {
  461. message,
  462. })
  463. })