graph.controller.js 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435
  1. const handleError = require('../../utils/v1/handleError')
  2. const excel = require('../../utils/excel')
  3. const response = require('../../utils/responseHandler')
  4. const {
  5. cekBanyakDataLaporan,
  6. dataLaporanAggregate,
  7. cekBanyakDataSanksi,
  8. } = require('../../utils/v1/cekData')
  9. const laporanModel = require('../../model/laporan.model')
  10. const moment = require('moment')
  11. const { TRUE, DIKTI, LLDIKTI, PTB_DIKTI, PTB_LLDIKTI, DITERIMA } = require('../../utils/constanta')
  12. const { capitalize } = require('../../utils/function')
  13. exports.laporan = handleError(async (req, res) => {
  14. const user = req.user
  15. const data = {}
  16. const date = new Date()
  17. const {
  18. jumlahLaporan,
  19. jadwal,
  20. evaluasi,
  21. sanksi,
  22. newLaporan,
  23. laporanBulan,
  24. laporanTahun,
  25. bulan,
  26. tahun,
  27. listJadwal,
  28. } = req.query
  29. berdasarkan_tahun = {
  30. $and: [
  31. {
  32. createdAt: {
  33. $gte: new Date(`${tahun || date.getFullYear()}`),
  34. },
  35. },
  36. {
  37. createdAt: {
  38. $lt: new Date(`${parseInt(tahun) + 1 || date.getFullYear() + 1}`),
  39. },
  40. },
  41. ],
  42. }
  43. // }
  44. const laporan = await cekBanyakDataLaporan(user, { ...berdasarkan_tahun })
  45. if (jumlahLaporan === TRUE) {
  46. const delegasi = await cekBanyakDataLaporan(user, {
  47. delegasi: true,
  48. ...berdasarkan_tahun,
  49. })
  50. const ditutup = await cekBanyakDataLaporan(user, {
  51. aktif: false,
  52. ...berdasarkan_tahun,
  53. })
  54. data.jumlah_laporan = {
  55. dikti: laporan.length,
  56. lldikti: delegasi.length,
  57. ditutup: ditutup.length,
  58. tes: {
  59. delegasi: true,
  60. ...berdasarkan_tahun,
  61. },
  62. }
  63. }
  64. if (jadwal === TRUE) {
  65. const hasJadwal = laporan.filter((e) => e.jadwal.judul).length
  66. const notHasJadwal = laporan.filter((e) => !e.jadwal.judul).length
  67. data.jadwal = {
  68. hasJadwal,
  69. notHasJadwal,
  70. }
  71. }
  72. if (evaluasi === TRUE) {
  73. const hasEvaluasi = laporan.filter(
  74. (e) => e.evaluasi.length && e.jadwal.judul
  75. ).length
  76. const notHasEvaluasi = laporan.filter(
  77. (e) => e.evaluasi.length === 0 && e.jadwal.judul
  78. ).length
  79. data.evaluasi = {
  80. hasEvaluasi,
  81. notHasEvaluasi,
  82. }
  83. }
  84. if (sanksi === TRUE) {
  85. const hasSanksi = laporan.filter(
  86. (e) => e.sanksi && e.evaluasi.length
  87. ).length
  88. const notHasSanksi = laporan.filter(
  89. (e) => !e.sanksi && e.evaluasi.length
  90. ).length
  91. data.sanksi = {
  92. hasSanksi,
  93. notHasSanksi,
  94. }
  95. }
  96. if (newLaporan === TRUE) {
  97. data.newLaporan = await cekBanyakDataLaporan(user, {
  98. limit: 3,
  99. select: 'no_laporan pt.nama -user createdAt',
  100. })
  101. }
  102. if (laporanBulan === TRUE) {
  103. let date = {}
  104. if (bulan || (bulan && tahun)) {
  105. const temp = new Date()
  106. date = {
  107. $expr: {
  108. $and: [
  109. { $eq: [{ $month: '$createdAt' }, parseInt(bulan)] },
  110. {
  111. $eq: [
  112. { $year: '$createdAt' },
  113. parseInt(tahun) || temp.getFullYear(),
  114. ],
  115. },
  116. ],
  117. },
  118. }
  119. }
  120. data.laporan_perbulan = await dataLaporanAggregate(
  121. user,
  122. { ...date },
  123. {
  124. _id: {
  125. bulan: {
  126. $month: '$createdAt',
  127. },
  128. tahun: {
  129. $year: '$createdAt',
  130. },
  131. },
  132. jumlah_laporan: {
  133. $sum: 1,
  134. },
  135. }
  136. )
  137. } else if (laporanTahun === TRUE) {
  138. const temp = new Date()
  139. let date = {
  140. $expr: {
  141. $eq: [{ $year: '$createdAt' }, parseInt(tahun) || temp.getFullYear()],
  142. },
  143. }
  144. data.laporan_perTahun = await dataLaporanAggregate(
  145. user,
  146. { ...date },
  147. {
  148. _id: {
  149. bulan: {
  150. $month: '$createdAt',
  151. },
  152. tahun: {
  153. $year: '$createdAt',
  154. },
  155. },
  156. jumlah_laporan: {
  157. $sum: 1,
  158. },
  159. }
  160. )
  161. }
  162. if (listJadwal === TRUE) {
  163. const temp = new Date()
  164. let date = {
  165. $expr: {
  166. $and: [
  167. {
  168. $eq: [
  169. { $month: '$jadwal.dari_tanggal' },
  170. parseInt(bulan) || temp.getMonth() + 1,
  171. ],
  172. },
  173. {
  174. $eq: [
  175. { $year: '$jadwal.dari_tanggal' },
  176. parseInt(tahun) || temp.getFullYear(),
  177. ],
  178. },
  179. ],
  180. },
  181. }
  182. data.list_jadwal = await dataLaporanAggregate(
  183. user,
  184. {
  185. aktif: true,
  186. ...date,
  187. jadwal: {
  188. $ne: null,
  189. $exists: true,
  190. },
  191. },
  192. {
  193. _id: {
  194. bulan: {
  195. $month: '$jadwal.dari_tanggal',
  196. },
  197. tahun: {
  198. $year: '$jadwal.dari_tanggal',
  199. },
  200. },
  201. jadwal: {
  202. $push: '$jadwal',
  203. },
  204. }
  205. )
  206. }
  207. return response.success(res, {
  208. message: 'Berhasil menganalisis data',
  209. data,
  210. })
  211. })
  212. exports.excel = handleError(async (req, res) => {
  213. const user = req.user
  214. const w = {}
  215. const date = new Date()
  216. switch (user.role.id) {
  217. case 2020:
  218. w.$or = [
  219. {
  220. role_asal: DIKTI,
  221. },
  222. {
  223. role_data: DIKTI,
  224. },
  225. ]
  226. break
  227. case 2021:
  228. w.$or = [
  229. {
  230. role_asal: LLDIKTI,
  231. },
  232. {
  233. role_data: LLDIKTI,
  234. },
  235. ]
  236. w['pt.pembina.id'] = user.lembaga.id
  237. break
  238. }
  239. const { tahun, penjadwalan, pelaporan, pemeriksaan, delegasi, sanksi } =
  240. req.query
  241. berdasarkan_tahun = {
  242. $and: [
  243. {
  244. createdAt: {
  245. $gte: new Date(`${tahun || date.getFullYear()}`),
  246. },
  247. },
  248. {
  249. createdAt: {
  250. $lt: new Date(`${parseInt(tahun) + 1 || date.getFullYear() + 1}`),
  251. },
  252. },
  253. ],
  254. }
  255. const laporan = await laporanModel
  256. .find({ ...w, ...berdasarkan_tahun })
  257. .populate('user')
  258. const dataDelegasi = laporan.map((value) => ({
  259. Tanggal: moment(value.createdAt).format('DD-MMMM-YYYY'),
  260. 'No. Laporan': value.no_laporan,
  261. 'Nama Perguruan Tinggi': value.pt.nama,
  262. 'Keterangan Laporan': value.keterangan,
  263. 'Dibuat Oleh': value.user.nama,
  264. Status: !value.aktif
  265. ? 'Ditutup'
  266. : (value.role_asal === DIKTI && value.role_data === DIKTI) ||
  267. (value.role_data == DIKTI && user.role.id === PTB_DIKTI) ||
  268. (value.role_asal === LLDIKTI && value.role_data === LLDIKTI) ||
  269. (value.role_data == LLDIKTI && user.role.id === PTB_LLDIKTI)
  270. ? `Ditindaklanjuti ${value.role_data === DIKTI ? DIKTI.toUpperCase() : LLDIKTI.toUpperCase()}`
  271. : `Delegasi Ke ${value.role_data === DIKTI ? DIKTI.toUpperCase() : LLDIKTI.toUpperCase()}`,
  272. }))
  273. const dataLaporan = laporan.map((value) => ({
  274. Tanggal: moment(value.createdAt).format('DD-MMMM-YYYY'),
  275. 'No. Laporan': value.no_laporan,
  276. 'Nama Perguruan Tinggi': value.pt.nama,
  277. 'Keterangan Laporan': value.keterangan,
  278. 'Dibuat Oleh': value.user.nama,
  279. Status:
  280. value.sanksi || value.aktif === false
  281. ? 'Pelaporan Selesai'
  282. : 'Pelaporan Belum Selesai',
  283. }))
  284. const dataJadwal = laporan
  285. .filter((e) => e.aktif === true)
  286. .map((value) => ({
  287. Tanggal: moment(value.createdAt).format('DD-MMMM-YYYY'),
  288. 'No. Laporan': value.no_laporan,
  289. 'Nama Perguruan Tinggi': value.pt.nama,
  290. 'Keterangan Laporan': value.keterangan,
  291. 'Dibuat Oleh': value.user.nama,
  292. 'Dari Tanggal':
  293. value.jadwal.judul &&
  294. moment(value.jadwal.dari_tanggal).format('DD-MMMM-YYYY'),
  295. 'Sampai Tanggal':
  296. value.jadwal.judul &&
  297. moment(value.jadwal.sampai_tanggal).format('DD-MMMM-YYYY'),
  298. Status: value.jadwal.judul ? 'Sudah ada jadwal' : 'Belum ada jadwal',
  299. }))
  300. const dataPemeriksaan = laporan
  301. .filter((e) => e.aktif === true && e.jadwal.judul)
  302. .map((value) => ({
  303. Tanggal: moment(value.createdAt).format('DD-MMMM-YYYY'),
  304. 'No. Laporan': value.no_laporan,
  305. 'Nama Perguruan Tinggi': value.pt.nama,
  306. 'Keterangan Laporan': value.keterangan,
  307. 'Dibuat Oleh': value.user.nama,
  308. Status: value.evaluasi.length ? 'Sudah diperiksa' : 'Belum diperiksa',
  309. }))
  310. const dataSanksi = laporan
  311. .filter((e) => e.aktif === true && e.evaluasi.length)
  312. .map((value) => ({
  313. Tanggal: moment(value.createdAt).format('DD-MMMM-YYYY'),
  314. 'No. Laporan': value.no_laporan,
  315. 'Nama Perguruan Tinggi': value.pt.nama,
  316. 'Keterangan Laporan': value.keterangan,
  317. 'Dibuat Oleh': value.user.nama,
  318. Status: value.sanksi ? 'Sudah ditetapkan' : 'Belum ditetapkan',
  319. }))
  320. const data = []
  321. if (delegasi === TRUE) {
  322. data.push({ SheetNames: 'Delegasi', data: dataDelegasi })
  323. }
  324. if (pelaporan === TRUE) {
  325. data.push({ SheetNames: 'Pelaporan', data: dataLaporan })
  326. }
  327. if (penjadwalan === TRUE) {
  328. data.push({
  329. SheetNames: 'Penjadwalan',
  330. data: dataJadwal,
  331. })
  332. }
  333. if (pemeriksaan === TRUE) {
  334. data.push({ SheetNames: 'Pemeriksaan', data: dataPemeriksaan })
  335. }
  336. if (sanksi === TRUE) {
  337. data.push({ SheetNames: 'Sanksi', data: dataSanksi })
  338. }
  339. const buffer = excel.to_excel(data)
  340. res.header(
  341. 'Content-Type',
  342. 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
  343. )
  344. return res.end(Buffer.from(buffer))
  345. })
  346. exports.laporanSelesai = handleError(async (req, res) => {
  347. const user = req.user
  348. laporan = await cekBanyakDataLaporan(user, { aktif: false })
  349. sanksi = await cekBanyakDataSanksi(user, { aktif: false })
  350. const data = {
  351. laporan,
  352. sanksi,
  353. jumlah_selesai: sanksi.length,
  354. jumlah_ditutup: laporan.length,
  355. }
  356. return response.success(res, {
  357. message: 'Berhasil menganalisis data',
  358. data,
  359. })
  360. })
  361. exports.jumlahStatusLaporan = handleError(async (req, res) => {
  362. let dataPembina = await laporanModel.find({
  363. aktif: true,
  364. })
  365. dataPembina = [
  366. ...new Set(
  367. dataPembina.map((e) => `${e.pt.pembina.id};${e.pt.pembina.nama}`)
  368. ),
  369. ]
  370. dataPembina = dataPembina.map((e) => ({
  371. id: e.split(';')[0],
  372. name: e.split(';')[1],
  373. })).sort((a, b) => a.name < b.name ? -1 : 1)
  374. let data = await Promise.all(
  375. dataPembina.map(async (e) => {
  376. const dataLaporan = await laporanModel.find({'pt.pembina.id': e.id}).populate('sanksi').lean()
  377. return {
  378. pembina: e,
  379. jumlah_laporan: dataLaporan.length,
  380. jumlah_jadwal_evaluasi: dataLaporan.filter(e => e.jadwal).length,
  381. jumlah_delegasi: dataLaporan.filter(e => e.role_asal === DIKTI && e.role_data === LLDIKTI).length,
  382. jumlah_pemeriksaan: dataLaporan.filter(e => e.evaluasi.length).length,
  383. jumlah_sanksi: dataLaporan.filter(e => e.sanksi).length,
  384. jumlah_keberatan: dataLaporan.filter(e => e.sanksi?.pengajuan?.keberatan).length,
  385. jumlah_banding: dataLaporan.filter(e => e.sanksi?.pengajuan?.banding).length,
  386. jumlah_pemantauan_perbaikan: dataLaporan.filter(e => e.sanksi?.perbaikan?.length).length,
  387. jumlah_pencabutan_sanksi: dataLaporan.filter(e => e.sanksi?.pengajuan?.cabut_sanksi).length,
  388. jumlah_diterima: dataLaporan.filter(e => e.sanksi?.jawaban?.cabut_sanksi?.status === capitalize(DITERIMA)).length,
  389. jumlah_ditutup: dataLaporan.filter(e => !e.aktif).length,
  390. }
  391. })
  392. )
  393. return response.success(res, {
  394. message: 'Berhasil menganalisis data',
  395. data,
  396. })
  397. })