auto.controller.js 15 KB

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