auto.controller.js 11 KB

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