package com.jasamedika.medifirst2000.service.impl;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
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.EvaluasiJabatanDao;
import com.jasamedika.medifirst2000.dao.MapFaktorEvaluasiDao;
import com.jasamedika.medifirst2000.dao.MapPegawaiJabatanToUnitKerjaDao;
import com.jasamedika.medifirst2000.dao.MasterEvaluasiJabatanDao;
import com.jasamedika.medifirst2000.dao.PegawaiDao;
import com.jasamedika.medifirst2000.entities.EvaluasiJabatan;
import com.jasamedika.medifirst2000.entities.FaktorEvaluasi;
import com.jasamedika.medifirst2000.entities.Jabatan;
import com.jasamedika.medifirst2000.entities.MapFaktorEvaluasi;
import com.jasamedika.medifirst2000.entities.MapPegawaiJabatanToUnitKerja;
import com.jasamedika.medifirst2000.entities.MasterEvaluasiJabatan;
import com.jasamedika.medifirst2000.entities.NilaiKelompokJabatan;
import com.jasamedika.medifirst2000.entities.Pegawai;
import com.jasamedika.medifirst2000.entities.Ruangan;
import com.jasamedika.medifirst2000.service.EvaluasiJabatanService;
import com.jasamedika.medifirst2000.util.CommonUtil;
import com.jasamedika.medifirst2000.util.DateHelper;
import com.jasamedika.medifirst2000.util.JsonUtil;
import com.jasamedika.medifirst2000.vo.EvaluasiJabatanVO;
import com.jasamedika.medifirst2000.vo.FaktorEvaluasiVO;
import com.jasamedika.medifirst2000.vo.JabatanVO;
import com.jasamedika.medifirst2000.vo.PegawaiVO;
import com.jasamedika.medifirst2000.vo.RuanganVO;

/**
 * Implement class for EvaluasiJabatanService
 * 
 * @author Generator
 * @param <T>
 */
@Service("evaluasiJabatanService")
public class EvaluasiJabatanServiceImpl extends BaseVoServiceImpl implements EvaluasiJabatanService {

	@Autowired
	private BaseConverterImpl<EvaluasiJabatanVO, EvaluasiJabatan> evaluasiJabatanConverter;

	@Autowired
	private BaseConverterImpl<PegawaiVO, Pegawai> pegawaiConverter;

	@Autowired
	private BaseConverterImpl<RuanganVO, Ruangan> ruanganConverter;

	@Autowired
	private BaseConverterImpl<FaktorEvaluasiVO, FaktorEvaluasi> faktorEvaluasiConverter;

	@Autowired
	private BaseConverterImpl<JabatanVO, Jabatan> jabatanConverter;

	@Autowired
	private EvaluasiJabatanDao evaluasiJabatanDao;

	@Autowired
	private MasterEvaluasiJabatanDao masterEvaluasiJabatanDao;

	@Autowired
	private PegawaiDao pegawaiDao;

	@Autowired
	private MapFaktorEvaluasiDao mapFaktorEvaluasiDao;

	@Autowired
	private MapPegawaiJabatanToUnitKerjaDao mapPegawaiJabatanToUnitKerjaDao;

	@Override
	public Map<String, Object> saveEvaluasiJabatan(EvaluasiJabatanVO vo) {
		Map<String, Object> result = new HashMap<String, Object>();
		EvaluasiJabatan model = new EvaluasiJabatan();

		model = evaluasiJabatanConverter.transferVOToModel(vo, model);
		model.setNoRec(vo.getNoRec());
		model.setBulan(vo.getBulan());
		model.setTahun(vo.getTahun());
		model.setTotalNilai(vo.getTotalNilai());
		model.setTglHitung(new Date());

		// SET DATA JABATAN
		model.setJabatan(jabatanConverter.transferVOToModel(vo.getJabatan(), new Jabatan()));

		// SET DATA PEGAWAI ENTRI
		if (CommonUtil.isNotNullOrEmpty(vo.getPegawaiEntri())) {
			model.setPegawaiEntri(pegawaiConverter.transferVOToModel(vo.getPegawaiEntri(), new Pegawai()));
		}

		// SET GRADE
		NilaiKelompokJabatan nilaiKelompokJabatan = evaluasiJabatanDao
				.findDetailKelompokJabatan(vo.getJabatan().getId(), vo.getTotalNilai().intValue());
		model.setGrade(nilaiKelompokJabatan);

		// SET DATA RUANGAN
		if (CommonUtil.isNotNullOrEmpty(vo.getRuangan())) {
			model.setRuangan(ruanganConverter.transferVOToModel(vo.getRuangan(), new Ruangan()));
		}

		if (CommonUtil.isNotNullOrEmpty(vo.getFaktor1())) {
			model.setFaktor1(faktorEvaluasiConverter.transferVOToModel(vo.getFaktor1(), new FaktorEvaluasi()));
		}
		if (CommonUtil.isNotNullOrEmpty(vo.getFaktor2())) {
			model.setFaktor2(faktorEvaluasiConverter.transferVOToModel(vo.getFaktor2(), new FaktorEvaluasi()));
		}
		if (CommonUtil.isNotNullOrEmpty(vo.getFaktor3())) {
			model.setFaktor3(faktorEvaluasiConverter.transferVOToModel(vo.getFaktor3(), new FaktorEvaluasi()));
		}
		if (CommonUtil.isNotNullOrEmpty(vo.getFaktor4())) {
			model.setFaktor4(faktorEvaluasiConverter.transferVOToModel(vo.getFaktor4(), new FaktorEvaluasi()));
		}
		if (CommonUtil.isNotNullOrEmpty(vo.getFaktor5())) {
			model.setFaktor5(faktorEvaluasiConverter.transferVOToModel(vo.getFaktor5(), new FaktorEvaluasi()));
		}
		if (CommonUtil.isNotNullOrEmpty(vo.getFaktor7())) {
			model.setFaktor7(faktorEvaluasiConverter.transferVOToModel(vo.getFaktor7(), new FaktorEvaluasi()));
		}
		if (CommonUtil.isNotNullOrEmpty(vo.getFaktor8())) {
			model.setFaktor8(faktorEvaluasiConverter.transferVOToModel(vo.getFaktor8(), new FaktorEvaluasi()));
		}
		if (CommonUtil.isNotNullOrEmpty(vo.getFaktor9())) {
			model.setFaktor9(faktorEvaluasiConverter.transferVOToModel(vo.getFaktor9(), new FaktorEvaluasi()));
		}
		if (CommonUtil.isNotNullOrEmpty(vo.getFaktor10())) {
			model.setFaktor10(faktorEvaluasiConverter.transferVOToModel(vo.getFaktor10(), new FaktorEvaluasi()));
		}
		if (CommonUtil.isNotNullOrEmpty(vo.getFaktorA())) {
			model.setFaktorA(faktorEvaluasiConverter.transferVOToModel(vo.getFaktorA(), new FaktorEvaluasi()));
		}
		if (CommonUtil.isNotNullOrEmpty(vo.getFaktorB())) {
			model.setFaktorB(faktorEvaluasiConverter.transferVOToModel(vo.getFaktorB(), new FaktorEvaluasi()));
		}
		if (CommonUtil.isNotNullOrEmpty(vo.getFaktorC())) {
			model.setFaktorC(faktorEvaluasiConverter.transferVOToModel(vo.getFaktorC(), new FaktorEvaluasi()));
		}
		if (CommonUtil.isNotNullOrEmpty(vo.getFaktorD())) {
			model.setFaktorD(faktorEvaluasiConverter.transferVOToModel(vo.getFaktorD(), new FaktorEvaluasi()));
		}
		if (CommonUtil.isNotNullOrEmpty(vo.getFaktorE())) {
			model.setFaktorE(faktorEvaluasiConverter.transferVOToModel(vo.getFaktorE(), new FaktorEvaluasi()));
		}
		if (CommonUtil.isNotNullOrEmpty(vo.getFaktorF())) {
			model.setFaktorF(faktorEvaluasiConverter.transferVOToModel(vo.getFaktorF(), new FaktorEvaluasi()));
		}
		if (CommonUtil.isNotNullOrEmpty(vo.getFaktorG())) {
			model.setFaktorG(faktorEvaluasiConverter.transferVOToModel(vo.getFaktorG(), new FaktorEvaluasi()));
		}
		if (CommonUtil.isNotNullOrEmpty(vo.getFaktorH())) {
			model.setFaktorH(faktorEvaluasiConverter.transferVOToModel(vo.getFaktorH(), new FaktorEvaluasi()));
		}
		if (CommonUtil.isNotNullOrEmpty(vo.getFaktorI())) {
			model.setFaktorI(faktorEvaluasiConverter.transferVOToModel(vo.getFaktorI(), new FaktorEvaluasi()));
		}
		if (CommonUtil.isNotNullOrEmpty(vo.getFaktorJ())) {
			model.setFaktorJ(faktorEvaluasiConverter.transferVOToModel(vo.getFaktorJ(), new FaktorEvaluasi()));
		}
		if (CommonUtil.isNotNullOrEmpty(vo.getFaktorK())) {
			model.setFaktorK(faktorEvaluasiConverter.transferVOToModel(vo.getFaktorK(), new FaktorEvaluasi()));
		}
		if (CommonUtil.isNotNullOrEmpty(vo.getFaktorL())) {
			model.setFaktorL(faktorEvaluasiConverter.transferVOToModel(vo.getFaktorL(), new FaktorEvaluasi()));
		}

		EvaluasiJabatan resultDomain = evaluasiJabatanDao.save(model);
		if (CommonUtil.isNotNullOrEmpty(resultDomain)) {
			result.put("noRec", resultDomain.getNoRec());

			if (CommonUtil.isNotNullOrEmpty(result)) {
				/**
				 * Update data pegawai
				 */
				List<Integer> listIdPegawai = evaluasiJabatanDao
						.findAllPegawaiRemunByJabatan(model.getJabatan().getId());
				List<Pegawai> listPegawai = new ArrayList<>();
				for (Integer idPegawai : listIdPegawai) {
					Pegawai pegawai = pegawaiDao.findOne(idPegawai);
					pegawai.setNilaiJabatan(model.getTotalNilai());
					pegawai.setGrade(Double.valueOf(nilaiKelompokJabatan.getGradeDesc()));
					pegawai.setDetailKelompokJabatan(nilaiKelompokJabatan);
					listPegawai.add(pegawai);
				}
				if (CommonUtil.isNotNullOrEmpty(listPegawai)) {
					pegawaiDao.save(listPegawai);
				}
				/**
				 * Update data jabatan
				 */
				List<MapPegawaiJabatanToUnitKerja> listMapJabatan = new ArrayList<>();
				List<Integer> listIdMapJabatan = evaluasiJabatanDao
						.findAllMappingJabatanRemun(model.getJabatan().getId());
				for (Integer id : listIdMapJabatan) {
					MapPegawaiJabatanToUnitKerja mj = mapPegawaiJabatanToUnitKerjaDao.findOne(id);
					mj.setNilaiJabatan(model.getTotalNilai());
					mj.setGrade(nilaiKelompokJabatan);
					listMapJabatan.add(mj);
				}
				if (CommonUtil.isNotNullOrEmpty(listMapJabatan)) {
					mapPegawaiJabatanToUnitKerjaDao.save(listMapJabatan);
				}
			}
		}

		return result;
	}

	@Override
	@Transactional(readOnly = false)
	public Map<String, Object> saveEvaluasiJabatan(List<EvaluasiJabatanVO> vo) {
		Map<String, Object> result = new HashMap<String, Object>();
		for (EvaluasiJabatanVO evaluasiJabatanVO : vo) {
			result = saveEvaluasiJabatan(evaluasiJabatanVO);
		}
		return result;
	}

	@Override
	public Map<String, Object> findEvaluasiJabatan(Integer tahun, String bulan, Integer ruangan) {
		Map<String, Object> result = new HashMap<String, Object>();
		try {

			result.put("items", JsonUtil.ToMaps(evaluasiJabatanDao.findEvaluasi(bulan, tahun, ruangan)));
		} catch (IllegalArgumentException | IllegalAccessException e) {
			e.printStackTrace();
		}
		return result;
	}

	@Override
	public Map<String, Object> hitungPoinEvaluasi(EvaluasiJabatanVO vo) {
		Map<String, Object> result = new HashMap<String, Object>();
		try {
			EvaluasiJabatan evaluasiJabatan = new EvaluasiJabatan();
			evaluasiJabatan = evaluasiJabatanConverter.transferVOToModel(vo, new EvaluasiJabatan());
			if (CommonUtil.isNotNullOrEmpty(vo.getPegawaiEntri())) {
				evaluasiJabatan
						.setPegawaiEntri(pegawaiConverter.transferVOToModel(vo.getPegawaiEntri(), new Pegawai()));
			}
			if (CommonUtil.isNotNullOrEmpty(vo.getFaktor1())) {
				evaluasiJabatan
						.setFaktor1(faktorEvaluasiConverter.transferVOToModel(vo.getFaktor1(), new FaktorEvaluasi()));
			}
			if (CommonUtil.isNotNullOrEmpty(vo.getFaktor2())) {
				evaluasiJabatan
						.setFaktor2(faktorEvaluasiConverter.transferVOToModel(vo.getFaktor2(), new FaktorEvaluasi()));
			}
			if (CommonUtil.isNotNullOrEmpty(vo.getFaktor3())) {
				evaluasiJabatan
						.setFaktor3(faktorEvaluasiConverter.transferVOToModel(vo.getFaktor3(), new FaktorEvaluasi()));
			}
			if (CommonUtil.isNotNullOrEmpty(vo.getFaktor4())) {
				evaluasiJabatan
						.setFaktor4(faktorEvaluasiConverter.transferVOToModel(vo.getFaktor4(), new FaktorEvaluasi()));
			}
			if (CommonUtil.isNotNullOrEmpty(vo.getFaktor5())) {
				evaluasiJabatan
						.setFaktor5(faktorEvaluasiConverter.transferVOToModel(vo.getFaktor5(), new FaktorEvaluasi()));
			}
			if (CommonUtil.isNotNullOrEmpty(vo.getFaktor7())) {
				evaluasiJabatan
						.setFaktor7(faktorEvaluasiConverter.transferVOToModel(vo.getFaktor7(), new FaktorEvaluasi()));
			}
			if (CommonUtil.isNotNullOrEmpty(vo.getFaktor8())) {
				evaluasiJabatan
						.setFaktor8(faktorEvaluasiConverter.transferVOToModel(vo.getFaktor8(), new FaktorEvaluasi()));
			}
			if (CommonUtil.isNotNullOrEmpty(vo.getFaktor9())) {
				evaluasiJabatan
						.setFaktor9(faktorEvaluasiConverter.transferVOToModel(vo.getFaktor9(), new FaktorEvaluasi()));
			}
			if (CommonUtil.isNotNullOrEmpty(vo.getFaktor10())) {
				evaluasiJabatan
						.setFaktor10(faktorEvaluasiConverter.transferVOToModel(vo.getFaktor10(), new FaktorEvaluasi()));
			}
			if (CommonUtil.isNotNullOrEmpty(vo.getFaktorA())) {
				evaluasiJabatan
						.setFaktorA(faktorEvaluasiConverter.transferVOToModel(vo.getFaktorA(), new FaktorEvaluasi()));
			}
			if (CommonUtil.isNotNullOrEmpty(vo.getFaktorB())) {
				evaluasiJabatan
						.setFaktorB(faktorEvaluasiConverter.transferVOToModel(vo.getFaktorB(), new FaktorEvaluasi()));
			}
			if (CommonUtil.isNotNullOrEmpty(vo.getFaktorC())) {
				evaluasiJabatan
						.setFaktorC(faktorEvaluasiConverter.transferVOToModel(vo.getFaktorC(), new FaktorEvaluasi()));
			}
			if (CommonUtil.isNotNullOrEmpty(vo.getFaktorD())) {
				evaluasiJabatan
						.setFaktorD(faktorEvaluasiConverter.transferVOToModel(vo.getFaktorD(), new FaktorEvaluasi()));
			}
			if (CommonUtil.isNotNullOrEmpty(vo.getFaktorE())) {
				evaluasiJabatan
						.setFaktorE(faktorEvaluasiConverter.transferVOToModel(vo.getFaktorE(), new FaktorEvaluasi()));
			}
			if (CommonUtil.isNotNullOrEmpty(vo.getFaktorF())) {
				evaluasiJabatan
						.setFaktorF(faktorEvaluasiConverter.transferVOToModel(vo.getFaktorF(), new FaktorEvaluasi()));
			}
			if (CommonUtil.isNotNullOrEmpty(vo.getFaktorG())) {
				evaluasiJabatan
						.setFaktorG(faktorEvaluasiConverter.transferVOToModel(vo.getFaktorG(), new FaktorEvaluasi()));
			}
			if (CommonUtil.isNotNullOrEmpty(vo.getFaktorH())) {
				evaluasiJabatan
						.setFaktorH(faktorEvaluasiConverter.transferVOToModel(vo.getFaktorH(), new FaktorEvaluasi()));
			}
			if (CommonUtil.isNotNullOrEmpty(vo.getFaktorI())) {
				evaluasiJabatan
						.setFaktorI(faktorEvaluasiConverter.transferVOToModel(vo.getFaktorI(), new FaktorEvaluasi()));
			}
			if (CommonUtil.isNotNullOrEmpty(vo.getFaktorJ())) {
				evaluasiJabatan
						.setFaktorJ(faktorEvaluasiConverter.transferVOToModel(vo.getFaktorJ(), new FaktorEvaluasi()));
			}
			if (CommonUtil.isNotNullOrEmpty(vo.getFaktorK())) {
				evaluasiJabatan
						.setFaktorK(faktorEvaluasiConverter.transferVOToModel(vo.getFaktorK(), new FaktorEvaluasi()));
			}
			if (CommonUtil.isNotNullOrEmpty(vo.getFaktorL())) {
				evaluasiJabatan
						.setFaktorL(faktorEvaluasiConverter.transferVOToModel(vo.getFaktorL(), new FaktorEvaluasi()));
			}
			if (CommonUtil.isNotNullOrEmpty(vo.getJabatan())) {
				evaluasiJabatan.setJabatan(jabatanConverter.transferVOToModel(vo.getJabatan(), new Jabatan()));
			}

			double total = 0.0;
			NilaiKelompokJabatan getGrade = null;

			try {
				double localTotal = 0.0;
				double p1 = Double.parseDouble(evaluasiJabatan.getFaktor1().getNilai());
				double p2 = Math
						.round(p1 * Double.parseDouble(evaluasiJabatan.getFaktor2().getNilai().replace("%", "")) / 100);
				double p3 = Math
						.round(p1 * Double.parseDouble(evaluasiJabatan.getFaktor3().getNilai().replace("%", "")) / 100);

				double knowHow = p1 + p2 + p3;

				double p4 = Math.round(
						knowHow * Double.parseDouble(evaluasiJabatan.getFaktor4().getNilai().replace("%", "")) / 100);
				double p5 = Math.round(
						knowHow * Double.parseDouble(evaluasiJabatan.getFaktor5().getNilai().replace("%", "")) / 100);

				double problem = p4 + p5;
				Integer i7 = evaluasiJabatan.getFaktor7().getId();
				Integer i8 = evaluasiJabatan.getFaktor8().getId();
				MapFaktorEvaluasi mapFaktorEvaluasi = mapFaktorEvaluasiDao.findMapping(i7, i8);
				double p8 = 0.0;
				if (CommonUtil.isNotNullOrEmpty(mapFaktorEvaluasi)) {
					p8 = mapFaktorEvaluasi.getValue();
				}

				double nilaiPeranDanWewenang = Math
						.round(Double.parseDouble(evaluasiJabatan.getFaktor9().getNilai()) * p8);
				double nilaiAcct = Math.round(nilaiPeranDanWewenang
						* Double.parseDouble(evaluasiJabatan.getFaktor10().getNilai().replace("%", "")) / 100);
				double p6 = Double.parseDouble(evaluasiJabatan.getFaktorA().getNilai())
						+ Double.parseDouble(evaluasiJabatan.getFaktorB().getNilai())
						+ Double.parseDouble(evaluasiJabatan.getFaktorC().getNilai())
						+ Double.parseDouble(evaluasiJabatan.getFaktorD().getNilai())
						+ Double.parseDouble(evaluasiJabatan.getFaktorE().getNilai())
						+ Double.parseDouble(evaluasiJabatan.getFaktorF().getNilai())
						+ Double.parseDouble(evaluasiJabatan.getFaktorG().getNilai())
						+ Double.parseDouble(evaluasiJabatan.getFaktorH().getNilai())
						+ Double.parseDouble(evaluasiJabatan.getFaktorI().getNilai())
						+ Double.parseDouble(evaluasiJabatan.getFaktorJ().getNilai())
						+ Double.parseDouble(evaluasiJabatan.getFaktorK().getNilai())
						+ Double.parseDouble(evaluasiJabatan.getFaktorL().getNilai());
				localTotal = p6 + nilaiAcct + problem + knowHow;
				total += localTotal;

				Integer idJabatan = evaluasiJabatan.getJabatan().getId();
				getGrade = evaluasiJabatanDao.findDetailKelompokJabatan(idJabatan, (int) total);

			} catch (Exception e) {
				e.printStackTrace();
			}

			result.put("result", total);
			if (CommonUtil.isNotNullOrEmpty(getGrade)) {
				result.put("grade", getGrade.getGradeDesc());
				result.put("detailGrade", getGrade.getDetailKelompokJabatan());
			} else {
				result.put("grade", "");
				result.put("detailGrade", "");
			}

		} catch (IllegalArgumentException e) {
			e.printStackTrace();
		}
		return result;
	}

	public NilaiKelompokJabatan getGrade(Integer idJabatan, Double nilaiTotal) {
		NilaiKelompokJabatan grade = null;
		List<NilaiKelompokJabatan> list = evaluasiJabatanDao.findGrade(idJabatan);
		for (NilaiKelompokJabatan nilaiKelompokJabatanList : list) {
			if (nilaiTotal >= nilaiKelompokJabatanList.getNilaiTerendah().doubleValue()
					&& nilaiTotal <= nilaiKelompokJabatanList.getNilaiTertinggi().doubleValue()) {
				grade = nilaiKelompokJabatanList;
			}
		}

		return grade;
	}

	@Override
	public Map<String, Object> findEvaluasiJabatanTahunBulan(Integer tahun, String bulan) {
		List<MasterEvaluasiJabatan> list = masterEvaluasiJabatanDao.findEvaluasiTahunBulanList(tahun, bulan);
		Map<String, Object> result = new HashMap<String, Object>();
		result.put("data", list);
		return result;
	}

	@Override
	public Map<String, Object> findEvaluasiJabatanTahun(Integer tahun) {
		List<Map<String, Object>> list = masterEvaluasiJabatanDao.findMasterEvaluasiJabatanList();
		// bulan tahun jabatanId
		List<MasterEvaluasiJabatan> listResut = new ArrayList<>();
		for (Map<String, Object> map : list) {
			String bulan = DateHelper.toMonthName(map.get("bulan").toString());
			Integer tahunDb = Integer.parseInt(map.get("tahun").toString());
			Integer idJabatan = Integer.parseInt(map.get("jabatanId").toString());
			MasterEvaluasiJabatan masterEvaluasiJabatan = masterEvaluasiJabatanDao
					.findEvaluasiByJabatanTahunBulan(idJabatan, tahunDb, bulan);
			listResut.add(masterEvaluasiJabatan);
		}
		Map<String, Object> result = new HashMap<String, Object>();
		result.put("data", listResut);
		return result;
	}

	@Override
	public Map<String, Object> findPegawaiByTahun(Integer tahun) {
		Map<String, Object> result = new HashMap<String, Object>();
		try {

			List<EvaluasiJabatan> list = evaluasiJabatanDao.findByTahun(tahun);
			double total = 0.0;
			for (EvaluasiJabatan evaluasiJabatan : list) {

				try

				{

					double localTotal = 0.0;
					double p1 = Double.parseDouble(evaluasiJabatan.getFaktor1().getNilai());
					double p2 = Math.round(
							(p1 * Double.parseDouble(evaluasiJabatan.getFaktor2().getNilai().replace("%", "")) / 100));
					double p3 = Math.round(
							(p1 * Double.parseDouble(evaluasiJabatan.getFaktor3().getNilai().replace("%", "")) / 100));

					double knowHow = p1 + p2 + p3;

					double p4 = (knowHow * Double.parseDouble(evaluasiJabatan.getFaktor4().getNilai().replace("%", ""))
							/ 100);
					double p5 = (knowHow * Double.parseDouble(evaluasiJabatan.getFaktor5().getNilai().replace("%", ""))
							/ 100);

					double problem = p4 + p5;
					Integer i7 = evaluasiJabatan.getFaktor7().getId();
					Integer i8 = evaluasiJabatan.getFaktor8().getId();
					MapFaktorEvaluasi mapFaktorEvaluasi = mapFaktorEvaluasiDao.findMapping(i7, i8);
					double p8 = mapFaktorEvaluasi.getValue();

					double nilaiPeranDanWewenang = Math
							.round(Double.parseDouble(evaluasiJabatan.getFaktor9().getNilai()) * p8);
					double nilaiAcct = (nilaiPeranDanWewenang
							* Double.parseDouble(evaluasiJabatan.getFaktor10().getNilai().replace("%", "")) / 100);
					double p6 = Double.parseDouble(evaluasiJabatan.getFaktorA().getNilai())
							+ Double.parseDouble(evaluasiJabatan.getFaktorB().getNilai())
							+ Double.parseDouble(evaluasiJabatan.getFaktorC().getNilai())
							+ Double.parseDouble(evaluasiJabatan.getFaktorD().getNilai())
							+ Double.parseDouble(evaluasiJabatan.getFaktorE().getNilai())
							+ Double.parseDouble(evaluasiJabatan.getFaktorF().getNilai())
							+ Double.parseDouble(evaluasiJabatan.getFaktorG().getNilai())
							+ Double.parseDouble(evaluasiJabatan.getFaktorH().getNilai())
							+ Double.parseDouble(evaluasiJabatan.getFaktorI().getNilai())
							+ Double.parseDouble(evaluasiJabatan.getFaktorJ().getNilai())
							+ Double.parseDouble(evaluasiJabatan.getFaktorK().getNilai())
							+ Double.parseDouble(evaluasiJabatan.getFaktorL().getNilai());
					localTotal = p6 + nilaiAcct + problem + knowHow;
					total += localTotal;
				} catch (Exception e) {

				}

			}
			result.put("result", total);
		} catch (IllegalArgumentException e) {
			e.printStackTrace();
		}
		return result;
	}

	@Override
	public Map<String, Object> CountEvaluasi(Integer tahun) {
		return null;
	}

	@Override
	public Map<String, Object> findPegawaiByTahun(Integer tahun, Integer idPegawai) {
		Map<String, Object> result = new HashMap<String, Object>();
		try {

			List<EvaluasiJabatan> list = evaluasiJabatanDao.findByTahunAndPegawaiId(tahun, idPegawai);
			double total = 0.0;
			for (EvaluasiJabatan evaluasiJabatan : list) {

				try

				{

					double localTotal = 0.0;
					double p1 = Double.parseDouble(evaluasiJabatan.getFaktor1().getNilai());
					double p2 = Math.round(
							p1 * Double.parseDouble(evaluasiJabatan.getFaktor2().getNilai().replace("%", "")) / 100);
					double p3 = Math.round(
							p1 * Double.parseDouble(evaluasiJabatan.getFaktor3().getNilai().replace("%", "")) / 100);

					double knowHow = p1 + p2 + p3;

					double p4 = Math.round(knowHow
							* Double.parseDouble(evaluasiJabatan.getFaktor4().getNilai().replace("%", "")) / 100);
					double p5 = Math.round(knowHow
							* Double.parseDouble(evaluasiJabatan.getFaktor5().getNilai().replace("%", "")) / 100);

					double problem = p4 + p5;
					Integer i7 = evaluasiJabatan.getFaktor7().getId();
					Integer i8 = evaluasiJabatan.getFaktor8().getId();
					MapFaktorEvaluasi mapFaktorEvaluasi = mapFaktorEvaluasiDao.findMapping(i7, i8);
					double p8 = mapFaktorEvaluasi.getValue();

					double nilaiPeranDanWewenang = Math
							.round(Double.parseDouble(evaluasiJabatan.getFaktor9().getNilai()) * p8);
					double nilaiAcct = (nilaiPeranDanWewenang
							* Double.parseDouble(evaluasiJabatan.getFaktor10().getNilai().replace("%", "")) / 100);
					double p6 = Double.parseDouble(evaluasiJabatan.getFaktorA().getNilai())
							+ Double.parseDouble(evaluasiJabatan.getFaktorB().getNilai())
							+ Double.parseDouble(evaluasiJabatan.getFaktorC().getNilai())
							+ Double.parseDouble(evaluasiJabatan.getFaktorD().getNilai())
							+ Double.parseDouble(evaluasiJabatan.getFaktorE().getNilai())
							+ Double.parseDouble(evaluasiJabatan.getFaktorF().getNilai())
							+ Double.parseDouble(evaluasiJabatan.getFaktorG().getNilai())
							+ Double.parseDouble(evaluasiJabatan.getFaktorH().getNilai())
							+ Double.parseDouble(evaluasiJabatan.getFaktorI().getNilai())
							+ Double.parseDouble(evaluasiJabatan.getFaktorJ().getNilai())
							+ Double.parseDouble(evaluasiJabatan.getFaktorK().getNilai())
							+ Double.parseDouble(evaluasiJabatan.getFaktorL().getNilai());
					localTotal = p6 + nilaiAcct + problem + knowHow;
					total += localTotal;
				} catch (Exception e) {

				}
			}
			result.put("result", total);
		} catch (IllegalArgumentException e) {
			e.printStackTrace();
		}
		return result;
	}

	@Override
	public List<Map<String, Object>> findActiveEvaluasiJabatan() {
		List<Map<String, Object>> result = new ArrayList<>();

		List<Map<String, Object>> distinctData = evaluasiJabatanDao.findDistinctEvaluasiJabatan();
		List<Map<String, Object>> data = evaluasiJabatanDao.findAllEvaluasiJabatan();

		for (Map<String, Object> param : distinctData) {
			for (Map<String, Object> map : data) {
				if (param.get("idJabatan").equals(map.get("idJabatan"))) {
					result.add(map);
					break;
				}
			}
		}

		return result;
	}

	@Override
	public List<Map<String, Object>> findAllEvaluasiJabatan() {
		List<Map<String, Object>> result = new ArrayList<>();

		result = evaluasiJabatanDao.findAllEvaluasiJabatan();

		return result;
	}

}
