auto.controller.js 14 KB

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