graph.controller.js 9.1 KB

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