laporan.controller.js 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564
  1. const handleError = require('../../utils/v1/handleError')
  2. const response = require('../../utils/responseHandler')
  3. const laporanModel = require('../../model/laporan.model')
  4. const pelanggaranModel = require('../../model/pelanggaran.model')
  5. const pemantauanModel = require('../../model/pemantauan.model')
  6. const { validate } = require('../../utils/v1/validation')
  7. const { notifWA } = require('../../utils/v1/notifFunction')
  8. const { addManyDokumen } = require('../../utils/dokumenFunction')
  9. const userModel = require('../../model/user.model')
  10. const {
  11. cekSatuDataLaporan,
  12. cekBanyakDataLaporan,
  13. } = require('../../utils/v1/cekData')
  14. const { TEMPLATE_LAPORAN, PELAPORAN, CREATE_LAPORAN, DIKTI, LLDIKTI, DITUTUP, DELEGASI, TRUE, FALSE, ADD_JADWAL,
  15. PTB_DIKTI,
  16. PTB_ADMIN,
  17. PTB_READ,
  18. SUCCESS, UPDATE_LAPORAN, DITERIMA
  19. } = require('../../utils/constanta')
  20. const logModel = require('../../model/log.model')
  21. const kontakModel = require('../../model/kontak.model')
  22. const { isValidObjectId } = require('mongoose')
  23. const roleId = require('../../middleware/role')
  24. const pddiktiService = require('../../services/v2/pddikti.service')
  25. exports.create = handleError(async (req, res) => {
  26. const user = req.user
  27. const files = req.files
  28. const isValid = validate(res, req.body, {
  29. no_laporan: 'string',
  30. pt_id: 'string',
  31. pelanggaran_id: 'string',
  32. keterangan: 'string',
  33. })
  34. if (!isValid) return
  35. const { no_laporan, pt_id, keterangan } = req.body
  36. let { pelanggaran_id } = req.body
  37. const pt = await pddiktiService.getPT(pt_id)
  38. if (pt.length === 0)
  39. return response.error(res, {
  40. message: 'pt_id tidak ditemukan',
  41. })
  42. let dokumen_id = []
  43. if (files.length) {
  44. const dokumen = await addManyDokumen(files)
  45. dokumen_id = dokumen.map((e) => e._id)
  46. }
  47. pelanggaran_id = pelanggaran_id.split(',')
  48. const pelanggaran = await pelanggaranModel.find({
  49. _id: {
  50. $in: pelanggaran_id,
  51. },
  52. })
  53. if (!pelanggaran.length)
  54. return response.error(res, { message: 'pelanggaran_id tidak ada' })
  55. let data = {
  56. no_laporan,
  57. user: user._id,
  58. dokumen: dokumen_id,
  59. pt: pt[0],
  60. pelanggaran: pelanggaran_id,
  61. keterangan,
  62. role_data: user.role.id === 2021 ? LLDIKTI : DIKTI,
  63. role_asal: user.role.id === 2021 ? LLDIKTI : DIKTI,
  64. level: 2,
  65. step: [PELAPORAN],
  66. flag: PELAPORAN,
  67. }
  68. data = await laporanModel.create(data)
  69. let contacts = await kontakModel.find()
  70. contacts = contacts.map((e) => e.nama).join(', ')
  71. try {
  72. const notif = await notifWA(TEMPLATE_LAPORAN, [
  73. {
  74. key: '1',
  75. value: 'nama',
  76. value_text: user.nama,
  77. },
  78. { key: '2', value: 'pt', value_text: pt[0].nama },
  79. { key: '3', value: 'keterangan', value_text: keterangan },
  80. { key: '4', value: 'no_laporan', value_text: no_laporan },
  81. ])
  82. if (notif[0].status === SUCCESS) {
  83. await logModel.create({
  84. aktivitas: `Server berhasil mengirim notif wa kepada ${contacts} untuk Pembuatan Laporan`,
  85. })
  86. } else {
  87. await logModel.create({
  88. aktivitas: `Server gagal mengirim notif wa kepada ${contacts} untuk Pembuatan Laporan, Error: ${JSON.stringify(notif)}`,
  89. })
  90. }
  91. } catch (error) {
  92. await logModel.create({
  93. aktivitas: `Server gagal mengirim notif wa kepada ${contacts} untuk Pembuatan Laporan, Error: ${error.message}`,
  94. })
  95. }
  96. await pemantauanModel.create({
  97. laporan: data._id,
  98. action: CREATE_LAPORAN,
  99. pt_id: pt[0].id,
  100. user: user._id,
  101. keterangan: 'Membuat Laporan',
  102. dokumen: dokumen_id,
  103. for_pt: false,
  104. })
  105. return response.success(res, {
  106. message: 'Berhasil menambah laporan',
  107. data,
  108. })
  109. })
  110. exports.public = handleError(async (req, res) => {
  111. const user = req.user
  112. const no_laporan = req.no_laporan
  113. let level = req.level
  114. const files = req.files
  115. const isValid = validate(res, req.body, {
  116. pt_id: 'string',
  117. pelanggaran_id: 'string',
  118. keterangan: 'string',
  119. })
  120. if (!isValid) return
  121. const { pt_id, keterangan, no_verifikasi } = req.body
  122. let { pelanggaran_id } = req.body
  123. if (no_verifikasi && user.no_verifikasi !== no_verifikasi) {
  124. return response.error(res, {
  125. message: 'Kode Verifikasi Salah',
  126. })
  127. } else if (no_verifikasi && user.no_verifikasi === no_verifikasi) {
  128. level = 3
  129. }
  130. const pt = await pddiktiService.getPT(pt_id)
  131. if (pt.length === 0)
  132. return response.error(res, {
  133. message: 'pt_id tidak ditemukan',
  134. })
  135. let dokumen_id = []
  136. if (files.length) {
  137. const dokumen = await addManyDokumen(files)
  138. dokumen_id = dokumen.map((e) => e._id)
  139. }
  140. pelanggaran_id = pelanggaran_id.split(',')
  141. const pelanggaran = await pelanggaranModel.find({
  142. _id: {
  143. $in: pelanggaran_id,
  144. },
  145. })
  146. if (!pelanggaran.length)
  147. return response.error(res, { message: 'pelanggaran_id tidak ada' })
  148. let data = {
  149. no_laporan,
  150. user: user._id,
  151. dokumen: dokumen_id,
  152. pt: pt[0],
  153. pelanggaran: pelanggaran_id,
  154. keterangan,
  155. role_data: DIKTI,
  156. role_asal: DIKTI,
  157. level,
  158. }
  159. data = await laporanModel.create(data)
  160. await pemantauanModel.create({
  161. laporan: data._id,
  162. action: CREATE_LAPORAN,
  163. pt_id: pt[0].id,
  164. user: user._id,
  165. keterangan: 'Membuat Laporan',
  166. dokumen: dokumen_id,
  167. for_pt: false,
  168. })
  169. if (no_verifikasi) await userModel.findByIdAndUpdate(user._id, { verified: true })
  170. let contacts = await kontakModel.find()
  171. contacts = contacts.map((e) => e.nama).join(', ')
  172. try {
  173. const notif = await notifWA(TEMPLATE_LAPORAN, [
  174. {
  175. key: '1',
  176. value: 'nama',
  177. value_text: user.isPrivate || !user.nama ? 'rahasia' : user.nama,
  178. },
  179. { key: '2', value: 'pt', value_text: pt[0].nama },
  180. { key: '3', value: 'keterangan', value_text: keterangan },
  181. { key: '4', value: 'no_laporan', value_text: no_laporan },
  182. ])
  183. if (notif[0].status === SUCCESS) {
  184. await logModel.create({
  185. aktivitas: `Server berhasil mengirim notif wa kepada ${contacts} untuk Pembuatan Laporan`,
  186. })
  187. } else {
  188. await logModel.create({
  189. aktivitas: `Server gagal mengirim notif wa kepada ${contacts} untuk Pembuatan Laporan, Error: ${JSON.stringify(notif)}`,
  190. })
  191. }
  192. } catch (error) {
  193. await logModel.create({
  194. aktivitas: `Server gagal mengirim notif wa kepada ${contacts} untuk Pembuatan Laporan, Error: ${error.message}`,
  195. })
  196. }
  197. return response.success(res, {
  198. message: 'Berhasil menambah laporan',
  199. data,
  200. })
  201. })
  202. exports.getLaporanByNoLaporanAndId = handleError(async (req, res) => {
  203. const { no_laporan } = req.params
  204. let where = { evaluasi: { $exists: true, $ne: [] } }
  205. if (isValidObjectId(no_laporan)) where._id = no_laporan
  206. else where.no_laporan = no_laporan
  207. const data = await laporanModel.findOne(where)
  208. .populate({ path: 'user', populate: 'foto' })
  209. .populate({ path: 'pelanggaran', select: 'pelanggaran' })
  210. .populate({ path: 'sanksi', populate: ['pelanggaran'] })
  211. .populate('dokumen')
  212. .populate('peserta_penetapan_sanksi.ttd')
  213. .populate({ path: 'evaluasi', populate: ['user', 'dokumen'] })
  214. if (!data) {
  215. return response.error(res, {
  216. message: 'no_laporan atau id tidak ada',
  217. code: 404,
  218. })
  219. }
  220. return response.success(res, {
  221. message: 'Berhasil ambil data laporan',
  222. data,
  223. })
  224. })
  225. exports.getAll = handleError(async (req, res) => {
  226. const user = req.user
  227. const where = {}
  228. const { no_laporan, pt_id, jadwal, evaluasi, aktif, delegasi, all, sanksi, tuntas } =
  229. req.query
  230. if (no_laporan) where.no_laporan = no_laporan
  231. if (pt_id) where['pt.id'] = pt_id
  232. if (aktif) where.aktif = aktif === TRUE
  233. if (all) where.all = true
  234. else if (delegasi) where.delegasi = delegasi === TRUE
  235. if (jadwal === TRUE) {
  236. where.jadwal = {
  237. $exists: true,
  238. $ne: null,
  239. }
  240. } else if (evaluasi === TRUE) {
  241. where.evaluasi = {
  242. $exists: true,
  243. $ne: null,
  244. $not: {
  245. $size: 0,
  246. },
  247. }
  248. } else if (sanksi === TRUE) {
  249. where.sanksi = {
  250. $exists: true,
  251. $ne: null,
  252. }
  253. } else if (tuntas === TRUE) {
  254. let dataLaporan = (await cekBanyakDataLaporan(user, { aktif: 'empty', all: true, }, { lean: true }))
  255. .filter(e => e.aktif === false || e.sanksi?.aktif === false)
  256. .map(e => ({ ...e, status: e.aktif === false || e.tuntas?.keterangan ? 'Ditutup' : e.sanksi?.jawaban?.cabut_sanksi?.status === 'Diterima' ? 'Diterima' : !e.sanksi?.masa_berlaku ? 'Selesai' : 'Ditutup' }))
  257. return response.success(res, {
  258. message: 'Berhasil ambil data laporan dan sanksi tuntas dan ditutup',
  259. data: dataLaporan
  260. })
  261. }
  262. let data = (await cekBanyakDataLaporan(user, where))
  263. if (!all) data = data.filter(e => !e.sanksi || e.sanksi?.aktif === true)
  264. return response.success(res, {
  265. message: 'Berhasil ambil data laporan',
  266. data,
  267. })
  268. })
  269. exports.getOne = handleError(async (req, res) => {
  270. const { id } = req.params
  271. const user = req.user
  272. const { aktif, delegasi, all } = req.query
  273. const where = {}
  274. if (aktif) where.aktif = aktif === TRUE
  275. if (all) where.all = true
  276. else if (delegasi) where.delegasi = delegasi === TRUE
  277. const data = await cekSatuDataLaporan(res, user, id, { normal: true })
  278. if (!data) return
  279. return response.success(res, {
  280. message: 'Berhasil ambil data Laporan',
  281. data,
  282. })
  283. })
  284. exports.update = handleError(async (req, res) => {
  285. const { id } = req.params
  286. const user = req.user
  287. const files = req.files
  288. const laporan = await cekSatuDataLaporan(res, user, id, { normal: true })
  289. if (!laporan) return
  290. const isValid = validate(res, req.body, {
  291. change_role: { type: 'string', optional: true, enum: [TRUE, FALSE] },
  292. aktif: { type: 'string', optional: true, enum: [TRUE, FALSE] },
  293. keterangan: 'string',
  294. })
  295. if (!isValid) return
  296. const data = {}
  297. let keterangan = ''
  298. let alasan = ''
  299. const { change_role, aktif } = req.body
  300. const keterangan2 = req.body.keterangan
  301. if (change_role === TRUE) {
  302. data.flag = DELEGASI
  303. data.role_data = user.role.id === 2020 ? 'lldikti' : 'dikti'
  304. keterangan = `Laporan didelegasi ke ${user.role.id === 2020 ? 'LLDIKTI' : 'DIKTI'}`
  305. alasan = keterangan2
  306. data.alasan_delegasi = keterangan2
  307. }
  308. if (aktif) {
  309. let dokumen_id = []
  310. data.aktif = aktif === TRUE
  311. if (files) {
  312. const dokumen = await addManyDokumen(files)
  313. dokumen_id = dokumen.map((e) => e._id)
  314. }
  315. if (aktif === 'true') {
  316. keterangan = 'Laporan dibuka'
  317. } else {
  318. keterangan = `Laporan ditutup`
  319. alasan = keterangan2
  320. data.flag = DITUTUP
  321. data.tuntas = {
  322. keterangan: keterangan2,
  323. dokumen: dokumen_id,
  324. }
  325. }
  326. }
  327. const update = await laporanModel.findByIdAndUpdate(laporan._id, data)
  328. if (change_role || aktif) {
  329. await pemantauanModel.create({
  330. action: UPDATE_LAPORAN,
  331. laporan: laporan._id,
  332. pt_id: laporan.pt.id,
  333. user: user._id,
  334. keterangan,
  335. alasan,
  336. for_pt: false,
  337. })
  338. }
  339. return response.success(res, {
  340. message: 'Berhasil update laporan',
  341. data: update,
  342. })
  343. })
  344. exports.jumlahLaporan = handleError(async (req, res) => {
  345. const laporan = await laporanModel.aggregate([
  346. {
  347. $match: {
  348. aktif: true,
  349. },
  350. },
  351. {
  352. $group: {
  353. _id: '$pt.pembina.nama',
  354. jumlah_laporan: {
  355. $sum: 1,
  356. },
  357. propinsi: {
  358. $addToSet: '$pt.propinsi.nama',
  359. },
  360. },
  361. },
  362. {
  363. $sort: {
  364. _id: 1,
  365. },
  366. },
  367. ])
  368. return response.success(res, {
  369. message: 'Jumlah Laporan',
  370. data: laporan,
  371. })
  372. })
  373. exports.laporanByPembina = [
  374. roleId([PTB_DIKTI,PTB_ADMIN, PTB_READ]),
  375. handleError(async (req, res) => {
  376. const { idPembina } = req.params
  377. const {
  378. penjadwalan,
  379. pemeriksaan,
  380. sanksi,
  381. keberatan,
  382. banding,
  383. perbaikan,
  384. cabutSanksi,
  385. delegasi,
  386. ditutup,
  387. diterima
  388. } = req.query
  389. let where = {}
  390. let where2 = {}
  391. let isLaporan = true
  392. let isSanksi = false
  393. if (penjadwalan === TRUE) {
  394. where.jadwal = {
  395. $exists: true,
  396. $ne: null,
  397. }
  398. isLaporan = true
  399. isSanksi = false
  400. }
  401. if (pemeriksaan === TRUE) {
  402. where.evaluasi = {
  403. $exists: true,
  404. $ne: null,
  405. $not: {
  406. $size: 0,
  407. },
  408. }
  409. isLaporan = true
  410. isSanksi = false
  411. }
  412. if (sanksi === TRUE) {
  413. where.sanksi = {
  414. $exists: true,
  415. $ne: null,
  416. }
  417. isLaporan = false
  418. isSanksi = true
  419. }
  420. if (keberatan === TRUE) {
  421. where2['pengajuan.keberatan'] = { $exists: true, $ne: null }
  422. isLaporan = false
  423. isSanksi = true
  424. }
  425. if (banding === TRUE) {
  426. where2['pengajuan.banding'] = { $exists: true, $ne: null }
  427. isLaporan = false
  428. isSanksi = true
  429. }
  430. if (cabutSanksi === TRUE) {
  431. where2['pengajuan.cabut_sanksi'] = {
  432. $exists: true,
  433. $ne: null,
  434. }
  435. isLaporan = false
  436. isSanksi = true
  437. }
  438. if (perbaikan === TRUE) {
  439. where2.perbaikan = {
  440. $exists: true,
  441. $ne: null,
  442. $not: {
  443. $size: 0,
  444. },
  445. }
  446. isLaporan = false
  447. isSanksi = true
  448. }
  449. if (delegasi === TRUE) {
  450. where = {
  451. role_asal: DIKTI,
  452. role_data: LLDIKTI
  453. }
  454. isLaporan = true
  455. isSanksi = false
  456. }
  457. if (ditutup === TRUE) {
  458. where.aktif = false
  459. isLaporan = true
  460. isSanksi = false
  461. }
  462. if (diterima === TRUE) {
  463. where2 = {
  464. 'jawaban.cabut_sanksi.status': DITERIMA,
  465. aktif: false
  466. }
  467. isLaporan = false
  468. isSanksi = true
  469. }
  470. let laporan = []
  471. if (isSanksi) {
  472. laporan = (await laporanModel.find({ ...where, 'pt.pembina.id': idPembina }).lean().populate({ path: 'sanksi', match: where2 }).lean())
  473. .filter(e => e.sanksi)
  474. .map(e => {
  475. let step = 'Pelaporan'
  476. if (e.jadwal && !e.evaluasi.length) step = 'Penjadwalan'
  477. else if (e.evaluasi.length && !e.sanksi) step = 'Pemeriksaan'
  478. else if (e.sanksi?.pengajuan?.cabut_sanksi) step = 'Cabut Sanksi'
  479. else if (e.sanksi?.pengajuan?.keberatan && !e.sanksi?.pengajuan?.banding) step = 'Keberatan'
  480. else if (e.sanksi?.aktif === false && !e.sanksi?.masa_berlaku?.from_date) step = 'Selesai'
  481. else if (e.sanksi?.aktif === false && e.jawaban?.cabut_sanksi?.status === 'Diterima') step = 'Diterima'
  482. else if (e.sanksi?.pengajuan?.banding) step = 'Banding'
  483. else if (e.sanksi) step = 'Sanksi'
  484. return { ...e, step }
  485. })
  486. } else if (isLaporan) {
  487. laporan = (await laporanModel.find({ ...where, 'pt.pembina.id': idPembina }).lean().populate({ path: 'sanksi', match: where2 }).lean())
  488. .map(e => {
  489. let step = 'Pelaporan'
  490. if (e.jadwal && !e.evaluasi.length) step = 'Penjadwalan'
  491. else if (e.evaluasi.length && !e.sanksi) step = 'Pemeriksaan'
  492. else if (e.sanksi?.pengajuan?.cabut_sanksi) step = 'Cabut Sanksi'
  493. else if (e.sanksi?.pengajuan?.keberatan && !e.sanksi?.pengajuan?.banding) step = 'Keberatan'
  494. else if (e.sanksi?.aktif === false && !e.sanksi?.masa_berlaku?.from_date) step = 'Selesai'
  495. else if (e.sanksi?.aktif === false && e.jawaban?.cabut_sanksi?.status === 'Diterima') step = 'Diterima'
  496. else if (e.sanksi?.pengajuan?.banding) step = 'Banding'
  497. else if (e.sanksi) step = 'Sanksi'
  498. return { ...e, step }
  499. })
  500. }
  501. return response.success(res, {
  502. message: 'berhasil get laporan by pembina',
  503. data: laporan,
  504. })
  505. })]
  506. exports.getOneLaporanPublic = handleError(async (req, res) => {
  507. const { id } = req.params
  508. const data = await laporanModel.findById(id)
  509. .populate({ path: 'user', populate: 'foto' })
  510. .populate({ path: 'pelanggaran', select: 'pelanggaran' })
  511. .populate({ path: 'sanksi', populate: ['pelanggaran'] })
  512. .populate('dokumen')
  513. .populate('peserta_penetapan_sanksi.ttd')
  514. .populate({ path: 'evaluasi', populate: ['user', 'dokumen'] })
  515. console.log(data)
  516. if (!data) return response.error(res, {
  517. code: 404,
  518. message: 'laporan_id tidak ada'
  519. })
  520. return response.success(res, {
  521. message: 'Berhasil ambil satu data Laporan',
  522. data,
  523. })
  524. })