auto.controller.js 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397
  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 {
  7. TEMPLATE_REMINDER,
  8. TEMPLATE_REMINDER2, TRUE, UPDATE_SANKSI,
  9. } = require('../../utils/constanta')
  10. const moment = require('moment')
  11. const autoSaveModel = require('../../model/autoSave.model')
  12. const { cekSatuDataSanksi, cekSatuDataLaporan } = require('../../utils/v1/cekData')
  13. const logModel = require('../../model/log.model')
  14. const kontakModel = require('../../model/kontak.model')
  15. const pemantauanModel = require('../../model/pemantauan.model')
  16. exports.keberatan = handleError(async (req, res) => {
  17. const dataSanksi = await sanksiModel
  18. .find({
  19. 'batas_waktu.keberatan': {
  20. $lt: moment().toISOString(),
  21. },
  22. 'is_pengajuan_keberatan': {
  23. $exists: false,
  24. $eq: null,
  25. },
  26. 'pengajuan.cabut_sanksi': {
  27. $exists: false,
  28. $eq: null,
  29. },
  30. })
  31. .populate('user')
  32. .populate('laporan')
  33. if (!dataSanksi.length) {
  34. return response.success(res, {
  35. message: 'Tidak ada notifikasi yg dikirim',
  36. })
  37. }
  38. await Promise.all(
  39. dataSanksi.map(
  40. async (sanksi) =>
  41. await sanksiModel.findByIdAndUpdate(sanksi._id, {
  42. is_pengajuan_keberatan: false,
  43. last_step: "Dokumen Perbaikan"
  44. })
  45. )
  46. )
  47. await logModel.create({
  48. aktivitas: `Server berhasil merubah last_step PT ${dataSanksi.map((e) => e.laporan.pt.nama).join(', ')} menjadi Dokumen Perbaikan`
  49. })
  50. return response.success(res, {
  51. message: 'Notifikasi berhasil terkirim',
  52. })
  53. })
  54. exports.banding = handleError(async (req, res) => {
  55. const dataSanksi = await sanksiModel
  56. .find({
  57. 'batas_waktu.banding': {
  58. $lt: moment().toISOString(),
  59. },
  60. 'is_pengajuan_banding': {
  61. $exists: false,
  62. $eq: null,
  63. },
  64. 'jawaban.keberatan': {
  65. $exists: true,
  66. $ne: null,
  67. },
  68. 'pengajuan.cabut_sanksi': {
  69. $exists: false,
  70. $eq: null,
  71. },
  72. })
  73. .populate('user')
  74. .populate('laporan')
  75. if (!dataSanksi.length) {
  76. return response.success(res, {
  77. message: 'Tidak ada notifikasi yg dikirim',
  78. })
  79. }
  80. await Promise.all(
  81. dataSanksi.map(
  82. async (sanksi) => {
  83. await sanksiModel.findByIdAndUpdate(sanksi._id, {
  84. is_pengajuan_banding: false,
  85. last_step: "Dokumen Perbaikan"
  86. })
  87. }
  88. )
  89. )
  90. await logModel.create({
  91. aktivitas: `Server berhasil merubah last_step PT ${dataSanksi.map((e) => e.laporan.pt.nama).join(', ')} menjadi Dokumen Perbaikan`
  92. })
  93. return response.success(res, {
  94. message: 'Notifikasi berhasil terkirim',
  95. })
  96. })
  97. exports.reminderKeberatan = handleError(async (req, res) => {
  98. let dataSanksi = await sanksiModel
  99. .find({
  100. 'batas_waktu.jawaban_keberatan': {
  101. $exists: true,
  102. $ne: null,
  103. },
  104. 'jawaban.keberatan': {
  105. $exists: false,
  106. $eq: null,
  107. },
  108. })
  109. .populate('user')
  110. .populate('laporan')
  111. const notif = await Promise.all(
  112. dataSanksi.map(async (e) => {
  113. const dayLeft = moment(e.batas_waktu.jawaban_keberatan).diff(
  114. new Date(),
  115. 'days'
  116. )
  117. if (dayLeft > 0 && dayLeft < 7) {
  118. try {
  119. await notifWA(TEMPLATE_REMINDER, [
  120. {
  121. key: '1',
  122. value: 'no_laporan',
  123. value_text: e.laporan.no_laporan,
  124. },
  125. {
  126. key: '2',
  127. value: 'keterangan',
  128. value_text: 'Proses Menjawab Pengajuan Keberatan',
  129. },
  130. {
  131. key: '3',
  132. value: 'pt',
  133. value_text: e.laporan.pt.nama,
  134. },
  135. {
  136. key: '4',
  137. value: 'masa',
  138. value_text: `menjawab pengajuan keberatan tersisa ${dayLeft} hari lagi.`,
  139. },
  140. ])
  141. const contacts = await kontakModel.find()
  142. await logModel.create({
  143. 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`
  144. })
  145. } catch (error) {
  146. return response.error(res, {
  147. message: 'Notifikasi gagal terkirim',
  148. error: error.message,
  149. })
  150. }
  151. }
  152. })
  153. )
  154. let message = 'Tidak ada notifikasi yang dikirim'
  155. if (notif.length) message = 'Notifikasi berhasil terkirim'
  156. return response.success(res, {
  157. message,
  158. })
  159. })
  160. exports.reminderBanding = handleError(async (req, res) => {
  161. let dataSanksi = await sanksiModel
  162. .find({
  163. 'batas_waktu.jawaban_banding': {
  164. $exists: true,
  165. $ne: null,
  166. },
  167. 'jawaban.banding': {
  168. $exists: false,
  169. $eq: null,
  170. },
  171. })
  172. .populate('user')
  173. .populate('laporan')
  174. const notif = await Promise.all(
  175. dataSanksi.map(async (e) => {
  176. const dayLeft = moment(e.batas_waktu.jawaban_banding).diff(
  177. new Date(),
  178. 'days'
  179. )
  180. if (dayLeft > 0 && dayLeft < 7) {
  181. try {
  182. await notifWA(TEMPLATE_REMINDER, [
  183. {
  184. key: '1',
  185. value: 'no_laporan',
  186. value_text: e.laporan.no_laporan,
  187. },
  188. {
  189. key: '2',
  190. value: 'keterangan',
  191. value_text: 'Proses Menjawab Pengajuan Banding',
  192. },
  193. {
  194. key: '3',
  195. value: 'pt',
  196. value_text: e.laporan.pt.nama,
  197. },
  198. {
  199. key: '4',
  200. value: 'masa',
  201. value_text: `menjawab pengajuan banding tersisa ${dayLeft} hari lagi.`,
  202. },
  203. ])
  204. const contacts = await kontakModel.find()
  205. await logModel.create({
  206. 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`
  207. })
  208. } catch (error) {
  209. return response.error(res, {
  210. message: 'Notifikasi gagal terkirim',
  211. error: error.message,
  212. })
  213. }
  214. }
  215. })
  216. )
  217. let message = 'Tidak ada notifikasi yang dikirim'
  218. if (notif.length) message = 'Notifikasi berhasil terkirim'
  219. return response.success(res, {
  220. message,
  221. })
  222. })
  223. exports.updateStatusSanksi = handleError(async (req, res) => {
  224. const sanksi = await sanksiModel.find({
  225. 'masa_berlaku.to_date': {
  226. $lte: new Date().toISOString(),
  227. },
  228. aktif: true,
  229. 'masa_berlaku.berakhir': {
  230. $exists: false,
  231. $eq: null
  232. }
  233. }).populate('laporan')
  234. await Promise.all(
  235. sanksi.map(async (e) => {
  236. await pemantauanModel.create({
  237. laporan: e.laporan._id,
  238. sanksi: e._id,
  239. action: UPDATE_SANKSI,
  240. pt_id: e.laporan.pt.id,
  241. keterangan: 'Masa berlaku sanksi sudah melewati TMT'
  242. })
  243. await sanksiModel.findByIdAndUpdate(e._id, { 'masa_berlaku.berakhir': true })
  244. })
  245. )
  246. return response.success(res, {
  247. message: 'update status sanksi berhasil',
  248. })
  249. })
  250. exports.save = handleError(async (req, res) => {
  251. const { id } = req.params
  252. const { laporan: isLaporan, sanksi: isSanksi } = req.query
  253. const user = req.user
  254. let autoData = null;
  255. let laporan = null;
  256. let sanksi = null;
  257. if (isLaporan === TRUE) {
  258. laporan = await cekSatuDataLaporan(res, user, id);
  259. if (!laporan) return
  260. autoData = await autoSaveModel.findOne({ laporan_id: laporan._id });
  261. } else if (isSanksi === TRUE) {
  262. sanksi = await cekSatuDataSanksi(res, user, id);
  263. if (!sanksi) return
  264. autoData = await autoSaveModel.findOne({ sanksi_id: sanksi._id });
  265. } else {
  266. return response.error(res, {
  267. message: 'query harus sanksi atau laporan yg bernilai true',
  268. })
  269. }
  270. if (autoData) {
  271. if (isLaporan) {
  272. const dataSave = await autoSaveModel.findOne({ laporan_id: laporan._id })
  273. await autoSaveModel.updateOne({ laporan_id: laporan._id }, {
  274. laporan: {
  275. ...req.body, PenetapanSanksi: {
  276. dataSuratBA: req.body?.PenetapanSanksi?.dataSuratBA || dataSave.laporan.PenetapanSanksi?.dataSuratBA,
  277. dataUpload: req.body?.PenetapanSanksi?.dataUpload || dataSave.laporan.PenetapanSanksi?.dataUpload,
  278. dataPelanggaran: req.body?.PenetapanSanksi?.dataPelanggaran || dataSave.laporan.PenetapanSanksi?.dataPelanggaran,
  279. activeStep: req.body?.PenetapanSanksi?.activeStep || dataSave.laporan.PenetapanSanksi?.activeStep,
  280. }
  281. }
  282. })
  283. } else {
  284. await autoSaveModel.updateOne({ sanksi_id: sanksi._id }, { sanksi: req.body })
  285. }
  286. } else {
  287. if (isLaporan) {
  288. await autoSaveModel.create({ laporan_id: laporan._id, laporan: req.body })
  289. } else {
  290. await autoSaveModel.create({ sanksi_id: sanksi._id, sanksi: req.body })
  291. }
  292. }
  293. return response.success(res, {
  294. message: 'Berhasil menyimpan data auto save',
  295. })
  296. })
  297. exports.getSave = handleError(async (req, res) => {
  298. const { id } = req.params
  299. const { laporan: isLaporan, sanksi: isSanksi } = req.query
  300. let data = null;
  301. let laporan = null;
  302. let sanksi = null;
  303. if (isLaporan === TRUE) {
  304. laporan = await laporanModel.findById(id)
  305. if (!laporan) return response.error(res, {
  306. code: 404,
  307. message: 'laporan_id tidak ada'
  308. })
  309. data = (await autoSaveModel.findOne({ laporan_id: laporan._id })).laporan;
  310. } else if (isSanksi === 'true') {
  311. sanksi = await sanksiModel.findById(id)
  312. if (!sanksi) return response.error(res, {
  313. code: 404,
  314. message: 'sanksi_id tidak ada'
  315. })
  316. data = (await autoSaveModel.findOne({ sanksi_id: sanksi._id })).sanksi;
  317. } else {
  318. return response.error(res, {
  319. message: 'harus terdapat query sanksi atau laporan yg bernilai true',
  320. })
  321. }
  322. return response.success(res, {
  323. message: 'Berhasil mengambil data auto save',
  324. data: data
  325. })
  326. })
  327. exports.berakhirSanksi = handleError(async (req, res) => {
  328. const sanksi = await sanksiModel.find({'masa_berlaku.to_date': {
  329. $ne: null,
  330. $exists: true
  331. }}).populate('laporan')
  332. let count = 0;
  333. await Promise.all(sanksi.map(async e => {
  334. const dayLeft = moment(e.masa_berlaku.to_date).diff(
  335. new Date(),
  336. 'days'
  337. )
  338. if (dayLeft > 0 && dayLeft < 7) {
  339. try {
  340. await notifWA(TEMPLATE_REMINDER2, [
  341. {
  342. key: '1',
  343. value: 'no_sanksi',
  344. value_text: `nomor sanksi ${e.no_sanksi}`
  345. },
  346. {
  347. key: '2',
  348. value: 'nama_pt',
  349. value_text: `${e.laporan.pt.nama}`
  350. },
  351. {
  352. key: '3',
  353. value: 'keterangan',
  354. value_text: `habis masa berlaku sanksi tersisa ${dayLeft} hari lagi.`
  355. }
  356. ])
  357. count++;
  358. const contacts = await kontakModel.find()
  359. await logModel.create({
  360. 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.`
  361. })
  362. } catch (error) {
  363. return response.error(res, {
  364. message: 'Notifikasi gagal terkirim',
  365. error: error.message,
  366. })
  367. }
  368. }
  369. }))
  370. let message = 'Notifikasi berhasil terkirim'
  371. if (count === 0) message = 'tidak ada notifikasi yg dikirim'
  372. return response.success(res, {
  373. message,
  374. })
  375. })