auto.controller.js 11 KB

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