graph.controller.js 8.8 KB

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