package com.jasamedika.medifirst2000.service.impl;

import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.UUID;

import org.apache.commons.codec.binary.Base64;
import org.apache.commons.lang.time.DateUtils;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.jasamedika.medifirst2000.dao.GolonganPegawaiDao;
import com.jasamedika.medifirst2000.dao.JenisGajiDao;
import com.jasamedika.medifirst2000.dao.KelompokTransaksiDao;
import com.jasamedika.medifirst2000.dao.KomponenHargaDao;
import com.jasamedika.medifirst2000.dao.ObjekPajakDao;
import com.jasamedika.medifirst2000.dao.PayRollPegawaiDao;
import com.jasamedika.medifirst2000.dao.PegawaiDao;
import com.jasamedika.medifirst2000.dao.RekananDao;
import com.jasamedika.medifirst2000.dao.RuanganDao;
import com.jasamedika.medifirst2000.dao.RunningNumberDao;
import com.jasamedika.medifirst2000.dao.StrukHistoriDao;
import com.jasamedika.medifirst2000.dao.StrukPelayananDao;
import com.jasamedika.medifirst2000.dto.FileUploadExcelDto;
import com.jasamedika.medifirst2000.dto.KomponenDto;
import com.jasamedika.medifirst2000.dto.PayRollDto;
import com.jasamedika.medifirst2000.dto.PayRollUangMakanDto;
import com.jasamedika.medifirst2000.entities.GolonganPegawai;
import com.jasamedika.medifirst2000.entities.JenisGaji;
import com.jasamedika.medifirst2000.entities.KelompokTransaksi;
import com.jasamedika.medifirst2000.entities.KomponenHarga;
import com.jasamedika.medifirst2000.entities.ObjekPajak;
import com.jasamedika.medifirst2000.entities.Pegawai;
import com.jasamedika.medifirst2000.entities.PegawaiHistoriRekap;
import com.jasamedika.medifirst2000.entities.PegawaiHistoriRekapGaji;
import com.jasamedika.medifirst2000.entities.Ruangan;
import com.jasamedika.medifirst2000.entities.RunningNumber;
import com.jasamedika.medifirst2000.entities.StrukHistori;
import com.jasamedika.medifirst2000.entities.StrukPelayanan;
import com.jasamedika.medifirst2000.service.PayRollPegawaiService;
import com.jasamedika.medifirst2000.util.AgeCalculator;
import com.jasamedika.medifirst2000.util.CommonUtil;
import com.jasamedika.medifirst2000.util.DateUtil;
import com.jasamedika.medifirst2000.util.StringUtil;

@Service("PayRollPegawaiService")
public class PayRollPegawaiServiceImpl extends BaseVoServiceImpl implements PayRollPegawaiService {
	
	private final Logger LOG = LoggerFactory.getLogger(PayRollPegawaiServiceImpl.class);
	
	@Value("${reportDirectory}")
	String reportDirectory;
	
	@Autowired
	private RunningNumberDao runningNumberDao;
	
	@Autowired
	private PayRollPegawaiDao payRollPegawaiDao;
	
	@Autowired
	private RuanganDao ruanganDao;
	
	@Autowired
	private KelompokTransaksiDao kelompokTransaksiDao;
	
	@Autowired
	private JenisGajiDao jenisGajiDao;
	
	@Autowired
	private KomponenHargaDao komponenHargaDao;

	@Autowired
	private StrukPelayananDao strukPelayananDao;
	
	@Autowired
	private PegawaiDao pegawaiDao;
	
	@Autowired
	private StrukHistoriDao strukHistoriDao;
	
	@Autowired
	private ObjekPajakDao objekPajakDao;
	
	@Autowired
	private GolonganPegawaiDao golonganPegawaiDao;

	@Autowired
	private RekananDao rekananDao;

	@Transactional(readOnly = false)
	private String getRunningNumber(String kegunaan) {
		RunningNumber runningNumber = runningNumberDao.findByResetAndKegunaan("0", kegunaan);
		if(runningNumber==null)
		{
			runningNumber = new RunningNumber();
			runningNumber.setKegunaan(kegunaan);
			runningNumber.setReset("0");
			runningNumber.setNomerTerbaru((Integer)0);
		}
		Integer number=(runningNumber.getNomerTerbaru()+(Integer)1);
		runningNumber.setNomerTerbaru(runningNumber.getNomerTerbaru()+(Integer)1);
		String noOrderIntern = StringUtil.formatNumber(number.toString(), 10);
		return noOrderIntern;
	}
	
	@Override	//blu=9 dan pkwt=10
	@Transactional(readOnly=false)
	public List<Map<String, Object>> prosesPegawaiBluPkwt(Integer idDetailKategoriPegawai,Integer idJenisGaji,String periode,Date tglHistori){
		List<Map<String, Object>> result2=new ArrayList<Map<String,Object>>();
		List<Map<String, Object>> result=payRollPegawaiDao.findPegawaiByDetailKategori(idDetailKategoriPegawai);
		String noGaji=getRunningNumber("Struk Histori");
		String noGaji2=noGaji;
		for(Map<String,Object> mapL:result){
			List<Map<String, Object>> listKomponen=new ArrayList<Map<String,Object>>();
			Integer pendidikanId=(Integer) mapL.get("pendidikanId");
			Integer jabatanId=(Integer) mapL.get("jabatanId");
			Integer pegawaiId=(Integer) mapL.get("pegawaiId");
			Integer levelTingkatId=(Integer) mapL.get("levelTingkatId");
			Integer golonganPegawaiId=(Integer) mapL.get("golonganPegawaiId");
			Date tglMasuk=(Date) mapL.get("tglMasuk");
			int tahun=AgeCalculator.calculateAge2(new Date(), tglMasuk).getYears();
			int bulan=AgeCalculator.calculateAge2(new Date(), tglMasuk).getMonths();
			Integer rangeId=10;
			System.out.println("=================");
			System.out.println("idPegawai : "+pegawaiId);
			System.out.println("idDetailKategoriPegawai : "+idDetailKategoriPegawai);
			System.out.println("pendidikanId : "+pendidikanId);
			System.out.println("jabatanId : "+jabatanId);
			System.out.println("golonganPegawaiId : "+golonganPegawaiId);
			System.out.println("tglMasuk : "+tglMasuk);
			System.out.println("=================");
			Double hargaMakape=0.0;
			Double hargaJa=0.0;
			Double hargaJape=0.0;
			Double hargaLtja=0.0;
			Double hargaPajak=0.0;
			Integer hitungRange=10;
			if(tglMasuk!=null){
				if(idDetailKategoriPegawai==9){
					System.out.println("MASA KERJA TAHUN : "+tahun);
					Map<String,Object> mapRange=payRollPegawaiDao.findRangeId(Integer.valueOf(tahun));
					rangeId=(Integer)mapRange.get("id");
					System.out.println("rangeId 9 : "+rangeId);
				}else if(idDetailKategoriPegawai==10){
					rangeId=null;
					System.out.println("rangeId 10 : "+rangeId);
				}
			}else{
			}
			List<Map<String, Object>> gajiMakape=new ArrayList<>();
			if(idDetailKategoriPegawai==9){
				gajiMakape=payRollPegawaiDao.findGajiByMakape(idDetailKategoriPegawai, rangeId,pendidikanId);
			}else if(idDetailKategoriPegawai==10){
				gajiMakape=payRollPegawaiDao.findGajiByMakape(idDetailKategoriPegawai,pendidikanId);
			}
			Map<String,Object> mapHargaMakape=new HashMap<String,Object>();
			if(!gajiMakape.isEmpty()){
				for(Map<String,Object> abc:gajiMakape){
					hargaMakape=(Double) abc.get("hargaSatuan");
					Integer komponenHargaId=(Integer) abc.get("komponenHargaId");
					System.out.println("komponenHargaId : "+komponenHargaId);
					String namaKomponen = getKomponenHarga(komponenHargaId);
					mapHargaMakape.put("komponenHargaId", komponenHargaId);
					mapHargaMakape.put("namaKomponen", namaKomponen);
					mapHargaMakape.put("harga", hargaMakape);
				}
				listKomponen.add(mapHargaMakape);
			}
			List<Map<String, Object>> gajiJape=payRollPegawaiDao.findGajiByJaPe(jabatanId,pendidikanId);
			Map<String,Object> mapHargaJape=new HashMap<String,Object>();
			if(!gajiJape.isEmpty()){
				for(Map<String,Object> abc:gajiJape){
					hargaJape=(Double) abc.get("hargaSatuan");
					Integer komponenHargaId=(Integer) abc.get("komponenHargaId");
					System.out.println("komponenHargaId : "+komponenHargaId);
					String namaKomponen = getKomponenHarga(komponenHargaId);
					mapHargaJape.put("komponenHargaId", komponenHargaId);
					mapHargaJape.put("namaKomponen", namaKomponen);
					mapHargaJape.put("harga", hargaJape);
				}
				listKomponen.add(mapHargaJape);
			}
			if(levelTingkatId==null)
				levelTingkatId=1;
			List<Map<String, Object>> gajiLtja=payRollPegawaiDao.findGajiByLTJa(jabatanId, levelTingkatId);
			Map<String,Object> mapHargaLtja=new HashMap<String,Object>();
			if(!gajiLtja.isEmpty()){
				for(Map<String,Object> abc:gajiLtja){
					hargaLtja=(Double) abc.get("hargaSatuan");
					Integer komponenHargaId=(Integer) abc.get("komponenHargaId");
					System.out.println("komponenHargaId : "+komponenHargaId);
					String namaKomponen = getKomponenHarga(komponenHargaId);
					mapHargaLtja.put("komponenHargaId", komponenHargaId);
					mapHargaLtja.put("namaKomponen", namaKomponen);
					mapHargaLtja.put("harga", hargaLtja);
				}
				listKomponen.add(mapHargaLtja);
			}
			Double totalHargaHitungPajak=hargaMakape+hargaJa+hargaJape+hargaLtja;
			List<Map<String, Object>> gajiPajak=payRollPegawaiDao.findGajiByPajak(42, golonganPegawaiId,18);
			Map<String,Object> mapHargaPajak=new HashMap<String,Object>();
			if(!gajiPajak.isEmpty()){
				Double persenPajak=0.0;
				for(Map<String,Object> abc:gajiPajak){
					persenPajak=(Double) abc.get("persenPajak");
					hargaPajak=(persenPajak/100.00)*totalHargaHitungPajak;
					//Tunjangan PPH
					KomponenHarga komponenHarga=komponenHargaDao.findOne(62);
					if(!(persenPajak==0.0)){
						Integer komponenHargaId=(Integer) abc.get("objekPajakId");
						System.out.println("OBJECT PAJAK ID : "+komponenHargaId);
						String namaKomponen = getObjectPajak(komponenHargaId);
						mapHargaPajak.put("komponenHargaId", komponenHarga.getId());
						mapHargaPajak.put("namaKomponen", komponenHarga.getKomponenHarga());
						mapHargaPajak.put("harga", hargaPajak);
					}else{
						ObjekPajak pajak=objekPajakDao.findOne(42);
						mapHargaPajak.put("komponenHargaId", komponenHarga.getId());
						mapHargaPajak.put("namaKomponen", komponenHarga.getKomponenHarga());
						mapHargaPajak.put("harga", 0.0);
					}
				}
				//if(!(persenPajak==0.0)){
					listKomponen.add(mapHargaPajak);
				//}
			}
			

			Double totalHarga=hargaMakape+hargaJa+hargaJape+hargaLtja-hargaPajak;
			Double potonganPajak=hargaPajak;
			Double hargaKotor=hargaMakape+hargaJa+hargaJape+hargaLtja+hargaPajak;
			Double hargaBersih=hargaKotor-potonganPajak;

			Map<String,Object> mapPotonganPajak=new HashMap<String,Object>();
			//Potongan PPh
			KomponenHarga komponenHargaPotonganPajak=komponenHargaDao.findOne(66);
			mapPotonganPajak.put("komponenHargaId", komponenHargaPotonganPajak.getId());
			mapPotonganPajak.put("namaKomponen", komponenHargaPotonganPajak.getKomponenHarga());
			mapPotonganPajak.put("harga", potonganPajak);
			listKomponen.add(mapPotonganPajak);
			
			Map<String,Object> mapGajiKotor=new HashMap<String,Object>();
			//Gaji Kotor
			KomponenHarga komponenHargaGajiKotor=komponenHargaDao.findOne(78);
			mapGajiKotor.put("komponenHargaId", komponenHargaGajiKotor.getId());
			mapGajiKotor.put("namaKomponen", komponenHargaGajiKotor.getKomponenHarga());
			mapGajiKotor.put("harga", hargaKotor);
			listKomponen.add(mapGajiKotor);
			
			mapL.put("masaKerja", String.valueOf(tahun)+" Tahun "+String.valueOf(bulan)+" Bulan ");
			mapL.put("komponenGaji", "");
			mapL.put("hargaKotor", hargaKotor);
			mapL.put("potonganPajak", potonganPajak);
			mapL.put("harga", hargaBersih);
			mapL.put("noGaji", noGaji2);
			mapL.put("jenisGajiId",idJenisGaji);
			mapL.put("isVerifikasi",0);
			if(tglHistori!=null)
				mapL.put("tglHistori", tglHistori);
			else
				mapL.put("tglHistori", new Date());
			mapL.put("periode",periode);
			mapL.put("komponen", listKomponen);
			result2.add(mapL);
		}
		return result2;		
	}

	private String getKomponenHarga(Integer komponenHargaId) {
		Map<String,Object> mapNamaKomponen=payRollPegawaiDao.findKomponenHargaNameById(komponenHargaId);
		String namaKomponen=(String) mapNamaKomponen.get("komponenHarga");
		return namaKomponen;
	}
	
	private String getObjectPajak(Integer objectPajakId) {
		Map<String,Object> mapNamaKomponen=payRollPegawaiDao.findObjekPajakById(objectPajakId);
		String namaKomponen=(String) mapNamaKomponen.get("objekPajak");
		return namaKomponen;
	}

	@Override
	@Transactional(readOnly=false)
	public List<PayRollDto> save(List<PayRollDto> dtos){
		System.out.println("saveeeeeeeeeee");
		StrukHistori strukHistori=new StrukHistori();
		
		Ruangan ruangan = ruanganDao.findById(213);
		if (ruangan != null) {
			strukHistori.setRuangan(ruangan);
		}
		
		KelompokTransaksi kelompokTransaksi = kelompokTransaksiDao.findById(52);
		if (kelompokTransaksi != null) {
			strukHistori.setKelompokTransaksi(kelompokTransaksi);
		}
		Set<PegawaiHistoriRekap> historiRekapList = new HashSet<>();
		Set<PegawaiHistoriRekapGaji> historiRekapGajiList = new HashSet<>();

		for(PayRollDto abcd:dtos){
			getPeriodeAndTglHistori(strukHistori, abcd);
			JenisGaji jenisGaji = jenisGajiDao.findById(abcd.getJenisGajiId());
			if(jenisGaji!=null){
				strukHistori.setJenisGaji(jenisGaji);
			}
			strukHistori.setNonHistori(abcd.getNoGaji());		
			PegawaiHistoriRekap historiRekap = new PegawaiHistoriRekap();
			Pegawai pegawai=pegawaiDao.findById(abcd.getPegawaiId());
			historiRekap.setPegawai(pegawai);
			historiRekap.setStrukHistory(strukHistori);
			historiRekap.setTotalHargaGajiAdd(new BigDecimal(abcd.getHarga().doubleValue()));
			StrukPelayanan strukPelayanan = new StrukPelayanan();
			strukPelayanan.setNostruk(getRunningNumber("StrukPelayanan"));
			strukPelayanan.setTotalharusdibayar(abcd.getHarga());
			strukPelayanan.setNoSBKLastId("");
			// set pegawai
			strukPelayanan.setObjectPegawaiPenerimaId(pegawai.getId());
			strukPelayanan.setNamapegawaipenerima(pegawai.getNamaLengkap());
			strukPelayanan = strukPelayananDao.save(strukPelayanan);
			historiRekap.setNoStrukPelayanan(strukPelayanan);
			historiRekap.setNoStrukPelayananId(strukPelayanan.getNostruk());
			historiRekapList.add(historiRekap);
			strukHistori.setPegawaiHistoriRekap(historiRekapList);
			for(KomponenDto abcde:abcd.getKomponen()){
				PegawaiHistoriRekapGaji rekapGaji = new PegawaiHistoriRekapGaji();
				rekapGaji.setStrukHistory(strukHistori);
				rekapGaji.setPeriode(abcd.getPeriode());
				rekapGaji.setPegawai(pegawai);
				KomponenHarga komponenHarga = komponenHargaDao.findOne(abcde.getKomponenHargaId());
				if (komponenHarga != null) {
					rekapGaji.setKomponenHarga(komponenHarga);
				}
				rekapGaji.setHargaSatuan(new BigDecimal(abcde.getHarga().doubleValue()));
				rekapGaji.setQtyKomponenHarga(1);
				historiRekapGajiList.add(rekapGaji);
			}
			strukHistori.setRekapGaji(historiRekapGajiList);
		}
		strukHistori = strukHistoriDao.save(strukHistori);
		return dtos;
	}

	private void getPeriodeAndTglHistori(StrukHistori strukHistori, PayRollDto abcd) {
		String periode=abcd.getPeriode();
		String bulanPeriode=periode.split("-")[0];
		String tahunPeriode=periode.split("-")[1];
		String dateS=tahunPeriode+"-"+bulanPeriode+"-01";
		System.out.println("PERIODEEEEE 1 : "+dateS);
		Date date=DateUtil.toDate(dateS);
		System.out.println("PERIODEEEEE 2 : "+date);
		Date startDate = DateUtil.getFirstLastDateOfMonth(date, true);
		Date endDate = DateUtil.getFirstLastDateOfMonth(date, false);
		strukHistori.setTglHistori(abcd.getTglHistori());
		System.out.println("PERIODEEEEE 2 : "+date);
		strukHistori.setTglAwal(startDate);
		strukHistori.setTglAhir(endDate);
	}
	
	private void getPeriodeAndTglHistoriUangMakan(StrukHistori strukHistori, PayRollUangMakanDto abcd) {
		String periode=abcd.getPeriode();
		String bulanPeriode=periode.split("-")[0];
		String tahunPeriode=periode.split("-")[1];
		String dateS=tahunPeriode+"-"+bulanPeriode+"-01";
		System.out.println("PERIODEEEEE 1 : "+dateS);
		Date date=DateUtil.toDate(dateS);
		System.out.println("PERIODEEEEE 2 : "+date);
		Date startDate = DateUtil.getFirstLastDateOfMonth(date, true);
		Date endDate = DateUtil.getFirstLastDateOfMonth(date, false);
		strukHistori.setTglHistori(abcd.getTglHistori());
		System.out.println("PERIODEEEEE 2 : "+date);
		strukHistori.setTglAwal(startDate);
		strukHistori.setTglAhir(endDate);
	}

	@Override
	public List<Map<String, Object>> findDetailKategoryPegawaiBluPkwt(List<Integer> ids){
		List<Map<String,Object>> result=payRollPegawaiDao.findDetailKategoryPegawaiBluPkwt(ids);
		return result;
	}

	@Override
	public List<Map<String, Object>> findAllJenisGaji(){
		List<Map<String,Object>> result=payRollPegawaiDao.findAllJenisGaji();
		return result;
	}
	
	@Override
	@Transactional(readOnly=false)
	public List<Map<String, Object>> prosesUangMakanPegawai(Integer idDetailKategoriPegawai,Integer idJenisGaji,String periode,String uangMakanOrHarianLepas,Date tglHistori){
		List<Map<String, Object>> result2=new ArrayList<Map<String,Object>>();
		List<Map<String, Object>> result=payRollPegawaiDao.findPegawaiByDetailKategori(idDetailKategoriPegawai);
		String noGaji=getRunningNumber("Struk Histori");
		String noGaji2=noGaji;
		for(Map<String,Object> mapL:result){
			List<Map<String, Object>> listKomponen=new ArrayList<Map<String,Object>>();
			Integer pendidikanId=(Integer) mapL.get("pendidikanId");
			Integer jabatanId=(Integer) mapL.get("jabatanId");
			Integer pegawaiId=(Integer) mapL.get("pegawaiId");
			Integer levelTingkatId=(Integer) mapL.get("levelTingkatId");
			Integer golonganPegawaiId=(Integer) mapL.get("golonganPegawaiId");
			Integer kelompokShifId=(Integer) mapL.get("kelompokShiftId");
			Date tglMasuk=(Date) mapL.get("tglMasuk");
			int tahun=AgeCalculator.calculateAge2(new Date(), tglMasuk).getYears();
			int bulan=AgeCalculator.calculateAge2(new Date(), tglMasuk).getMonths();
			Integer rangeId=null;
			System.out.println("=================");
			System.out.println("idPegawai : "+pegawaiId);
			System.out.println("idDetailKategoriPegawai : "+idDetailKategoriPegawai);
			System.out.println("pendidikanId : "+pendidikanId);
			System.out.println("jabatanId : "+jabatanId);
			System.out.println("golonganPegawaiId : "+golonganPegawaiId);
			System.out.println("levelTingkatId : "+levelTingkatId);
			System.out.println("kelompokShifId : "+kelompokShifId);
			System.out.println("=================");
			Double hargaUangMakan=0.0;
			Double hargaUpahHarian=0.0;
			Double hargaPajak=0.0;
			Map<String,Object> mapRange=payRollPegawaiDao.findRangeId(Integer.valueOf(tahun));
			if(mapRange!=null)
				rangeId=(Integer)mapRange.get("id");
			else
				rangeId=10;
			
			List<Map<String, Object>> gajiUangMakan=new ArrayList<Map<String, Object>>();
			List<Map<String, Object>> gajiUpahHarian=new ArrayList<Map<String, Object>>();
			if(uangMakanOrHarianLepas.equals("uangmakan"))
				gajiUangMakan=payRollPegawaiDao.findGajiByGolongan(golonganPegawaiId,55);
			else if(uangMakanOrHarianLepas.equals("harianlepas")){
				gajiUangMakan=payRollPegawaiDao.findGajiByGolongan(golonganPegawaiId,55);
				gajiUpahHarian=payRollPegawaiDao.findGajiHarianLepas(79);
			}
			Integer komponenHargaUangMakanId=0;
			Map<String,Object> mapHargaUangMakan=new HashMap<String,Object>();
			if(!gajiUangMakan.isEmpty()){
				for(Map<String,Object> abc:gajiUangMakan){
					hargaUangMakan=(Double) abc.get("hargaSatuan");
					Integer komponenHargaId=(Integer) abc.get("komponenHargaId");
					String namaKomponen = getKomponenHarga(komponenHargaId);
					mapHargaUangMakan.put("komponenHargaId", komponenHargaId);
					mapHargaUangMakan.put("namaKomponen", namaKomponen);
					mapHargaUangMakan.put("harga", hargaUangMakan);
					komponenHargaUangMakanId=komponenHargaId;
				}
				listKomponen.add(mapHargaUangMakan);
			}
			Integer komponenHargaUpahHarianId=0;
			Map<String,Object> mapHargaUpahHarian=new HashMap<String,Object>();
			if(!gajiUpahHarian.isEmpty()){
				for(Map<String,Object> abc:gajiUpahHarian){
					hargaUpahHarian=(Double) abc.get("hargaSatuan");
					Integer komponenHargaId=(Integer) abc.get("komponenHargaId");
					String namaKomponen = getKomponenHarga(komponenHargaId);
					mapHargaUpahHarian.put("komponenHargaId", komponenHargaId);
					mapHargaUpahHarian.put("namaKomponen", namaKomponen);
					mapHargaUpahHarian.put("harga", hargaUpahHarian);
					komponenHargaUpahHarianId=komponenHargaId;
				}
				listKomponen.add(mapHargaUpahHarian);
			}
			Long jumlahHadir=0L;		
			List<Integer> komponenIndexs=new ArrayList<Integer>();
			if(kelompokShifId!=null){
				List<Map<String,Object>> listKomponenIndex=payRollPegawaiDao.findKomponenIndexByIdKelompokShift(kelompokShifId);
				for(Map<String,Object> map:listKomponenIndex){
					Integer komponenIndex=(Integer) map.get("komponenIndexId");
					komponenIndexs.add(komponenIndex);
				}
				//for(Integer inttt:komponenIndexs){
				//	System.out.println("komponen index : "+inttt);
				//}
				String periodeBulan=periode.split("-")[0];
				Map<String,Object> mapJumlahHari=payRollPegawaiDao.getJumlahHari(komponenIndexs, new Integer(213), pegawaiId, periode);
				if(mapJumlahHari!=null)
				jumlahHadir=(Long) mapJumlahHari.get("sumNilaiIndex");
			}else{
				
			}
			Double totalUangMakan=hargaUangMakan*jumlahHadir;
			Double totalUpahHarian=hargaUpahHarian*jumlahHadir;
			Double totalHargaHitungPajak=totalUangMakan+totalUpahHarian;
			List<Map<String, Object>> gajiPajak=payRollPegawaiDao.findGajiByPajak(42, golonganPegawaiId,18);
			Map<String,Object> mapHargaPajak=new HashMap<String,Object>();
			Integer komponenHargaPajakId=0;
			if(!gajiPajak.isEmpty()){
				Double persenPajak=0.0;
				for(Map<String,Object> abc:gajiPajak){
					persenPajak=(Double) abc.get("persenPajak");
					hargaPajak=(persenPajak/100.00)*totalHargaHitungPajak;
					Integer komponenHargaId=(Integer) abc.get("objekPajakId");
					System.out.println("OBJECT PAJAK ID : "+komponenHargaId);
					String namaKomponen = getObjectPajak(komponenHargaId);
					mapHargaPajak.put("komponenHargaId", komponenHargaId);
					mapHargaPajak.put("namaKomponen", namaKomponen);
					mapHargaPajak.put("harga", hargaPajak);
					//Potongan PPh
					komponenHargaPajakId=66;
				}
					listKomponen.add(mapHargaPajak);
			}
			Double jumlahKotor=totalUangMakan+totalUpahHarian+hargaPajak;
			Double jumlahBersih=jumlahKotor-hargaPajak;
			mapL.put("masaKerja", String.valueOf(tahun)+" Tahun "+String.valueOf(bulan)+" Bulan ");
			mapL.put("jumlahHadir", jumlahHadir);
			if(uangMakanOrHarianLepas.equals("uangmakan")){
				mapL.put("tarif", hargaUangMakan);
			}else if(uangMakanOrHarianLepas.equals("harianlepas")){
				mapL.put("tarif", hargaUpahHarian);	
				mapL.put("jumlahUang", totalUpahHarian);
				mapL.put("tarifUangMakanPerHari",hargaUangMakan);
				mapL.put("uangMakan",totalUangMakan);
			}
			mapL.put("jumlahKotor", jumlahKotor);
			mapL.put("pph", hargaPajak);
			mapL.put("jumlahBersih", jumlahBersih);
			mapL.put("noGaji", noGaji2);
			mapL.put("jenisGajiId",idJenisGaji);
			mapL.put("isVerifikasi",0);
			if(tglHistori!=null)
				mapL.put("tglHistori", tglHistori);
			else
				mapL.put("tglHistori", new Date());
			mapL.put("periode",periode);
			if(uangMakanOrHarianLepas.equals("uangmakan")){
				mapL.put("komponenHargaUangMakanId",komponenHargaUangMakanId);
			}else if(uangMakanOrHarianLepas.equals("harianlepas")){
				mapL.put("komponenHargaUangMakanId",komponenHargaUangMakanId);
				mapL.put("komponenHargaHarianLepasId",komponenHargaUpahHarianId);
			}
			mapL.put("komponenHargaPajakId",komponenHargaPajakId);
						
			result2.add(mapL);
		}
		return result2;		
	}

	@Override
	@Transactional(readOnly=false)
	public List<PayRollUangMakanDto> saveUangMakan(List<PayRollUangMakanDto> dtos,String uangMakanOrHarianLepas){
		StrukHistori strukHistori=new StrukHistori();
		
		Ruangan ruangan = ruanganDao.findById(213); //ruangan sdm
		if (ruangan != null) {
			strukHistori.setRuangan(ruangan);
		}
		
		KelompokTransaksi kelompokTransaksi =null;
		if(uangMakanOrHarianLepas.equals("uangmakan"))
			kelompokTransaksi = kelompokTransaksiDao.findById(54); //kelompok transaksi uang makan id 54
		else if(uangMakanOrHarianLepas.equals("harianlepas"))
			kelompokTransaksi = kelompokTransaksiDao.findById(53); //kelompok transaksi harian lepas id 55
		else if(uangMakanOrHarianLepas.equals("tunjanganlayanan"))
			kelompokTransaksi = kelompokTransaksiDao.findById(55); //kelompok transaksi tunjangan layanan dokter & psikologi pkwt id 54
		if (kelompokTransaksi != null) {
			strukHistori.setKelompokTransaksi(kelompokTransaksi);
		}
		Set<PegawaiHistoriRekap> historiRekapList = new HashSet<>();
		Set<PegawaiHistoriRekapGaji> historiRekapGajiList = new HashSet<>();

		for(PayRollUangMakanDto abcd:dtos){
			getPeriodeAndTglHistoriUangMakan(strukHistori, abcd);
			JenisGaji jenisGaji = jenisGajiDao.findById(abcd.getJenisGajiId());
			if(jenisGaji!=null){
				strukHistori.setJenisGaji(jenisGaji);
			}
			strukHistori.setNonHistori(abcd.getNoGaji());		
			PegawaiHistoriRekap historiRekap = new PegawaiHistoriRekap();
			Pegawai pegawai=pegawaiDao.findById(abcd.getPegawaiId());
			historiRekap.setPegawai(pegawai);
			historiRekap.setStrukHistory(strukHistori);
			historiRekap.setTotalHargaGajiAdd(new BigDecimal(abcd.getJumlahBersih().doubleValue()));
			StrukPelayanan strukPelayanan = new StrukPelayanan();
			strukPelayanan.setNostruk(getRunningNumber("StrukPelayanan"));
			strukPelayanan.setTotalharusdibayar(abcd.getJumlahBersih());
			strukPelayanan.setNoSBKLastId("");
			// set pegawai
			strukPelayanan.setObjectPegawaiPenerimaId(pegawai.getId());
			strukPelayanan.setNamapegawaipenerima(pegawai.getNamaLengkap());
			strukPelayanan = strukPelayananDao.save(strukPelayanan);
			historiRekap.setNoStrukPelayanan(strukPelayanan);
			historiRekap.setNoStrukPelayananId(strukPelayanan.getNostruk());
			historiRekapList.add(historiRekap);
			strukHistori.setPegawaiHistoriRekap(historiRekapList);
			// uang makan ato harianlepas ato tunjanganlayanan
			if(uangMakanOrHarianLepas.equals("harianlepas") || uangMakanOrHarianLepas.equals("tunjanganlayanan")){
				PegawaiHistoriRekapGaji rekapGaji = new PegawaiHistoriRekapGaji();
				rekapGaji.setStrukHistory(strukHistori);
				rekapGaji.setPeriode(abcd.getPeriode());
				rekapGaji.setPegawai(pegawai);
				KomponenHarga komponenHarga=null;
				if(uangMakanOrHarianLepas.equals("uangmakan"))
					komponenHarga=komponenHargaDao.findOne(abcd.getKomponenHargaUangMakanId());
				else if(uangMakanOrHarianLepas.equals("harianlepas")){
					komponenHarga=komponenHargaDao.findOne(abcd.getKomponenHargaHarianLepasId());	
				}
				else if(uangMakanOrHarianLepas.equals("tunjanganlayanan"))
					komponenHarga=komponenHargaDao.findOne(abcd.getKomponenHargaTunjanganLayananId());	
				if (komponenHarga != null) {
					rekapGaji.setKomponenHarga(komponenHarga);
				}
				if(uangMakanOrHarianLepas.equals("uangmakan"))
					rekapGaji.setHargaSatuan(new BigDecimal(abcd.getTarif().doubleValue()));
				else if(uangMakanOrHarianLepas.equals("harianlepas")){
					rekapGaji.setHargaSatuan(new BigDecimal(abcd.getJumlahUang().doubleValue()));
				}else if(uangMakanOrHarianLepas.equals("tunjanganlayanan"))
					rekapGaji.setHargaSatuan(new BigDecimal(abcd.getTarif().doubleValue()));
				rekapGaji.setQtyKomponenHarga(1);
				historiRekapGajiList.add(rekapGaji);
			}
			//uang makan untuk harian lepas
			if(uangMakanOrHarianLepas.equals("harianlepas")){
				PegawaiHistoriRekapGaji rekapGajiUangMakan = new PegawaiHistoriRekapGaji();
				rekapGajiUangMakan.setStrukHistory(strukHistori);
				rekapGajiUangMakan.setPeriode(abcd.getPeriode());
				rekapGajiUangMakan.setPegawai(pegawai);
				KomponenHarga komponenHargaUangMakan=komponenHargaDao.findOne(abcd.getKomponenHargaUangMakanId());
				if (komponenHargaUangMakan != null) {
					rekapGajiUangMakan.setKomponenHarga(komponenHargaUangMakan);
				}
				rekapGajiUangMakan.setHargaSatuan(new BigDecimal(abcd.getUangMakan().doubleValue()));
				rekapGajiUangMakan.setQtyKomponenHarga(1);
				historiRekapGajiList.add(rekapGajiUangMakan);
			}
			// pajak : ppn
			PegawaiHistoriRekapGaji rekapGajiPajak = new PegawaiHistoriRekapGaji();
			rekapGajiPajak.setStrukHistory(strukHistori);
			rekapGajiPajak.setPeriode(abcd.getPeriode());
			rekapGajiPajak.setPegawai(pegawai);
			KomponenHarga komponenHargaPajak = komponenHargaDao.findOne(abcd.getKomponenHargaPajakId());
			if (komponenHargaPajak != null) {
				rekapGajiPajak.setKomponenHarga(komponenHargaPajak);
			}
			rekapGajiPajak.setHargaSatuan(new BigDecimal(abcd.getPph().doubleValue()));
			rekapGajiPajak.setQtyKomponenHarga(1);
			historiRekapGajiList.add(rekapGajiPajak);				
			//Gaji Kotor
			if(uangMakanOrHarianLepas.equals("uangmakan") || uangMakanOrHarianLepas.equals("harianlepas")){
				PegawaiHistoriRekapGaji rekapGajiKotor = new PegawaiHistoriRekapGaji();
				rekapGajiKotor.setStrukHistory(strukHistori);
				rekapGajiKotor.setPeriode(abcd.getPeriode());
				rekapGajiKotor.setPegawai(pegawai);
				KomponenHarga komponenHargaKotor = komponenHargaDao.findOne(78);
				if (komponenHargaKotor != null) {
					rekapGajiKotor.setKomponenHarga(komponenHargaKotor);
				}
				rekapGajiKotor.setHargaSatuan(new BigDecimal(abcd.getJumlahKotor().doubleValue()));
				rekapGajiKotor.setQtyKomponenHarga(1);
				historiRekapGajiList.add(rekapGajiKotor);
			}
			strukHistori.setRekapGaji(historiRekapGajiList);
		}
		strukHistori = strukHistoriDao.save(strukHistori);
		return dtos;
	}

	@Override
	@Transactional(readOnly=false)
	public List<PayRollUangMakanDto> importUangMakan(Integer idKategoryPegawai, Integer idJenisGaji, String periode, String fileExcel,Date tglHistori,FileUploadExcelDto dtos) {
		List<Map<String,Object>> listResult=new ArrayList<Map<String,Object>>();
		//nomakan,tgl,bln,thn,kdsatker,kdanak,kdsubanak,nip,kdgol,gol,nmpeg,jmlhari,tarif,kotor,pph,bersih,rekening,lembar
		String noGaji=getRunningNumber("Struk Histori");
		String noGaji2=noGaji;
		String fileInput=dtos.getFileInput();//new String("E:/excel/DIREKSI.xls");
		byte[] decodedBytes = Base64.decodeBase64(fileInput);
		String targetFile = reportDirectory+ UUID.randomUUID().toString().replaceAll("-", "")+".xls";
		try {
			writeByteArraysToFile(targetFile, decodedBytes);
		} catch (IOException e1) {
			e1.printStackTrace();
		}
		List<PayRollUangMakanDto> listBooks = new ArrayList<>();
		List<PayRollUangMakanDto> listNonBooks = new ArrayList<>();
		try {
			FileInputStream file = new FileInputStream(new File(targetFile));
			// Get the workbook instance for XLS file
			HSSFWorkbook workbook = new HSSFWorkbook(file);
			// Get first sheet from the workbook
			HSSFSheet sheet = workbook.getSheetAt(0);
			// Iterate through each rows from first sheet
			Iterator<Row> rowIterator = sheet.iterator();
			int countRow=0;
			while (rowIterator.hasNext()) {
				Row row = rowIterator.next();
				if(row.getRowNum()==0){
				}else{
					Iterator<Cell> cellIterator = row.cellIterator();
					PayRollUangMakanDto uangMakanDto = new PayRollUangMakanDto();
					String nip="",golongan="";
					Double jmlHari=0.0,tarif=0.0,kotor=0.0,pph=0.0,bersih=0.0;
					int countCell=0;
					Integer pegawaiId=null;
					while (cellIterator.hasNext()) {
						Cell nextCell = cellIterator.next();
						int columnIndex = nextCell.getColumnIndex();
						if(CommonUtil.isNotNullOrEmpty(getCellValue(nextCell))){
							switch (columnIndex) {
							case 0:
								getCellValue(nextCell);
								break;
							case 1:
								getCellValue(nextCell);
								break;
							case 2:
								getCellValue(nextCell);
								break;
							case 3:
								getCellValue(nextCell);
								break;
							case 4:
								getCellValue(nextCell);
								break;
							case 5:
								getCellValue(nextCell);
								break;
							case 6:
								getCellValue(nextCell);
								break;
							case 7:
								nip= (String) getCellValue(nextCell);
								System.out.println("IMport Excel Nip : "+nip);
								uangMakanDto.setNipPns(nip);
								break;
							case 8:
								getCellValue(nextCell);
								break;
							case 9:
								golongan=(String) getCellValue(nextCell);
								System.out.println("IMport Excel Golongan : "+golongan);
								GolonganPegawai golonganPegawai=golonganPegawaiDao.findGolongaPegawaiByGolonganPegawai(golongan);
								uangMakanDto.setGolonganPegawaiId(golonganPegawai.getId());
								uangMakanDto.setGolonganPegawai(golonganPegawai.getGolonganPegawai());
								break;
							case 10:
								getCellValue(nextCell);
								System.out.println("NIPPPPPPP 10 : "+nip);
								Pegawai pegawai=pegawaiDao.findOneByNipPns(nip);
								if(pegawai!=null){
									System.out.println("IMport Excel Pegawai : "+pegawai.getNamaLengkap());
									pegawaiId=pegawai.getId();
									uangMakanDto.setPegawaiId(pegawai.getId());
									uangMakanDto.setNamaLengkap(pegawai.getNamaLengkap());
								}
								break;
							case 11:
								jmlHari=(Double) getCellValue(nextCell);
								System.out.println("IMport Excel JmlHari : "+jmlHari);
								uangMakanDto.setJumlahHadir(jmlHari);
								break;
							case 12:
								tarif=(Double) getCellValue(nextCell);
								System.out.println("IMport Excel Tarif : "+tarif);
								uangMakanDto.setTarif(tarif);
								break;
							case 13:
								kotor=(Double) getCellValue(nextCell);
								System.out.println("IMport Excel JmlHari : "+jmlHari);
								uangMakanDto.setJumlahKotor(kotor);
								break;
							case 14:
								pph=(Double) getCellValue(nextCell);
								System.out.println("IMport Excel pph : "+pph);
								uangMakanDto.setPph(pph);
								break;
							case 15:
								bersih=(Double) getCellValue(nextCell);
								System.out.println("IMport Excel bersih : "+bersih);
								uangMakanDto.setJumlahBersih(bersih);
								break;
							case 16:
								getCellValue(nextCell);
								break;
							case 17:
								getCellValue(nextCell);
								break;
							}
						}							
					}
					uangMakanDto.setNoGaji(noGaji2);
					uangMakanDto.setJenisGajiId(idJenisGaji);
					uangMakanDto.setIsVerifikasi(0);
					if(tglHistori!=null)
						uangMakanDto.setTglHistori(tglHistori);
					else
						uangMakanDto.setTglHistori(new Date());
					uangMakanDto.setPeriode(periode);
					uangMakanDto.setKomponenHargaUangMakanId(55);
					uangMakanDto.setKomponenHargaPajakId(66);
					System.out.println("COUNTTTTTTTTT CELL: "+countCell);
					countCell++;
					if(pegawaiId!=null)
						listBooks.add(uangMakanDto);
					else
						listNonBooks.add(uangMakanDto);

				}
				System.out.println("COUNTTTTTTTTT ROW: "+countRow);
				countRow++;	
			}
			file.close();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		for(PayRollUangMakanDto dto:listNonBooks){
			System.out.println("LIST NON BOOKS : "+dto.getNipPns()+" "+dto.getNamaLengkap());
		}
		Map<String, Object> r = new HashMap<String, Object>();
		r.put("data", listBooks);
		return listBooks;
	}

	private Object getCellValue(Cell cell) {
		switch (cell.getCellType()) {
		case Cell.CELL_TYPE_STRING:
			return cell.getStringCellValue();
		case Cell.CELL_TYPE_BOOLEAN:
			return cell.getBooleanCellValue();
		case Cell.CELL_TYPE_NUMERIC:
			return cell.getNumericCellValue();
		}
		return null;
	}
	
	public static void writeByteArraysToFile(String fileName, byte[] content) throws IOException {
		File file = new File(fileName);
		BufferedOutputStream writer = new BufferedOutputStream(new FileOutputStream(file));
		writer.write(content);
		writer.flush();
		writer.close();

	}

	@Override	
	@Transactional(readOnly=false)
	public List<Map<String, Object>> prosesDokterPsikologiPkwt(Integer idDetailKategoriPegawai,Integer idJenisGaji,String periode,Date tglHistori){
		List<Map<String, Object>> result2=new ArrayList<Map<String,Object>>();
		List<Map<String, Object>> resultFilter=new ArrayList<Map<String,Object>>();
		List<Map<String, Object>> result=payRollPegawaiDao.findPegawaiByDetailKategoriDokterPsikologi(idDetailKategoriPegawai);
		for(Map<String,Object> mapR:result){
			Integer jabatanId=(Integer) mapR.get("jabatanId");
			System.out.println("PEGAWAI : "+jabatanId);
			List<Map<String, Object>> resultJabatanJa=payRollPegawaiDao.findGajiByJa(jabatanId);
			if(!resultJabatanJa.isEmpty()){
				resultFilter.add(mapR);
			}
		}
		String noGaji=getRunningNumber("Struk Histori");
		System.out.println("NOGAJI : "+noGaji);
		String noGaji2=noGaji;
		for(Map<String,Object> mapL:resultFilter){
			List<Map<String, Object>> listKomponen=new ArrayList<Map<String,Object>>();
			Integer pendidikanId=(Integer) mapL.get("pendidikanId");
			Integer jabatanId=(Integer) mapL.get("jabatanId");
			Integer pegawaiId=(Integer) mapL.get("pegawaiId");
			Integer levelTingkatId=(Integer) mapL.get("levelTingkatId");
			Integer golonganPegawaiId=(Integer) mapL.get("golonganPegawaiId");
			Integer kelompokShifId=(Integer) mapL.get("kelompoktShiftId");
			Date tglMasuk=(Date) mapL.get("tglMasuk");
			int tahun=AgeCalculator.calculateAge2(new Date(), tglMasuk).getYears();
			int bulan=AgeCalculator.calculateAge2(new Date(), tglMasuk).getMonths();
			Integer rangeId=null;
			System.out.println("=================");
			System.out.println("idPegawai : "+pegawaiId);
			System.out.println("idDetailKategoriPegawai : "+idDetailKategoriPegawai);
			System.out.println("pendidikanId : "+pendidikanId);
			System.out.println("jabatanId : "+jabatanId);
			System.out.println("golonganPegawaiId : "+golonganPegawaiId);
			System.out.println("levelTingkatId : "+levelTingkatId);
			System.out.println("kelompokShifId : "+kelompokShifId);
			System.out.println("=================");
			Double hargaPajak=0.0;
			Map<String,Object> mapRange=payRollPegawaiDao.findRangeId(Integer.valueOf(tahun));
			if(mapRange!=null)
				rangeId=(Integer)mapRange.get("id");
			else
				rangeId=10;
			Double hargaJa=0.0;
			Integer komponenHargaTunjanganLayananId=0;
			List<Map<String, Object>> gajiJa=payRollPegawaiDao.findGajiByJa(jabatanId);
			Map<String,Object> mapHargaJape=new HashMap<String,Object>();
			if(!gajiJa.isEmpty()){
				for(Map<String,Object> abc:gajiJa){
					hargaJa=(Double) abc.get("hargaSatuan");
					Integer komponenHargaId=(Integer) abc.get("komponenHargaId");
					System.out.println("komponenHargaId : "+komponenHargaId);
					String namaKomponen = getKomponenHarga(komponenHargaId);
					mapHargaJape.put("komponenHargaId", komponenHargaId);
					mapHargaJape.put("namaKomponen", namaKomponen);
					mapHargaJape.put("harga", hargaJa);
					komponenHargaTunjanganLayananId=komponenHargaId;
				}
				listKomponen.add(mapHargaJape);
			}
			Double totalHargaHitungPajak=hargaJa;
			List<Map<String, Object>> gajiPajak=payRollPegawaiDao.findGajiByPajak(42, golonganPegawaiId,18);
			Map<String,Object> mapHargaPajak=new HashMap<String,Object>();
			Integer komponenHargaPajakId=0;
			if(!gajiPajak.isEmpty()){
				Double persenPajak=0.0;
				for(Map<String,Object> abc:gajiPajak){
					persenPajak=(Double) abc.get("persenPajak");
					hargaPajak=(persenPajak/100.00)*totalHargaHitungPajak;
					Integer komponenHargaId=(Integer) abc.get("objekPajakId");
					System.out.println("OBJECT PAJAK ID : "+komponenHargaId);
					String namaKomponen = getObjectPajak(komponenHargaId);
					mapHargaPajak.put("komponenHargaId", komponenHargaId);
					mapHargaPajak.put("namaKomponen", namaKomponen);
					mapHargaPajak.put("harga", hargaPajak);
					komponenHargaPajakId=66;
				}
					listKomponen.add(mapHargaPajak);
			}
			Double jumlahKotor=hargaJa;
			Double jumlahBersih=jumlahKotor-hargaPajak;
			mapL.put("masaKerja", String.valueOf(tahun)+" Tahun "+String.valueOf(bulan)+" Bulan ");
			mapL.put("tarif", hargaJa);
			mapL.put("jumlahKotor", jumlahKotor);
			mapL.put("pph", hargaPajak);
			mapL.put("jumlahBersih", jumlahBersih);
			mapL.put("noGaji", noGaji2);
			mapL.put("jenisGajiId",idJenisGaji);
			mapL.put("isVerifikasi",0);
			if(tglHistori!=null)
				mapL.put("tglHistori", tglHistori);
			else
				mapL.put("tglHistori", new Date());
			mapL.put("periode",periode);
			mapL.put("komponenHargaTunjanganLayananId",komponenHargaTunjanganLayananId);
			mapL.put("komponenHargaPajakId",komponenHargaPajakId);
			result2.add(mapL);
		}
		return result2;		
	}
	
	@Override	
	@Transactional(readOnly=false)
	public List<Map<String, Object>> prosesPremiAsuransi(Integer idJenisGaji,
			String periode,Integer idRekanan,Date tglHistori){
		List<Map<String, Object>> result2=new ArrayList<Map<String,Object>>();
		List<Map<String, Object>> result=payRollPegawaiDao.findPegawaiByAsuransi(idRekanan);
		String noGaji=getRunningNumber("Struk Histori");
		String noGaji2=noGaji;
		if(!result.isEmpty()){
			for(Map<String,Object> mapL:result){
				List<Map<String, Object>> listKomponen=new ArrayList<Map<String,Object>>();
				Integer pendidikanId=(Integer) mapL.get("pendidikanId");
				Integer jabatanId=(Integer) mapL.get("jabatanId");
				Integer pegawaiId=(Integer) mapL.get("id");
				Integer levelTingkatId=(Integer) mapL.get("levelTingkatId");
				Integer golonganPegawaiId=(Integer) mapL.get("golonganPegawaiId");
				Integer kelompokShifId=(Integer) mapL.get("kelompoktShiftId");
				Integer rekananId=(Integer) mapL.get("rekananId");
				Date tglMasuk=(Date) mapL.get("tglMasuk");
				int tahun=AgeCalculator.calculateAge2(new Date(), tglMasuk).getYears();
				int bulan=AgeCalculator.calculateAge2(new Date(), tglMasuk).getMonths();
				Integer rangeId=null;
				System.out.println("=================");
				System.out.println("idPegawai : "+pegawaiId);
				System.out.println("pendidikanId : "+pendidikanId);
				System.out.println("jabatanId : "+jabatanId);
				System.out.println("golonganPegawaiId : "+golonganPegawaiId);
				System.out.println("levelTingkatId : "+levelTingkatId);
				System.out.println("kelompokShifId : "+kelompokShifId);
				System.out.println("=================");
				//premi perusahaan
				Double hargaAsuransiPerusahaan=0.0;
				Integer komponenHargaAsuransiPerusahaanId=0;
				Double presenPremiPerusahaan=0.0;
				List<Map<String, Object>> gajiAsuransiPerusahaan=payRollPegawaiDao.findGajiByAsuransi(rekananId,80); //premi perusahaan
				Map<String,Object> mapHargaAsuransiPerusahaan=new HashMap<String,Object>();
				if(!gajiAsuransiPerusahaan.isEmpty()){
					for(Map<String,Object> abc:gajiAsuransiPerusahaan){
						hargaAsuransiPerusahaan=(Double) abc.get("totalFactorRatePremi");
						Integer komponenHargaId=(Integer) abc.get("komponenHargaId");
						presenPremiPerusahaan=(Double) abc.get("persenHargaSatuanPremi");
						System.out.println("komponenHargaId : "+komponenHargaId);
						String namaKomponen = getKomponenHarga(komponenHargaId);
						mapHargaAsuransiPerusahaan.put("komponenHargaId", komponenHargaId);
						mapHargaAsuransiPerusahaan.put("namaKomponen", namaKomponen);
						mapHargaAsuransiPerusahaan.put("harga", hargaAsuransiPerusahaan);
						komponenHargaAsuransiPerusahaanId=komponenHargaId;
					}
					listKomponen.add(mapHargaAsuransiPerusahaan);
				}
				//premi pegawai
				Double hargaAsuransiPegawai=0.0;
				Integer komponenHargaAsuransiPegawaiId=0;
				Double presenPremiPegawai=0.0;
				List<Map<String, Object>> gajiAsuransiPegawai=payRollPegawaiDao.findGajiByAsuransi(rekananId,81); //premi perusahaan
				Map<String,Object> mapHargaAsuransiPegawai=new HashMap<String,Object>();
				if(!gajiAsuransiPegawai.isEmpty()){
					for(Map<String,Object> abc:gajiAsuransiPegawai){
						hargaAsuransiPegawai=(Double) abc.get("totalFactorRatePremi");
						Integer komponenHargaId=(Integer) abc.get("komponenHargaId");
						presenPremiPegawai=(Double) abc.get("persenHargaSatuanPremi");
						System.out.println("komponenHargaId : "+komponenHargaId);
						String namaKomponen = getKomponenHarga(komponenHargaId);
						mapHargaAsuransiPegawai.put("komponenHargaId", komponenHargaId);
						mapHargaAsuransiPegawai.put("namaKomponen", namaKomponen);
						mapHargaAsuransiPegawai.put("harga", hargaAsuransiPerusahaan);
						komponenHargaAsuransiPegawaiId=komponenHargaId;
					}
					listKomponen.add(mapHargaAsuransiPegawai);
				}
				Double jumlahPremiDiBayar=0.0;
				mapL.put("umr", hargaAsuransiPegawai);
				hargaAsuransiPerusahaan=hargaAsuransiPerusahaan*(presenPremiPerusahaan/100);
				hargaAsuransiPegawai=hargaAsuransiPegawai*(presenPremiPegawai/100);
				jumlahPremiDiBayar=hargaAsuransiPerusahaan+hargaAsuransiPegawai;
				mapL.put("premiDiBayarPegawai",hargaAsuransiPegawai );
				mapL.put("premiDiBayarPerusahaan", hargaAsuransiPerusahaan);
				mapL.put("jumlahPremiDiBayar", jumlahPremiDiBayar);
				mapL.put("noGaji", noGaji2);
				mapL.put("jenisGajiId",idJenisGaji);
				if(tglHistori!=null)
					mapL.put("tglHistori", tglHistori);
				else
					mapL.put("tglHistori", new Date());
				mapL.put("periode",periode);
				mapL.put("komponenHargaAsuransiPerusahaanId",komponenHargaAsuransiPerusahaanId);
				mapL.put("komponenHargaAsuransiPegawaiId",komponenHargaAsuransiPegawaiId);
				result2.add(mapL);
			}
		}else{
			Map<String,Object> map=new HashMap<String,Object>();
			map.put("dataFound", false);
			result2.add(map);
		}
		return result2;		
	}

	@Override
	@Transactional(readOnly=false)
	public List<PayRollUangMakanDto> savePremiAsuransi(List<PayRollUangMakanDto> dtos){
		StrukHistori strukHistori=new StrukHistori();
		
		Ruangan ruangan = ruanganDao.findById(213); //ruangan sdm
		if (ruangan != null) {
			strukHistori.setRuangan(ruangan);
		}
		
		KelompokTransaksi kelompokTransaksi = kelompokTransaksiDao.findById(57); //kelompok transaksi 57 : premi asuransi
		if (kelompokTransaksi != null) {
			strukHistori.setKelompokTransaksi(kelompokTransaksi);
		}
		Set<PegawaiHistoriRekap> historiRekapList = new HashSet<>();
		Set<PegawaiHistoriRekapGaji> historiRekapGajiList = new HashSet<>();

		for(PayRollUangMakanDto abcd:dtos){
			getPeriodeAndTglHistoriUangMakan(strukHistori, abcd);
			JenisGaji jenisGaji = jenisGajiDao.findById(abcd.getJenisGajiId());
			if(jenisGaji!=null){
				strukHistori.setJenisGaji(jenisGaji);
			}
			strukHistori.setNonHistori(abcd.getNoGaji());		
			PegawaiHistoriRekap historiRekap = new PegawaiHistoriRekap();
			Pegawai pegawai=pegawaiDao.findById(abcd.getPegawaiId());
			historiRekap.setPegawai(pegawai);
			historiRekap.setStrukHistory(strukHistori);
			historiRekap.setTotalHargaGajiMin(new BigDecimal(abcd.getJumlahPremiDiBayar().doubleValue()));
			StrukPelayanan strukPelayanan = new StrukPelayanan();
			strukPelayanan.setNostruk(getRunningNumber("StrukPelayanan"));
			strukPelayanan.setTotalharusdibayar(abcd.getJumlahBersih());
			strukPelayanan.setNoSBKLastId("");
			// set pegawai
			strukPelayanan.setObjectPegawaiPenerimaId(pegawai.getId());
			strukPelayanan.setNamapegawaipenerima(pegawai.getNamaLengkap());
			strukPelayanan = strukPelayananDao.save(strukPelayanan);
			historiRekap.setNoStrukPelayanan(strukPelayanan);
			historiRekap.setNoStrukPelayananId(strukPelayanan.getNostruk());
			historiRekapList.add(historiRekap);
			strukHistori.setPegawaiHistoriRekap(historiRekapList);
			// premi pegawai
			PegawaiHistoriRekapGaji rekapGajiPegawai = new PegawaiHistoriRekapGaji();
			rekapGajiPegawai.setStrukHistory(strukHistori);
			rekapGajiPegawai.setPeriode(abcd.getPeriode());
			rekapGajiPegawai.setPegawai(pegawai);
			KomponenHarga komponenHargaPegawai=komponenHargaDao.findOne(abcd.getKomponenHargaAsuransiPegawaiId());
			if (komponenHargaPegawai != null) {
				rekapGajiPegawai.setKomponenHarga(komponenHargaPegawai);
			}
			rekapGajiPegawai.setHargaSatuan(new BigDecimal(abcd.getPremiDiBayarPegawai().doubleValue()));
			rekapGajiPegawai.setQtyKomponenHarga(1);
			historiRekapGajiList.add(rekapGajiPegawai);
			//	
			//permi perusahaan
			PegawaiHistoriRekapGaji rekapGajiPerusahaan = new PegawaiHistoriRekapGaji();
			rekapGajiPerusahaan.setStrukHistory(strukHistori);
			rekapGajiPerusahaan.setPeriode(abcd.getPeriode());
			rekapGajiPerusahaan.setPegawai(pegawai);
			KomponenHarga komponenHargaPerusahaan=komponenHargaDao.findOne(abcd.getKomponenHargaAsuransiPerusahaanId());
			if (komponenHargaPerusahaan != null) {
				rekapGajiPerusahaan.setKomponenHarga(komponenHargaPerusahaan);
			}
			rekapGajiPerusahaan.setHargaSatuan(new BigDecimal(abcd.getPremiDiBayarPerusahaan().doubleValue()));
			rekapGajiPerusahaan.setQtyKomponenHarga(1);
			historiRekapGajiList.add(rekapGajiPerusahaan);
			//	
			strukHistori.setRekapGaji(historiRekapGajiList);
		}
		strukHistori = strukHistoriDao.save(strukHistori);
		return dtos;
	}

	@Override
	public List<Map<String, Object>> findRekananPenjaminPasien() {
		String idJenisRekanan=GetSettingDataFixed("kdJenisRekananPenjaminPasien");
		return rekananDao.findByJenisRekanan(Integer.valueOf(idJenisRekanan));
	}

	@Override
	public Map<String, Object> findUmr(String periode) {
		Map<String,Object> mapL=new HashMap<String,Object>();
		String tgl="02";
		String bulan=periode.split("-")[0];
		String tahun=periode.split("-")[1];
		String periodeTgl=tahun+"-"+bulan+"-"+tgl;
		System.out.println("PERIODE TANGGAL : "+periodeTgl);
		List<Map<String,Object>> list=payRollPegawaiDao.findUmr(DateUtil.toDate(periodeTgl));
		if(!list.isEmpty()){
			for(Map<String,Object> map:list){
				mapL=map;
			}
		}else{
			mapL.put("umr", 0);
			mapL.put("tahun", tahun);
		}
		return mapL;
	}

}
