auto.controller.js 13 KB

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