auto.controller.js 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426
  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 mime = require('mime')
  9. const {
  10. TEMPLATE_KEBERATAN,
  11. TEMPLATE_BANDING,
  12. TEMPLATE_REMINDER,
  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: new Date().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) => await sanksiModel.findByIdAndUpdate(sanksi._id, {
  44. is_pengajuan_keberatan: false,
  45. last_step: "Dokumen Perbaikan"
  46. })
  47. // await notifWA(TEMPLATE_KEBERATAN, [
  48. // {
  49. // key: '1',
  50. // value: 'nama_pt',
  51. // value_text: sanksi.laporan.pt.nama,
  52. // },
  53. // {
  54. // key: '2',
  55. // value: 'pemberi_sanksi',
  56. // value_text: sanksi.user.lembaga.nama,
  57. // },
  58. // {
  59. // key: '3',
  60. // value: 'no_laporan',
  61. // value_text: sanksi.laporan.no_laporan,
  62. // },
  63. // ])
  64. )
  65. )
  66. return response.success(res, {
  67. message: 'Notifikasi berhasil terkirim',
  68. })
  69. })
  70. exports.banding = handleError(async (req, res) => {
  71. const dataSanksi = await sanksiModel
  72. .find({
  73. 'tanggal_akhir_banding': {
  74. $lt: new Date().toISOString(),
  75. },
  76. 'is_pengajuan_banding': {
  77. $exists: false,
  78. $eq: null,
  79. },
  80. 'batas_waktu.jawaban_keberatan': {
  81. $exists: true,
  82. $ne: null,
  83. },
  84. ['pengajuan.cabut_sanksi']: {
  85. $exists: false,
  86. $eq: null,
  87. },
  88. })
  89. .populate('user')
  90. .populate('laporan')
  91. if (!dataSanksi.length) {
  92. return response.success(res, {
  93. message: 'Tidak ada notifikasi yg dikirim',
  94. })
  95. }
  96. Promise.all(
  97. dataSanksi.map(
  98. async (sanksi) => {
  99. // await notifWA(TEMPLATE_BANDING, [
  100. // {
  101. // key: '1',
  102. // value: 'nama_pt',
  103. // value_text: sanksi.laporan.pt.nama,
  104. // },
  105. // {
  106. // key: '2',
  107. // value: 'pemberi_sanksi',
  108. // value_text: sanksi.user.lembaga.nama,
  109. // },
  110. // {
  111. // key: '3',
  112. // value: 'no_laporan',
  113. // value_text: sanksi.laporan.no_laporan,
  114. // },
  115. // ])
  116. await sanksiModel.findByIdAndUpdate(sanksi._id, {
  117. is_pengajuan_banding: false,
  118. last_step: "Dokumen Perbaikan"
  119. })
  120. }
  121. )
  122. )
  123. return response.success(res, {
  124. message: 'Notifikasi berhasil terkirim',
  125. })
  126. })
  127. exports.reminderKeberatan = handleError(async (req, res) => {
  128. let dataSanksi = await sanksiModel
  129. .find({
  130. 'batas_waktu.jawaban_keberatan': {
  131. $exists: true,
  132. $ne: null,
  133. },
  134. 'jawaban.keberatan': {
  135. $exists: false,
  136. $eq: null,
  137. },
  138. })
  139. .populate('user')
  140. .populate('laporan')
  141. const notif = await Promise.all(
  142. dataSanksi.map(async (e) => {
  143. if (
  144. e.batas_waktu.jawaban_keberatan &&
  145. new Date() >
  146. moment(e.batas_waktu.jawaban_keberatan).add(-7, 'days').toDate() &&
  147. new Date() < e.batas_waktu.jawaban_keberatan
  148. ) {
  149. const dayLeft = moment(e.batas_waktu.jawaban_keberatan).diff(
  150. new Date(),
  151. 'days'
  152. )
  153. try {
  154. await notifWA(TEMPLATE_REMINDER, [
  155. {
  156. key: '1',
  157. value: 'no_laporan',
  158. value_text: e.laporan.no_laporan,
  159. },
  160. {
  161. key: '2',
  162. value: 'keterangan',
  163. value_text: 'Proses Menjawab Pengajuan Keberatan',
  164. },
  165. {
  166. key: '3',
  167. value: 'pt',
  168. value_text: e.laporan.pt.nama,
  169. },
  170. {
  171. key: '4',
  172. value: 'masa',
  173. value_text: `menjawab pengajuan keberatan tersisa ${dayLeft} hari lagi.`,
  174. },
  175. ])
  176. } catch (error) {
  177. return response.error(res, {
  178. message: 'Notifikasi gagal terkirim',
  179. error: error.message,
  180. })
  181. }
  182. }
  183. })
  184. )
  185. let message = 'Tidak ada notifikasi yang dikirim'
  186. if (notif.length) message = 'Notifikasi berhasil terkirim'
  187. return response.success(res, {
  188. message,
  189. })
  190. })
  191. exports.reminderBanding = handleError(async (req, res) => {
  192. let dataSanksi = await sanksiModel
  193. .find({
  194. 'batas_waktu.jawaban_banding': {
  195. $exists: true,
  196. $ne: null,
  197. },
  198. 'jawaban.banding': {
  199. $exists: false,
  200. $eq: null,
  201. },
  202. })
  203. .populate('user')
  204. .populate('laporan')
  205. const notif = await Promise.all(
  206. dataSanksi.map(async (e) => {
  207. if (
  208. e.batas_waktu.jawaban_banding &&
  209. new Date() >
  210. moment(e.batas_waktu.jawaban_banding).add(-7, 'days').toDate() &&
  211. new Date() < e.batas_waktu.jawaban_banding
  212. ) {
  213. const dayLeft = moment(e.batas_waktu.jawaban_banding).diff(
  214. new Date(),
  215. 'days'
  216. )
  217. try {
  218. await notifWA(TEMPLATE_REMINDER, [
  219. {
  220. key: '1',
  221. value: 'no_laporan',
  222. value_text: e.laporan.no_laporan,
  223. },
  224. {
  225. key: '2',
  226. value: 'keterangan',
  227. value_text: 'Proses Menjawab Pengajuan Banding',
  228. },
  229. {
  230. key: '3',
  231. value: 'pt',
  232. value_text: e.laporan.pt.nama,
  233. },
  234. {
  235. key: '4',
  236. value: 'masa',
  237. value_text: `menjawab pengajuan banding tersisa ${dayLeft} hari lagi.`,
  238. },
  239. ])
  240. } catch (error) {
  241. return response.error(res, {
  242. message: 'Notifikasi gagal terkirim',
  243. error: error.message,
  244. })
  245. }
  246. }
  247. })
  248. )
  249. let message = 'Tidak ada notifikasi yang dikirim'
  250. if (notif.length) message = 'Notifikasi berhasil terkirim'
  251. return response.success(res, {
  252. message,
  253. })
  254. })
  255. exports.updateStatusSanksi = handleError(async (req, res) => {
  256. const sanksi = await sanksiModel.find({
  257. 'masa_berlaku.to_date': {
  258. $lte: new Date().toISOString(),
  259. },
  260. aktif: true,
  261. })
  262. Promise.all(
  263. sanksi.map(async (e) =>
  264. sanksiModel.findByIdAndUpdate(e._id, {
  265. aktif: false,
  266. })
  267. )
  268. )
  269. return response.success(res, {
  270. message: 'update status sanksi berhasil',
  271. })
  272. })
  273. exports.save = handleError(async (req, res) => {
  274. const { id } = req.params
  275. const { laporan: isLaporan, sanksi: isSanksi } = req.query
  276. const user = req.user
  277. let autoData = null;
  278. let laporan = null;
  279. let sanksi = null;
  280. if (isLaporan === 'true') {
  281. laporan = await cekSatuDataLaporan(res, user, id);
  282. if (!laporan) return
  283. autoData = await autoSaveModel.findOne({ laporan_id: laporan._id });
  284. } else if (isSanksi === 'true') {
  285. sanksi = await cekSatuDataSanksi(res, user, id);
  286. if (!sanksi) return
  287. autoData = await autoSaveModel.findOne({ sanksi_id: sanksi._id });
  288. } else {
  289. return response.error(res, {
  290. message: 'query harus sanksi atau laporan yg bernilai true',
  291. })
  292. }
  293. if (autoData) {
  294. if (isLaporan) {
  295. const dataSave = await autoSaveModel.findOne({ laporan_id: laporan._id })
  296. await autoSaveModel.updateOne({ laporan_id: laporan._id }, {
  297. laporan: {
  298. ...req.body, PenetapanSanksi: {
  299. dataSuratBA: req.body?.PenetapanSanksi?.dataSuratBA || dataSave.laporan.PenetapanSanksi?.dataSuratBA,
  300. dataUpload: req.body?.PenetapanSanksi?.dataUpload || dataSave.laporan.PenetapanSanksi?.dataUpload,
  301. dataPelanggaran: req.body?.PenetapanSanksi?.dataPelanggaran || dataSave.laporan.PenetapanSanksi?.dataPelanggaran,
  302. activeStep: req.body?.PenetapanSanksi?.activeStep || dataSave.laporan.PenetapanSanksi?.activeStep,
  303. }
  304. }
  305. })
  306. } else {
  307. await autoSaveModel.updateOne({ sanksi_id: sanksi._id }, { sanksi: req.body })
  308. }
  309. } else {
  310. if (isLaporan) {
  311. await autoSaveModel.create({ laporan_id: laporan._id, laporan: req.body })
  312. } else {
  313. await autoSaveModel.create({ sanksi_id: sanksi._id, sanksi: req.body })
  314. }
  315. }
  316. return response.success(res, {
  317. message: 'Berhasil menyimpan data auto save',
  318. })
  319. })
  320. exports.getSave = handleError(async (req, res) => {
  321. const { id } = req.params
  322. const { laporan: isLaporan, sanksi: isSanksi } = req.query
  323. let data = null;
  324. let laporan = null;
  325. let sanksi = null;
  326. if (isLaporan === 'true') {
  327. laporan = await laporanModel.findById(id)
  328. if (!laporan) return response.error(res, {
  329. code: 404,
  330. message: 'laporan_id tidak ada'
  331. })
  332. data = (await autoSaveModel.findOne({ laporan_id: laporan._id })).laporan;
  333. } else if (isSanksi === 'true') {
  334. sanksi = await sanksiModel.findById(id)
  335. if (!sanksi) return response.error(res, {
  336. code: 404,
  337. message: 'sanksi_id tidak ada'
  338. })
  339. data = (await autoSaveModel.findOne({ sanksi_id: sanksi._id })).sanksi;
  340. } else {
  341. return response.error(res, {
  342. message: 'harus terdapat query sanksi atau laporan yg bernilai true',
  343. })
  344. }
  345. return response.success(res, {
  346. message: 'Berhasil mengambil data auto save',
  347. data: data
  348. })
  349. })
  350. exports.backup = handleError(async (req, res) => {
  351. const dataBakup = await Promise.all([
  352. (async () => {
  353. const path = 'backup/' + new Date().getTime() + '-sanksi.json'
  354. const sanksi = await sanksiModel.find()
  355. fs.writeFileSync(path, JSON.stringify(sanksi))
  356. const { size } = fs.statSync(path)
  357. const mimetype = 'application/json'
  358. const buffer = fs.readFileSync(path)
  359. return { buffer, mimetype, size, originalname: 'sanksi.json' }
  360. })(),
  361. (async () => {
  362. const path = 'backup/' + new Date().getTime() + '-laporan.json'
  363. const laporan = await laporanModel.find()
  364. fs.writeFileSync(path, JSON.stringify(laporan))
  365. const { size } = fs.statSync(path)
  366. const mimetype = 'application/json'
  367. const buffer = fs.readFileSync(path)
  368. return { buffer, mimetype, size, originalname: 'laporan.json' }
  369. })(),
  370. (async () => {
  371. const path = 'backup/' + new Date().getTime() + '-user.json'
  372. const user = await userModel.find()
  373. fs.writeFileSync(path, JSON.stringify(user))
  374. const { size } = fs.statSync(path)
  375. const mimetype = 'application/json'
  376. const buffer = fs.readFileSync(path)
  377. return { buffer, mimetype, size, originalname: 'user.json' }
  378. })()
  379. ])
  380. const dokumen = await addManyDokumen(dataBakup)
  381. const tes = await backupModel.create({
  382. dokumen: dokumen.map(e => e._id)
  383. })
  384. return response.success(res, {
  385. message: 'berhasil membuat backup',
  386. data: tes
  387. })
  388. })
  389. exports.getBackup = handleError(async (req, res) => {
  390. const { id } = req.params
  391. const data = await backupModel.findById(id).populate('dokumen')
  392. if (!data) return response.error(res, {
  393. code: 404,
  394. message: 'Not Found',
  395. })
  396. return response.success(res, {
  397. message: 'berhasil mengambil data backup',
  398. data: data.dokumen
  399. })
  400. })