graph.controller.js 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379
  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. ...date,
  185. jadwal: {
  186. $ne: null,
  187. $exists: true,
  188. },
  189. },
  190. {
  191. _id: {
  192. bulan: {
  193. $month: '$jadwal.dari_tanggal',
  194. },
  195. tahun: {
  196. $year: '$jadwal.dari_tanggal',
  197. },
  198. },
  199. jadwal: {
  200. $push: '$jadwal',
  201. },
  202. }
  203. )
  204. }
  205. return response.success(res, {
  206. message: 'Berhasil menganalisis data',
  207. data,
  208. })
  209. })
  210. exports.excel = handleError(async (req, res) => {
  211. const user = req.user
  212. const w = {}
  213. const date = new Date()
  214. switch (user.role.id) {
  215. case 2020:
  216. w['$or'] = [
  217. {
  218. role_asal: 'dikti',
  219. },
  220. {
  221. role_data: 'dikti',
  222. },
  223. ]
  224. break
  225. case 2021:
  226. w['$or'] = [
  227. {
  228. role_asal: 'lldikti',
  229. },
  230. {
  231. role_data: 'lldikti',
  232. },
  233. ]
  234. w['pt.pembina.id'] = user.lembaga.id
  235. break
  236. default:
  237. return response.error(res, {
  238. message: 'Forbidden',
  239. code: 403,
  240. })
  241. }
  242. const { tahun } = req.query
  243. berdasarkan_tahun = {
  244. $and: [
  245. {
  246. createdAt: {
  247. $gte: new Date(`${tahun || date.getFullYear()}`),
  248. },
  249. },
  250. {
  251. createdAt: {
  252. $lt: new Date(`${parseInt(tahun) + 1 || date.getFullYear() + 1}`),
  253. },
  254. },
  255. ],
  256. }
  257. const laporan = await laporanModel
  258. .find({ ...w, ...berdasarkan_tahun })
  259. .populate('user')
  260. const dataDelegasi = laporan.map((value) => ({
  261. Tanggal: moment(value.createdAt).format('DD-MMMM-YYYY'),
  262. 'No. Laporan': value.no_laporan,
  263. 'Nama Perguruan Tinggi': value.pt.nama,
  264. 'Keterangan Laporan': value.keterangan,
  265. 'Dibuat Oleh': value.user.nama,
  266. Status: !value.aktif
  267. ? 'Ditutup'
  268. : (value.role_asal === 'dikti' && value.role_data === 'dikti') ||
  269. (value.role_data == 'dikti' && user.role.id === 2020) ||
  270. (value.role_asal === 'lldikti' && value.role_data === 'lldikti') ||
  271. (value.role_data == 'lldikti' && user.role.id === 2021)
  272. ? `Ditindaklanjuti ${value.role_data === 'dikti' ? 'DIKTI' : 'LLDIKTI'}`
  273. : `Delegasi Ke ${value.role_data === 'dikti' ? 'DIKTI' : 'LLDIKTI'}`,
  274. }))
  275. const dataLaporan = laporan.map((value) => ({
  276. Tanggal: moment(value.createdAt).format('DD-MMMM-YYYY'),
  277. 'No. Laporan': value.no_laporan,
  278. 'Nama Perguruan Tinggi': value.pt.nama,
  279. 'Keterangan Laporan': value.keterangan,
  280. 'Dibuat Oleh': value.user.nama,
  281. Status:
  282. value.sanksi || value.aktif === false
  283. ? 'Pelaporan Selesai'
  284. : 'Pelaporan Belum Selesai',
  285. }))
  286. const dataJadwal = laporan
  287. .filter((e) => e.aktif === true)
  288. .map((value) => ({
  289. Tanggal: moment(value.createdAt).format('DD-MMMM-YYYY'),
  290. 'No. Laporan': value.no_laporan,
  291. 'Nama Perguruan Tinggi': value.pt.nama,
  292. 'Keterangan Laporan': value.keterangan,
  293. 'Dibuat Oleh': value.user.nama,
  294. 'Dari Tanggal':
  295. value.jadwal.judul &&
  296. moment(value.jadwal.dari_tanggal).format('DD-MMMM-YYYY'),
  297. 'Sampai Tanggal':
  298. value.jadwal.judul &&
  299. moment(value.jadwal.sampai_tanggal).format('DD-MMMM-YYYY'),
  300. Status: value.jadwal.judul ? 'Sudah ada jadwal' : 'Belum ada jadwal',
  301. }))
  302. const dataPemeriksaan = laporan
  303. .filter((e) => e.aktif === true && e.jadwal.judul)
  304. .map((value) => ({
  305. Tanggal: moment(value.createdAt).format('DD-MMMM-YYYY'),
  306. 'No. Laporan': value.no_laporan,
  307. 'Nama Perguruan Tinggi': value.pt.nama,
  308. 'Keterangan Laporan': value.keterangan,
  309. 'Dibuat Oleh': value.user.nama,
  310. Status: value.evaluasi.length ? 'Sudah diperiksa' : 'Belum diperiksa',
  311. }))
  312. const dataSanksi = laporan
  313. .filter((e) => e.aktif === true && e.evaluasi.length)
  314. .map((value) => ({
  315. Tanggal: moment(value.createdAt).format('DD-MMMM-YYYY'),
  316. 'No. Laporan': value.no_laporan,
  317. 'Nama Perguruan Tinggi': value.pt.nama,
  318. 'Keterangan Laporan': value.keterangan,
  319. 'Dibuat Oleh': value.user.nama,
  320. Status: value.sanksi ? 'Sudah ditetapkan' : 'Belum ditetapkan',
  321. }))
  322. const buffer = excel.to_excel([
  323. {
  324. SheetNames: 'Delegasi',
  325. data: dataDelegasi,
  326. },
  327. {
  328. SheetNames: 'Pelaporan',
  329. data: dataLaporan,
  330. },
  331. {
  332. SheetNames: 'Penjadwalan',
  333. data: dataJadwal,
  334. },
  335. {
  336. SheetNames: 'Pemeriksaan',
  337. data: dataPemeriksaan,
  338. },
  339. {
  340. SheetNames: 'Sanksi',
  341. data: dataSanksi,
  342. },
  343. ])
  344. res.header(
  345. 'Content-Type',
  346. 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
  347. )
  348. return res.end(Buffer.from(buffer))
  349. })