graph.controller.js 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268
  1. const handleError = require('../utils/handleError')
  2. const response = require('../utils/responseHandler')
  3. const {
  4. cekBanyakDataLaporan,
  5. dataLaporanAggregate,
  6. } = require('../utils/cekData')
  7. const XLSX = require('xlsx')
  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.exel = handleError(async (req, res) => {
  211. // const user = req.user
  212. const laporan = await laporanModel.find()
  213. const data = laporan.map((value) => ({
  214. Tanggal: moment(value.createdAt).format('DD-MMMM-YYYY'),
  215. 'No. Laporan': value.no_laporan,
  216. 'Nama Perguruan Tinggi': value.pt.nama,
  217. 'Keterangan Laporan': value.keterangan,
  218. 'Dibuat Oleh': value.user.nama,
  219. Status: !value.aktif
  220. ? 'Ditutup'
  221. : (value.role_asal === 'dikti' && value.role_data === 'dikti') ||
  222. (value.role_asal === 'lldikti' && value.role_data === 'lldikti')
  223. ? `Ditindaklanjuti ${value.role_asal}`
  224. : `Delegasi Ke ${value.role_data}`,
  225. }))
  226. const fileName = 'Laporan'
  227. let wb = XLSX.utils.book_new()
  228. wb.Props = {
  229. Title: fileName,
  230. Author: 'RISTEK DIKTI',
  231. CreatedDate: new Date(),
  232. }
  233. wb.SheetNames.push('Sheet 1')
  234. let ws = XLSX.utils.json_to_sheet(data)
  235. wb.Sheets['Sheet 1'] = ws
  236. const buffer = XLSX.write(wb, { type: 'buffer' })
  237. res.header(
  238. 'Content-Type',
  239. 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
  240. )
  241. return res.end(new Buffer(buffer, 'base64'))
  242. })