auto.controller.js 9.3 KB

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