graph.controller.js 13 KB

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