package com.jasamedika.medifirst2000.service.impl;

import java.math.BigDecimal;
import java.util.ArrayList;
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 com.jasamedika.medifirst2000.converter.BaseConverterImpl;
import com.jasamedika.medifirst2000.dao.RuanganDao;
import com.jasamedika.medifirst2000.dao.StrukBuktiPengeluaranCaraBayarDao;
import com.jasamedika.medifirst2000.dao.StrukBuktiPengeluaranDao;
import com.jasamedika.medifirst2000.dao.StrukPelayananDao;
import com.jasamedika.medifirst2000.dao.StrukPelayananPenjaminDao;
import com.jasamedika.medifirst2000.dao.StrukVerifikasiDao;
import com.jasamedika.medifirst2000.dao.custom.GajiPegawaiDaoCustom;
import com.jasamedika.medifirst2000.entities.BankAccount;
import com.jasamedika.medifirst2000.entities.CaraBayar;
import com.jasamedika.medifirst2000.entities.DetailKamar;
import com.jasamedika.medifirst2000.entities.JenisKartu;
import com.jasamedika.medifirst2000.entities.KelompokPasien;
import com.jasamedika.medifirst2000.entities.KelompokTransaksi;
import com.jasamedika.medifirst2000.entities.LoginUser;
import com.jasamedika.medifirst2000.entities.Pasien;
import com.jasamedika.medifirst2000.entities.PasienDaftar;
import com.jasamedika.medifirst2000.entities.Pegawai;
import com.jasamedika.medifirst2000.entities.Rekanan;
import com.jasamedika.medifirst2000.entities.Ruangan;
import com.jasamedika.medifirst2000.entities.StrukBuktiPenerimaan;
import com.jasamedika.medifirst2000.entities.StrukBuktiPengeluaran;
import com.jasamedika.medifirst2000.entities.StrukBuktiPengeluaranCaraBayar;
import com.jasamedika.medifirst2000.entities.StrukClosing;
import com.jasamedika.medifirst2000.entities.StrukPelayanan;
import com.jasamedika.medifirst2000.entities.StrukPelayananPenjamin;
import com.jasamedika.medifirst2000.entities.StrukVerifikasi;
import com.jasamedika.medifirst2000.service.GajiPegawaiService;
import com.jasamedika.medifirst2000.service.LoginUserService;
import com.jasamedika.medifirst2000.util.CommonUtil;
import com.jasamedika.medifirst2000.util.DateUtil;
import com.jasamedika.medifirst2000.vo.BankAccountVO;
import com.jasamedika.medifirst2000.vo.CaraBayarVO;
import com.jasamedika.medifirst2000.vo.JenisKartuVO;
import com.jasamedika.medifirst2000.vo.KelompokTransaksiVO;
import com.jasamedika.medifirst2000.vo.MappingKirimDokumenPasienVO;
import com.jasamedika.medifirst2000.vo.StrukBuktiPengeluaranCaraBayarVO;
import com.jasamedika.medifirst2000.vo.StrukBuktiPengeluaranVO;
import com.jasamedika.medifirst2000.vo.StrukClosingVO;
import com.jasamedika.medifirst2000.vo.StrukVerifikasiVO;

@Service("GajiPegawaiService")
public class GajiPegawaiServiceImpl extends BaseVoServiceImpl implements GajiPegawaiService {

	@Autowired
	private StrukBuktiPengeluaranCaraBayarDao daoStrukBuktiPengeluaranCaraBayar;

	@Autowired
	private StrukPelayananDao daoStrukPelayanan;

	@Autowired
	private RuanganDao ruanganDao;

	@Autowired
	private StrukVerifikasiDao daoStrukVerifikasi;

	@Autowired
	private GajiPegawaiDaoCustom daoCustom;

	@Autowired
	private StrukBuktiPengeluaranDao daoStrukBuktiPengeluaran;
	
	@Autowired
	private StrukPelayananPenjaminDao daoStrukPelayananPenjamin;

	@Autowired
	private LoginUserService loginUserService;

	@Autowired
	private BaseConverterImpl<StrukBuktiPengeluaranVO, StrukBuktiPengeluaran> strukBuktiPengeluaranConverter;

	@Autowired
	private BaseConverterImpl<KelompokTransaksiVO, KelompokTransaksi> kelompokTransaksiConverter;

	@Autowired
	private BaseConverterImpl<StrukBuktiPengeluaranCaraBayarVO, StrukBuktiPengeluaranCaraBayar> strukBuktiPengeluaranCaraBayarConverter;

	@Autowired
	private BaseConverterImpl<CaraBayarVO, CaraBayar> caraBayarConverter;

	@Autowired
	private BaseConverterImpl<JenisKartuVO, JenisKartu> jenisKartuConverter;

	@Autowired
	private BaseConverterImpl<StrukClosingVO, StrukClosing> strukClosingConverter;

	@Autowired
	private BaseConverterImpl<StrukVerifikasiVO, StrukVerifikasi> strukVerifikasiConverter;

	@Autowired
	private BaseConverterImpl<BankAccountVO, BankAccount> bankAccountConverter;

	@Override
	public Map<String, Object> getDaftarGajiPegawai(Integer page, Integer limit, String sort, String dir,
			String dateStart, String dateEnd, String detailKategoryPegawai, String noRec, String gridFor,
			String status) {

		Map<String, Object> result = new HashMap<String, Object>();
		try {
			System.out.println("=======START GET DAFTAR GAJI PEGAWAI BELUM VERIFIKASI=======");

			Ruangan r = getRuanganByUserLogin();
			Integer ruanganId = null;
			if (CommonUtil.isNotNullOrEmpty(r)) {
				ruanganId = r.getId();
			}
			List<Integer> ruanganList = getRuanganByUserLoginList();

			result.put("result", daoCustom.getDaftarGajiPegawai(sort, dir, dateStart, dateEnd, detailKategoryPegawai,
					noRec, gridFor, ruanganList, status));
			System.out.println("=======END GET DAFTAR GAJI PEGAWAI BELUM VERIFIKASI=======");
		} catch (Exception e) {
			e.printStackTrace();
		}
		return result;
	}

	@Override
	public Ruangan getRuanganByUserLogin() {
		LoginUser loginUser = loginUserService.getLoginUser();
		Ruangan r = new Ruangan();
		if (CommonUtil.isNotNullOrEmpty(loginUser.getPegawai())) {
			if (CommonUtil.isNotNullOrEmpty(loginUser.getPegawai().getRuangan())) {
				r = loginUser.getPegawai().getRuangan();
			}
		}
		return r;
	}

	@Override
	public LoginUser getLoginUser() {
		LoginUser loginUser = loginUserService.getLoginUser();
		return loginUser;
	}

	@Override
	public List<Integer> getRuanganByUserLoginList() {
		List<Integer> user = ruanganDao.getRuanganByUserLogin(getLoginUser().getId());
		return user;
	}

	@Override
	public Map<String, Object> getDetailGajiPegawai(Integer page, Integer limit, String sort, String dir,
			String dateStart, String dateEnd, String detailKategoryPegawai, String noRec, Integer idPegawai) {

		Map<String, Object> result = new HashMap<String, Object>();
		try {
			System.out.println("=======START GET DETAIL GAJI PEGAWAI=======");

			List<Map<String, Object>> resultDetailGajiPegawai = daoCustom.getDetailGajiPegawai(sort, dir, dateStart,
					dateEnd, detailKategoryPegawai, noRec, idPegawai);

			// get detail komponen harga
			List<Map<String, Object>> resultKompHarga = daoCustom.getDetailKompHarga(dateStart, dateEnd,
					detailKategoryPegawai, noRec, idPegawai);

			List<Map<String, Object>> list2 = new ArrayList<>();

			for (Map<String, Object> map1 : resultDetailGajiPegawai) {
				List<Map<String, Object>> list = new ArrayList<>();
				Map<String, Object> data1 = new HashMap<String, Object>();
				data1.put("noRec", map1.get("noRec"));
				data1.put("namaRuangan", map1.get("namaRuangan"));
				data1.put("jenisGaji", map1.get("jenisGaji"));
				data1.put("kelTransaksi", map1.get("kelTransaksi"));
				data1.put("total", map1.get("total"));
				data1.put("golPegawai", map1.get("golPegawai"));
				data1.put("rekeningAtasNama", map1.get("rekeningAtasNama"));
				data1.put("namaBank", map1.get("namaBank"));
				data1.put("noRekening", map1.get("noRekening"));
				data1.put("idPegawai", map1.get("idPegawai"));
				data1.put("namaPegawai", map1.get("namaPegawai"));
				data1.put("nipPns", map1.get("nipPns"));
				for (Map<String, Object> map2 : resultKompHarga) {
					if (map2.get("idPegawai").equals(map1.get("idPegawai"))) {
						Map<String, Object> data2 = new HashMap<String, Object>();
						data2.put("harga", map2.get("harga"));
						data2.put("kompHarga", map2.get("kompHarga"));
						list.add(data2);
					}
					data1.put("detailTunjangan", list);
				}
				list2.add(data1);
			}
			result.put("result", list2);
			System.out.println("=======END GET DETAIL GAJI PEGAWAI=======");
		} catch (Exception e) {
			e.printStackTrace();
		}
		return result;
	}

	@Override
	public Map<String, Object> getTotalGajiPegawai(String dateStart, String dateEnd, String detailKategoryPegawai) {

		Map<String, Object> result = new HashMap<String, Object>();
		try {
			System.out.println("=======START GET TOTAL GAJI PEGAWAI=======");
			result.put("result", daoCustom.getTotalGajiPegawai(dateStart, dateEnd, detailKategoryPegawai));
			System.out.println("=======END GET TOTAL GAJI PEGAWAI=======");
		} catch (Exception e) {
			e.printStackTrace();
		}
		return result;
	}

	@Override
	public Map<String, Object> saveGajiPegawai(StrukBuktiPengeluaranVO vo) {

		Map<String, Object> result = new HashMap<String, Object>();
		try {
			System.out.println("=======START SAVE GAJI PEGAWAI=======");
			StrukBuktiPengeluaran sbp = strukBuktiPengeluaranConverter.transferVOToModel(vo,
					new StrukBuktiPengeluaran());

			KelompokTransaksi kelompokTransaksi = new KelompokTransaksi();
			kelompokTransaksi.setId(Integer.parseInt(GetSettingDataFixed("KdKelompokTransaksiOutPayroll")));
			// set kelompok transaksi payroll
			sbp.setKelompokTransaksi(kelompokTransaksi);
			// set pegawai pembayar
			sbp.setPegawaiPembayar(loginUserService.getLoginUser());

			Ruangan ruangan = new Ruangan();
			ruangan.setId(Integer.parseInt(GetSettingDataFixed("KdRuanganKeuangan")));
			// set ruangan
			sbp.setRuangan(ruangan);

			// set nama pegawai pembayar
			sbp.setNamaPegawaiPembayar(loginUserService.getLoginUser().getPegawai().getNamaLengkap());

			StrukBuktiPengeluaran resultModel = daoStrukBuktiPengeluaran.save(sbp);
			result.put("noRec", resultModel.getNoRec());
		} catch (Exception e) {
			e.printStackTrace();
		}
		return result;
	}

	@Override
	public Map<String, Object> saveVerifikasiGajiPegawai(String noRec) {

		Map<String, Object> result = new HashMap<String, Object>();
		try {
			System.out.println("=======START UPDATE VERIFIKASI GAJI PEGAWAI=======");
			StrukVerifikasi strukVerifikasi = daoStrukVerifikasi.findByNoRecStrukVerifikasi(noRec);
			strukVerifikasi.setKelompokTransaksi(strukVerifikasi.getKelompokTransaksi());
			strukVerifikasi.setNoUrutRuangan(strukVerifikasi.getNoUrutRuangan());
			strukVerifikasi.setNoverifikasi(strukVerifikasi.getNoverifikasi());
			strukVerifikasi.setRuangan(strukVerifikasi.getRuangan());
			strukVerifikasi.setTglverifikasi(strukVerifikasi.getTglverifikasi());
			strukVerifikasi.setTglEksekusi(DateUtil.getShortDate());
			strukVerifikasi.setStrukVerifikasi(strukVerifikasi.getStrukVerifikasi());

			StrukVerifikasi resultModel = daoStrukVerifikasi.save(strukVerifikasi);
			result.put("noRecStrukVerifikasi", resultModel.getNoRec());
			System.out.println("=======END UPDATE VERIFIKASI GAJI PEGAWAI=======");
		} catch (Exception e) {
			e.printStackTrace();
		}
		return result;
	}

	@Override
	public Map<String, Object> getDaftarGajiPegawaiVerifikasi(Integer page, Integer limit, String sort, String dir,
			String dateStart, String dateEnd, String detailKategoryPegawai, String noRec, String gridFor,
			String status) {

		Map<String, Object> result = new HashMap<String, Object>();
		try {
			System.out.println("=======START GET DAFTAR GAJI PEGAWAI VERIFIKASI=======");

			Ruangan r = getRuanganByUserLogin();
			Integer ruanganId = null;
			if (CommonUtil.isNotNullOrEmpty(r)) {
				ruanganId = r.getId();
			}
			List<Integer> ruanganList = getRuanganByUserLoginList();

			result.put("result", daoCustom.getDaftarGajiPegawaiVerifikasi(sort, dir, dateStart, dateEnd,
					detailKategoryPegawai, noRec, gridFor, ruanganList, status));
			System.out.println("=======END GET DAFTAR GAJI PEGAWAI VERIFIKASI=======");
		} catch (Exception e) {
			e.printStackTrace();
		}
		return result;
	}

	@Override
	public String generatePembayaranKe(String noRec) {

		Long count = daoStrukBuktiPengeluaran.getPembayaranKe(noRec);

		if (count == null || count.equals(null)) {
			count = (long) 1;
		} else {
			count++;
		}

		return count.toString();
	}

	@Override
	public Map<String, Object> savePembayaranGajiPegawai(StrukBuktiPengeluaranCaraBayarVO vo, Integer idRekanan,
			String noRec, String status) {

		Map<String, Object> result = new HashMap<String, Object>();
		try {
			System.out.println("=======START SAVE PEMBAYARAN GAJI PEGAWAI=======");

			if (CommonUtil.isNotNullOrEmpty(vo.getNoSBK())) {

				List<Map<String, Object>> list = daoCustom.getDaftarGajiPegawai(idRekanan, noRec, status);

				StrukBuktiPengeluaran sbp = strukBuktiPengeluaranConverter.transferVOToModel(vo.getNoSBK(),
						new StrukBuktiPengeluaran());

				// set kelompok transaksi payroll
				if (CommonUtil.isNotNullOrEmpty(vo.getNoSBK().getKelompokTransaksi())) {
					sbp.setKelompokTransaksi(kelompokTransaksiConverter
							.transferVOToModel(vo.getNoSBK().getKelompokTransaksi(), new KelompokTransaksi()));
				}

				// set pegawai pembayar
				sbp.setPegawaiPembayar(loginUserService.getLoginUser());

				Ruangan ruangan = new Ruangan();
				ruangan.setId(Integer.parseInt(GetSettingDataFixed("KdRuanganKeuangan")));
				// set ruangan
				sbp.setRuangan(ruangan);

				// set nama pegawai pembayar
				sbp.setNamaPegawaiPembayar(loginUserService.getLoginUser().getPegawai().getNamaLengkap());

				sbp.setTglSBK(DateUtil.getShortDate());
				sbp.setNoSBK("PV-" + GenerateNoSbk());

				StrukPelayanan sp = new StrukPelayanan();

				for (int i = 0; i < list.size(); i++) {
					// setPembayaranKe
					sbp.setPembayaranKe(Byte.parseByte(generatePembayaranKe(noRec)));
					sp.setNoRec(list.get(i).get("noRecStrukPelayanan").toString());
					sp.setTotalharusdibayar(Double.parseDouble(list.get(i).get("totalHarusDibayar").toString()));
					if (CommonUtil.isNotNullOrEmpty(list.get(i).get("totalHarusDibayar"))) {
						if (list.get(i).get("totalSisaHutang").equals(0)
								|| list.get(i).get("totalSisaHutang").equals(null)
								|| Double.parseDouble(list.get(i).get("totalSisaHutang").toString()) == 0
								|| list.get(i).get("totalSisaHutang") == ""
								|| list.get(i).get("totalSisaHutang") == null) {
							sbp.setTotalSisaHutang(Double.parseDouble(list.get(i).get("totalHarusDibayar").toString())
									- sbp.getTotalDiBayar());
							sbp.setTotalDiBayarBefore(0.0);
							sbp.setTotalSudahDiBayar(0.0);
						} else if (!list.get(i).get("totalSisaHutang").equals(0)
								|| !list.get(i).get("totalSisaHutang").equals(null)) {
							sbp.setTotalSudahDiBayar(Double.parseDouble(list.get(i).get("totalHarusDibayar").toString())
									- Double.parseDouble(list.get(i).get("totalSisaHutang").toString()));
							sbp.setTotalDiBayarBefore(Double.parseDouble(list.get(i).get("totalDiBayar").toString()));
							sbp.setTotalSisaHutang(Double.parseDouble(list.get(i).get("totalSisaHutang").toString())
									- sbp.getTotalDiBayar());
						}
					} else {
						sbp.setTotalSudahDiBayar(0.0);
						sbp.setTotalSisaHutang(0.0);
					}
				}

				sbp.setNoStruk(sp);// setStrukPelayanan

				if (CommonUtil.isNotNullOrEmpty(vo)) {

					StrukBuktiPengeluaranCaraBayar sbpcb = strukBuktiPengeluaranCaraBayarConverter.transferVOToModel(vo,
							new StrukBuktiPengeluaranCaraBayar());

					// set struk bukti pengeluaran
					sbpcb.setNoSBK(sbp);

					// setBankAccount
					if (CommonUtil.isNotNullOrEmpty(vo.getKdBankAccountTujuan())) {
						sbpcb.setKdBankAccountTujuan(
								bankAccountConverter.transferVOToModel(vo.getKdBankAccountTujuan(), new BankAccount()));
					}

					// set cara bayar
					if (CommonUtil.isNotNullOrEmpty(vo.getKdCaraBayar())) {
						sbpcb.setKdCaraBayar(
								caraBayarConverter.transferVOToModel(vo.getKdCaraBayar(), new CaraBayar()));
					}
					// set jenis kartu
					if (CommonUtil.isNotNullOrEmpty(vo.getKdJenisKartu())) {
						sbpcb.setKdJenisKartu(
								jenisKartuConverter.transferVOToModel(vo.getKdJenisKartu(), new JenisKartu()));
					}
					// set struk closing
					if (CommonUtil.isNotNullOrEmpty(vo.getNoclosing())) {
						sbpcb.setNoclosing(
								strukClosingConverter.transferVOToModel(vo.getNoclosing(), new StrukClosing()));
					}
					// set struk verifikasi
					if (CommonUtil.isNotNullOrEmpty(vo.getNoVerifikasi())) {
						sbpcb.setNoVerifikasi(strukVerifikasiConverter.transferVOToModel(vo.getNoVerifikasi(),
								new StrukVerifikasi()));
					}
					// set pegawai pembayar
					sbpcb.setKdPegawaiPembayar(loginUserService.getLoginUser());
					// set nama pegawai pembayar
					sbpcb.setNamaPegawaiPembayar(loginUserService.getLoginUser().getPegawai().getNamaLengkap());
					sbpcb.setNoUrutCb((byte) 0);

					if (CommonUtil.isNotNullOrEmpty(vo.getTotalDibayarCashIn())) {
						sbpcb.setTotalDibayarCashIn(vo.getTotalDibayarCashIn());
					} else {
						sbpcb.setTotalDibayarCashIn(0.0);
					}

					sbpcb.setTotalDibayar(0.0);
					sbpcb.setKeteranganLainnya(sbp.getKeteranganLainnya());

					if (CommonUtil.isNotNullOrEmpty(vo.getNoSBK().getNoStruk())) {

						KelompokTransaksi kelompokTransaksiSP = new KelompokTransaksi();
						Ruangan ruanganSP = new Ruangan();
						Rekanan rekanan = new Rekanan();

						Pegawai pegawaiPenerima = new Pegawai();
						pegawaiPenerima.setId(loginUserService.getLoginUser().getPegawai().getId());

						for (int i = 0; i < list.size(); i++) {
							kelompokTransaksiSP
									.setId(Integer.parseInt(list.get(i).get("idKelompokTransaksi").toString()));
							ruanganSP.setId(Integer.parseInt(list.get(i).get("idRuangan").toString()));
							sp.setTglfaktur(DateUtil.toDate(list.get(i).get("tglFaktur").toString()));
							sp.setTglstruk(DateUtil.toDate(list.get(i).get("tglStruk").toString()));
							sp.setTglterimakiriman(DateUtil.toDate(list.get(i).get("tglTerimaKiriman").toString()));
							sp.setTotalharusdibayar(
									Double.parseDouble(list.get(i).get("totalHarusDibayar").toString()));
							sp.setNamarekanan(list.get(i).get("namaRekanan").toString());
							sp.setNofaktur(list.get(i).get("noFaktur").toString());
							sp.setNostruk(list.get(i).get("noStruk").toString());
							rekanan.setId(Integer.parseInt(list.get(i).get("idRekanan").toString()));
						}

						sp.setKdrekanan(rekanan);// setRekanan
						sp.setKdpegawaipenerima(pegawaiPenerima);// setIdPegawaiPenerima
						sp.setNamapegawaipenerima(loginUserService.getLoginUser().getPegawai().getNamaLengkap());// setNamaPegawaiPenerima
						sp.setKdkelompoktransaksi(kelompokTransaksiSP); // setKelompokTransaksi
						sp.setKdruangan(ruanganSP); // setRuangan
						sp.setNosbklast(sbp); // updateStrukPengeluaran
						sp.setKeteranganlainnya(sbp.getKeteranganLainnya());

						StrukBuktiPengeluaran resultModel = daoStrukBuktiPengeluaran.save(sbp);
						result.put("noRecStrukBuktiPengeluaran", resultModel.getNoRec());

						StrukBuktiPengeluaranCaraBayar resultModelCB = daoStrukBuktiPengeluaranCaraBayar.save(sbpcb);
						result.put("noRecStrukBuktiPengeluaranCaraBayar", resultModelCB.getNoRec());

						StrukPelayanan resultModelStrukPelayanan = daoStrukPelayanan.save(sp);
						result.put("noRecStrukPelayanan", resultModelStrukPelayanan.getNoRec());
						System.out.println("=======END SAVE PEMBAYARAN GAJI PEGAWAI=======");
					}
				}
			}

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

	@Override
	public String GenerateNoSbk() {

		Date dateNow = new Date();
		Integer month = DateUtil.getMonthFromDate(dateNow);
		Integer year = DateUtil.getYearFromDate(dateNow);
		Long count = daoStrukBuktiPengeluaran.countGenerateNoSbk(month);

		String monthNow = month.toString();
		String yearNow = year.toString().substring(2, 4);
		String noSbk = null;

		if (count == null || count.equals(null)) {
			count = (long) 1;
		} else {
			count++;
		}

		if (count.toString().length() == 1) {
			noSbk = "000000";
		} else if (count.toString().length() == 2) {
			noSbk = "000000";
		} else if (count.toString().length() == 3) {
			noSbk = "000000";
		} else if (count.toString().length() == 4) {
			noSbk = "000000";
		} else if (count.toString().length() == 5) {
			noSbk = "000000";
		} else if (count.toString().length() == 6) {
			noSbk = "000000";
		}
		if (monthNow.length() == 1)
			monthNow = "0" + monthNow;

		return yearNow + monthNow + noSbk + count;
	}

	@Override
	public Map<String, Object> saveKlaimPembayaranGajiPegawai(MappingKirimDokumenPasienVO vo) {

		Map<String, Object> result = new HashMap<String, Object>();
		try {
			System.out.println("=======START UPDATE KLAIM PEMBAYARAN=======");

			if (CommonUtil.isNotNullOrEmpty(vo.getList())) {

				StrukBuktiPenerimaan sbm = new StrukBuktiPenerimaan();
				StrukPelayananPenjamin spp = new StrukPelayananPenjamin();
				StrukPelayanan strukPelayanan = new StrukPelayanan();
				Pasien pasien = new Pasien();
				PasienDaftar pasienDaftar = new PasienDaftar();
				DetailKamar detailKamar = new DetailKamar();
				KelompokTransaksi kelTransaksi = new KelompokTransaksi();
				Pegawai pegawai = new Pegawai();
				Ruangan ruangan = new Ruangan();
				KelompokPasien kelPasien = new KelompokPasien();
				Rekanan rekanan = new Rekanan();

				for (MappingKirimDokumenPasienVO model : vo.getList()) {

					List<Map<String, Object>> list = daoCustom.getKlaimPembayaran(model.getNoRegistrasi());

					if (CommonUtil.isNotNullOrEmpty(list)) {
						for (int i = 0; i < list.size(); i++) {

							// set strukPelayanan
							strukPelayanan.setNoRec(list.get(i).get("noRecStrukPelayanan").toString());
							pasien.setId(Integer.parseInt(list.get(i).get("idPasien").toString()));
							strukPelayanan.setNocm(pasien);
							pasienDaftar.setNoRec(list.get(i).get("noRecPasienDaftar").toString());
							strukPelayanan.setNoregistrasi(pasienDaftar);
							sbm.setNoRec(model.getNoRecSbm());
							strukPelayanan.setNosbmlast(sbm);
							detailKamar.setId(Integer.parseInt(list.get(i).get("idKelasLast").toString()));
							strukPelayanan.setKdkelaslast(detailKamar);
							kelTransaksi.setId(Integer.parseInt(list.get(i).get("idKelTransaksi").toString()));
							strukPelayanan.setKdkelompoktransaksi(kelTransaksi);
							pegawai.setId(Integer.parseInt(list.get(i).get("idPegawaiPenerima").toString()));
							strukPelayanan.setKdpegawaipenerima(pegawai);
							ruangan.setId(Integer.parseInt(list.get(i).get("idRuangan").toString()));
							strukPelayanan.setKdruangan(ruangan);
							strukPelayanan.setNostruk(list.get(i).get("noStruk").toString());
							strukPelayanan.setTglstruk(DateUtil.toDate(list.get(i).get("tglStruk").toString()));
							strukPelayanan.setTotalharusdibayar(
									Double.parseDouble(list.get(i).get("totalHarusDibayar").toString()));
							strukPelayanan
									.setTotalprekanan(Double.parseDouble(list.get(i).get("totalPRekanan").toString()));

							// set strukPelayananPenjamin
							spp.setNoRec(model.getNoRegistrasi());
							spp.setNoStruk(strukPelayanan);
							kelPasien.setId(Integer.parseInt(list.get(i).get("idKelPasien").toString()));
							spp.setKdKelompokPasien(kelPasien);
							spp.setTotalBiaya(
									BigDecimal.valueOf(Double.parseDouble(list.get(i).get("totalBiaya").toString())));
							spp.setTotalSudahPPenjamin(BigDecimal
									.valueOf(Double.parseDouble(list.get(i).get("totalSudahPPenjamin").toString())));
							spp.setTotalSisaHarusDibayar(BigDecimal
									.valueOf(Double.parseDouble(list.get(i).get("totalSisaHarusDibayar").toString())));
							spp.setTotalPPenjamin(BigDecimal
									.valueOf(Double.parseDouble(list.get(i).get("totalPPenjamin").toString())));
							spp.setTotalHarusDibayar(BigDecimal
									.valueOf(Double.parseDouble(list.get(i).get("totalHarusDibayar").toString())));
							spp.setTotalSisaPiutang(
									BigDecimal.valueOf(Double.parseDouble(model.getTotalSisaPiutang().toString())));
							spp.setTotalSudahDibayar(
									BigDecimal.valueOf(Double.parseDouble(model.getTotalBayar().toString())));
							spp.setNoVerifikasi(list.get(i).get("noVerifikasi").toString());
							rekanan.setId(Integer.parseInt(list.get(i).get("idRekanan").toString()));
							spp.setKdRekananPenjamin(rekanan);

							spp.setTotalSudahDibebaskan(BigDecimal.valueOf(0));
							spp.setTotalDibayarLebih(BigDecimal.valueOf(0));
							spp.setKdPegawaiPenjamin(Integer.parseInt(list.get(i).get("kdPegawaiPenjamin").toString()));

							StrukPelayanan resultModel = daoStrukPelayanan.save(strukPelayanan);
							result.put("noRecStrukPelayanan", resultModel.getNoRec());

							StrukPelayananPenjamin resultSpp = daoStrukPelayananPenjamin.save(spp);
							result.put("noRecStrukPelayananPenjamin", resultSpp.getNoRec());

						}
					}
				}
			}

			System.out.println("=======END UPDATE KLAIM PEMBAYARAN=======");
		} catch (Exception e) {
			e.printStackTrace();
		}
		return result;
	}

}
