graph.controller.js 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375
  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. }
  238. const { tahun } = req.query
  239. berdasarkan_tahun = {
  240. $and: [
  241. {
  242. createdAt: {
  243. $gte: new Date(`${tahun || date.getFullYear()}`),
  244. },
  245. },
  246. {
  247. createdAt: {
  248. $lt: new Date(`${parseInt(tahun) + 1 || date.getFullYear() + 1}`),
  249. },
  250. },
  251. ],
  252. }
  253. const laporan = await laporanModel
  254. .find({ ...w, ...berdasarkan_tahun })
  255. .populate('user')
  256. const dataDelegasi = laporan.map((value) => ({
  257. Tanggal: moment(value.createdAt).format('DD-MMMM-YYYY'),
  258. 'No. Laporan': value.no_laporan,
  259. 'Nama Perguruan Tinggi': value.pt.nama,
  260. 'Keterangan Laporan': value.keterangan,
  261. 'Dibuat Oleh': value.user.nama,
  262. Status: !value.aktif
  263. ? 'Ditutup'
  264. : (value.role_asal === 'dikti' && value.role_data === 'dikti') ||
  265. (value.role_data == 'dikti' && user.role.id === 2020) ||
  266. (value.role_asal === 'lldikti' && value.role_data === 'lldikti') ||
  267. (value.role_data == 'lldikti' && user.role.id === 2021)
  268. ? `Ditindaklanjuti ${value.role_data === 'dikti' ? 'DIKTI' : 'LLDIKTI'}`
  269. : `Delegasi Ke ${value.role_data === 'dikti' ? 'DIKTI' : 'LLDIKTI'}`,
  270. }))
  271. const dataLaporan = laporan.map((value) => ({
  272. Tanggal: moment(value.createdAt).format('DD-MMMM-YYYY'),
  273. 'No. Laporan': value.no_laporan,
  274. 'Nama Perguruan Tinggi': value.pt.nama,
  275. 'Keterangan Laporan': value.keterangan,
  276. 'Dibuat Oleh': value.user.nama,
  277. Status:
  278. value.sanksi || value.aktif === false
  279. ? 'Pelaporan Selesai'
  280. : 'Pelaporan Belum Selesai',
  281. }))
  282. const dataJadwal = laporan
  283. .filter((e) => e.aktif === true)
  284. .map((value) => ({
  285. Tanggal: moment(value.createdAt).format('DD-MMMM-YYYY'),
  286. 'No. Laporan': value.no_laporan,
  287. 'Nama Perguruan Tinggi': value.pt.nama,
  288. 'Keterangan Laporan': value.keterangan,
  289. 'Dibuat Oleh': value.user.nama,
  290. 'Dari Tanggal':
  291. value.jadwal.judul &&
  292. moment(value.jadwal.dari_tanggal).format('DD-MMMM-YYYY'),
  293. 'Sampai Tanggal':
  294. value.jadwal.judul &&
  295. moment(value.jadwal.sampai_tanggal).format('DD-MMMM-YYYY'),
  296. Status: value.jadwal.judul ? 'Sudah ada jadwal' : 'Belum ada jadwal',
  297. }))
  298. const dataPemeriksaan = laporan
  299. .filter((e) => e.aktif === true && e.jadwal.judul)
  300. .map((value) => ({
  301. Tanggal: moment(value.createdAt).format('DD-MMMM-YYYY'),
  302. 'No. Laporan': value.no_laporan,
  303. 'Nama Perguruan Tinggi': value.pt.nama,
  304. 'Keterangan Laporan': value.keterangan,
  305. 'Dibuat Oleh': value.user.nama,
  306. Status: value.evaluasi.length ? 'Sudah diperiksa' : 'Belum diperiksa',
  307. }))
  308. const dataSanksi = laporan
  309. .filter((e) => e.aktif === true && e.evaluasi.length)
  310. .map((value) => ({
  311. Tanggal: moment(value.createdAt).format('DD-MMMM-YYYY'),
  312. 'No. Laporan': value.no_laporan,
  313. 'Nama Perguruan Tinggi': value.pt.nama,
  314. 'Keterangan Laporan': value.keterangan,
  315. 'Dibuat Oleh': value.user.nama,
  316. Status: value.sanksi ? 'Sudah ditetapkan' : 'Belum ditetapkan',
  317. }))
  318. const buffer = excel.to_excel([
  319. {
  320. SheetNames: 'Delegasi',
  321. data: dataDelegasi,
  322. },
  323. {
  324. SheetNames: 'Pelaporan',
  325. data: dataLaporan,
  326. },
  327. {
  328. SheetNames: 'Penjadwalan',
  329. data: dataJadwal,
  330. },
  331. {
  332. SheetNames: 'Pemeriksaan',
  333. data: dataPemeriksaan,
  334. },
  335. {
  336. SheetNames: 'Sanksi',
  337. data: dataSanksi,
  338. },
  339. ])
  340. res.header(
  341. 'Content-Type',
  342. 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
  343. )
  344. return res.end(Buffer.from(buffer))
  345. })