auto.controller.js 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395
  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. }).populate('laporan')
  230. await Promise.all(
  231. sanksi.map(async (e) => {
  232. await pemantauanModel.create({
  233. laporan: e.laporan._id,
  234. sanksi: e._id,
  235. action: UPDATE_SANKSI,
  236. pt_id: e.laporan.pt.id,
  237. keterangan: 'Sanksi sudah berakhir'
  238. })
  239. await 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.berakhirSanksi = handleError(async (req, res) => {
  326. const sanksi = await sanksiModel.find({'masa_berlaku.to_date': {
  327. $ne: null,
  328. $exists: true
  329. }}).populate('laporan')
  330. let count = 0;
  331. await Promise.all(sanksi.map(async e => {
  332. const dayLeft = moment(e.masa_berlaku.to_date).diff(
  333. new Date(),
  334. 'days'
  335. )
  336. if (dayLeft > 0 && dayLeft < 7) {
  337. try {
  338. await notifWA(TEMPLATE_REMINDER2, [
  339. {
  340. key: '1',
  341. value: 'no_sanksi',
  342. value_text: `nomor sanksi ${e.no_sanksi}`
  343. },
  344. {
  345. key: '2',
  346. value: 'nama_pt',
  347. value_text: `${e.laporan.pt.nama}`
  348. },
  349. {
  350. key: '3',
  351. value: 'keterangan',
  352. value_text: `habis masa berlaku sanksi tersisa ${dayLeft} hari lagi.`
  353. }
  354. ])
  355. count++;
  356. const contacts = await kontakModel.find()
  357. await logModel.create({
  358. 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.`
  359. })
  360. } catch (error) {
  361. return response.error(res, {
  362. message: 'Notifikasi gagal terkirim',
  363. error: error.message,
  364. })
  365. }
  366. }
  367. }))
  368. let message = 'Notifikasi berhasil terkirim'
  369. if (count === 0) message = 'tidak ada notifikasi yg dikirim'
  370. return response.success(res, {
  371. message,
  372. })
  373. })