auto.controller.js 8.6 KB

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