graph.controller.js 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297
  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. const { addDokumen } = require('../utils/dokumenFunction')
  11. exports.laporan = handleError(async (req, res) => {
  12. const user = req.user
  13. const data = {}
  14. const date = new Date()
  15. // let berdasarkan_tahun = {}
  16. const {
  17. jumlahLaporan,
  18. jadwal,
  19. evaluasi,
  20. sanksi,
  21. newLaporan,
  22. laporanBulan,
  23. laporanTahun,
  24. bulan,
  25. tahun,
  26. listJadwal,
  27. } = req.query
  28. // if (tahun) {
  29. berdasarkan_tahun = {
  30. $and: [
  31. {
  32. createdAt: {
  33. $gte: new Date(`${tahun || date.getFullYear()}`),
  34. },
  35. },
  36. {
  37. createdAt: {
  38. $lt: new Date(`${parseInt(tahun) + 1 || date.getFullYear() + 1}`),
  39. },
  40. },
  41. ],
  42. }
  43. // }
  44. const laporan = await cekBanyakDataLaporan(user, { ...berdasarkan_tahun })
  45. if (jumlahLaporan == 'true') {
  46. const delegasi = await cekBanyakDataLaporan(user, {
  47. delegasi: true,
  48. ...berdasarkan_tahun,
  49. })
  50. const ditutup = await cekBanyakDataLaporan(user, {
  51. aktif: false,
  52. ...berdasarkan_tahun,
  53. })
  54. data.jumlah_laporan = {
  55. dikti: laporan.length,
  56. lldikti: delegasi.length,
  57. ditutup: ditutup.length,
  58. tes: {
  59. delegasi: true,
  60. ...berdasarkan_tahun,
  61. },
  62. }
  63. }
  64. if (jadwal == 'true') {
  65. const hasJadwal = laporan.filter((e) => e.jadwal.judul).length
  66. const notHasJadwal = laporan.filter((e) => !e.jadwal.judul).length
  67. data.jadwal = {
  68. hasJadwal,
  69. notHasJadwal,
  70. }
  71. }
  72. if (evaluasi == 'true') {
  73. const hasEvaluasi = laporan.filter(
  74. (e) => e.evaluasi.length && e.jadwal.judul
  75. ).length
  76. const notHasEvaluasi = laporan.filter(
  77. (e) => e.evaluasi.length == 0 && e.jadwal.judul
  78. ).length
  79. data.evaluasi = {
  80. hasEvaluasi,
  81. notHasEvaluasi,
  82. }
  83. }
  84. if (sanksi == 'true') {
  85. const hasSanksi = laporan.filter(
  86. (e) => e.sanksi && e.evaluasi.length
  87. ).length
  88. const notHasSanksi = laporan.filter(
  89. (e) => !e.sanksi && e.evaluasi.length
  90. ).length
  91. data.sanksi = {
  92. hasSanksi,
  93. notHasSanksi,
  94. }
  95. }
  96. if (newLaporan == 'true') {
  97. data.newLaporan = await cekBanyakDataLaporan(user, {
  98. limit: 3,
  99. select: 'no_laporan pt.nama -user createdAt',
  100. })
  101. }
  102. if (laporanBulan == 'true') {
  103. let date = {}
  104. if (bulan || (bulan && tahun)) {
  105. const temp = new Date()
  106. date = {
  107. $expr: {
  108. $and: [
  109. { $eq: [{ $month: '$createdAt' }, parseInt(bulan)] },
  110. {
  111. $eq: [
  112. { $year: '$createdAt' },
  113. parseInt(tahun) || temp.getFullYear(),
  114. ],
  115. },
  116. ],
  117. },
  118. }
  119. }
  120. data.laporan_perbulan = await dataLaporanAggregate(
  121. user,
  122. { ...date },
  123. {
  124. _id: {
  125. bulan: {
  126. $month: '$createdAt',
  127. },
  128. tahun: {
  129. $year: '$createdAt',
  130. },
  131. },
  132. jumlah_laporan: {
  133. $sum: 1,
  134. },
  135. }
  136. )
  137. } else if (laporanTahun == 'true') {
  138. const temp = new Date()
  139. let date = {
  140. $expr: {
  141. $eq: [{ $year: '$createdAt' }, parseInt(tahun) || temp.getFullYear()],
  142. },
  143. }
  144. data.laporan_perTahun = await dataLaporanAggregate(
  145. user,
  146. { ...date },
  147. {
  148. _id: {
  149. bulan: {
  150. $month: '$createdAt',
  151. },
  152. tahun: {
  153. $year: '$createdAt',
  154. },
  155. },
  156. jumlah_laporan: {
  157. $sum: 1,
  158. },
  159. }
  160. )
  161. }
  162. if (listJadwal == 'true') {
  163. const temp = new Date()
  164. let date = {
  165. $expr: {
  166. $and: [
  167. {
  168. $eq: [
  169. { $month: '$jadwal.dari_tanggal' },
  170. parseInt(bulan) || temp.getMonth() + 1,
  171. ],
  172. },
  173. {
  174. $eq: [
  175. { $year: '$jadwal.dari_tanggal' },
  176. parseInt(tahun) || temp.getFullYear(),
  177. ],
  178. },
  179. ],
  180. },
  181. }
  182. data.list_jadwal = await dataLaporanAggregate(
  183. user,
  184. {
  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.role_asal = 'dikti'
  218. break
  219. case 2021:
  220. w.role_asal = 'lldikti'
  221. w['pt.pembina.id'] = user.lembaga.id
  222. break
  223. default:
  224. return response.error(res, {
  225. message: 'Forbidden',
  226. code: 403,
  227. })
  228. }
  229. const { tahun } = req.query
  230. berdasarkan_tahun = {
  231. $and: [
  232. {
  233. createdAt: {
  234. $gte: new Date(`${tahun || date.getFullYear()}`),
  235. },
  236. },
  237. {
  238. createdAt: {
  239. $lt: new Date(`${parseInt(tahun) + 1 || date.getFullYear() + 1}`),
  240. },
  241. },
  242. ],
  243. }
  244. const laporan = await laporanModel
  245. .find({ ...w, ...berdasarkan_tahun })
  246. .populate('user')
  247. const data = laporan.map((value) => ({
  248. Tanggal: moment(value.createdAt).format('DD-MMMM-YYYY'),
  249. 'No. Laporan': value.no_laporan,
  250. 'Nama Perguruan Tinggi': value.pt.nama,
  251. 'Keterangan Laporan': value.keterangan,
  252. 'Dibuat Oleh': value.user.nama,
  253. Status: !value.aktif
  254. ? 'Ditutup'
  255. : (value.role_asal === 'dikti' && value.role_data === 'dikti') ||
  256. (value.role_asal === 'lldikti' && value.role_data === 'lldikti')
  257. ? `Ditindaklanjuti ${value.role_asal === 'dikti' ? 'DIKTI' : 'LLDIKTI'}`
  258. : `Delegasi Ke ${value.role_data === 'dikti' ? 'DIKTI' : 'LLDIKTI'}`,
  259. }))
  260. const buffer = excel.to_excel([
  261. {
  262. SheetNames: 'Laporan Delegasi',
  263. data,
  264. },
  265. ])
  266. res.header(
  267. 'Content-Type',
  268. 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
  269. )
  270. return res.end(Buffer.from(buffer))
  271. })