package com.jasamedika.medifirst2000.service.impl;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.DateFormat;
import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.orm.jpa.JpaSystemException;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.jasamedika.medifirst2000.constants.Master;
import com.jasamedika.medifirst2000.converter.BaseConverterImpl;
import com.jasamedika.medifirst2000.dao.AnggaranRemunerasiDao;
import com.jasamedika.medifirst2000.dao.IkiDanRemunerasiDao;
import com.jasamedika.medifirst2000.dao.IndikatorKinerjaDao;
import com.jasamedika.medifirst2000.dao.IndikatorKinerjaDetailDao;
import com.jasamedika.medifirst2000.dao.LogbookKinerjaDao;
import com.jasamedika.medifirst2000.dao.LogbookKinerjaDetailDao;
import com.jasamedika.medifirst2000.dao.LogbookKinerjaDokterDao;
import com.jasamedika.medifirst2000.dao.MapPegawaiLaboratRadiologiDao;
import com.jasamedika.medifirst2000.dao.PegawaiDao;
import com.jasamedika.medifirst2000.dao.ShiftKerjaDao;
import com.jasamedika.medifirst2000.dao.SkoringTindakanMedisDao;
import com.jasamedika.medifirst2000.dao.TabelAcuanIndeksIKIDao;
import com.jasamedika.medifirst2000.entities.IndikatorKinerja;
import com.jasamedika.medifirst2000.entities.Jabatan;
import com.jasamedika.medifirst2000.entities.LogbookKinerja;
import com.jasamedika.medifirst2000.entities.Pegawai;
import com.jasamedika.medifirst2000.entities.SatuanIndikator;
import com.jasamedika.medifirst2000.exception.ServiceVOException;
import com.jasamedika.medifirst2000.service.LogbookKinerjaService;
import com.jasamedika.medifirst2000.util.CommonUtil;
import com.jasamedika.medifirst2000.vo.IndikatorKinerjaVO;
import com.jasamedika.medifirst2000.vo.JabatanVO;
import com.jasamedika.medifirst2000.vo.LogbookKinerjaVO;
import com.jasamedika.medifirst2000.vo.PegawaiVO;
import com.jasamedika.medifirst2000.vo.SatuanIndikatorVO;

@Service("LogbookKinerjaService")
public class LogbookKinerjaServiceImpl extends BaseVoServiceImpl implements LogbookKinerjaService {

	@Autowired
	private BaseConverterImpl<LogbookKinerjaVO, LogbookKinerja> logbookKinerjaConverter;

	@Autowired
	private BaseConverterImpl<PegawaiVO, Pegawai> pegawaiConverter;

	@Autowired
	private BaseConverterImpl<JabatanVO, Jabatan> jabatanConverter;

	@Autowired
	private BaseConverterImpl<IndikatorKinerjaVO, IndikatorKinerja> indikatorKinerjaConverter;

	@Autowired
	private BaseConverterImpl<SatuanIndikatorVO, SatuanIndikator> satuanIndikatorConverter;

	@Autowired
	private LogbookKinerjaDao logbookKinerjaDao;

	@Autowired
	private LogbookKinerjaDetailDao logbookKinerjaDetailDao;

	@Autowired
	private IndikatorKinerjaDao indikatorKinerjaDao;

	@Autowired
	private AnggaranRemunerasiDao anggaranRemunerasiDao;

	@Autowired
	private PegawaiDao pegawaiDao;

	@Autowired
	private LogbookKinerjaDokterDao logbookKinerjaDokterDao;

	@Autowired
	private IkiDanRemunerasiDao ikiDanRemunerasiDao;

	@Autowired
	private SkoringTindakanMedisDao skoringTindakanMedisDao;

	@Autowired
	private IndikatorKinerjaDetailDao indikatorKinerjaDetailDao;

	@Autowired
	private TabelAcuanIndeksIKIDao tabelAcuanIndeksIKIDao;

	@Autowired
	private ShiftKerjaDao shiftKerjaDao;

	@Autowired
	private MapPegawaiLaboratRadiologiDao mapPegawaiLaboratRadiologiDao;

	@Override
	public LogbookKinerjaVO add(LogbookKinerjaVO vo) throws JpaSystemException, ServiceVOException {
		Pegawai pegawai = pegawaiConverter.transferVOToModel(vo.getPegawai(), new Pegawai());
		Jabatan jabatan = jabatanConverter.transferVOToModel(vo.getJabatan(), new Jabatan());
		IndikatorKinerja indikatorKinerja = indikatorKinerjaConverter.transferVOToModel(vo.getIndikatorKinerja(),
				new IndikatorKinerja());
		LogbookKinerja logbookKinerja = logbookKinerjaConverter.transferVOToModel(vo, new LogbookKinerja());

		logbookKinerja.setPegawai(pegawai);
		logbookKinerja.setJabatan(jabatan);
		logbookKinerja.setIndikatorKinerja(indikatorKinerja);
		logbookKinerja.setCapaian(0.0);
		LogbookKinerja resultModel = logbookKinerjaDao.save(logbookKinerja);

		LogbookKinerjaVO resultVO = new LogbookKinerjaVO();
		resultVO = logbookKinerjaConverter.transferModelToVO(resultModel, resultVO);

		return resultVO;
	}

	@Override
	public LogbookKinerjaVO update(LogbookKinerjaVO vo) throws JpaSystemException, ServiceVOException {
		List<Map<String, Object>> existedWorkingRecord = findUsedWorkingRecordByKontrak(vo.getNoRec());

		LogbookKinerja logbookKinerjaLama = logbookKinerjaDao.findOne(vo.getNoRec());

		Pegawai pegawai = pegawaiConverter.transferVOToModel(vo.getPegawai(), new Pegawai());
		Jabatan jabatan = jabatanConverter.transferVOToModel(vo.getJabatan(), new Jabatan());
		IndikatorKinerja indikatorKinerja = indikatorKinerjaConverter.transferVOToModel(vo.getIndikatorKinerja(),
				new IndikatorKinerja());
		LogbookKinerja logbookKinerjaBaru = logbookKinerjaConverter.transferVOToModel(vo, logbookKinerjaLama);

		logbookKinerjaBaru.setPegawai(pegawai);
		logbookKinerjaBaru.setJabatan(jabatan);
		logbookKinerjaBaru.setIndikatorKinerja(indikatorKinerja);

		LogbookKinerjaVO resultVO = new LogbookKinerjaVO();
		if (existedWorkingRecord.size() > 0 && !vo.getStatusVerifikasi() && vo.getStatusEnabled()) {
			resultVO.setResponseMessage("Catatan kegiatan kinerja sudah diisi, tidak dapat batal verifikasi!");
		} else if (existedWorkingRecord.size() > 0 && !vo.getStatusVerifikasi() && !vo.getStatusEnabled()) {
			resultVO.setResponseMessage("Catatan kegiatan kinerja sudah diisi, tidak dapat hapus kontrak!");
		} else {
			LogbookKinerja resultModel = logbookKinerjaDao.save(logbookKinerjaBaru);
			resultVO = logbookKinerjaConverter.transferModelToVO(resultModel, resultVO);
		}

		return resultVO;
	}

	@Override
	public Boolean delete(String key) throws JpaSystemException {
		logbookKinerjaDao.delete(key);

		return true;
	}

	@Override
	public LogbookKinerjaVO findById(String key) throws JpaSystemException {
		LogbookKinerjaVO result = new LogbookKinerjaVO();

		LogbookKinerja logbookKinerja = logbookKinerjaDao.findOne(key);
		if (CommonUtil.isNotNullOrEmpty(logbookKinerja)) {
			result = logbookKinerjaConverter.transferModelToVO(logbookKinerja, result);
		}

		return result;
	}

	@Override
	public List<LogbookKinerjaVO> findAll() throws JpaSystemException {
		List<LogbookKinerjaVO> result = new ArrayList<LogbookKinerjaVO>();

		Iterable<LogbookKinerja> models = logbookKinerjaDao.findAll();
		if (CommonUtil.isNotNullOrEmpty(models)) {
			for (LogbookKinerja model : models) {
				LogbookKinerjaVO vo = new LogbookKinerjaVO();
				vo = logbookKinerjaConverter.transferModelToVO(model, vo);
				result.add(vo);
			}
		}

		return result;
	}

	@Override
	public Map<String, Object> findAllWithPageAndLimitAndSortByAndDirectionParameter(Integer page, Integer limit,
			String sort, String dir) {

		return null;
	}

	@Override
	public LogbookKinerjaVO verify(LogbookKinerjaVO vo) throws JpaSystemException, ServiceVOException {
		DateFormat df = new SimpleDateFormat("yyyy-MM");

		Map<String, Object> kontrak = logbookKinerjaDao.findKontrakByLogbook(df.format(vo.getBulan()),
				vo.getPegawai().getId(), vo.getIndikatorKinerja().getId());
		LogbookKinerja logbookKinerjaLama = logbookKinerjaDao.findOne(kontrak.get("noRec").toString());

		Pegawai pegawai = pegawaiConverter.transferVOToModel(vo.getPegawai(), new Pegawai());
		Jabatan jabatan = new Jabatan();
		jabatan.setId(Integer.valueOf(kontrak.get("jabatanId").toString()));
		IndikatorKinerja indikatorKinerja = indikatorKinerjaConverter.transferVOToModel(vo.getIndikatorKinerja(),
				new IndikatorKinerja());
		LogbookKinerja logbookKinerjaBaru = logbookKinerjaConverter.transferVOToModel(vo, logbookKinerjaLama);

		logbookKinerjaBaru.setPegawai(pegawai);
		logbookKinerjaBaru.setJabatan(jabatan);
		logbookKinerjaBaru.setIndikatorKinerja(indikatorKinerja);
		LogbookKinerja resultModel = logbookKinerjaDao.save(logbookKinerjaBaru);

		LogbookKinerjaVO resultVO = new LogbookKinerjaVO();
		resultVO = logbookKinerjaConverter.transferModelToVO(resultModel, resultVO);

		return resultVO;
	}

	@Transactional
	public void autoVerify(LogbookKinerjaVO vo) throws JpaSystemException, ServiceVOException {
		DateFormat df = new SimpleDateFormat("yyyy-MM");

		Map<String, Object> kontrak = logbookKinerjaDao.findKontrakByLogbook(df.format(vo.getBulan()),
				vo.getPegawai().getId(), vo.getIndikatorKinerja().getId());
		LogbookKinerja logbookKinerja = logbookKinerjaDao.findOne(kontrak.get("noRec").toString());

		Pegawai pegawai = new Pegawai();
		pegawai.setId(vo.getPegawai().getId());
		Jabatan jabatan = new Jabatan();
		jabatan.setId(Integer.valueOf(kontrak.get("jabatanId").toString()));
		IndikatorKinerja indikatorKinerja = new IndikatorKinerja();
		indikatorKinerja.setId(vo.getIndikatorKinerja().getId());

		logbookKinerja.setPegawai(pegawai);
		logbookKinerja.setJabatan(jabatan);
		logbookKinerja.setIndikatorKinerja(indikatorKinerja);
		logbookKinerja.setCapaian(vo.getCapaian());
		logbookKinerjaDao.save(logbookKinerja);
	}

	@Override
	public LogbookKinerjaVO addPengajuanKontrakKinerja(LogbookKinerjaVO vo)
			throws JpaSystemException, ServiceVOException {
		SatuanIndikator satuanIndikator = satuanIndikatorConverter
				.transferVOToModel(vo.getIndikatorKinerja().getSatuanIndikator(), new SatuanIndikator());

		IndikatorKinerja indikatorKinerja = indikatorKinerjaConverter.transferVOToModel(vo.getIndikatorKinerja(),
				new IndikatorKinerja());
		indikatorKinerja.setSatuanIndikator(satuanIndikator);
		indikatorKinerja.setStatusVerifikasi(false);
		indikatorKinerja.setStatusEnabled(true);
		indikatorKinerja.setKdProfile((short) 0);

		Pegawai pegawai = pegawaiConverter.transferVOToModel(vo.getPegawai(), new Pegawai());
		Jabatan jabatan = jabatanConverter.transferVOToModel(vo.getJabatan(), new Jabatan());

		LogbookKinerja logbookKinerja = logbookKinerjaConverter.transferVOToModel(vo, new LogbookKinerja());
		logbookKinerja.setPegawai(pegawai);
		logbookKinerja.setJabatan(jabatan);
		logbookKinerja.setCapaian(0.0);
		logbookKinerja.setStatusVerifikasi(false);
		logbookKinerja.setStatusEnabled(true);
		logbookKinerja.setKdProfile((short) 0);
		logbookKinerja.setIndikatorKinerja(indikatorKinerja);

		indikatorKinerjaDao.save(indikatorKinerja);
		LogbookKinerja resultModel = logbookKinerjaDao.save(logbookKinerja);

		LogbookKinerjaVO resultVO = new LogbookKinerjaVO();
		resultVO = logbookKinerjaConverter.transferModelToVO(resultModel, resultVO);

		return resultVO;
	}

	@Override
	public LogbookKinerjaVO updatePengajuanKontrakKinerja(LogbookKinerjaVO vo)
			throws JpaSystemException, ServiceVOException {
		IndikatorKinerja indikatorKinerjaLama = indikatorKinerjaDao.findOne(vo.getIndikatorKinerja().getId());
		LogbookKinerja logbookKinerjaLama = logbookKinerjaDao.findOne(vo.getNoRec());

		SatuanIndikator satuanIndikator = satuanIndikatorConverter
				.transferVOToModel(vo.getIndikatorKinerja().getSatuanIndikator(), new SatuanIndikator());
		Pegawai pegawai = pegawaiConverter.transferVOToModel(vo.getPegawai(), new Pegawai());
		Jabatan jabatan = jabatanConverter.transferVOToModel(vo.getJabatan(), new Jabatan());

		IndikatorKinerja indikatorKinerjaBaru = indikatorKinerjaConverter.transferVOToModel(vo.getIndikatorKinerja(),
				indikatorKinerjaLama);
		LogbookKinerja logbookKinerjaBaru = logbookKinerjaConverter.transferVOToModel(vo, logbookKinerjaLama);

		indikatorKinerjaBaru.setSatuanIndikator(satuanIndikator);
		if (vo.getIndikatorKinerja().getStatusVerifikasi()) {
			indikatorKinerjaBaru.setStatusEnabled(true);
		} else {
			indikatorKinerjaBaru.setStatusEnabled(false);
		}
		indikatorKinerjaBaru.setKdProfile((short) 0);
		logbookKinerjaBaru.setPegawai(pegawai);
		logbookKinerjaBaru.setJabatan(jabatan);
		if (vo.getStatusVerifikasi()) {
			logbookKinerjaBaru.setStatusEnabled(true);
		} else {
			logbookKinerjaBaru.setStatusEnabled(false);
		}
		logbookKinerjaBaru.setKdProfile((short) 0);
		logbookKinerjaBaru.setIndikatorKinerja(indikatorKinerjaBaru);

		indikatorKinerjaDao.save(indikatorKinerjaBaru);
		LogbookKinerja resultModel = logbookKinerjaDao.save(logbookKinerjaBaru);

		LogbookKinerjaVO resultVO = new LogbookKinerjaVO();
		resultVO = logbookKinerjaConverter.transferModelToVO(resultModel, resultVO);

		return resultVO;
	}

	@Override
	public List<Map<String, Object>> findPengajuanKontrakKinerja(Integer idPegawai, Integer idJabatan)
			throws JpaSystemException {
		List<Map<String, Object>> result = logbookKinerjaDao.findPengajuanIndikatorByPegawaiJabatan(idPegawai,
				idJabatan);

		return result;
	}

	@Override
	public List<Map<String, Object>> findDupKontrakKinerja(Integer idPegawai, Integer idJabatan, Long bulan,
			Integer idIndikator) throws JpaSystemException {
		DateFormat df = new SimpleDateFormat("yyyy-MM");

		List<Map<String, Object>> result = logbookKinerjaDao.findDupKontrakKinerja(idPegawai, idJabatan,
				df.format(new Date(bulan)), idIndikator);

		return result;
	}

	@Override
	public Map<String, Object> findKontrakKinerja(Integer idPegawai, Integer idJabatan, Long bulan)
			throws JpaSystemException {
		Map<String, Object> result = new HashMap<>();
		List<Map<String, Object>> listRes = new ArrayList<>();
		List<Integer> listIdIndikator = new ArrayList<>();
		DateFormat df = new SimpleDateFormat("yyyy-MM");

		List<Map<String, Object>> listMap = logbookKinerjaDao.findIndikatorByJabatan(idJabatan,
				df.format(new Date(bulan)));
		List<Map<String, Object>> data = logbookKinerjaDao.findKontrakKinerja(idPegawai, idJabatan,
				df.format(new Date(bulan)));

		for (Map<String, Object> map : listMap) {
			if (!listIdIndikator.contains(map.get("indikatorId"))) {
				listIdIndikator.add(Integer.valueOf(map.get("indikatorId").toString()));

				List<Map<String, Object>> detailIndikator = logbookKinerjaDokterDao.findDetailKontrakKinerja(
						df.format(new Date(bulan)), idJabatan, idPegawai,
						Integer.valueOf(map.get("indikatorId").toString()));

				if (CommonUtil.isNotNullOrEmpty(detailIndikator)) {
					double detailTarget = 0.0;
					for (Map<String, Object> detail : detailIndikator) {
						detailTarget += Double.parseDouble(detail.get("detailTarget").toString());
					}
					map.put("target", detailTarget);
					map.put("detail", detailIndikator);
				}

				listRes.add(map);
			}
		}
		for (Map<String, Object> map : data) {
			if (!listIdIndikator.contains(map.get("indikatorId"))) {
				listIdIndikator.add(Integer.valueOf(map.get("indikatorId").toString()));
				listRes.add(map);
			}
		}

		for (Map<String, Object> res : listRes) {
			res.put("noRecMap", res.get("noRecMap"));
			for (Map<String, Object> map : data) {
				if (res.get("indikatorId").equals(map.get("indikatorId"))) {
					res.put("noRec", map.get("noRec"));
					res.put("target", map.get("target"));
					res.put("bobot", map.get("bobot"));
					res.put("isStatusVerifikasi", map.get("isStatusVerifikasi"));
					res.put("statusVerifikasi", map.get("statusVerifikasi"));
				}
			}
			if (CommonUtil.isNullOrEmpty(res.get("noRec"))) {
				res.put("noRec", null);
				if (CommonUtil.isNotNullOrEmpty(res.get("target"))) {
					res.put("target", res.get("target"));
				} else {
					res.put("target", null);
				}
				res.put("bobot", null);
				res.put("isStatusVerifikasi", null);
				res.put("statusVerifikasi", null);
			}
		}

		for (Integer idJenisIndikator : Arrays.asList(Master.Remunerasi.JENIS_INDIKATOR)) {
			List<Map<String, Object>> resByJenisIndikator = new ArrayList<>();
			for (Map<String, Object> res : listRes) {
				if (res.get("jenisIndikatorId").equals(idJenisIndikator)) {
					resByJenisIndikator.add(res);
				}
			}

			if (idJenisIndikator.equals(1)) {
				result.put("kuantitas", resByJenisIndikator);
			} else if (idJenisIndikator.equals(2)) {
				result.put("kualitas", resByJenisIndikator);
			} else if (idJenisIndikator.equals(3)) {
				result.put("perilaku", resByJenisIndikator);
			}
		}

		return result;
	}

	@Override
	public List<Map<String, Object>> findKontrakKinerja(Integer idIndikator) throws JpaSystemException {
		List<Map<String, Object>> result = logbookKinerjaDao.findKontrakKinerja(idIndikator);

		return result;
	}

	public Map<String, Object> findAnggaranRemunerasi(Integer idPegawai, Integer idJabatan, String tahun)
			throws JpaSystemException {
		Map<String, Object> result = new HashMap<>();

		List<Map<String, Object>> data = anggaranRemunerasiDao.findAnggaran(idPegawai, idJabatan, tahun);
		if (CommonUtil.isNotNullOrEmpty(data) && data.size() > 0) {
			result = data.get(0);
		}

		return result;
	}

	@Override
	public Map<String, Object> findLogbookKinerja(Integer idPegawai, Integer idJabatan, Long bulan)
			throws JpaSystemException {
		Map<String, Object> result = new HashMap<>();
		List<Map<String, Object>> listJenisIndikator = new ArrayList<>();
		DateFormat mf = new SimpleDateFormat("yyyy-MM");
		DateFormat yf = new SimpleDateFormat("yyyy");
		double totAllPersen = 0.0;
		double nilaiJabatan = 0.0;
		double pir = 0.0;
		double plafonGaji = 0.0;
		double plafonInsentif = 0.0;

		DecimalFormatSymbols formatRp = new DecimalFormatSymbols();
		formatRp.setCurrencySymbol("Rp");
		formatRp.setMonetaryDecimalSeparator(',');
		formatRp.setGroupingSeparator('.');

		DecimalFormat kursINA = (DecimalFormat) DecimalFormat.getCurrencyInstance();
		kursINA.setDecimalFormatSymbols(formatRp);

		DecimalFormat df = new DecimalFormat("0.00");
		df.setRoundingMode(RoundingMode.HALF_UP);

		List<Map<String, Object>> rs = logbookKinerjaDao.findLogbookKinerja(idPegawai, idJabatan,
				mf.format(new Date(bulan)));
		Map<String, Object> anggaran = findAnggaranRemunerasi(idPegawai, idJabatan, yf.format(new Date(bulan)));

		if (CommonUtil.isNotNullOrEmpty(rs) && rs.size() > 0) {
			nilaiJabatan = Double.valueOf(rs.get(0).get("nilaiJabatan").toString());
		}
		if (CommonUtil.isNotNullOrEmpty(anggaran)) {
			pir = Double.valueOf(anggaran.get("pir").toString());
			plafonGaji = Double.valueOf(anggaran.get("plafonGaji").toString());
			plafonInsentif = Double.valueOf(anggaran.get("plafonInsentif").toString());
		}

		for (String ji : Arrays.asList(Master.JENIS_INDIKATOR)) {
			double hasil = 0.0;
			List<Map<String, Object>> data = new ArrayList<>();
			Map<String, Object> jenisIndikator = new HashMap<>();
			jenisIndikator.put("jenisIndikator", ji);
			for (Map<String, Object> map : rs) {
				if (map.get("jenisIndikator").equals(ji)) {
					if (map.get("idIndikator").equals(Master.IndikatorKinerja.PELAYANAN_MEDIS_JAM_KERJA)
							&& Double.valueOf(map.get("fragCapaian").toString()).equals(0.0)) {
						List<Map<String, Object>> logbookDokter = findLogbookJamKerjaDokter(idPegawai, bulan);
						double capaian = 0.0;
						for (Map<String, Object> ld : logbookDokter) {
							capaian += Double.valueOf(ld.get("tSkor").toString());
						}
						String fragCapaian = df.format(capaian / Double.valueOf(map.get("target").toString()));
						hasil += capaian / Double.valueOf(map.get("target").toString())
								* Double.valueOf(map.get("bobot").toString());
						map.put("fragCapaian", Double.parseDouble(fragCapaian));
						map.put("persenCapaianDibulatkan",
								new BigDecimal(Double.valueOf(map.get("fragCapaian").toString()) * 100).setScale(2,
										RoundingMode.HALF_UP));
						data.add(map);
					} else {
						hasil += Double.parseDouble(df.format(Double.valueOf(map.get("fragCapaian").toString())))
								* Double.valueOf(map.get("bobot").toString());
						map.put("persenCapaianDibulatkan",
								new BigDecimal(Double.valueOf(map.get("fragCapaian").toString()) * 100).setScale(2,
										RoundingMode.HALF_UP));
						data.add(map);
					}
				}
			}

			if (ji.equals("Kuantitas")) {
				totAllPersen += hasil;
				jenisIndikator.put("persenCapaian", (100.0 / Master.Remunerasi.BOBOT_KUANTITAS) * hasil);
				jenisIndikator.put("persenCapaianDibulatkan",
						new BigDecimal(Double.valueOf((100.0 / Master.Remunerasi.BOBOT_KUANTITAS) * hasil)).setScale(2,
								RoundingMode.HALF_UP));
			} else if (ji.equals("Kualitas")) {
				totAllPersen += hasil;
				jenisIndikator.put("persenCapaian", (100.0 / Master.Remunerasi.BOBOT_KUALITAS) * hasil);
				jenisIndikator.put("persenCapaianDibulatkan",
						new BigDecimal(Double.valueOf((100.0 / Master.Remunerasi.BOBOT_KUALITAS) * hasil)).setScale(2,
								RoundingMode.HALF_UP));
			} else if (ji.equals("Perilaku")) {
				totAllPersen += hasil;
				jenisIndikator.put("persenCapaian", (100.0 / Master.Remunerasi.BOBOT_PERILAKU) * hasil);
				jenisIndikator.put("persenCapaianDibulatkan",
						new BigDecimal(Double.valueOf((100.0 / Master.Remunerasi.BOBOT_PERILAKU) * hasil)).setScale(2,
								RoundingMode.HALF_UP));
			}
			jenisIndikator.put("data", data);

			listJenisIndikator.add(jenisIndikator);
		}

		Double iki = 0.0;
		Map<String, Object> acuanIndeks = tabelAcuanIndeksIKIDao.findIKI(totAllPersen);
		if (CommonUtil.isNotNullOrEmpty(acuanIndeks)) {
			iki = Double.valueOf(acuanIndeks.get("indeks").toString());
		}

		double targetRupiahP1 = nilaiJabatan * Master.Remunerasi.IKI_STANDAR * pir * Master.Remunerasi.PERSEN_P1;
		double targetRupiahP2 = nilaiJabatan * Master.Remunerasi.IKU * Master.Remunerasi.IKI_STANDAR * pir
				* Master.Remunerasi.PERSEN_P2;

		double capaianRupiahP1 = nilaiJabatan * iki * pir * Master.Remunerasi.PERSEN_P1;
		double capaianRupiahP2 = nilaiJabatan * Master.Remunerasi.IKU * iki * pir * Master.Remunerasi.PERSEN_P2;

		result.put("listJenisIndikator", listJenisIndikator);

		result.put("plafonP1", kursINA.format(plafonGaji).toString());
		result.put("rupiahTargetP1", targetRupiahP1);
		result.put("rupiahTargetFormatP1", kursINA.format(targetRupiahP1).toString());
		result.put("rupiahCapaianP1", capaianRupiahP1);
		result.put("rupiahCapaianP1Format", kursINA.format(capaianRupiahP1).toString());

		result.put("plafonP2", kursINA.format(plafonInsentif).toString());
		result.put("rupiahTargetP2", targetRupiahP2);
		result.put("rupiahTargetFormatP2", kursINA.format(targetRupiahP2).toString());
		result.put("rupiahCapaianP2", capaianRupiahP2);
		result.put("rupiahCapaianP2Format", kursINA.format(capaianRupiahP2).toString());

		result.put("persenCapaian", totAllPersen);
		result.put("persenCapaianDibulatkan",
				new BigDecimal(Double.valueOf(totAllPersen)).setScale(2, RoundingMode.HALF_UP));

		return result;
	}

	@Override
	public List<Map<String, Object>> findAksesPegawai(Integer idPegawai) {
		List<Map<String, Object>> result = new ArrayList<>();
		List<Map<String, Object>> rsAll = new ArrayList<>();
		List<Integer> listPurnaWaktu = Arrays.asList(Master.KategoryPegawai.PURNA_WAKTU);

		List<Integer> listIdSDM = pegawaiDao.getPegawaiSDMforCred(Master.UnitKerja.BAG_SDM,
				Master.SubUnitKerja.SUBBAG_KESEJAHTERAAN);
		if (listIdSDM.contains(idPegawai)) {
			rsAll = pegawaiDao.findPegawaiByListKategori(listPurnaWaktu);
			result.addAll(rsAll);
			for (Map<String, Object> map : result) {
				map.put("isModifAkses", false);
			}
		}

		List<Map<String, Object>> aksesByStaf = logbookKinerjaDao.findAksesPegawaiByStaf(idPegawai, listPurnaWaktu);
		List<Map<String, Object>> aksesByAtasan = logbookKinerjaDao.findAksesPegawaiByAtasan(idPegawai, listPurnaWaktu);
		List<Map<String, Object>> aksesByPenilai = logbookKinerjaDao.findAksesPegawaiByPenilai(idPegawai,
				listPurnaWaktu);

		if (CommonUtil.isNotNullOrEmpty(aksesByStaf) && CommonUtil.isNullOrEmpty(rsAll)) {
			for (Map<String, Object> map : aksesByStaf) {
				map.put("isModifAkses", false);
			}
			result.addAll(aksesByStaf);
		}
		if (CommonUtil.isNotNullOrEmpty(aksesByAtasan)) {
			if (CommonUtil.isNullOrEmpty(rsAll)) {
				for (Map<String, Object> map : aksesByAtasan) {
					map.put("isModifAkses", true);
				}
				result.addAll(aksesByAtasan);
			} else {
				for (Map<String, Object> res : result) {
					for (Map<String, Object> map : aksesByAtasan) {
						if (res.get("id").equals(map.get("id"))) {
							res.put("isModifAkses", true);
							break;
						}
					}
				}
			}
		}
		if (CommonUtil.isNotNullOrEmpty(aksesByPenilai) && CommonUtil.isNullOrEmpty(rsAll)) {
			for (Map<String, Object> map : aksesByPenilai) {
				map.put("isModifAkses", false);
			}
			result.addAll(aksesByPenilai);
		}

		if (CommonUtil.isNotNullOrEmpty(result)) {
			result.sort(Comparator.comparing(m -> (String) m.get("namaLengkap"), String.CASE_INSENSITIVE_ORDER));
		}

		return result;
	}

	public List<Map<String, Object>> findUsedWorkingRecordByKontrak(String logbookNoRec) throws JpaSystemException {
		List<Map<String, Object>> result = logbookKinerjaDetailDao.findUsedWorkingRecordByKontrak(logbookNoRec);

		return result;
	}

	@Override
	public List<Map<String, Object>> findLogbookJamKerjaDokter(Integer idPegawai, Long bulan) {
		List<Map<String, Object>> result = new ArrayList<>();
		List<String> listTglPelayanan = new ArrayList<>();
		List<Integer> listIdIndikator = new ArrayList<>();
		List<Integer> listIdProduk = new ArrayList<>();
		List<Double> listSkor = new ArrayList<>();
		List<Integer> listDetailJenisProduk = new ArrayList<>();
		List<Integer> listDetailJenisProdukException = new ArrayList<>();

		DateFormat mf = new SimpleDateFormat("yyyy-MM");
		DateFormat df = new SimpleDateFormat("yyyy-MM-dd");

		DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");

		DecimalFormat decf = new DecimalFormat("###.###");
		decf.setRoundingMode(RoundingMode.HALF_UP);

		LocalDateTime PSBBDate = LocalDateTime.of(2020, 9, 14, 0, 0, 0);
		LocalDateTime PSBBEnd = LocalDateTime.parse(GetSettingDataFixed("psbbperiod"), dtf);

		Date pssbAwal = Date.from(PSBBDate.atZone(ZoneId.systemDefault()).toInstant());
		Date pssbAkhir = Date.from(PSBBEnd.atZone(ZoneId.systemDefault()).toInstant());

		List<Integer> listRuangEks = splitDataSettingDatafixed("IdRuanganEksekutif");
		List<Integer> listKonsulTapiVisit = splitDataSettingDatafixed("konsulTapiVisit");

		List<Integer> listIdNonjadwal = shiftKerjaDao.findListNonjadwal();
		List<Integer> laboranRadiologList = mapPegawaiLaboratRadiologiDao.findPegawaiLaboranRadiolog();
		if (pegawaiDao.getDokterLabPatologiAnatomi().contains(idPegawai)) {
			listDetailJenisProduk = new ArrayList<>(Arrays.asList(Master.DetailJenisProduk.PENUNJANG_PATOLOGI_ANATOMI));
		} else if (pegawaiDao.getDokterLabKlinik().contains(idPegawai)) {
			listDetailJenisProduk = new ArrayList<>(Arrays.asList(Master.DetailJenisProduk.PENUNJANG_PATOLOGI_KLINIK));
		} else if (pegawaiDao.getDokterRadiologi().contains(idPegawai)) {
			listDetailJenisProduk = new ArrayList<>(Arrays.asList(Master.DetailJenisProduk.PENUNJANG_RADIOLOGI));
		} else {
			listDetailJenisProduk = new ArrayList<>(Arrays.asList(Master.DetailJenisProduk.MEDIS_UTAMA));
		}

		if (laboranRadiologList.contains(idPegawai)) {
			listDetailJenisProdukException = new ArrayList<>(
					Arrays.asList(Master.DetailJenisProduk.ADMINISTRASI_PATOLOGI_KLINIK_EXCEPTION));
			listDetailJenisProdukException.removeAll(listDetailJenisProduk);

			listDetailJenisProduk.addAll(listDetailJenisProdukException);
		}

		List<Map<String, Object>> dataLayanan = ikiDanRemunerasiDao.getDataLogbookJamKerjaDokter(
				mf.format(new Date(bulan)), pssbAwal, pssbAkhir, listIdNonjadwal, Master.JenisPegawai.DOKTER,
				Arrays.asList(idPegawai), listDetailJenisProduk, Arrays.asList(Master.JenisProduk.NONTINDAKAN),
				Arrays.asList(Master.KelompokPasien.KELOMPOK_BPJS), Master.Produk.KARCIS);

		List<Map<String, Object>> dataSkor = skoringTindakanMedisDao.findSkoringLogbookDokter(
				mf.format(new Date(bulan)), Arrays.asList(idPegawai), Arrays.asList(Master.UnitKerja.KSM));

		// SCORE
		for (Map<String, Object> mapLayanan : dataLayanan) {
			for (Map<String, Object> mapSkor : dataSkor) {
				if (mapLayanan.get("produkId").equals(mapSkor.get("produkId"))
						&& (((Date) mapLayanan.get("tglPelayanan")).after((Date) mapSkor.get("tglMulaiBerlaku"))
								|| ((Date) mapLayanan.get("tglPelayanan"))
										.equals((Date) mapSkor.get("tglMulaiBerlaku")))) {
					mapLayanan.put("skor", mapSkor.get("skor"));
					break;
				}
			}
			if (!mapLayanan.containsKey("skor")) {
				mapLayanan.put("skor", 1.0);
			}
		}

		// RULES
		for (Map<String, Object> mapLayanan : dataLayanan) {
			if (Double.valueOf(mapLayanan.get("hargaDiskon").toString()) > 0.0
					&& (CommonUtil.isNullOrEmpty(mapLayanan.get("statusDiskon"))
							|| Integer.valueOf(mapLayanan.get("statusDiskon").toString()).equals(0))) {
				// tidak_dapat_skor_untuk_diskon_dpjp
				mapLayanan.put("skor", 0.000);
				mapLayanan.put("tSkor", 0.000);
			} else if (!mapLayanan.get("namaProduk").toString().toLowerCase().contains(Master.KONSUL)
					&& !mapLayanan.get("namaProduk").toString().toLowerCase().contains(Master.VISIT)
					&& listRuangEks.contains(mapLayanan.get("ruanganId"))) {
				mapLayanan.put("skor", Double.parseDouble(decf.format(
						Double.valueOf(mapLayanan.get("skor").toString()) * Master.Remunerasi.PERSEN_SKOR_EKSEKUTIF)));
				mapLayanan.put("tSkor", Double.parseDouble(decf.format(Double.valueOf(mapLayanan.get("skor").toString())
						* Double.valueOf(mapLayanan.get("jumlah").toString()))));
			} else if (mapLayanan.get("jenisPetugasId").equals(Master.JenisPetugasPelaksana.ASISTEN_SPESIALIS)) {
				mapLayanan.put("skor", Double.parseDouble(decf.format(Double.valueOf(mapLayanan.get("skor").toString())
						* Master.Remunerasi.PERSEN_SKOR_ASISTEN_SPESIALIS)));
				mapLayanan.put("tSkor", Double.parseDouble(decf.format(Double.valueOf(mapLayanan.get("skor").toString())
						* Double.valueOf(mapLayanan.get("jumlah").toString()))));
			} else {
				mapLayanan.put("skor",
						Double.parseDouble(decf.format(Double.valueOf(mapLayanan.get("skor").toString()))));
				mapLayanan.put("tSkor", Double.parseDouble(decf.format(Double.valueOf(mapLayanan.get("skor").toString())
						* Double.valueOf(mapLayanan.get("jumlah").toString()))));
			}
		}

		// GROUPING_INDIKATOR
		for (Map<String, Object> mapLayanan : dataLayanan) {
			if (listKonsulTapiVisit.contains(mapLayanan.get("produkId"))
					|| mapLayanan.get("namaProduk").toString().toLowerCase().contains(Master.VISIT)) {
				mapLayanan.put("indikatorId", Master.IndikatorKinerjaJamKerja.VISITE);
				mapLayanan.put("namaIndikator",
						indikatorKinerjaDetailDao.findNamaIndikator(Master.IndikatorKinerjaJamKerja.VISITE));
			} else if (mapLayanan.get("namaProduk").toString().toLowerCase().contains(Master.KONSUL)
					&& listRuangEks.contains(mapLayanan.get("ruanganId"))) {
				mapLayanan.put("indikatorId", Master.IndikatorKinerjaJamKerja.KONSUL_EKS);
				mapLayanan.put("namaIndikator",
						indikatorKinerjaDetailDao.findNamaIndikator(Master.IndikatorKinerjaJamKerja.KONSUL_EKS));
			} else if (mapLayanan.get("namaProduk").toString().toLowerCase().contains(Master.KONSUL)
					&& mapLayanan.get("departemenId").equals(Master.Departemen.IGD)) {
				mapLayanan.put("indikatorId", Master.IndikatorKinerjaJamKerja.KONSUL_GADAR);
				mapLayanan.put("namaIndikator",
						indikatorKinerjaDetailDao.findNamaIndikator(Master.IndikatorKinerjaJamKerja.KONSUL_GADAR));
			} else if (mapLayanan.get("namaProduk").toString().toLowerCase().contains(Master.KONSUL)) {
				mapLayanan.put("indikatorId", Master.IndikatorKinerjaJamKerja.KONSUL_REG);
				mapLayanan.put("namaIndikator",
						indikatorKinerjaDetailDao.findNamaIndikator(Master.IndikatorKinerjaJamKerja.KONSUL_REG));
			} else if (listRuangEks.contains(mapLayanan.get("ruanganId"))) {
				mapLayanan.put("indikatorId", Master.IndikatorKinerjaJamKerja.TINDAKAN_EKS);
				mapLayanan.put("namaIndikator",
						indikatorKinerjaDetailDao.findNamaIndikator(Master.IndikatorKinerjaJamKerja.TINDAKAN_EKS));
			} else if (mapLayanan.get("departemenId").equals(Master.Departemen.IGD)) {
				mapLayanan.put("indikatorId", Master.IndikatorKinerjaJamKerja.TINDAKAN_GADAR);
				mapLayanan.put("namaIndikator",
						indikatorKinerjaDetailDao.findNamaIndikator(Master.IndikatorKinerjaJamKerja.TINDAKAN_GADAR));
			} else if (mapLayanan.get("ruanganId").equals(Master.Ruangan.OK)) {
				mapLayanan.put("indikatorId", Master.IndikatorKinerjaJamKerja.TINDAKAN_OPS);
				mapLayanan.put("namaIndikator",
						indikatorKinerjaDetailDao.findNamaIndikator(Master.IndikatorKinerjaJamKerja.TINDAKAN_OPS));
			} else {
				mapLayanan.put("indikatorId", Master.IndikatorKinerjaJamKerja.TINDAKAN_REG);
				mapLayanan.put("namaIndikator",
						indikatorKinerjaDetailDao.findNamaIndikator(Master.IndikatorKinerjaJamKerja.TINDAKAN_REG));
			}
		}

		for (Map<String, Object> mapLayanan : dataLayanan) {
			if (!listIdIndikator.contains(mapLayanan.get("indikatorId"))) {
				listIdIndikator.add(Integer.valueOf(mapLayanan.get("indikatorId").toString()));
			}
			if (!listIdProduk.contains(mapLayanan.get("produkId"))) {
				listIdProduk.add(Integer.valueOf(mapLayanan.get("produkId").toString()));
			}
			if (!listSkor.contains(mapLayanan.get("skor"))) {
				listSkor.add(Double.valueOf(mapLayanan.get("skor").toString()));
			}
			if (!listTglPelayanan.contains(df.format(((Date) mapLayanan.get("tglPelayanan"))))) {
				listTglPelayanan.add(df.format(((Date) mapLayanan.get("tglPelayanan"))));
			}
		}

		List<String> listTglPelayananSorted = listTglPelayanan.stream().sorted().collect(Collectors.toList());

		// GROUPING_TANGGAL_PELAYANAN
		List<Map<String, Object>> dataTglPelayanan = new ArrayList<>();
		for (Integer idIndikator : listIdIndikator) {
			for (Integer idProduk : listIdProduk) {
				for (Double skor : listSkor) {
					for (String tglPelayanan : listTglPelayananSorted) {
						Map<String, Object> data = new HashMap<>();
						double jumlahTindakan = 0.0;
						double jumlahSkor = 0.0;
						for (Map<String, Object> mapLayanan : dataLayanan) {
							if (idIndikator.equals(mapLayanan.get("indikatorId"))
									&& idProduk.equals(mapLayanan.get("produkId"))
									&& skor.equals(mapLayanan.get("skor"))
									&& tglPelayanan.equals(df.format(((Date) mapLayanan.get("tglPelayanan"))))) {
								jumlahTindakan += Double.valueOf(mapLayanan.get("jumlah").toString());
								jumlahSkor += Double.valueOf(mapLayanan.get("tSkor").toString());
								data.putAll(mapLayanan);
								data.put("tglPelayanan", df.format(((Date) mapLayanan.get("tglPelayanan"))));
							}
						}
						if (CommonUtil.isNotNullOrEmpty(data)) {
							data.put("jumlah", jumlahTindakan);
							data.put("tSkor", jumlahSkor);

							dataTglPelayanan.add(data);
						}
					}
				}
			}
		}

		// GROUPING_HEADER
		for (Integer idIndikator : listIdIndikator) {
			for (Integer idProduk : listIdProduk) {
				for (Double skor : listSkor) {
					Map<String, Object> data = new HashMap<>();
					List<Map<String, Object>> detail = new ArrayList<>();
					double jumlahTindakan = 0.0;
					double jumlahSkor = 0.0;
					for (Map<String, Object> mapLayanan : dataTglPelayanan) {
						if (idIndikator.equals(mapLayanan.get("indikatorId"))
								&& idProduk.equals(mapLayanan.get("produkId")) && skor.equals(mapLayanan.get("skor"))) {
							jumlahTindakan += Double.valueOf(mapLayanan.get("jumlah").toString());
							jumlahSkor += Double.valueOf(mapLayanan.get("tSkor").toString());

							Map<String, Object> mapDetail = new HashMap<>();
							mapDetail.put("jumlah", mapLayanan.get("jumlah"));
							mapDetail.put("tglPelayanan", mapLayanan.get("tglPelayanan"));
							detail.add(mapDetail);

							mapLayanan.remove("noRec");
							mapLayanan.remove("tglPelayanan");
							mapLayanan.remove("statusDiskon");
							mapLayanan.remove("hargaDiskon");
							mapLayanan.remove("departemenId");
							mapLayanan.remove("ruanganId");
							data.putAll(mapLayanan);
						}
					}
					if (CommonUtil.isNotNullOrEmpty(data)) {
						data.put("detail", detail);
						data.put("jumlah", jumlahTindakan);
						data.put("tSkor", Double.parseDouble(decf.format(jumlahSkor)));

						result.add(data);
					}
				}
			}
		}

		return result;
	}

	@Override
	public List<Map<String, Object>> findLogbookLuarJamKerjaDokter(Integer idPegawai, Long bulan) {
		List<Map<String, Object>> result = new ArrayList<>();
		List<String> listTglPelayanan = new ArrayList<>();
		List<Integer> listIdIndikator = new ArrayList<>();
		List<Integer> listIdProduk = new ArrayList<>();
		List<Integer> listDetailJenisProduk = new ArrayList<>();
		List<Integer> listDetailJenisProdukException = new ArrayList<>();
		List<Double> listSkor = new ArrayList<>();

		DateFormat mf = new SimpleDateFormat("yyyy-MM");
		DateFormat df = new SimpleDateFormat("yyyy-MM-dd");

		DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");

		DecimalFormat decf = new DecimalFormat("###.###");
		decf.setRoundingMode(RoundingMode.HALF_UP);

		LocalDateTime PSBBDate = LocalDateTime.of(2020, 9, 14, 0, 0, 0);
		LocalDateTime PSBBEnd = LocalDateTime.parse(GetSettingDataFixed("psbbperiod"), dtf);

		Date pssbAwal = Date.from(PSBBDate.atZone(ZoneId.systemDefault()).toInstant());
		Date pssbAkhir = Date.from(PSBBEnd.atZone(ZoneId.systemDefault()).toInstant());

		List<Integer> listRuangEks = splitDataSettingDatafixed("IdRuanganEksekutif");
		List<Integer> listKonsulTapiVisit = splitDataSettingDatafixed("konsulTapiVisit");

		List<Integer> listIdNonjadwal = shiftKerjaDao.findListNonjadwal();
		List<Integer> laboranRadiologList = mapPegawaiLaboratRadiologiDao.findPegawaiLaboranRadiolog();
		if (pegawaiDao.getDokterLabPatologiAnatomi().contains(idPegawai)) {
			listDetailJenisProduk = new ArrayList<>(Arrays.asList(Master.DetailJenisProduk.PENUNJANG_PATOLOGI_ANATOMI));
		} else if (pegawaiDao.getDokterLabKlinik().contains(idPegawai)) {
			listDetailJenisProduk = new ArrayList<>(Arrays.asList(Master.DetailJenisProduk.PENUNJANG_PATOLOGI_KLINIK));
		} else if (pegawaiDao.getDokterRadiologi().contains(idPegawai)) {
			listDetailJenisProduk = new ArrayList<>(Arrays.asList(Master.DetailJenisProduk.PENUNJANG_RADIOLOGI));
		} else {
			listDetailJenisProduk = new ArrayList<>(Arrays.asList(Master.DetailJenisProduk.MEDIS_UTAMA));
		}

		if (laboranRadiologList.contains(idPegawai)) {
			listDetailJenisProdukException = new ArrayList<>(
					Arrays.asList(Master.DetailJenisProduk.ADMINISTRASI_PATOLOGI_KLINIK_EXCEPTION));
			listDetailJenisProdukException.removeAll(listDetailJenisProduk);

			listDetailJenisProduk.addAll(listDetailJenisProdukException);
		}

		List<Map<String, Object>> dataLayanan = ikiDanRemunerasiDao.getDataLogbookLuarJamKerjaDokter(
				mf.format(new Date(bulan)), pssbAwal, pssbAkhir, listIdNonjadwal, Master.JenisPegawai.DOKTER, idPegawai,
				listDetailJenisProduk, Arrays.asList(Master.JenisProduk.NONTINDAKAN),
				Arrays.asList(Master.KelompokPasien.KELOMPOK_BPJS), Master.Produk.KARCIS);

		List<Map<String, Object>> dataSkor = skoringTindakanMedisDao.findSkoringLogbookDokter(
				mf.format(new Date(bulan)), Arrays.asList(idPegawai), Arrays.asList(Master.UnitKerja.KSM));

		// SCORE
		for (Map<String, Object> mapLayanan : dataLayanan) {
			for (Map<String, Object> mapSkor : dataSkor) {
				if (mapLayanan.get("produkId").equals(mapSkor.get("produkId"))
						&& (((Date) mapLayanan.get("tglPelayanan")).after((Date) mapSkor.get("tglMulaiBerlaku"))
								|| ((Date) mapLayanan.get("tglPelayanan"))
										.equals((Date) mapSkor.get("tglMulaiBerlaku")))) {
					mapLayanan.put("skor", mapSkor.get("skor"));
					break;
				}
			}
			if (!mapLayanan.containsKey("skor")) {
				mapLayanan.put("skor", 1.0);
			}
		}

		// RULES
		for (Map<String, Object> mapLayanan : dataLayanan) {
			if (Double.valueOf(mapLayanan.get("hargaDiskon").toString()) > 0.0
					&& (CommonUtil.isNullOrEmpty(mapLayanan.get("statusDiskon"))
							|| Integer.valueOf(mapLayanan.get("statusDiskon").toString()).equals(0))) {
				// tidak_dapat_skor_untuk_diskon_dpjp
				mapLayanan.put("skor", 0.000);
				mapLayanan.put("tSkor", 0.000);
			} else if (!mapLayanan.get("namaProduk").toString().toLowerCase().contains(Master.KONSUL)
					&& !mapLayanan.get("namaProduk").toString().toLowerCase().contains(Master.VISIT)
					&& listRuangEks.contains(mapLayanan.get("ruanganId"))) {
				mapLayanan.put("skor", Double.parseDouble(decf.format(Double.valueOf(mapLayanan.get("skor").toString())
						* Master.Remunerasi.PERSEN_SKOR_LUAR_JAM_KERJA)));
				mapLayanan.put("tSkor", Double.parseDouble(decf.format(Double.valueOf(mapLayanan.get("skor").toString())
						* Double.valueOf(mapLayanan.get("jumlah").toString()))));
			} else if (mapLayanan.get("jenisPetugasId").equals(Master.JenisPetugasPelaksana.ASISTEN_SPESIALIS)) {
				mapLayanan.put("skor",
						Double.parseDouble(decf.format(Double.valueOf(mapLayanan.get("skor").toString())
								* Master.Remunerasi.PERSEN_SKOR_LUAR_JAM_KERJA
								* Master.Remunerasi.PERSEN_SKOR_ASISTEN_SPESIALIS)));
				mapLayanan.put("tSkor", Double.parseDouble(decf.format(Double.valueOf(mapLayanan.get("skor").toString())
						* Double.valueOf(mapLayanan.get("jumlah").toString()))));
			} else {
				mapLayanan.put("skor", Double.parseDouble(decf.format(Double.valueOf(mapLayanan.get("skor").toString())
						* Master.Remunerasi.PERSEN_SKOR_LUAR_JAM_KERJA)));
				mapLayanan.put("tSkor", Double.parseDouble(decf.format(Double.valueOf(mapLayanan.get("skor").toString())
						* Double.valueOf(mapLayanan.get("jumlah").toString()))));
			}
		}

		// GROUPING_INDIKATOR
		for (Map<String, Object> mapLayanan : dataLayanan) {
			if (listKonsulTapiVisit.contains(mapLayanan.get("produkId"))
					|| mapLayanan.get("namaProduk").toString().toLowerCase().contains(Master.VISIT)) {
				mapLayanan.put("indikatorId", Master.IndikatorKinerjaLuarJamKerja.VISITE);
				mapLayanan.put("namaIndikator",
						indikatorKinerjaDetailDao.findNamaIndikator(Master.IndikatorKinerjaLuarJamKerja.VISITE));
			} else if (mapLayanan.get("namaProduk").toString().toLowerCase().contains(Master.KONSUL)
					&& listRuangEks.contains(mapLayanan.get("ruanganId"))) {
				mapLayanan.put("indikatorId", Master.IndikatorKinerjaLuarJamKerja.KONSUL_EKS);
				mapLayanan.put("namaIndikator",
						indikatorKinerjaDetailDao.findNamaIndikator(Master.IndikatorKinerjaLuarJamKerja.KONSUL_EKS));
			} else if (mapLayanan.get("namaProduk").toString().toLowerCase().contains(Master.KONSUL)
					&& mapLayanan.get("departemenId").equals(Master.Departemen.IGD)) {
				mapLayanan.put("indikatorId", Master.IndikatorKinerjaLuarJamKerja.KONSUL_GADAR);
				mapLayanan.put("namaIndikator",
						indikatorKinerjaDetailDao.findNamaIndikator(Master.IndikatorKinerjaLuarJamKerja.KONSUL_GADAR));
			} else if (mapLayanan.get("namaProduk").toString().toLowerCase().contains(Master.KONSUL)) {
				mapLayanan.put("indikatorId", Master.IndikatorKinerjaLuarJamKerja.KONSUL_REG);
				mapLayanan.put("namaIndikator",
						indikatorKinerjaDetailDao.findNamaIndikator(Master.IndikatorKinerjaLuarJamKerja.KONSUL_REG));
			} else if (listRuangEks.contains(mapLayanan.get("ruanganId"))) {
				mapLayanan.put("indikatorId", Master.IndikatorKinerjaLuarJamKerja.TINDAKAN_EKS);
				mapLayanan.put("namaIndikator",
						indikatorKinerjaDetailDao.findNamaIndikator(Master.IndikatorKinerjaLuarJamKerja.TINDAKAN_EKS));
			} else if (mapLayanan.get("departemenId").equals(Master.Departemen.IGD)) {
				mapLayanan.put("indikatorId", Master.IndikatorKinerjaLuarJamKerja.TINDAKAN_GADAR);
				mapLayanan.put("namaIndikator", indikatorKinerjaDetailDao
						.findNamaIndikator(Master.IndikatorKinerjaLuarJamKerja.TINDAKAN_GADAR));
			} else if (mapLayanan.get("ruanganId").equals(Master.Ruangan.OK)) {
				mapLayanan.put("indikatorId", Master.IndikatorKinerjaLuarJamKerja.TINDAKAN_OPS);
				mapLayanan.put("namaIndikator",
						indikatorKinerjaDetailDao.findNamaIndikator(Master.IndikatorKinerjaLuarJamKerja.TINDAKAN_OPS));
			} else {
				mapLayanan.put("indikatorId", Master.IndikatorKinerjaLuarJamKerja.TINDAKAN_REG);
				mapLayanan.put("namaIndikator",
						indikatorKinerjaDetailDao.findNamaIndikator(Master.IndikatorKinerjaLuarJamKerja.TINDAKAN_REG));
			}
		}

		for (Map<String, Object> mapLayanan : dataLayanan) {
			if (!listIdIndikator.contains(mapLayanan.get("indikatorId"))) {
				listIdIndikator.add(Integer.valueOf(mapLayanan.get("indikatorId").toString()));
			}
			if (!listIdProduk.contains(mapLayanan.get("produkId"))) {
				listIdProduk.add(Integer.valueOf(mapLayanan.get("produkId").toString()));
			}
			if (!listSkor.contains(mapLayanan.get("skor"))) {
				listSkor.add(Double.valueOf(mapLayanan.get("skor").toString()));
			}
			if (!listTglPelayanan.contains(df.format(((Date) mapLayanan.get("tglPelayanan"))))) {
				listTglPelayanan.add(df.format(((Date) mapLayanan.get("tglPelayanan"))));
			}
		}

		List<String> listTglPelayananSorted = listTglPelayanan.stream().sorted().collect(Collectors.toList());

		// GROUPING_TANGGAL_PELAYANAN
		List<Map<String, Object>> dataTglPelayanan = new ArrayList<>();
		for (Integer idIndikator : listIdIndikator) {
			for (Integer idProduk : listIdProduk) {
				for (Double skor : listSkor) {
					for (String tglPelayanan : listTglPelayananSorted) {
						Map<String, Object> data = new HashMap<>();
						double jumlahTindakan = 0.0;
						double jumlahSkor = 0.0;
						for (Map<String, Object> mapLayanan : dataLayanan) {
							if (idIndikator.equals(mapLayanan.get("indikatorId"))
									&& idProduk.equals(mapLayanan.get("produkId"))
									&& skor.equals(mapLayanan.get("skor"))
									&& tglPelayanan.equals(df.format(((Date) mapLayanan.get("tglPelayanan"))))) {
								jumlahTindakan += Double.valueOf(mapLayanan.get("jumlah").toString());
								jumlahSkor += Double.valueOf(mapLayanan.get("tSkor").toString());
								data.putAll(mapLayanan);
								data.put("tglPelayanan", df.format(((Date) mapLayanan.get("tglPelayanan"))));
							}
						}
						if (CommonUtil.isNotNullOrEmpty(data)) {
							data.put("jumlah", jumlahTindakan);
							data.put("tSkor", jumlahSkor);

							dataTglPelayanan.add(data);
						}
					}
				}
			}
		}

		// GROUPING_HEADER
		for (Integer idIndikator : listIdIndikator) {
			for (Integer idProduk : listIdProduk) {
				for (Double skor : listSkor) {
					Map<String, Object> data = new HashMap<>();
					List<Map<String, Object>> detail = new ArrayList<>();
					double jumlahTindakan = 0.0;
					double jumlahSkor = 0.0;
					for (Map<String, Object> mapLayanan : dataTglPelayanan) {
						if (idIndikator.equals(mapLayanan.get("indikatorId"))
								&& idProduk.equals(mapLayanan.get("produkId")) && skor.equals(mapLayanan.get("skor"))) {
							jumlahTindakan += Double.valueOf(mapLayanan.get("jumlah").toString());
							jumlahSkor += Double.valueOf(mapLayanan.get("tSkor").toString());

							Map<String, Object> mapDetail = new HashMap<>();
							mapDetail.put("jumlah", mapLayanan.get("jumlah"));
							mapDetail.put("tglPelayanan", mapLayanan.get("tglPelayanan"));
							detail.add(mapDetail);

							mapLayanan.remove("noRec");
							mapLayanan.remove("tglPelayanan");
							mapLayanan.remove("statusDiskon");
							mapLayanan.remove("hargaDiskon");
							mapLayanan.remove("departemenId");
							mapLayanan.remove("ruanganId");
							data.putAll(mapLayanan);
						}
					}
					if (CommonUtil.isNotNullOrEmpty(data)) {
						data.put("detail", detail);
						data.put("jumlah", jumlahTindakan);
						data.put("tSkor", Double.parseDouble(decf.format(jumlahSkor)));

						result.add(data);
					}
				}
			}
		}

		return result;
	}

	@Override
	public List<Map<String, Object>> findDetailLogbookJamKerjaDokter(Integer idPegawai, Integer idIndikator,
			Integer idProduk, String tglPelayanan, Integer idJenisPetugas, Double skor) {
		List<Map<String, Object>> result = new ArrayList<>();

		List<Integer> listDetailJenisProduk = new ArrayList<>();
		List<Integer> listDetailJenisProdukException = new ArrayList<>();

		DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");

		LocalDateTime PSBBDate = LocalDateTime.of(2020, 9, 14, 0, 0, 0);
		LocalDateTime PSBBEnd = LocalDateTime.parse(GetSettingDataFixed("psbbperiod"), dtf);

		Date pssbAwal = Date.from(PSBBDate.atZone(ZoneId.systemDefault()).toInstant());
		Date pssbAkhir = Date.from(PSBBEnd.atZone(ZoneId.systemDefault()).toInstant());

		List<Integer> listRuangEks = splitDataSettingDatafixed("IdRuanganEksekutif");
		List<Integer> listKonsulTapiVisit = splitDataSettingDatafixed("konsulTapiVisit");

		List<Integer> listIdNonjadwal = shiftKerjaDao.findListNonjadwal();
		List<Integer> laboranRadiologList = mapPegawaiLaboratRadiologiDao.findPegawaiLaboranRadiolog();
		if (pegawaiDao.getDokterLabPatologiAnatomi().contains(idPegawai)) {
			listDetailJenisProduk = new ArrayList<>(Arrays.asList(Master.DetailJenisProduk.PENUNJANG_PATOLOGI_ANATOMI));
		} else if (pegawaiDao.getDokterLabKlinik().contains(idPegawai)) {
			listDetailJenisProduk = new ArrayList<>(Arrays.asList(Master.DetailJenisProduk.PENUNJANG_PATOLOGI_KLINIK));
		} else if (pegawaiDao.getDokterRadiologi().contains(idPegawai)) {
			listDetailJenisProduk = new ArrayList<>(Arrays.asList(Master.DetailJenisProduk.PENUNJANG_RADIOLOGI));
		} else {
			listDetailJenisProduk = new ArrayList<>(Arrays.asList(Master.DetailJenisProduk.MEDIS_UTAMA));
		}

		if (laboranRadiologList.contains(idPegawai)) {
			listDetailJenisProdukException = new ArrayList<>(
					Arrays.asList(Master.DetailJenisProduk.ADMINISTRASI_PATOLOGI_KLINIK_EXCEPTION));
			listDetailJenisProdukException.removeAll(listDetailJenisProduk);

			listDetailJenisProduk.addAll(listDetailJenisProdukException);
		}

		List<Map<String, Object>> dataLayanan = ikiDanRemunerasiDao.findDetailPasienLogbookJamKerjaDokter(idProduk,
				tglPelayanan, pssbAwal, pssbAkhir, listIdNonjadwal, Master.JenisPegawai.DOKTER, idPegawai,
				listDetailJenisProduk, Arrays.asList(Master.JenisProduk.NONTINDAKAN),
				Arrays.asList(Master.KelompokPasien.KELOMPOK_BPJS), Master.Produk.KARCIS);

		for (Map<String, Object> mapLayanan : dataLayanan) {
			if (idIndikator.equals(Master.IndikatorKinerjaJamKerja.VISITE)
					&& (listKonsulTapiVisit.contains(mapLayanan.get("produkId"))
							|| mapLayanan.get("namaProduk").toString().toLowerCase().contains(Master.VISIT))) {
				if (idJenisPetugas.equals(Master.JenisPetugasPelaksana.ASISTEN_SPESIALIS)
						&& mapLayanan.get("jenisPetugasId").equals(Master.JenisPetugasPelaksana.ASISTEN_SPESIALIS)) {
					if (skor.equals(0.0) && Double.valueOf(mapLayanan.get("hargaDiskon").toString()) > 0.0
							&& (CommonUtil.isNullOrEmpty(mapLayanan.get("statusDiskon"))
									|| Integer.valueOf(mapLayanan.get("statusDiskon").toString()).equals(0))) {
						mapLayanan.remove("noRec");
						mapLayanan.remove("statusDiskon");
						mapLayanan.remove("departemenId");
						mapLayanan.remove("ruanganId");
						mapLayanan.remove("hargaDiskon");
						result.add(mapLayanan);
					} else if (!skor.equals(0.0) && Double.valueOf(mapLayanan.get("hargaDiskon").toString()) == 0.0) {
						mapLayanan.remove("noRec");
						mapLayanan.remove("statusDiskon");
						mapLayanan.remove("departemenId");
						mapLayanan.remove("ruanganId");
						mapLayanan.remove("hargaDiskon");
						result.add(mapLayanan);
					}
				} else if (!idJenisPetugas.equals(Master.JenisPetugasPelaksana.ASISTEN_SPESIALIS)
						&& !mapLayanan.get("jenisPetugasId").equals(Master.JenisPetugasPelaksana.ASISTEN_SPESIALIS)) {
					if (skor.equals(0.0) && Double.valueOf(mapLayanan.get("hargaDiskon").toString()) > 0.0
							&& (CommonUtil.isNullOrEmpty(mapLayanan.get("statusDiskon"))
									|| Integer.valueOf(mapLayanan.get("statusDiskon").toString()).equals(0))) {
						mapLayanan.remove("noRec");
						mapLayanan.remove("statusDiskon");
						mapLayanan.remove("departemenId");
						mapLayanan.remove("ruanganId");
						mapLayanan.remove("hargaDiskon");
						result.add(mapLayanan);
					} else if (!skor.equals(0.0) && Double.valueOf(mapLayanan.get("hargaDiskon").toString()) == 0.0) {
						mapLayanan.remove("noRec");
						mapLayanan.remove("statusDiskon");
						mapLayanan.remove("departemenId");
						mapLayanan.remove("ruanganId");
						mapLayanan.remove("hargaDiskon");
						result.add(mapLayanan);
					}
				}
			} else if (idIndikator.equals(Master.IndikatorKinerjaJamKerja.KONSUL_EKS)
					&& mapLayanan.get("namaProduk").toString().toLowerCase().contains(Master.KONSUL)
					&& listRuangEks.contains(mapLayanan.get("ruanganId"))) {
				if (idJenisPetugas.equals(Master.JenisPetugasPelaksana.ASISTEN_SPESIALIS)
						&& mapLayanan.get("jenisPetugasId").equals(Master.JenisPetugasPelaksana.ASISTEN_SPESIALIS)) {
					if (skor.equals(0.0) && Double.valueOf(mapLayanan.get("hargaDiskon").toString()) > 0.0
							&& (CommonUtil.isNullOrEmpty(mapLayanan.get("statusDiskon"))
									|| Integer.valueOf(mapLayanan.get("statusDiskon").toString()).equals(0))) {
						mapLayanan.remove("noRec");
						mapLayanan.remove("statusDiskon");
						mapLayanan.remove("departemenId");
						mapLayanan.remove("ruanganId");
						mapLayanan.remove("hargaDiskon");
						result.add(mapLayanan);
					} else if (!skor.equals(0.0) && Double.valueOf(mapLayanan.get("hargaDiskon").toString()) == 0.0) {
						mapLayanan.remove("noRec");
						mapLayanan.remove("statusDiskon");
						mapLayanan.remove("departemenId");
						mapLayanan.remove("ruanganId");
						mapLayanan.remove("hargaDiskon");
						result.add(mapLayanan);
					}
				} else if (!idJenisPetugas.equals(Master.JenisPetugasPelaksana.ASISTEN_SPESIALIS)
						&& !mapLayanan.get("jenisPetugasId").equals(Master.JenisPetugasPelaksana.ASISTEN_SPESIALIS)) {
					if (skor.equals(0.0) && Double.valueOf(mapLayanan.get("hargaDiskon").toString()) > 0.0
							&& (CommonUtil.isNullOrEmpty(mapLayanan.get("statusDiskon"))
									|| Integer.valueOf(mapLayanan.get("statusDiskon").toString()).equals(0))) {
						mapLayanan.remove("noRec");
						mapLayanan.remove("statusDiskon");
						mapLayanan.remove("departemenId");
						mapLayanan.remove("ruanganId");
						mapLayanan.remove("hargaDiskon");
						result.add(mapLayanan);
					} else if (!skor.equals(0.0) && Double.valueOf(mapLayanan.get("hargaDiskon").toString()) == 0.0) {
						mapLayanan.remove("noRec");
						mapLayanan.remove("statusDiskon");
						mapLayanan.remove("departemenId");
						mapLayanan.remove("ruanganId");
						mapLayanan.remove("hargaDiskon");
						result.add(mapLayanan);
					}
				}
			} else if (idIndikator.equals(Master.IndikatorKinerjaJamKerja.KONSUL_GADAR)
					&& mapLayanan.get("namaProduk").toString().toLowerCase().contains(Master.KONSUL)
					&& mapLayanan.get("departemenId").equals(Master.Departemen.IGD)) {
				if (idJenisPetugas.equals(Master.JenisPetugasPelaksana.ASISTEN_SPESIALIS)
						&& mapLayanan.get("jenisPetugasId").equals(Master.JenisPetugasPelaksana.ASISTEN_SPESIALIS)) {
					if (skor.equals(0.0) && Double.valueOf(mapLayanan.get("hargaDiskon").toString()) > 0.0
							&& (CommonUtil.isNullOrEmpty(mapLayanan.get("statusDiskon"))
									|| Integer.valueOf(mapLayanan.get("statusDiskon").toString()).equals(0))) {
						mapLayanan.remove("noRec");
						mapLayanan.remove("statusDiskon");
						mapLayanan.remove("departemenId");
						mapLayanan.remove("ruanganId");
						mapLayanan.remove("hargaDiskon");
						result.add(mapLayanan);
					} else if (!skor.equals(0.0) && Double.valueOf(mapLayanan.get("hargaDiskon").toString()) == 0.0) {
						mapLayanan.remove("noRec");
						mapLayanan.remove("statusDiskon");
						mapLayanan.remove("departemenId");
						mapLayanan.remove("ruanganId");
						mapLayanan.remove("hargaDiskon");
						result.add(mapLayanan);
					}
				} else if (!idJenisPetugas.equals(Master.JenisPetugasPelaksana.ASISTEN_SPESIALIS)
						&& !mapLayanan.get("jenisPetugasId").equals(Master.JenisPetugasPelaksana.ASISTEN_SPESIALIS)) {
					if (skor.equals(0.0) && Double.valueOf(mapLayanan.get("hargaDiskon").toString()) > 0.0
							&& (CommonUtil.isNullOrEmpty(mapLayanan.get("statusDiskon"))
									|| Integer.valueOf(mapLayanan.get("statusDiskon").toString()).equals(0))) {
						mapLayanan.remove("noRec");
						mapLayanan.remove("statusDiskon");
						mapLayanan.remove("departemenId");
						mapLayanan.remove("ruanganId");
						mapLayanan.remove("hargaDiskon");
						result.add(mapLayanan);
					} else if (!skor.equals(0.0) && Double.valueOf(mapLayanan.get("hargaDiskon").toString()) == 0.0) {
						mapLayanan.remove("noRec");
						mapLayanan.remove("statusDiskon");
						mapLayanan.remove("departemenId");
						mapLayanan.remove("ruanganId");
						mapLayanan.remove("hargaDiskon");
						result.add(mapLayanan);
					}
				}
			} else if (idIndikator.equals(Master.IndikatorKinerjaJamKerja.KONSUL_REG)
					&& mapLayanan.get("namaProduk").toString().toLowerCase().contains(Master.KONSUL)) {
				if (idJenisPetugas.equals(Master.JenisPetugasPelaksana.ASISTEN_SPESIALIS)
						&& mapLayanan.get("jenisPetugasId").equals(Master.JenisPetugasPelaksana.ASISTEN_SPESIALIS)) {
					if (skor.equals(0.0) && Double.valueOf(mapLayanan.get("hargaDiskon").toString()) > 0.0
							&& (CommonUtil.isNullOrEmpty(mapLayanan.get("statusDiskon"))
									|| Integer.valueOf(mapLayanan.get("statusDiskon").toString()).equals(0))) {
						mapLayanan.remove("noRec");
						mapLayanan.remove("statusDiskon");
						mapLayanan.remove("departemenId");
						mapLayanan.remove("ruanganId");
						mapLayanan.remove("hargaDiskon");
						result.add(mapLayanan);
					} else if (!skor.equals(0.0) && Double.valueOf(mapLayanan.get("hargaDiskon").toString()) == 0.0) {
						mapLayanan.remove("noRec");
						mapLayanan.remove("statusDiskon");
						mapLayanan.remove("departemenId");
						mapLayanan.remove("ruanganId");
						mapLayanan.remove("hargaDiskon");
						result.add(mapLayanan);
					}
				} else if (!idJenisPetugas.equals(Master.JenisPetugasPelaksana.ASISTEN_SPESIALIS)
						&& !mapLayanan.get("jenisPetugasId").equals(Master.JenisPetugasPelaksana.ASISTEN_SPESIALIS)) {
					if (skor.equals(0.0) && Double.valueOf(mapLayanan.get("hargaDiskon").toString()) > 0.0
							&& (CommonUtil.isNullOrEmpty(mapLayanan.get("statusDiskon"))
									|| Integer.valueOf(mapLayanan.get("statusDiskon").toString()).equals(0))) {
						mapLayanan.remove("noRec");
						mapLayanan.remove("statusDiskon");
						mapLayanan.remove("departemenId");
						mapLayanan.remove("ruanganId");
						mapLayanan.remove("hargaDiskon");
						result.add(mapLayanan);
					} else if (!skor.equals(0.0) && Double.valueOf(mapLayanan.get("hargaDiskon").toString()) == 0.0) {
						mapLayanan.remove("noRec");
						mapLayanan.remove("statusDiskon");
						mapLayanan.remove("departemenId");
						mapLayanan.remove("ruanganId");
						mapLayanan.remove("hargaDiskon");
						result.add(mapLayanan);
					}
				}
			} else if (idIndikator.equals(Master.IndikatorKinerjaJamKerja.TINDAKAN_EKS)
					&& listRuangEks.contains(mapLayanan.get("ruanganId"))) {
				if (idJenisPetugas.equals(Master.JenisPetugasPelaksana.ASISTEN_SPESIALIS)
						&& mapLayanan.get("jenisPetugasId").equals(Master.JenisPetugasPelaksana.ASISTEN_SPESIALIS)) {
					if (skor.equals(0.0) && Double.valueOf(mapLayanan.get("hargaDiskon").toString()) > 0.0
							&& (CommonUtil.isNullOrEmpty(mapLayanan.get("statusDiskon"))
									|| Integer.valueOf(mapLayanan.get("statusDiskon").toString()).equals(0))) {
						mapLayanan.remove("noRec");
						mapLayanan.remove("statusDiskon");
						mapLayanan.remove("departemenId");
						mapLayanan.remove("ruanganId");
						mapLayanan.remove("hargaDiskon");
						result.add(mapLayanan);
					} else if (!skor.equals(0.0) && Double.valueOf(mapLayanan.get("hargaDiskon").toString()) == 0.0) {
						mapLayanan.remove("noRec");
						mapLayanan.remove("statusDiskon");
						mapLayanan.remove("departemenId");
						mapLayanan.remove("ruanganId");
						mapLayanan.remove("hargaDiskon");
						result.add(mapLayanan);
					}
				} else if (!idJenisPetugas.equals(Master.JenisPetugasPelaksana.ASISTEN_SPESIALIS)
						&& !mapLayanan.get("jenisPetugasId").equals(Master.JenisPetugasPelaksana.ASISTEN_SPESIALIS)) {
					if (skor.equals(0.0) && Double.valueOf(mapLayanan.get("hargaDiskon").toString()) > 0.0
							&& (CommonUtil.isNullOrEmpty(mapLayanan.get("statusDiskon"))
									|| Integer.valueOf(mapLayanan.get("statusDiskon").toString()).equals(0))) {
						mapLayanan.remove("noRec");
						mapLayanan.remove("statusDiskon");
						mapLayanan.remove("departemenId");
						mapLayanan.remove("ruanganId");
						mapLayanan.remove("hargaDiskon");
						result.add(mapLayanan);
					} else if (!skor.equals(0.0) && Double.valueOf(mapLayanan.get("hargaDiskon").toString()) == 0.0) {
						mapLayanan.remove("noRec");
						mapLayanan.remove("statusDiskon");
						mapLayanan.remove("departemenId");
						mapLayanan.remove("ruanganId");
						mapLayanan.remove("hargaDiskon");
						result.add(mapLayanan);
					}
				}
			} else if (idIndikator.equals(Master.IndikatorKinerjaJamKerja.TINDAKAN_GADAR)
					&& mapLayanan.get("departemenId").equals(Master.Departemen.IGD)) {
				if (idJenisPetugas.equals(Master.JenisPetugasPelaksana.ASISTEN_SPESIALIS)
						&& mapLayanan.get("jenisPetugasId").equals(Master.JenisPetugasPelaksana.ASISTEN_SPESIALIS)) {
					if (skor.equals(0.0) && Double.valueOf(mapLayanan.get("hargaDiskon").toString()) > 0.0
							&& (CommonUtil.isNullOrEmpty(mapLayanan.get("statusDiskon"))
									|| Integer.valueOf(mapLayanan.get("statusDiskon").toString()).equals(0))) {
						mapLayanan.remove("noRec");
						mapLayanan.remove("statusDiskon");
						mapLayanan.remove("departemenId");
						mapLayanan.remove("ruanganId");
						mapLayanan.remove("hargaDiskon");
						result.add(mapLayanan);
					} else if (!skor.equals(0.0) && Double.valueOf(mapLayanan.get("hargaDiskon").toString()) == 0.0) {
						mapLayanan.remove("noRec");
						mapLayanan.remove("statusDiskon");
						mapLayanan.remove("departemenId");
						mapLayanan.remove("ruanganId");
						mapLayanan.remove("hargaDiskon");
						result.add(mapLayanan);
					}
				} else if (!idJenisPetugas.equals(Master.JenisPetugasPelaksana.ASISTEN_SPESIALIS)
						&& !mapLayanan.get("jenisPetugasId").equals(Master.JenisPetugasPelaksana.ASISTEN_SPESIALIS)) {
					if (skor.equals(0.0) && Double.valueOf(mapLayanan.get("hargaDiskon").toString()) > 0.0
							&& (CommonUtil.isNullOrEmpty(mapLayanan.get("statusDiskon"))
									|| Integer.valueOf(mapLayanan.get("statusDiskon").toString()).equals(0))) {
						mapLayanan.remove("noRec");
						mapLayanan.remove("statusDiskon");
						mapLayanan.remove("departemenId");
						mapLayanan.remove("ruanganId");
						mapLayanan.remove("hargaDiskon");
						result.add(mapLayanan);
					} else if (!skor.equals(0.0) && Double.valueOf(mapLayanan.get("hargaDiskon").toString()) == 0.0) {
						mapLayanan.remove("noRec");
						mapLayanan.remove("statusDiskon");
						mapLayanan.remove("departemenId");
						mapLayanan.remove("ruanganId");
						mapLayanan.remove("hargaDiskon");
						result.add(mapLayanan);
					}
				}
			} else if (idIndikator.equals(Master.IndikatorKinerjaJamKerja.TINDAKAN_OPS)
					&& mapLayanan.get("ruanganId").equals(Master.Ruangan.OK)) {
				if (idJenisPetugas.equals(Master.JenisPetugasPelaksana.ASISTEN_SPESIALIS)
						&& mapLayanan.get("jenisPetugasId").equals(Master.JenisPetugasPelaksana.ASISTEN_SPESIALIS)) {
					if (skor.equals(0.0) && Double.valueOf(mapLayanan.get("hargaDiskon").toString()) > 0.0
							&& (CommonUtil.isNullOrEmpty(mapLayanan.get("statusDiskon"))
									|| Integer.valueOf(mapLayanan.get("statusDiskon").toString()).equals(0))) {
						mapLayanan.remove("noRec");
						mapLayanan.remove("statusDiskon");
						mapLayanan.remove("departemenId");
						mapLayanan.remove("ruanganId");
						mapLayanan.remove("hargaDiskon");
						result.add(mapLayanan);
					} else if (!skor.equals(0.0) && Double.valueOf(mapLayanan.get("hargaDiskon").toString()) == 0.0) {
						mapLayanan.remove("noRec");
						mapLayanan.remove("statusDiskon");
						mapLayanan.remove("departemenId");
						mapLayanan.remove("ruanganId");
						mapLayanan.remove("hargaDiskon");
						result.add(mapLayanan);
					}
				} else if (!idJenisPetugas.equals(Master.JenisPetugasPelaksana.ASISTEN_SPESIALIS)
						&& !mapLayanan.get("jenisPetugasId").equals(Master.JenisPetugasPelaksana.ASISTEN_SPESIALIS)) {
					if (skor.equals(0.0) && Double.valueOf(mapLayanan.get("hargaDiskon").toString()) > 0.0
							&& (CommonUtil.isNullOrEmpty(mapLayanan.get("statusDiskon"))
									|| Integer.valueOf(mapLayanan.get("statusDiskon").toString()).equals(0))) {
						mapLayanan.remove("noRec");
						mapLayanan.remove("statusDiskon");
						mapLayanan.remove("departemenId");
						mapLayanan.remove("ruanganId");
						mapLayanan.remove("hargaDiskon");
						result.add(mapLayanan);
					} else if (!skor.equals(0.0) && Double.valueOf(mapLayanan.get("hargaDiskon").toString()) == 0.0) {
						mapLayanan.remove("noRec");
						mapLayanan.remove("statusDiskon");
						mapLayanan.remove("departemenId");
						mapLayanan.remove("ruanganId");
						mapLayanan.remove("hargaDiskon");
						result.add(mapLayanan);
					}
				}
			} else if (idIndikator.equals(Master.IndikatorKinerjaJamKerja.TINDAKAN_REG)
					&& !listKonsulTapiVisit.contains(mapLayanan.get("produkId"))
					&& !mapLayanan.get("namaProduk").toString().toLowerCase().contains(Master.VISIT)
					&& !mapLayanan.get("namaProduk").toString().toLowerCase().contains(Master.KONSUL)
					&& !listRuangEks.contains(mapLayanan.get("ruanganId"))
					&& !mapLayanan.get("departemenId").equals(Master.Departemen.IGD)
					&& !mapLayanan.get("ruanganId").equals(Master.Ruangan.OK)) {
				if (idJenisPetugas.equals(Master.JenisPetugasPelaksana.ASISTEN_SPESIALIS)
						&& mapLayanan.get("jenisPetugasId").equals(Master.JenisPetugasPelaksana.ASISTEN_SPESIALIS)) {
					if (skor.equals(0.0) && Double.valueOf(mapLayanan.get("hargaDiskon").toString()) > 0.0
							&& (CommonUtil.isNullOrEmpty(mapLayanan.get("statusDiskon"))
									|| Integer.valueOf(mapLayanan.get("statusDiskon").toString()).equals(0))) {
						mapLayanan.remove("noRec");
						mapLayanan.remove("statusDiskon");
						mapLayanan.remove("departemenId");
						mapLayanan.remove("ruanganId");
						mapLayanan.remove("hargaDiskon");
						result.add(mapLayanan);
					} else if (!skor.equals(0.0) && Double.valueOf(mapLayanan.get("hargaDiskon").toString()) == 0.0) {
						mapLayanan.remove("noRec");
						mapLayanan.remove("statusDiskon");
						mapLayanan.remove("departemenId");
						mapLayanan.remove("ruanganId");
						mapLayanan.remove("hargaDiskon");
						result.add(mapLayanan);
					}
				} else if (!idJenisPetugas.equals(Master.JenisPetugasPelaksana.ASISTEN_SPESIALIS)
						&& !mapLayanan.get("jenisPetugasId").equals(Master.JenisPetugasPelaksana.ASISTEN_SPESIALIS)) {
					if (skor.equals(0.0) && Double.valueOf(mapLayanan.get("hargaDiskon").toString()) > 0.0
							&& (CommonUtil.isNullOrEmpty(mapLayanan.get("statusDiskon"))
									|| Integer.valueOf(mapLayanan.get("statusDiskon").toString()).equals(0))) {
						mapLayanan.remove("noRec");
						mapLayanan.remove("statusDiskon");
						mapLayanan.remove("departemenId");
						mapLayanan.remove("ruanganId");
						mapLayanan.remove("hargaDiskon");
						result.add(mapLayanan);
					} else if (!skor.equals(0.0) && Double.valueOf(mapLayanan.get("hargaDiskon").toString()) == 0.0) {
						mapLayanan.remove("noRec");
						mapLayanan.remove("statusDiskon");
						mapLayanan.remove("departemenId");
						mapLayanan.remove("ruanganId");
						mapLayanan.remove("hargaDiskon");
						result.add(mapLayanan);
					}
				}
			}
		}

		return result;
	}

	@Override
	public List<Map<String, Object>> findDetailLogbookLuarJamKerjaDokter(Integer idPegawai, Integer idIndikator,
			Integer idProduk, String tglPelayanan, Integer idJenisPetugas, Double skor) {
		List<Map<String, Object>> result = new ArrayList<>();

		List<Integer> listDetailJenisProduk = new ArrayList<>();
		List<Integer> listDetailJenisProdukException = new ArrayList<>();

		DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");

		LocalDateTime PSBBDate = LocalDateTime.of(2020, 9, 14, 0, 0, 0);
		LocalDateTime PSBBEnd = LocalDateTime.parse(GetSettingDataFixed("psbbperiod"), dtf);

		Date pssbAwal = Date.from(PSBBDate.atZone(ZoneId.systemDefault()).toInstant());
		Date pssbAkhir = Date.from(PSBBEnd.atZone(ZoneId.systemDefault()).toInstant());

		List<Integer> listRuangEks = splitDataSettingDatafixed("IdRuanganEksekutif");
		List<Integer> listKonsulTapiVisit = splitDataSettingDatafixed("konsulTapiVisit");

		List<Integer> listIdNonjadwal = shiftKerjaDao.findListNonjadwal();
		List<Integer> laboranRadiologList = mapPegawaiLaboratRadiologiDao.findPegawaiLaboranRadiolog();
		if (pegawaiDao.getDokterLabPatologiAnatomi().contains(idPegawai)) {
			listDetailJenisProduk = new ArrayList<>(Arrays.asList(Master.DetailJenisProduk.PENUNJANG_PATOLOGI_ANATOMI));
		} else if (pegawaiDao.getDokterLabKlinik().contains(idPegawai)) {
			listDetailJenisProduk = new ArrayList<>(Arrays.asList(Master.DetailJenisProduk.PENUNJANG_PATOLOGI_KLINIK));
		} else if (pegawaiDao.getDokterRadiologi().contains(idPegawai)) {
			listDetailJenisProduk = new ArrayList<>(Arrays.asList(Master.DetailJenisProduk.PENUNJANG_RADIOLOGI));
		} else {
			listDetailJenisProduk = new ArrayList<>(Arrays.asList(Master.DetailJenisProduk.MEDIS_UTAMA));
		}

		if (laboranRadiologList.contains(idPegawai)) {
			listDetailJenisProdukException = new ArrayList<>(
					Arrays.asList(Master.DetailJenisProduk.ADMINISTRASI_PATOLOGI_KLINIK_EXCEPTION));
			listDetailJenisProdukException.removeAll(listDetailJenisProduk);

			listDetailJenisProduk.addAll(listDetailJenisProdukException);
		}

		List<Map<String, Object>> dataLayanan = ikiDanRemunerasiDao.findDetailPasienLogbookLuarJamKerjaDokter(idProduk,
				tglPelayanan, pssbAwal, pssbAkhir, listIdNonjadwal, Master.JenisPegawai.DOKTER, idPegawai,
				listDetailJenisProduk, Arrays.asList(Master.JenisProduk.NONTINDAKAN),
				Arrays.asList(Master.KelompokPasien.KELOMPOK_BPJS), Master.Produk.KARCIS);

		for (Map<String, Object> mapLayanan : dataLayanan) {
			if (idIndikator.equals(Master.IndikatorKinerjaLuarJamKerja.VISITE)
					&& (listKonsulTapiVisit.contains(mapLayanan.get("produkId"))
							|| mapLayanan.get("namaProduk").toString().toLowerCase().contains(Master.VISIT))) {
				if (idJenisPetugas.equals(Master.JenisPetugasPelaksana.ASISTEN_SPESIALIS)
						&& mapLayanan.get("jenisPetugasId").equals(Master.JenisPetugasPelaksana.ASISTEN_SPESIALIS)) {
					if (skor.equals(0.0) && Double.valueOf(mapLayanan.get("hargaDiskon").toString()) > 0.0
							&& (CommonUtil.isNullOrEmpty(mapLayanan.get("statusDiskon"))
									|| Integer.valueOf(mapLayanan.get("statusDiskon").toString()).equals(0))) {
						mapLayanan.remove("noRec");
						mapLayanan.remove("statusDiskon");
						mapLayanan.remove("departemenId");
						mapLayanan.remove("ruanganId");
						mapLayanan.remove("hargaDiskon");
						result.add(mapLayanan);
					} else if (!skor.equals(0.0) && Double.valueOf(mapLayanan.get("hargaDiskon").toString()) == 0.0) {
						mapLayanan.remove("noRec");
						mapLayanan.remove("statusDiskon");
						mapLayanan.remove("departemenId");
						mapLayanan.remove("ruanganId");
						mapLayanan.remove("hargaDiskon");
						result.add(mapLayanan);
					}
				} else if (!idJenisPetugas.equals(Master.JenisPetugasPelaksana.ASISTEN_SPESIALIS)
						&& !mapLayanan.get("jenisPetugasId").equals(Master.JenisPetugasPelaksana.ASISTEN_SPESIALIS)) {
					if (skor.equals(0.0) && Double.valueOf(mapLayanan.get("hargaDiskon").toString()) > 0.0
							&& (CommonUtil.isNullOrEmpty(mapLayanan.get("statusDiskon"))
									|| Integer.valueOf(mapLayanan.get("statusDiskon").toString()).equals(0))) {
						mapLayanan.remove("noRec");
						mapLayanan.remove("statusDiskon");
						mapLayanan.remove("departemenId");
						mapLayanan.remove("ruanganId");
						mapLayanan.remove("hargaDiskon");
						result.add(mapLayanan);
					} else if (!skor.equals(0.0) && Double.valueOf(mapLayanan.get("hargaDiskon").toString()) == 0.0) {
						mapLayanan.remove("noRec");
						mapLayanan.remove("statusDiskon");
						mapLayanan.remove("departemenId");
						mapLayanan.remove("ruanganId");
						mapLayanan.remove("hargaDiskon");
						result.add(mapLayanan);
					}
				}
			} else if (idIndikator.equals(Master.IndikatorKinerjaLuarJamKerja.KONSUL_EKS)
					&& mapLayanan.get("namaProduk").toString().toLowerCase().contains(Master.KONSUL)
					&& listRuangEks.contains(mapLayanan.get("ruanganId"))) {
				if (idJenisPetugas.equals(Master.JenisPetugasPelaksana.ASISTEN_SPESIALIS)
						&& mapLayanan.get("jenisPetugasId").equals(Master.JenisPetugasPelaksana.ASISTEN_SPESIALIS)) {
					if (skor.equals(0.0) && Double.valueOf(mapLayanan.get("hargaDiskon").toString()) > 0.0
							&& (CommonUtil.isNullOrEmpty(mapLayanan.get("statusDiskon"))
									|| Integer.valueOf(mapLayanan.get("statusDiskon").toString()).equals(0))) {
						mapLayanan.remove("noRec");
						mapLayanan.remove("statusDiskon");
						mapLayanan.remove("departemenId");
						mapLayanan.remove("ruanganId");
						mapLayanan.remove("hargaDiskon");
						result.add(mapLayanan);
					} else if (!skor.equals(0.0) && Double.valueOf(mapLayanan.get("hargaDiskon").toString()) == 0.0) {
						mapLayanan.remove("noRec");
						mapLayanan.remove("statusDiskon");
						mapLayanan.remove("departemenId");
						mapLayanan.remove("ruanganId");
						mapLayanan.remove("hargaDiskon");
						result.add(mapLayanan);
					}
				} else if (!idJenisPetugas.equals(Master.JenisPetugasPelaksana.ASISTEN_SPESIALIS)
						&& !mapLayanan.get("jenisPetugasId").equals(Master.JenisPetugasPelaksana.ASISTEN_SPESIALIS)) {
					if (skor.equals(0.0) && Double.valueOf(mapLayanan.get("hargaDiskon").toString()) > 0.0
							&& (CommonUtil.isNullOrEmpty(mapLayanan.get("statusDiskon"))
									|| Integer.valueOf(mapLayanan.get("statusDiskon").toString()).equals(0))) {
						mapLayanan.remove("noRec");
						mapLayanan.remove("statusDiskon");
						mapLayanan.remove("departemenId");
						mapLayanan.remove("ruanganId");
						mapLayanan.remove("hargaDiskon");
						result.add(mapLayanan);
					} else if (!skor.equals(0.0) && Double.valueOf(mapLayanan.get("hargaDiskon").toString()) == 0.0) {
						mapLayanan.remove("noRec");
						mapLayanan.remove("statusDiskon");
						mapLayanan.remove("departemenId");
						mapLayanan.remove("ruanganId");
						mapLayanan.remove("hargaDiskon");
						result.add(mapLayanan);
					}
				}
			} else if (idIndikator.equals(Master.IndikatorKinerjaLuarJamKerja.KONSUL_GADAR)
					&& mapLayanan.get("namaProduk").toString().toLowerCase().contains(Master.KONSUL)
					&& mapLayanan.get("departemenId").equals(Master.Departemen.IGD)) {
				if (idJenisPetugas.equals(Master.JenisPetugasPelaksana.ASISTEN_SPESIALIS)
						&& mapLayanan.get("jenisPetugasId").equals(Master.JenisPetugasPelaksana.ASISTEN_SPESIALIS)) {
					if (skor.equals(0.0) && Double.valueOf(mapLayanan.get("hargaDiskon").toString()) > 0.0
							&& (CommonUtil.isNullOrEmpty(mapLayanan.get("statusDiskon"))
									|| Integer.valueOf(mapLayanan.get("statusDiskon").toString()).equals(0))) {
						mapLayanan.remove("noRec");
						mapLayanan.remove("statusDiskon");
						mapLayanan.remove("departemenId");
						mapLayanan.remove("ruanganId");
						mapLayanan.remove("hargaDiskon");
						result.add(mapLayanan);
					} else if (!skor.equals(0.0) && Double.valueOf(mapLayanan.get("hargaDiskon").toString()) == 0.0) {
						mapLayanan.remove("noRec");
						mapLayanan.remove("statusDiskon");
						mapLayanan.remove("departemenId");
						mapLayanan.remove("ruanganId");
						mapLayanan.remove("hargaDiskon");
						result.add(mapLayanan);
					}
				} else if (!idJenisPetugas.equals(Master.JenisPetugasPelaksana.ASISTEN_SPESIALIS)
						&& !mapLayanan.get("jenisPetugasId").equals(Master.JenisPetugasPelaksana.ASISTEN_SPESIALIS)) {
					if (skor.equals(0.0) && Double.valueOf(mapLayanan.get("hargaDiskon").toString()) > 0.0
							&& (CommonUtil.isNullOrEmpty(mapLayanan.get("statusDiskon"))
									|| Integer.valueOf(mapLayanan.get("statusDiskon").toString()).equals(0))) {
						mapLayanan.remove("noRec");
						mapLayanan.remove("statusDiskon");
						mapLayanan.remove("departemenId");
						mapLayanan.remove("ruanganId");
						mapLayanan.remove("hargaDiskon");
						result.add(mapLayanan);
					} else if (!skor.equals(0.0) && Double.valueOf(mapLayanan.get("hargaDiskon").toString()) == 0.0) {
						mapLayanan.remove("noRec");
						mapLayanan.remove("statusDiskon");
						mapLayanan.remove("departemenId");
						mapLayanan.remove("ruanganId");
						mapLayanan.remove("hargaDiskon");
						result.add(mapLayanan);
					}
				}
			} else if (idIndikator.equals(Master.IndikatorKinerjaLuarJamKerja.KONSUL_REG)
					&& mapLayanan.get("namaProduk").toString().toLowerCase().contains(Master.KONSUL)) {
				if (idJenisPetugas.equals(Master.JenisPetugasPelaksana.ASISTEN_SPESIALIS)
						&& mapLayanan.get("jenisPetugasId").equals(Master.JenisPetugasPelaksana.ASISTEN_SPESIALIS)) {
					if (skor.equals(0.0) && Double.valueOf(mapLayanan.get("hargaDiskon").toString()) > 0.0
							&& (CommonUtil.isNullOrEmpty(mapLayanan.get("statusDiskon"))
									|| Integer.valueOf(mapLayanan.get("statusDiskon").toString()).equals(0))) {
						mapLayanan.remove("noRec");
						mapLayanan.remove("statusDiskon");
						mapLayanan.remove("departemenId");
						mapLayanan.remove("ruanganId");
						mapLayanan.remove("hargaDiskon");
						result.add(mapLayanan);
					} else if (!skor.equals(0.0) && Double.valueOf(mapLayanan.get("hargaDiskon").toString()) == 0.0) {
						mapLayanan.remove("noRec");
						mapLayanan.remove("statusDiskon");
						mapLayanan.remove("departemenId");
						mapLayanan.remove("ruanganId");
						mapLayanan.remove("hargaDiskon");
						result.add(mapLayanan);
					}
				} else if (!idJenisPetugas.equals(Master.JenisPetugasPelaksana.ASISTEN_SPESIALIS)
						&& !mapLayanan.get("jenisPetugasId").equals(Master.JenisPetugasPelaksana.ASISTEN_SPESIALIS)) {
					if (skor.equals(0.0) && Double.valueOf(mapLayanan.get("hargaDiskon").toString()) > 0.0
							&& (CommonUtil.isNullOrEmpty(mapLayanan.get("statusDiskon"))
									|| Integer.valueOf(mapLayanan.get("statusDiskon").toString()).equals(0))) {
						mapLayanan.remove("noRec");
						mapLayanan.remove("statusDiskon");
						mapLayanan.remove("departemenId");
						mapLayanan.remove("ruanganId");
						mapLayanan.remove("hargaDiskon");
						result.add(mapLayanan);
					} else if (!skor.equals(0.0) && Double.valueOf(mapLayanan.get("hargaDiskon").toString()) == 0.0) {
						mapLayanan.remove("noRec");
						mapLayanan.remove("statusDiskon");
						mapLayanan.remove("departemenId");
						mapLayanan.remove("ruanganId");
						mapLayanan.remove("hargaDiskon");
						result.add(mapLayanan);
					}
				}
			} else if (idIndikator.equals(Master.IndikatorKinerjaLuarJamKerja.TINDAKAN_EKS)
					&& listRuangEks.contains(mapLayanan.get("ruanganId"))) {
				if (idJenisPetugas.equals(Master.JenisPetugasPelaksana.ASISTEN_SPESIALIS)
						&& mapLayanan.get("jenisPetugasId").equals(Master.JenisPetugasPelaksana.ASISTEN_SPESIALIS)) {
					if (skor.equals(0.0) && Double.valueOf(mapLayanan.get("hargaDiskon").toString()) > 0.0
							&& (CommonUtil.isNullOrEmpty(mapLayanan.get("statusDiskon"))
									|| Integer.valueOf(mapLayanan.get("statusDiskon").toString()).equals(0))) {
						mapLayanan.remove("noRec");
						mapLayanan.remove("statusDiskon");
						mapLayanan.remove("departemenId");
						mapLayanan.remove("ruanganId");
						mapLayanan.remove("hargaDiskon");
						result.add(mapLayanan);
					} else if (!skor.equals(0.0) && Double.valueOf(mapLayanan.get("hargaDiskon").toString()) == 0.0) {
						mapLayanan.remove("noRec");
						mapLayanan.remove("statusDiskon");
						mapLayanan.remove("departemenId");
						mapLayanan.remove("ruanganId");
						mapLayanan.remove("hargaDiskon");
						result.add(mapLayanan);
					}
				} else if (!idJenisPetugas.equals(Master.JenisPetugasPelaksana.ASISTEN_SPESIALIS)
						&& !mapLayanan.get("jenisPetugasId").equals(Master.JenisPetugasPelaksana.ASISTEN_SPESIALIS)) {
					if (skor.equals(0.0) && Double.valueOf(mapLayanan.get("hargaDiskon").toString()) > 0.0
							&& (CommonUtil.isNullOrEmpty(mapLayanan.get("statusDiskon"))
									|| Integer.valueOf(mapLayanan.get("statusDiskon").toString()).equals(0))) {
						mapLayanan.remove("noRec");
						mapLayanan.remove("statusDiskon");
						mapLayanan.remove("departemenId");
						mapLayanan.remove("ruanganId");
						mapLayanan.remove("hargaDiskon");
						result.add(mapLayanan);
					} else if (!skor.equals(0.0) && Double.valueOf(mapLayanan.get("hargaDiskon").toString()) == 0.0) {
						mapLayanan.remove("noRec");
						mapLayanan.remove("statusDiskon");
						mapLayanan.remove("departemenId");
						mapLayanan.remove("ruanganId");
						mapLayanan.remove("hargaDiskon");
						result.add(mapLayanan);
					}
				}
			} else if (idIndikator.equals(Master.IndikatorKinerjaLuarJamKerja.TINDAKAN_GADAR)
					&& mapLayanan.get("departemenId").equals(Master.Departemen.IGD)) {
				if (idJenisPetugas.equals(Master.JenisPetugasPelaksana.ASISTEN_SPESIALIS)
						&& mapLayanan.get("jenisPetugasId").equals(Master.JenisPetugasPelaksana.ASISTEN_SPESIALIS)) {
					if (skor.equals(0.0) && Double.valueOf(mapLayanan.get("hargaDiskon").toString()) > 0.0
							&& (CommonUtil.isNullOrEmpty(mapLayanan.get("statusDiskon"))
									|| Integer.valueOf(mapLayanan.get("statusDiskon").toString()).equals(0))) {
						mapLayanan.remove("noRec");
						mapLayanan.remove("statusDiskon");
						mapLayanan.remove("departemenId");
						mapLayanan.remove("ruanganId");
						mapLayanan.remove("hargaDiskon");
						result.add(mapLayanan);
					} else if (!skor.equals(0.0) && Double.valueOf(mapLayanan.get("hargaDiskon").toString()) == 0.0) {
						mapLayanan.remove("noRec");
						mapLayanan.remove("statusDiskon");
						mapLayanan.remove("departemenId");
						mapLayanan.remove("ruanganId");
						mapLayanan.remove("hargaDiskon");
						result.add(mapLayanan);
					}
				} else if (!idJenisPetugas.equals(Master.JenisPetugasPelaksana.ASISTEN_SPESIALIS)
						&& !mapLayanan.get("jenisPetugasId").equals(Master.JenisPetugasPelaksana.ASISTEN_SPESIALIS)) {
					if (skor.equals(0.0) && Double.valueOf(mapLayanan.get("hargaDiskon").toString()) > 0.0
							&& (CommonUtil.isNullOrEmpty(mapLayanan.get("statusDiskon"))
									|| Integer.valueOf(mapLayanan.get("statusDiskon").toString()).equals(0))) {
						mapLayanan.remove("noRec");
						mapLayanan.remove("statusDiskon");
						mapLayanan.remove("departemenId");
						mapLayanan.remove("ruanganId");
						mapLayanan.remove("hargaDiskon");
						result.add(mapLayanan);
					} else if (!skor.equals(0.0) && Double.valueOf(mapLayanan.get("hargaDiskon").toString()) == 0.0) {
						mapLayanan.remove("noRec");
						mapLayanan.remove("statusDiskon");
						mapLayanan.remove("departemenId");
						mapLayanan.remove("ruanganId");
						mapLayanan.remove("hargaDiskon");
						result.add(mapLayanan);
					}
				}
			} else if (idIndikator.equals(Master.IndikatorKinerjaLuarJamKerja.TINDAKAN_OPS)
					&& mapLayanan.get("ruanganId").equals(Master.Ruangan.OK)) {
				if (idJenisPetugas.equals(Master.JenisPetugasPelaksana.ASISTEN_SPESIALIS)
						&& mapLayanan.get("jenisPetugasId").equals(Master.JenisPetugasPelaksana.ASISTEN_SPESIALIS)) {
					if (skor.equals(0.0) && Double.valueOf(mapLayanan.get("hargaDiskon").toString()) > 0.0
							&& (CommonUtil.isNullOrEmpty(mapLayanan.get("statusDiskon"))
									|| Integer.valueOf(mapLayanan.get("statusDiskon").toString()).equals(0))) {
						mapLayanan.remove("noRec");
						mapLayanan.remove("statusDiskon");
						mapLayanan.remove("departemenId");
						mapLayanan.remove("ruanganId");
						mapLayanan.remove("hargaDiskon");
						result.add(mapLayanan);
					} else if (!skor.equals(0.0) && Double.valueOf(mapLayanan.get("hargaDiskon").toString()) == 0.0) {
						mapLayanan.remove("noRec");
						mapLayanan.remove("statusDiskon");
						mapLayanan.remove("departemenId");
						mapLayanan.remove("ruanganId");
						mapLayanan.remove("hargaDiskon");
						result.add(mapLayanan);
					}
				} else if (!idJenisPetugas.equals(Master.JenisPetugasPelaksana.ASISTEN_SPESIALIS)
						&& !mapLayanan.get("jenisPetugasId").equals(Master.JenisPetugasPelaksana.ASISTEN_SPESIALIS)) {
					if (skor.equals(0.0) && Double.valueOf(mapLayanan.get("hargaDiskon").toString()) > 0.0
							&& (CommonUtil.isNullOrEmpty(mapLayanan.get("statusDiskon"))
									|| Integer.valueOf(mapLayanan.get("statusDiskon").toString()).equals(0))) {
						mapLayanan.remove("noRec");
						mapLayanan.remove("statusDiskon");
						mapLayanan.remove("departemenId");
						mapLayanan.remove("ruanganId");
						mapLayanan.remove("hargaDiskon");
						result.add(mapLayanan);
					} else if (!skor.equals(0.0) && Double.valueOf(mapLayanan.get("hargaDiskon").toString()) == 0.0) {
						mapLayanan.remove("noRec");
						mapLayanan.remove("statusDiskon");
						mapLayanan.remove("departemenId");
						mapLayanan.remove("ruanganId");
						mapLayanan.remove("hargaDiskon");
						result.add(mapLayanan);
					}
				}
			} else if (idIndikator.equals(Master.IndikatorKinerjaLuarJamKerja.TINDAKAN_REG)
					&& !listKonsulTapiVisit.contains(mapLayanan.get("produkId"))
					&& !mapLayanan.get("namaProduk").toString().toLowerCase().contains(Master.VISIT)
					&& !mapLayanan.get("namaProduk").toString().toLowerCase().contains(Master.KONSUL)
					&& !listRuangEks.contains(mapLayanan.get("ruanganId"))
					&& !mapLayanan.get("departemenId").equals(Master.Departemen.IGD)
					&& !mapLayanan.get("ruanganId").equals(Master.Ruangan.OK)) {
				if (idJenisPetugas.equals(Master.JenisPetugasPelaksana.ASISTEN_SPESIALIS)
						&& mapLayanan.get("jenisPetugasId").equals(Master.JenisPetugasPelaksana.ASISTEN_SPESIALIS)) {
					if (skor.equals(0.0) && Double.valueOf(mapLayanan.get("hargaDiskon").toString()) > 0.0
							&& (CommonUtil.isNullOrEmpty(mapLayanan.get("statusDiskon"))
									|| Integer.valueOf(mapLayanan.get("statusDiskon").toString()).equals(0))) {
						mapLayanan.remove("noRec");
						mapLayanan.remove("statusDiskon");
						mapLayanan.remove("departemenId");
						mapLayanan.remove("ruanganId");
						mapLayanan.remove("hargaDiskon");
						result.add(mapLayanan);
					} else if (!skor.equals(0.0) && Double.valueOf(mapLayanan.get("hargaDiskon").toString()) == 0.0) {
						mapLayanan.remove("noRec");
						mapLayanan.remove("statusDiskon");
						mapLayanan.remove("departemenId");
						mapLayanan.remove("ruanganId");
						mapLayanan.remove("hargaDiskon");
						result.add(mapLayanan);
					}
				} else if (!idJenisPetugas.equals(Master.JenisPetugasPelaksana.ASISTEN_SPESIALIS)
						&& !mapLayanan.get("jenisPetugasId").equals(Master.JenisPetugasPelaksana.ASISTEN_SPESIALIS)) {
					if (skor.equals(0.0) && Double.valueOf(mapLayanan.get("hargaDiskon").toString()) > 0.0
							&& (CommonUtil.isNullOrEmpty(mapLayanan.get("statusDiskon"))
									|| Integer.valueOf(mapLayanan.get("statusDiskon").toString()).equals(0))) {
						mapLayanan.remove("noRec");
						mapLayanan.remove("statusDiskon");
						mapLayanan.remove("departemenId");
						mapLayanan.remove("ruanganId");
						mapLayanan.remove("hargaDiskon");
						result.add(mapLayanan);
					} else if (!skor.equals(0.0) && Double.valueOf(mapLayanan.get("hargaDiskon").toString()) == 0.0) {
						mapLayanan.remove("noRec");
						mapLayanan.remove("statusDiskon");
						mapLayanan.remove("departemenId");
						mapLayanan.remove("ruanganId");
						mapLayanan.remove("hargaDiskon");
						result.add(mapLayanan);
					}
				}
			}
		}

		return result;
	}

	@Override
	public Map<String, Object> findPenilaianKinerja(Integer idPegawai, Integer idJabatan, Long bulan)
			throws JpaSystemException {
		Map<String, Object> result = new HashMap<>();

		DateFormat mf = new SimpleDateFormat("yyyy-MM");

		DecimalFormat df = new DecimalFormat("0.00");
		df.setRoundingMode(RoundingMode.HALF_UP);

		List<Map<String, Object>> data = logbookKinerjaDao.findPenilaianKinerja(idPegawai, idJabatan,
				mf.format(new Date(bulan)));

		double tBobot = 0.00;
		double tHasil = 0.00;
		for (Integer idJenisIndikator : Arrays.asList(Master.Remunerasi.JENIS_INDIKATOR)) {
			Map<String, Object> jiData = new HashMap<>();
			List<Map<String, Object>> jiDetail = new ArrayList<>();
			double jiBobot = 0.00;
			double jiHasil = 0.00;
			for (Map<String, Object> map : data) {
				if (idJenisIndikator.equals(map.get("jenisIndikatorId"))) {
					String nilai = df.format(Double.valueOf(map.get("realisasi").toString())
							/ Double.valueOf(map.get("target").toString()));
					String hasil = df.format(Double.parseDouble(nilai) * Double.valueOf(map.get("bobot").toString()));
					map.put("nilai", Double.parseDouble(nilai));
					map.put("hasil", Double.parseDouble(hasil));
					jiDetail.add(map);

					jiBobot += Double.valueOf(map.get("bobot").toString());
					jiHasil += Double.valueOf(map.get("hasil").toString());

					tBobot += Double.valueOf(map.get("bobot").toString());
					tHasil += Double.valueOf(map.get("hasil").toString());
				}
			}
			jiData.put("detail", jiDetail);
			jiData.put("stBobot", jiBobot);
			jiData.put("stHasil", jiHasil);

			if (idJenisIndikator == 1) {
				result.put("kuantitas", jiData);
			} else if (idJenisIndikator == 2) {
				result.put("kualitas", jiData);
			} else if (idJenisIndikator == 3) {
				result.put("perilaku", jiData);
			}
		}

		Double iki = 0.0;
		String kriteria = "-";
		Map<String, Object> acuanIndeks = tabelAcuanIndeksIKIDao.findIKI(Double.parseDouble(df.format(tHasil)));
		if (CommonUtil.isNotNullOrEmpty(acuanIndeks)) {
			iki = Double.valueOf(acuanIndeks.get("indeks").toString());
			kriteria = acuanIndeks.get("kriteria").toString();
		}

		result.put("tBobot", tBobot);
		result.put("tHasil", Double.parseDouble(df.format(tHasil)));
		result.put("iki", iki);
		result.put("kriteria", kriteria);

		return result;
	}

	@Override
	public List<Map<String, Object>> findRekapPenilaianKinerja(Long bulan, Integer idUnitKerja, Integer idSubunitKerja,
			Integer idPegawai) throws JpaSystemException {
		List<Map<String, Object>> result = new ArrayList<>();
		List<Map<String, Object>> data = new ArrayList<>();
		List<Map<String, Object>> recapData = new ArrayList<>();
		List<Integer> listIdUnitKerja = new ArrayList<>();
		List<Integer> listIdSubunitKerja = new ArrayList<>();
		List<Integer> listIdPegawai = new ArrayList<>();
		List<Integer> listIdJabatan = new ArrayList<>();

		DecimalFormatSymbols formatRp = new DecimalFormatSymbols();
		formatRp.setCurrencySymbol("Rp");
		formatRp.setMonetaryDecimalSeparator(',');
		formatRp.setGroupingSeparator('.');

		DecimalFormat kursINA = (DecimalFormat) DecimalFormat.getCurrencyInstance();
		kursINA.setDecimalFormatSymbols(formatRp);

		DateFormat mf = new SimpleDateFormat("yyyy-MM");
		DateFormat yf = new SimpleDateFormat("yyyy");

		DecimalFormat df = new DecimalFormat("0.00");
		df.setRoundingMode(RoundingMode.HALF_UP);

		List<Map<String, Object>> anggaran = anggaranRemunerasiDao.findAnggaran(yf.format(new Date(bulan)));

		List<Map<String, Object>> acuanIndeks = tabelAcuanIndeksIKIDao.findAllAcuanIndeks();

		if (CommonUtil.isNotNullOrEmpty(bulan) && CommonUtil.isNullOrEmpty(idUnitKerja)
				&& CommonUtil.isNullOrEmpty(idSubunitKerja) && CommonUtil.isNullOrEmpty(idPegawai)) {
			data = logbookKinerjaDao.findPenilaianKinerja(mf.format(new Date(bulan)));
		} else if (CommonUtil.isNotNullOrEmpty(bulan) && CommonUtil.isNotNullOrEmpty(idUnitKerja)
				&& CommonUtil.isNullOrEmpty(idSubunitKerja) && CommonUtil.isNullOrEmpty(idPegawai)) {
			data = logbookKinerjaDao.findPenilaianKinerjaUnitKerja(mf.format(new Date(bulan)), idUnitKerja);
		} else if (CommonUtil.isNotNullOrEmpty(bulan) && CommonUtil.isNotNullOrEmpty(idUnitKerja)
				&& CommonUtil.isNotNullOrEmpty(idSubunitKerja) && CommonUtil.isNullOrEmpty(idPegawai)) {
			data = logbookKinerjaDao.findPenilaianKinerjaSubunitKerja(mf.format(new Date(bulan)), idUnitKerja,
					idSubunitKerja);
		} else if (CommonUtil.isNotNullOrEmpty(bulan) && CommonUtil.isNullOrEmpty(idUnitKerja)
				&& CommonUtil.isNullOrEmpty(idSubunitKerja) && CommonUtil.isNotNullOrEmpty(idPegawai)) {
			data = logbookKinerjaDao.findPenilaianKinerjaPegawai(mf.format(new Date(bulan)), idPegawai);
		} else if (CommonUtil.isNotNullOrEmpty(bulan) && CommonUtil.isNotNullOrEmpty(idUnitKerja)
				&& CommonUtil.isNotNullOrEmpty(idSubunitKerja) && CommonUtil.isNotNullOrEmpty(idPegawai)) {
			data = logbookKinerjaDao.findPenilaianKinerjaPegawai(mf.format(new Date(bulan)), idUnitKerja,
					idSubunitKerja, idPegawai);
		}

		for (Map<String, Object> map : data) {
			if (!listIdUnitKerja.contains(map.get("unitKerjaId"))) {
				listIdUnitKerja.add(Integer.valueOf(map.get("unitKerjaId").toString()));
			}
			if (!listIdSubunitKerja.contains(map.get("subunitKerjaId"))) {
				listIdSubunitKerja.add(Integer.valueOf(map.get("subunitKerjaId").toString()));
			}
			if (!listIdPegawai.contains(map.get("pegawaiId"))) {
				listIdPegawai.add(Integer.valueOf(map.get("pegawaiId").toString()));
			}
			if (!listIdJabatan.contains(map.get("jabatanId"))) {
				listIdJabatan.add(Integer.valueOf(map.get("jabatanId").toString()));
			}
		}

		for (Integer idUK : listIdUnitKerja) {
			for (Integer idSK : listIdSubunitKerja) {
				for (Integer idP : listIdPegawai) {
					for (Integer idJ : listIdJabatan) {
						Map<String, Object> rsMap = new HashMap<>();
						double tHasil = 0.00;
						for (Integer idJI : Arrays.asList(Master.Remunerasi.JENIS_INDIKATOR)) {
							double jiBobot = 0.00;
							double jiHasil = 0.00;
							for (Map<String, Object> map : data) {
								if (idUK.equals(map.get("unitKerjaId")) && idSK.equals(map.get("subunitKerjaId"))
										&& idP.equals(map.get("pegawaiId")) && idJ.equals(map.get("jabatanId"))
										&& idJI.equals(map.get("jenisIndikatorId"))) {
									String nilai = df.format(Double.valueOf(map.get("realisasi").toString())
											/ Double.valueOf(map.get("target").toString()));
									String hasil = df.format(
											Double.parseDouble(nilai) * Double.valueOf(map.get("bobot").toString()));

									jiBobot += Double.valueOf(map.get("bobot").toString());
									jiHasil += Double.parseDouble(hasil);
									tHasil += Double.parseDouble(hasil);

									rsMap.put("unitKerjaId", map.get("unitKerjaId"));
									rsMap.put("unitKerja", map.get("unitKerja"));
									rsMap.put("subunitKerjaId", map.get("subunitKerjaId"));
									rsMap.put("subunitKerja", map.get("subunitKerja"));
									rsMap.put("pegawaiId", map.get("pegawaiId"));
									rsMap.put("namaLengkap", map.get("namaLengkap"));
									rsMap.put("jabatanId", map.get("jabatanId"));
									rsMap.put("namaJabatan", map.get("namaJabatan"));
									rsMap.put("nilaiJabatan", map.get("nilaiJabatan"));
								}
							}
							if (idJI == 1) {
								rsMap.put("bobotKuantitas", jiBobot);
								rsMap.put("hasilKuantitas", jiHasil);
							} else if (idJI == 2) {
								rsMap.put("bobotKualitas", jiBobot);
								rsMap.put("hasilKualitas", jiHasil);
							} else if (idJI == 3) {
								rsMap.put("bobotPerilaku", jiBobot);
								rsMap.put("hasilPerilaku", jiHasil);
							}
						}
						if (CommonUtil.isNotNullOrEmpty(rsMap.get("unitKerjaId"))
								&& CommonUtil.isNotNullOrEmpty(rsMap.get("subunitKerjaId"))
								&& CommonUtil.isNotNullOrEmpty(rsMap.get("pegawaiId"))
								&& CommonUtil.isNotNullOrEmpty(rsMap.get("jabatanId"))
								&& CommonUtil.isNotNullOrEmpty(rsMap.get("nilaiJabatan"))) {
							Double iki = 0.00;
							String kriteria = "";
							for (Map<String, Object> aiki : acuanIndeks) {
								if ((Double.valueOf(aiki.get("nilaiBawah").toString()) <= Double
										.parseDouble(df.format(tHasil))
										&& Double.parseDouble(df.format(tHasil)) <= Double
												.valueOf(aiki.get("nilaiAtas").toString()))
										|| (Double.parseDouble(df.format(tHasil)) > 1000
												&& Double.valueOf(aiki.get("nilaiAtas").toString()) == 1000)) {
									iki = Double.valueOf(aiki.get("iki").toString());
									kriteria = aiki.get("kriteria").toString();

									break;
								}
							}
							rsMap.put("totalHasil", Double.parseDouble(df.format(tHasil)));
							rsMap.put("iki", iki);
							rsMap.put("kriteria", kriteria);

							recapData.add(rsMap);
						}
					}
				}
			}
		}

		for (Map<String, Object> rd : recapData) {
			for (Map<String, Object> ag : anggaran) {
				if (rd.get("pegawaiId").equals(ag.get("pegawaiId"))
						&& rd.get("jabatanId").equals(ag.get("jabatanId"))) {
					rd.put("pir", ag.get("pir"));

					break;
				}
			}
			double p1 = Double.valueOf(rd.get("nilaiJabatan").toString()) * Double.valueOf(rd.get("iki").toString())
					* Double.valueOf(rd.get("pir").toString()) * Master.Remunerasi.PERSEN_P1;
			double p2 = Double.valueOf(rd.get("nilaiJabatan").toString()) * Double.valueOf(rd.get("iki").toString())
					* Master.Remunerasi.IKU * Double.valueOf(rd.get("pir").toString()) * Master.Remunerasi.PERSEN_P2;

			rd.put("p1", p1);
			rd.put("p2", p2);

			rd.put("rpP1", kursINA.format(p1).toString());
			rd.put("rpP2", kursINA.format(p2).toString());

			result.add(rd);
		}

		return result;
	}

	@Override
	public void autoVerifLogbookJamKerjaDokter(Date bulan) {
		List<Integer> listDetailJenisProduk = new ArrayList<>();
		List<Integer> listDetailJenisProdukException = new ArrayList<>();

		DateFormat mf = new SimpleDateFormat("yyyy-MM");

		DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");

		DecimalFormat decf = new DecimalFormat("###.###");
		decf.setRoundingMode(RoundingMode.HALF_UP);

		LocalDateTime PSBBDate = LocalDateTime.of(2020, 9, 14, 0, 0, 0);
		LocalDateTime PSBBEnd = LocalDateTime.parse(GetSettingDataFixed("psbbperiod"), dtf);

		Date pssbAwal = Date.from(PSBBDate.atZone(ZoneId.systemDefault()).toInstant());
		Date pssbAkhir = Date.from(PSBBEnd.atZone(ZoneId.systemDefault()).toInstant());

		List<Integer> listRuangEks = splitDataSettingDatafixed("IdRuanganEksekutif");

		List<Integer> listIdNonjadwal = shiftKerjaDao.findListNonjadwal();

		List<Integer> listIdPegawai = logbookKinerjaDao.findPegawaiKontrakByIndikator(mf.format(bulan),
				Master.IndikatorKinerja.PELAYANAN_MEDIS_JAM_KERJA);

		List<Map<String, Object>> dataLayanan = ikiDanRemunerasiDao.getDataLogbookJamKerjaDokter(mf.format(bulan),
				pssbAwal, pssbAkhir, listIdNonjadwal, Master.JenisPegawai.DOKTER, listIdPegawai,
				Arrays.asList(Master.JenisProduk.NONTINDAKAN), Arrays.asList(Master.KelompokPasien.KELOMPOK_BPJS),
				Master.Produk.KARCIS);

		List<Map<String, Object>> dataSkor = skoringTindakanMedisDao.findSkoringLogbookDokter(mf.format(bulan),
				listIdPegawai, Arrays.asList(Master.UnitKerja.KSM));

		// SCORE
		for (Map<String, Object> mapLayanan : dataLayanan) {
			for (Map<String, Object> mapSkor : dataSkor) {
				if (mapLayanan.get("pegawaiId").equals(mapSkor.get("pegawaiId"))
						&& mapLayanan.get("produkId").equals(mapSkor.get("produkId"))
						&& (((Date) mapLayanan.get("tglPelayanan")).after((Date) mapSkor.get("tglMulaiBerlaku"))
								|| ((Date) mapLayanan.get("tglPelayanan"))
										.equals((Date) mapSkor.get("tglMulaiBerlaku")))) {
					mapLayanan.put("skor", mapSkor.get("skor"));
					break;
				}
			}
			if (!mapLayanan.containsKey("skor")) {
				mapLayanan.put("skor", 1.0);
			}
		}

		// RULES
		for (Map<String, Object> mapLayanan : dataLayanan) {
			if (Double.valueOf(mapLayanan.get("hargaDiskon").toString()) > 0.0
					&& (CommonUtil.isNullOrEmpty(mapLayanan.get("statusDiskon"))
							|| Integer.valueOf(mapLayanan.get("statusDiskon").toString()).equals(0))) {
				// tidak_dapat_skor_untuk_diskon_dpjp
				mapLayanan.put("skor", 0.0);
				mapLayanan.put("tSkor", 0.0);
			} else if (!mapLayanan.get("namaProduk").toString().toLowerCase().contains(Master.KONSUL)
					&& !mapLayanan.get("namaProduk").toString().toLowerCase().contains(Master.VISIT)
					&& listRuangEks.contains(mapLayanan.get("ruanganId"))) {
				mapLayanan.put("skor", Double.parseDouble(decf.format(
						Double.valueOf(mapLayanan.get("skor").toString()) * Master.Remunerasi.PERSEN_SKOR_EKSEKUTIF)));
				mapLayanan.put("tSkor", Double.parseDouble(decf.format(Double.valueOf(mapLayanan.get("skor").toString())
						* Double.valueOf(mapLayanan.get("jumlah").toString()))));
			} else if (mapLayanan.get("jenisPetugasId").equals(Master.JenisPetugasPelaksana.ASISTEN_SPESIALIS)) {
				mapLayanan.put("skor", Double.parseDouble(decf.format(Double.valueOf(mapLayanan.get("skor").toString())
						* Master.Remunerasi.PERSEN_SKOR_ASISTEN_SPESIALIS)));
				mapLayanan.put("tSkor", Double.parseDouble(decf.format(Double.valueOf(mapLayanan.get("skor").toString())
						* Double.valueOf(mapLayanan.get("jumlah").toString()))));
			} else {
				mapLayanan.put("skor",
						Double.parseDouble(decf.format(Double.valueOf(mapLayanan.get("skor").toString()))));
				mapLayanan.put("tSkor", Double.parseDouble(decf.format(Double.valueOf(mapLayanan.get("skor").toString())
						* Double.valueOf(mapLayanan.get("jumlah").toString()))));
			}
		}

		List<Integer> laboranRadiologList = mapPegawaiLaboratRadiologiDao.findPegawaiLaboranRadiolog();

		for (Integer idPegawai : listIdPegawai) {
			if (pegawaiDao.getDokterLabPatologiAnatomi().contains(idPegawai)) {
				listDetailJenisProduk = new ArrayList<>(
						Arrays.asList(Master.DetailJenisProduk.PENUNJANG_PATOLOGI_ANATOMI));
			} else if (pegawaiDao.getDokterLabKlinik().contains(idPegawai)) {
				listDetailJenisProduk = new ArrayList<>(
						Arrays.asList(Master.DetailJenisProduk.PENUNJANG_PATOLOGI_KLINIK));
			} else if (pegawaiDao.getDokterRadiologi().contains(idPegawai)) {
				listDetailJenisProduk = new ArrayList<>(Arrays.asList(Master.DetailJenisProduk.PENUNJANG_RADIOLOGI));
			} else {
				listDetailJenisProduk = new ArrayList<>(Arrays.asList(Master.DetailJenisProduk.MEDIS_UTAMA));
			}

			if (laboranRadiologList.contains(idPegawai)) {
				listDetailJenisProdukException = new ArrayList<>(
						Arrays.asList(Master.DetailJenisProduk.ADMINISTRASI_PATOLOGI_KLINIK_EXCEPTION));
				listDetailJenisProdukException.removeAll(listDetailJenisProduk);

				listDetailJenisProduk.addAll(listDetailJenisProdukException);
			}

			double capaian = 0.0;
			for (Map<String, Object> mapLayanan : dataLayanan) {
				if (mapLayanan.get("pegawaiId").equals(idPegawai)
						&& listDetailJenisProduk.contains(mapLayanan.get("detailJenisProdukId"))) {
					capaian += Double.valueOf(mapLayanan.get("tSkor").toString());
				}
			}

			LogbookKinerjaVO vo = new LogbookKinerjaVO();
			PegawaiVO pegawai = new PegawaiVO();
			pegawai.setId(idPegawai);
			vo.setPegawai(pegawai);
			IndikatorKinerjaVO indikator = new IndikatorKinerjaVO();
			indikator.setId(Master.IndikatorKinerja.PELAYANAN_MEDIS_JAM_KERJA);
			vo.setIndikatorKinerja(indikator);
			vo.setBulan(bulan);
			vo.setCapaian(capaian);
			this.autoVerify(vo);
		}
	}

}
