|  | @@ -0,0 +1,225 @@
 | 
	
		
			
				|  |  | +const handleError = require('../utils/handleError')
 | 
	
		
			
				|  |  | +const response = require('../utils/responseHandler')
 | 
	
		
			
				|  |  | +const {
 | 
	
		
			
				|  |  | +  cekBanyakDataLaporan,
 | 
	
		
			
				|  |  | +  dataLaporanAggregate,
 | 
	
		
			
				|  |  | +} = require('../utils/cekData')
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +exports.laporan = handleError(async (req, res) => {
 | 
	
		
			
				|  |  | +  const user = req.user
 | 
	
		
			
				|  |  | +  const data = {}
 | 
	
		
			
				|  |  | +  const date = new Date()
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  // let berdasarkan_tahun = {}
 | 
	
		
			
				|  |  | +  const {
 | 
	
		
			
				|  |  | +    jumlahLaporan,
 | 
	
		
			
				|  |  | +    jadwal,
 | 
	
		
			
				|  |  | +    evaluasi,
 | 
	
		
			
				|  |  | +    sanksi,
 | 
	
		
			
				|  |  | +    newLaporan,
 | 
	
		
			
				|  |  | +    laporanBulan,
 | 
	
		
			
				|  |  | +    laporanTahun,
 | 
	
		
			
				|  |  | +    bulan,
 | 
	
		
			
				|  |  | +    tahun,
 | 
	
		
			
				|  |  | +    listJadwal,
 | 
	
		
			
				|  |  | +  } = req.query
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  // if (tahun) {
 | 
	
		
			
				|  |  | +  berdasarkan_tahun = {
 | 
	
		
			
				|  |  | +    $and: [
 | 
	
		
			
				|  |  | +      {
 | 
	
		
			
				|  |  | +        createdAt: {
 | 
	
		
			
				|  |  | +          $gte: new Date(`${tahun || date.getFullYear()}`),
 | 
	
		
			
				|  |  | +        },
 | 
	
		
			
				|  |  | +      },
 | 
	
		
			
				|  |  | +      {
 | 
	
		
			
				|  |  | +        createdAt: {
 | 
	
		
			
				|  |  | +          $lt: new Date(`${parseInt(tahun) + 1 || date.getFullYear() + 1}`),
 | 
	
		
			
				|  |  | +        },
 | 
	
		
			
				|  |  | +      },
 | 
	
		
			
				|  |  | +    ],
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +  // }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  const laporan = await cekBanyakDataLaporan(user, { ...berdasarkan_tahun })
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  if (jumlahLaporan == 'true') {
 | 
	
		
			
				|  |  | +    const delegasi = await cekBanyakDataLaporan(user, {
 | 
	
		
			
				|  |  | +      delegasi: true,
 | 
	
		
			
				|  |  | +      ...berdasarkan_tahun,
 | 
	
		
			
				|  |  | +    })
 | 
	
		
			
				|  |  | +    const ditutup = await cekBanyakDataLaporan(user, {
 | 
	
		
			
				|  |  | +      aktif: false,
 | 
	
		
			
				|  |  | +      ...berdasarkan_tahun,
 | 
	
		
			
				|  |  | +    })
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    data.jumlah_laporan = {
 | 
	
		
			
				|  |  | +      dikti: laporan.length,
 | 
	
		
			
				|  |  | +      lldikti: delegasi.length,
 | 
	
		
			
				|  |  | +      ditutup: ditutup.length,
 | 
	
		
			
				|  |  | +      tes: {
 | 
	
		
			
				|  |  | +        delegasi: true,
 | 
	
		
			
				|  |  | +        ...berdasarkan_tahun,
 | 
	
		
			
				|  |  | +      },
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  if (jadwal == 'true') {
 | 
	
		
			
				|  |  | +    const hasJadwal = laporan.filter((e) => e.jadwal.judul).length
 | 
	
		
			
				|  |  | +    const notHasJadwal = laporan.filter((e) => !e.jadwal.judul).length
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    data.jadwal = {
 | 
	
		
			
				|  |  | +      hasJadwal,
 | 
	
		
			
				|  |  | +      notHasJadwal,
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  if (evaluasi == 'true') {
 | 
	
		
			
				|  |  | +    const hasEvaluasi = laporan.filter(
 | 
	
		
			
				|  |  | +      (e) => e.evaluasi.length && e.jadwal.judul
 | 
	
		
			
				|  |  | +    ).length
 | 
	
		
			
				|  |  | +    const notHasEvaluasi = laporan.filter(
 | 
	
		
			
				|  |  | +      (e) => e.evaluasi.length == 0 && e.jadwal.judul
 | 
	
		
			
				|  |  | +    ).length
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    data.evaluasi = {
 | 
	
		
			
				|  |  | +      hasEvaluasi,
 | 
	
		
			
				|  |  | +      notHasEvaluasi,
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  if (sanksi == 'true') {
 | 
	
		
			
				|  |  | +    const hasSanksi = laporan.filter(
 | 
	
		
			
				|  |  | +      (e) => e.sanksi && e.evaluasi.length
 | 
	
		
			
				|  |  | +    ).length
 | 
	
		
			
				|  |  | +    const notHasSanksi = laporan.filter(
 | 
	
		
			
				|  |  | +      (e) => !e.sanksi && e.evaluasi.length
 | 
	
		
			
				|  |  | +    ).length
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    data.sanksi = {
 | 
	
		
			
				|  |  | +      hasSanksi,
 | 
	
		
			
				|  |  | +      notHasSanksi,
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  if (newLaporan == 'true') {
 | 
	
		
			
				|  |  | +    data.newLaporan = await cekBanyakDataLaporan(user, {
 | 
	
		
			
				|  |  | +      limit: 3,
 | 
	
		
			
				|  |  | +      select: 'no_laporan pt.nama -user createdAt',
 | 
	
		
			
				|  |  | +    })
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  if (laporanBulan == 'true') {
 | 
	
		
			
				|  |  | +    let date = {}
 | 
	
		
			
				|  |  | +    if (bulan || (bulan && tahun)) {
 | 
	
		
			
				|  |  | +      const temp = new Date()
 | 
	
		
			
				|  |  | +      date = {
 | 
	
		
			
				|  |  | +        $expr: {
 | 
	
		
			
				|  |  | +          $and: [
 | 
	
		
			
				|  |  | +            { $eq: [{ $month: '$createdAt' }, parseInt(bulan)] },
 | 
	
		
			
				|  |  | +            {
 | 
	
		
			
				|  |  | +              $eq: [
 | 
	
		
			
				|  |  | +                { $year: '$createdAt' },
 | 
	
		
			
				|  |  | +                parseInt(tahun) || temp.getFullYear(),
 | 
	
		
			
				|  |  | +              ],
 | 
	
		
			
				|  |  | +            },
 | 
	
		
			
				|  |  | +          ],
 | 
	
		
			
				|  |  | +        },
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    data.laporan_perbulan = await dataLaporanAggregate(
 | 
	
		
			
				|  |  | +      user,
 | 
	
		
			
				|  |  | +      { ...date },
 | 
	
		
			
				|  |  | +      {
 | 
	
		
			
				|  |  | +        _id: {
 | 
	
		
			
				|  |  | +          bulan: {
 | 
	
		
			
				|  |  | +            $month: '$createdAt',
 | 
	
		
			
				|  |  | +          },
 | 
	
		
			
				|  |  | +          tahun: {
 | 
	
		
			
				|  |  | +            $year: '$createdAt',
 | 
	
		
			
				|  |  | +          },
 | 
	
		
			
				|  |  | +        },
 | 
	
		
			
				|  |  | +        jumlah_laporan: {
 | 
	
		
			
				|  |  | +          $sum: 1,
 | 
	
		
			
				|  |  | +        },
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +    )
 | 
	
		
			
				|  |  | +  } else if (laporanTahun == 'true') {
 | 
	
		
			
				|  |  | +    const temp = new Date()
 | 
	
		
			
				|  |  | +    let date = {
 | 
	
		
			
				|  |  | +      $expr: {
 | 
	
		
			
				|  |  | +        $eq: [{ $year: '$createdAt' }, parseInt(tahun) || temp.getFullYear()],
 | 
	
		
			
				|  |  | +      },
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    data.laporan_perTahun = await dataLaporanAggregate(
 | 
	
		
			
				|  |  | +      user,
 | 
	
		
			
				|  |  | +      { ...date },
 | 
	
		
			
				|  |  | +      {
 | 
	
		
			
				|  |  | +        _id: {
 | 
	
		
			
				|  |  | +          bulan: {
 | 
	
		
			
				|  |  | +            $month: '$createdAt',
 | 
	
		
			
				|  |  | +          },
 | 
	
		
			
				|  |  | +          tahun: {
 | 
	
		
			
				|  |  | +            $year: '$createdAt',
 | 
	
		
			
				|  |  | +          },
 | 
	
		
			
				|  |  | +        },
 | 
	
		
			
				|  |  | +        jumlah_laporan: {
 | 
	
		
			
				|  |  | +          $sum: 1,
 | 
	
		
			
				|  |  | +        },
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +    )
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  if (listJadwal == 'true') {
 | 
	
		
			
				|  |  | +    const temp = new Date()
 | 
	
		
			
				|  |  | +    let date = {
 | 
	
		
			
				|  |  | +      $expr: {
 | 
	
		
			
				|  |  | +        $and: [
 | 
	
		
			
				|  |  | +          {
 | 
	
		
			
				|  |  | +            $eq: [
 | 
	
		
			
				|  |  | +              { $month: '$jadwal.dari_tanggal' },
 | 
	
		
			
				|  |  | +              parseInt(bulan) || temp.getMonth() + 1,
 | 
	
		
			
				|  |  | +            ],
 | 
	
		
			
				|  |  | +          },
 | 
	
		
			
				|  |  | +          {
 | 
	
		
			
				|  |  | +            $eq: [
 | 
	
		
			
				|  |  | +              { $year: '$jadwal.dari_tanggal' },
 | 
	
		
			
				|  |  | +              parseInt(tahun) || temp.getFullYear(),
 | 
	
		
			
				|  |  | +            ],
 | 
	
		
			
				|  |  | +          },
 | 
	
		
			
				|  |  | +        ],
 | 
	
		
			
				|  |  | +      },
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    data.list_jadwal = await dataLaporanAggregate(
 | 
	
		
			
				|  |  | +      user,
 | 
	
		
			
				|  |  | +      {
 | 
	
		
			
				|  |  | +        ...date,
 | 
	
		
			
				|  |  | +        jadwal: {
 | 
	
		
			
				|  |  | +          $ne: null,
 | 
	
		
			
				|  |  | +          $exists: true,
 | 
	
		
			
				|  |  | +        },
 | 
	
		
			
				|  |  | +      },
 | 
	
		
			
				|  |  | +      {
 | 
	
		
			
				|  |  | +        _id: {
 | 
	
		
			
				|  |  | +          bulan: {
 | 
	
		
			
				|  |  | +            $month: '$jadwal.dari_tanggal',
 | 
	
		
			
				|  |  | +          },
 | 
	
		
			
				|  |  | +          tahun: {
 | 
	
		
			
				|  |  | +            $year: '$jadwal.dari_tanggal',
 | 
	
		
			
				|  |  | +          },
 | 
	
		
			
				|  |  | +        },
 | 
	
		
			
				|  |  | +        jadwal: {
 | 
	
		
			
				|  |  | +          $push: '$jadwal',
 | 
	
		
			
				|  |  | +        },
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +    )
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  return response.success(res, {
 | 
	
		
			
				|  |  | +    message: 'Berhasil menganalisis data',
 | 
	
		
			
				|  |  | +    data,
 | 
	
		
			
				|  |  | +  })
 | 
	
		
			
				|  |  | +})
 |