package com.jasamedika.medifirst2000.service.impl;

import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

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

import com.jasamedika.medifirst2000.constants.Master;
import com.jasamedika.medifirst2000.converter.BaseConverterImpl;
import com.jasamedika.medifirst2000.dao.AntrianPasienDiPeriksaDao;
import com.jasamedika.medifirst2000.dao.HargaNettoProdukByKelasDao;
import com.jasamedika.medifirst2000.dao.LogAccDao;
import com.jasamedika.medifirst2000.dao.MapDiagnosisToProdukDao;
import com.jasamedika.medifirst2000.dao.MapPaketToProdukDao;
import com.jasamedika.medifirst2000.dao.MapRuanganToProdukDao;
import com.jasamedika.medifirst2000.dao.PasienDaftarDao;
import com.jasamedika.medifirst2000.dao.PelayananPasienDao;
import com.jasamedika.medifirst2000.dao.PelayananPasienDetailDao;
import com.jasamedika.medifirst2000.dao.PelayananPasienPetugasDao;
import com.jasamedika.medifirst2000.dao.ProdukDao;
import com.jasamedika.medifirst2000.dao.ProdukDetailLaboratoriumDao;
import com.jasamedika.medifirst2000.dao.ProdukDetailLaboratoriumHasilDao;
import com.jasamedika.medifirst2000.dao.SettingDataFixedDao;
import com.jasamedika.medifirst2000.dto.PiutangRekananProfileTemp;
import com.jasamedika.medifirst2000.entities.AntrianPasienDiPeriksa;
import com.jasamedika.medifirst2000.entities.AsalProduk;
import com.jasamedika.medifirst2000.entities.BahanProduk;
import com.jasamedika.medifirst2000.entities.Departemen;
import com.jasamedika.medifirst2000.entities.DetailGolonganProduk;
import com.jasamedika.medifirst2000.entities.DetailJenisProduk;
import com.jasamedika.medifirst2000.entities.DetailObat;
import com.jasamedika.medifirst2000.entities.Generik;
import com.jasamedika.medifirst2000.entities.GolonganDarah;
import com.jasamedika.medifirst2000.entities.HargaNettoProdukByKelasD;
import com.jasamedika.medifirst2000.entities.JenisPetugasPelaksana;
import com.jasamedika.medifirst2000.entities.JenisProduk;
import com.jasamedika.medifirst2000.entities.KategoryProduk;
import com.jasamedika.medifirst2000.entities.KelompokProduk;
import com.jasamedika.medifirst2000.entities.KomponenHarga;
import com.jasamedika.medifirst2000.entities.LogAcc;
import com.jasamedika.medifirst2000.entities.MapRuanganToProduk;
import com.jasamedika.medifirst2000.entities.MerkProduk;
import com.jasamedika.medifirst2000.entities.PasienDaftar;
import com.jasamedika.medifirst2000.entities.PelayananPasien;
import com.jasamedika.medifirst2000.entities.PelayananPasienDetail;
import com.jasamedika.medifirst2000.entities.PelayananPasienPetugas;
import com.jasamedika.medifirst2000.entities.Produk;
import com.jasamedika.medifirst2000.entities.ProdukDetailLaboratorium;
import com.jasamedika.medifirst2000.entities.ProdukDetailLaboratoriumHasil;
import com.jasamedika.medifirst2000.entities.Rekanan;
import com.jasamedika.medifirst2000.entities.Rhesus;
import com.jasamedika.medifirst2000.entities.Ruangan;
import com.jasamedika.medifirst2000.entities.SatuanBesar;
import com.jasamedika.medifirst2000.entities.SatuanKecil;
import com.jasamedika.medifirst2000.entities.SatuanStandar;
import com.jasamedika.medifirst2000.entities.Sediaan;
import com.jasamedika.medifirst2000.entities.StatusBarang;
import com.jasamedika.medifirst2000.entities.TypeProduk;
import com.jasamedika.medifirst2000.entities.WarnaProduk;
import com.jasamedika.medifirst2000.exception.ServiceVOException;
import com.jasamedika.medifirst2000.service.PelayananPiutangRekananService;
import com.jasamedika.medifirst2000.service.ProdukService;
import com.jasamedika.medifirst2000.util.CommonUtil;
import com.jasamedika.medifirst2000.util.HibernateInitialize;
import com.jasamedika.medifirst2000.util.JsonUtil;
import com.jasamedika.medifirst2000.util.StringUtil;
import com.jasamedika.medifirst2000.vo.BahanProdukVO;
import com.jasamedika.medifirst2000.vo.DepartemenVO;
import com.jasamedika.medifirst2000.vo.DetailGolonganProdukVO;
import com.jasamedika.medifirst2000.vo.DetailJenisProdukVO;
import com.jasamedika.medifirst2000.vo.DetailObatVO;
import com.jasamedika.medifirst2000.vo.GenerikVO;
import com.jasamedika.medifirst2000.vo.GolonganDarahVO;
import com.jasamedika.medifirst2000.vo.JenisLimbahB3MasukVO;
import com.jasamedika.medifirst2000.vo.JenisProdukVO;
import com.jasamedika.medifirst2000.vo.KategoryProdukVO;
import com.jasamedika.medifirst2000.vo.KelompokProdukVO;
import com.jasamedika.medifirst2000.vo.MerkProdukVO;
import com.jasamedika.medifirst2000.vo.PelayananPasienPetugasVO;
import com.jasamedika.medifirst2000.vo.ProdukDetailLaboratoriumHasilVO;
import com.jasamedika.medifirst2000.vo.ProdukVO;
import com.jasamedika.medifirst2000.vo.RekananVO;
import com.jasamedika.medifirst2000.vo.RhesusVO;
import com.jasamedika.medifirst2000.vo.SatuanBesarVO;
import com.jasamedika.medifirst2000.vo.SatuanKecilVO;
import com.jasamedika.medifirst2000.vo.SatuanStandarVO;
import com.jasamedika.medifirst2000.vo.SediaanVO;
import com.jasamedika.medifirst2000.vo.StatusBarangVO;
import com.jasamedika.medifirst2000.vo.TypeProdukVO;
import com.jasamedika.medifirst2000.vo.WarnaProdukVO;

@Service("produkService")
public class ProdukServiceImpl extends BaseAngaranServiceImpl implements ProdukService {

	@Autowired
	private ProdukDao produkDao;

	@Autowired
	private LogAccDao logAccDao;

	@Autowired
	private ProdukDetailLaboratoriumHasilDao detailHasilDao;

	@Autowired
	private ProdukDetailLaboratoriumDao detailDao;

	@Autowired
	private MapDiagnosisToProdukDao mapDiagnosaToProdukDao;

	@Autowired
	private BaseConverterImpl<ProdukVO, Produk> produkConverter;

	@Autowired
	private BaseConverterImpl<JenisProdukVO, JenisProduk> jenisProdukConverter;

	@Autowired
	private BaseConverterImpl<DetailJenisProdukVO, DetailJenisProduk> detailJenisProdukVOConverter;

	@Autowired
	private PelayananPasienDao pelayananPasienDao;
	@Autowired
	private PelayananPasienDetailDao pelayananPasienDetailDao;

	@Autowired
	private BaseConverterImpl<GenerikVO, Generik> generikConverter;

	@Autowired
	private BaseConverterImpl<SediaanVO, Sediaan> sediaanConverter;

	@Autowired
	private BaseConverterImpl<KategoryProdukVO, KategoryProduk> kategoryProdukConverter;

	@Autowired
	private BaseConverterImpl<DetailObatVO, DetailObat> detailObatConverter;

	@Autowired
	private BaseConverterImpl<StatusBarangVO, StatusBarang> statusBarangConverter;

	@Autowired
	private BaseConverterImpl<RekananVO, Rekanan> rekananConverter;

	@Autowired
	private BaseConverterImpl<SatuanBesarVO, SatuanBesar> satuanBesarConverter;

	@Autowired
	private BaseConverterImpl<SatuanKecilVO, SatuanKecil> satuanKecilConverter;

	@Autowired
	private BaseConverterImpl<DepartemenVO, Departemen> departemenConverter;

	@Autowired
	private BaseConverterImpl<DetailGolonganProdukVO, DetailGolonganProduk> detailGolonganProdukVOConverter;

	@Autowired
	private BaseConverterImpl<SatuanStandarVO, SatuanStandar> satuanStandarVOConverter;

	@Autowired
	private BaseConverterImpl<BahanProdukVO, BahanProduk> bahanProdukConverter;

	@Autowired
	private BaseConverterImpl<MerkProdukVO, MerkProduk> merkProdukConverter;

	@Autowired
	private BaseConverterImpl<TypeProdukVO, TypeProduk> typeProdukConverter;

	@Autowired
	private BaseConverterImpl<WarnaProdukVO, WarnaProduk> warnaProdukConverter;

	@Autowired
	private BaseConverterImpl<GolonganDarahVO, GolonganDarah> golonganDarahConverter;

	@Autowired
	private BaseConverterImpl<RhesusVO, Rhesus> rhesusConverter;

	@Autowired
	private BaseConverterImpl<ProdukDetailLaboratoriumHasilVO, ProdukDetailLaboratoriumHasil> produkDetailHasilConverter;

	@Autowired
	private BaseConverterImpl<PelayananPasienPetugasVO, PelayananPasienPetugas> pelayananPetugasConverter;

	@Autowired
	private PelayananPiutangRekananService pelayananPiutangRekananService;

	@Autowired
	private MapRuanganToProdukDao mapRuanganToProdukDao;

	@Autowired
	private MapPaketToProdukDao mapPaketToProdukDao;

	@Autowired
	private SettingDataFixedDao settingDataFixedDao;

	@Autowired
	private PelayananPasienPetugasDao pelayananPasienPetugasDao;

	@Autowired
	private com.jasamedika.medifirst2000.service.LoginUserService LoginUserService;

	@Autowired
	private PasienDaftarDao pasienDaftarDao;

	@Autowired
	private HargaNettoProdukByKelasDao hargaNettoProdukByKelasDao;

	@Override
	public ProdukVO add(ProdukVO vo) throws JpaSystemException, ServiceVOException {
		return null;
	}

	@Override
	public ProdukVO update(ProdukVO vo) throws JpaSystemException, ServiceVOException {
		return null;
	}

	@Override
	public Boolean delete(Integer key) throws JpaSystemException {
		return null;
	}

	@Override
	public ProdukVO findById(Integer key) throws JpaSystemException {
		return null;
	}

	@Override
	public List<ProdukVO> findAll() throws JpaSystemException {
		return null;
	}

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

	@Override
	public List<JenisProdukVO> findJenisProdukByKelompokProduk(Integer idKelompokProduk) {
		List<JenisProdukVO> data = new ArrayList<JenisProdukVO>();
		return jenisProdukConverter.transferListOfModelToListOfVO(
				produkDao.findJenisProdukByKelompokProduk(idKelompokProduk), data, JenisProdukVO.class);
	}

	@Override
	public List<JenisProdukVO> findJenisProdukLaboratorium() {
		// get produk laborat, sisa jenis produk nya masih di hardcode,
		// hars di ubah id kelompok produk
		List<JenisProdukVO> data = new ArrayList<JenisProdukVO>();
		return jenisProdukConverter.transferListOfModelToListOfVO(produkDao.findJenisProdukLaboratorium(), data,
				JenisProdukVO.class);
	}

	@Override
	public List<DetailJenisProdukVO> findDetailJenisProdukByJenisProduk(Integer idJenisProduk) {
		List<DetailJenisProdukVO> data = new ArrayList<DetailJenisProdukVO>();
		return detailJenisProdukVOConverter.transferListOfModelToListOfVO(
				produkDao.findDetailJenisProdukByJenisProduk(idJenisProduk), data, DetailJenisProdukVO.class);
	}

	@Override
	public List<ProdukVO> findTindakanByName(String namaObat) {
		List<ProdukVO> data = new ArrayList<ProdukVO>();
		produkConverter.setUseGson(false);
		List<Produk> page = produkDao.findTindakan(namaObat, new PageRequest(0, 25));

		return produkConverter.transferListOfModelToListOfVO(page, data, ProdukVO.class);
	}

	@Override
	public List<ProdukVO> findDetailProdukByDetailJenisProduk(Integer idDetailJenisProduk) {
		List<ProdukVO> data = new ArrayList<ProdukVO>();
		produkConverter.setUseGson(false);
		return produkConverter.transferListOfModelToListOfVO(
				produkDao.findDetailProdukByDetailJenisProduk(idDetailJenisProduk), data, ProdukVO.class);
	}

	@Override
	public List<ProdukVO> findObatByName(String namaObat) {
		List<ProdukVO> data = new ArrayList<ProdukVO>();
		produkConverter.setUseGson(false);
		List<Produk> page = produkDao.findObatByNama(namaObat, new PageRequest(0, 25));
		for (Produk produk : page) {

			produk.setGenerik(produkDao.findGenerikByProdukId(produk.getId()));
		}
		return produkConverter.transferListOfModelToListOfVO(page, data, ProdukVO.class);
	}

	@Override
	public Integer findStokProdukService(Integer idProduk, Integer idRuangan) {
		return produkDao.findStokRuangan(idProduk, idRuangan);
	}

	@Override
	public Double findStokProdukServiceKonversi(Integer idProduk, Integer idRuangan, Integer satuanStandarId) {
		Produk p = HibernateInitialize.initializeAndUnproxy(produkDao.findByIdObject(idProduk));
		Double qty = 0.0;
		Double tmp = 0.0;
		Double qtyProduk = produkDao.findStokRuanganDouble(idProduk, idRuangan);
		if (CommonUtil.isNotNullOrEmpty(qtyProduk)) {
			qty = qtyProduk;
		}
		if (CommonUtil.isNotNullOrEmpty(p.getSatuanStandar())) {
			tmp = qty / p.getSatuanStandar().getQtyKemasan();
			if (!(p.getSatuanStandar().getId().equals(satuanStandarId))) {
				if (CommonUtil.isNotNullOrEmpty(p.getSatuanStandar().getSatuanStandarHead())) {
					tmp = tmp / p.getSatuanStandar().getSatuanStandarHead().getQtyKemasan();
					if (!(p.getSatuanStandar().getSatuanStandarHead().getId().equals(satuanStandarId))) {
						if (CommonUtil
								.isNotNullOrEmpty(p.getSatuanStandar().getSatuanStandarHead().getSatuanStandarHead())) {
							tmp = tmp / p.getSatuanStandar().getSatuanStandarHead().getSatuanStandarHead()
									.getQtyKemasan();
							if (!(p.getSatuanStandar().getSatuanStandarHead().getSatuanStandarHead().getId()
									.equals(satuanStandarId))) {
								if (CommonUtil.isNotNullOrEmpty(p.getSatuanStandar().getSatuanStandarHead()
										.getSatuanStandarHead().getSatuanStandarHead())) {
									tmp = tmp / p.getSatuanStandar().getSatuanStandarHead().getSatuanStandarHead()
											.getSatuanStandarHead().getQtyKemasan();
								}
							}

						}
					}

				}
			}

		}
		return tmp;
	}

	@Override
	@Transactional(readOnly = false)
	public List<PelayananPasien> postDiagnosa(String kdDiagnosa, AntrianPasienDiPeriksa pasienDaftar) {
		// edit by askur 06012017
		// List<PelayananPasien> list = savePelayananDiagnosaPasien(kdDiagnosa,
		// pasienDaftar);
		List<PelayananPasien> list = savePelayananDiagnosaPasien2(kdDiagnosa, pasienDaftar);
		return list;
	}

	private List<PelayananPasien> savePelayananDiagnosaPasien2(String kdDiagnosa, AntrianPasienDiPeriksa pasienDaftar) {
		return null;
	}

	@SuppressWarnings("unchecked")
	private void ambilHarga(AntrianPasienDiPeriksa pasienDaftar, Produk produk, List<PelayananPasien> list) {
		PelayananPasien newsubModel;
		Map<String, Object> map = pelayananPiutangRekananService.getHargaPiutangRekananProfile(pasienDaftar.getNoRec(),
				produk, 1.0, 0);
		List<PiutangRekananProfileTemp> listPiutangRekananProfileTemp = (List<PiutangRekananProfileTemp>) map
				.get("list");
		// Double mapHargaCito=0.0;
		Double mapHargaSatuan = 0.0;
		// Double mapHargaDiskon=0.0;
		Double mapHargaNetto = 0.0;
		Double mapHargaPiutangRekanan = 0.0;
		Double mapHargaPiutangProfile = 0.0;
		for (PiutangRekananProfileTemp abcd : listPiutangRekananProfileTemp) {
			// mapHargaCito=Double.valueOf(abcd.getHargaCito());
			mapHargaSatuan = Double.valueOf(abcd.getHargaSatuan());
			// mapHargaDiskon=Double.valueOf(abcd.getHargaDiskon());
			mapHargaNetto = Double.valueOf(abcd.getHargaNetto());
			mapHargaPiutangRekanan = Double.valueOf(abcd.getHargaPiutangRekanan());
			mapHargaPiutangProfile = Double.valueOf(abcd.getHargaPiutangProfile());
		}

		Double hargaSatuan = mapHargaSatuan;
		Double hargaJual = mapHargaSatuan;
		Double hargaNetto = mapHargaNetto;
		Double hargaPiutangPenjamin = mapHargaPiutangRekanan;
		Double hargaPiutangRumahSakit = mapHargaPiutangProfile;
		//

		// masukan ke pelayanan
		Calendar c = new GregorianCalendar();
		c.set(Calendar.HOUR_OF_DAY, 0); // anything 0 - 23
		c.set(Calendar.MINUTE, 0);
		c.set(Calendar.SECOND, 0);
		Date d1 = c.getTime(); //

		newsubModel = new PelayananPasien();
		// add by askur 19012017
		newsubModel.setPiutangPenjamin(hargaPiutangPenjamin);
		newsubModel.setPiutangRumahSakit(hargaPiutangRumahSakit);
		//
		// edit by askur 06012017
		// newsubModel.setHargaSatuan(harga.getHargaNetto1());
		// newsubModel.setHargaJual(harga.getHargaNetto1());
		newsubModel.setHargaSatuan(hargaSatuan);
		newsubModel.setHargaJual(hargaJual);
		newsubModel.setHargaNetto(hargaNetto);
		//
		newsubModel.setTglPelayanan(d1);
		newsubModel.setKeteranganLain("-");
		newsubModel.setAturanPakai("-");
		newsubModel.setNilaiNormal((byte) 1);
		// newsubModel.setKeteranganPakai();
		newsubModel.setKeteranganPakai2("-");
		newsubModel.setPasien(pasienDaftar);
		newsubModel.setProduk(produk);
		newsubModel.setStock(1.0);
		newsubModel.setJumlah(1.0);

		newsubModel = pelayananPasienDao.save(newsubModel);
		if (CommonUtil.isNotNullOrEmpty(newsubModel.getNoRec())) {
			LogAcc log = new LogAcc();
			log.setTanggal(newsubModel.getTglPelayanan());
			log.setNoReff(newsubModel.getNoRec());
			log.setJenisTransaksi("save pelayanan");
			if (CommonUtil.isNotNullOrEmpty(log)) {
				logAccDao.save(log);
			}
		}
		list.add(newsubModel);
		List<HargaNettoProdukByKelasD> hargas = mapDiagnosaToProdukDao.getHargaDetail(produk.getId());
		for (HargaNettoProdukByKelasD hargaNettoProdukByKelasD : hargas) {
			PelayananPasienDetail newsubModelDetail = new PelayananPasienDetail();
			// add by askur 19012017
			newsubModelDetail.setPiutangPenjamin(hargaPiutangPenjamin);
			newsubModelDetail.setPiutangRumahSakit(hargaPiutangRumahSakit);
			//
			// edit by askur 06012017
			// newsubModelDetail.setHargaSatuan(harga.getHargaNetto1());
			// newsubModelDetail.setHargaJual(harga.getHargaNetto1());
			newsubModelDetail.setHargaSatuan(hargaSatuan);
			newsubModelDetail.setHargaJual(hargaJual);
			newsubModelDetail.setHargaNetto(hargaNetto);
			//
			newsubModelDetail.setTglPelayanan(d1);
			newsubModelDetail.setJumlah(1.0);
			newsubModelDetail.setPasien(pasienDaftar);
			newsubModelDetail.setKeteranganLain("-");
			newsubModelDetail.setAturanPakai("-");
			// newsubModelDetail.setKeteranganPakai("-");
			newsubModelDetail.setStock(1);
			newsubModelDetail.setKeteranganPakai2("-");
			newsubModelDetail.setKomponenHarga(hargaNettoProdukByKelasD.getKomponenHarga());
			newsubModelDetail.setProduk(produk);
			// add by askur 021120160258
			newsubModelDetail.setPelayananPasien(newsubModel);
			//
			pelayananPasienDetailDao.save(newsubModelDetail);
		}

		pelayananPetugasConverter.setUseGson(true);
		PelayananPasienPetugas model = null;
		try {
			model = pelayananPetugasConverter.transferVOToModel(newsubModel.ToMap(), new PelayananPasienPetugas());
		} catch (IllegalArgumentException | IllegalAccessException e) {
			e.printStackTrace();
		}
		model.setObjectProduk(newsubModel.getProduk());
		AsalProduk asalProduk = new AsalProduk();
		asalProduk.setId(1);
		model.setObjectRuangan(pasienDaftar.getRuangan());
		model.setObjectAsalProduk(asalProduk);
		JenisPetugasPelaksana kdjenispetugaspe = new JenisPetugasPelaksana();
		kdjenispetugaspe.setId(3);
		model.setObjectJenisPetugasPe(kdjenispetugaspe);
		model.setObjectPegawai(LoginUserService.getLoginUser().getPegawai());
		model.setPelayananPasien(newsubModel);
		model.setNoMasuk(newsubModel.getPasien());
		pelayananPasienPetugasDao.save(model);

	}

	@Override
	@Transactional(readOnly = false)
	public Map<String, Object> addBarangMedis(ProdukVO vo) {
		Produk produk = new Produk();
		if (CommonUtil.isNotNullOrEmpty(vo)) {
			produk = produkConverter.transferVOToModel(vo, new Produk());
		}
		if (CommonUtil.isNotNullOrEmpty(vo.getGenerik())) {
			produk.setGenerik(generikConverter.transferVOToModel(vo.getGenerik(), new Generik()));
		}
		if (CommonUtil.isNotNullOrEmpty(vo.getSediaan())) {
			produk.setSediaan(sediaanConverter.transferVOToModel(vo.getSediaan(), new Sediaan()));
		}
		if (CommonUtil.isNotNullOrEmpty(vo.getKategoryProduk())) {
			produk.setKategoryProduk(
					kategoryProdukConverter.transferVOToModel(vo.getKategoryProduk(), new KategoryProduk()));
		}
		if (CommonUtil.isNotNullOrEmpty(vo.getDetailJenisProduk())) {
			produk.setDetailJenisProduk(
					detailJenisProdukVOConverter.transferVOToModel(vo.getDetailJenisProduk(), new DetailJenisProduk()));
		}
		if (CommonUtil.isNotNullOrEmpty(vo.getDetailObat())) {
			produk.setDetailObat(detailObatConverter.transferVOToModel(vo.getDetailObat(), new DetailObat()));
		}
		if (CommonUtil.isNotNullOrEmpty(vo.getStatusBarang())) {
			produk.setStatusBarang(statusBarangConverter.transferVOToModel(vo.getStatusBarang(), new StatusBarang()));
		}
		if (CommonUtil.isNotNullOrEmpty(vo.getRekanan())) {
			produk.setRekanan(rekananConverter.transferVOToModel(vo.getRekanan(), new Rekanan()));
		}
		if (CommonUtil.isNotNullOrEmpty(vo.getSatuanBesar())) {
			produk.setSatuanBesar(satuanBesarConverter.transferVOToModel(vo.getSatuanBesar(), new SatuanBesar()));
		}
		if (CommonUtil.isNotNullOrEmpty(vo.getSatuanKecil())) {
			produk.setSatuanKecil(satuanKecilConverter.transferVOToModel(vo.getSatuanKecil(), new SatuanKecil()));
		}
		if (CommonUtil.isNotNullOrEmpty(vo.getDepartemen())) {
			produk.setDepartemen(departemenConverter.transferVOToModel(vo.getDepartemen(), new Departemen()));
		}
		if (CommonUtil.isNotNullOrEmpty(vo.getGolonganDarah())) {
			produk.setGolonganDarah(
					golonganDarahConverter.transferVOToModel(vo.getGolonganDarah(), new GolonganDarah()));
		}
		if (CommonUtil.isNotNullOrEmpty(vo.getRhesus())) {
			produk.setRhesus(rhesusConverter.transferVOToModel(vo.getRhesus(), new Rhesus()));
		}

		Produk resultModel = produkDao.save(produk);

		Map<String, Object> result = new HashMap<String, Object>();
		if (resultModel != null) {
			result.put("id", resultModel.getId());
			result.put("namaBarang", resultModel.getNamaProduk());
		}

		return result;
	}

	@Override
	@Transactional(readOnly = false)
	public Map<String, Object> updateBarangMedis(ProdukVO vo) {
		Produk produk = new Produk();
		if (CommonUtil.isNotNullOrEmpty(vo)) {
			produk = produkConverter.transferVOToModel(vo, new Produk());
		}
		if (CommonUtil.isNotNullOrEmpty(vo.getGenerik())) {
			produk.setGenerik(generikConverter.transferVOToModel(vo.getGenerik(), new Generik()));
		}
		if (CommonUtil.isNotNullOrEmpty(vo.getSediaan())) {
			produk.setSediaan(sediaanConverter.transferVOToModel(vo.getSediaan(), new Sediaan()));
		}
		if (CommonUtil.isNotNullOrEmpty(vo.getKategoryProduk())) {
			produk.setKategoryProduk(
					kategoryProdukConverter.transferVOToModel(vo.getKategoryProduk(), new KategoryProduk()));
		}
		if (CommonUtil.isNotNullOrEmpty(vo.getDetailJenisProduk())) {
			produk.setDetailJenisProduk(
					detailJenisProdukVOConverter.transferVOToModel(vo.getDetailJenisProduk(), new DetailJenisProduk()));
		}
		if (CommonUtil.isNotNullOrEmpty(vo.getDetailObat())) {
			produk.setDetailObat(detailObatConverter.transferVOToModel(vo.getDetailObat(), new DetailObat()));
		}
		if (CommonUtil.isNotNullOrEmpty(vo.getStatusBarang())) {
			produk.setStatusBarang(statusBarangConverter.transferVOToModel(vo.getStatusBarang(), new StatusBarang()));
		}
		if (CommonUtil.isNotNullOrEmpty(vo.getRekanan())) {
			produk.setRekanan(rekananConverter.transferVOToModel(vo.getRekanan(), new Rekanan()));
		}
		if (CommonUtil.isNotNullOrEmpty(vo.getSatuanBesar())) {
			produk.setSatuanBesar(satuanBesarConverter.transferVOToModel(vo.getSatuanBesar(), new SatuanBesar()));
		}
		if (CommonUtil.isNotNullOrEmpty(vo.getSatuanKecil())) {
			produk.setSatuanKecil(satuanKecilConverter.transferVOToModel(vo.getSatuanKecil(), new SatuanKecil()));
		}
		if (CommonUtil.isNotNullOrEmpty(vo.getDepartemen())) {
			produk.setDepartemen(departemenConverter.transferVOToModel(vo.getDepartemen(), new Departemen()));
		}
		if (CommonUtil.isNotNullOrEmpty(vo.getGolonganDarah())) {
			produk.setGolonganDarah(
					golonganDarahConverter.transferVOToModel(vo.getGolonganDarah(), new GolonganDarah()));
		}
		if (CommonUtil.isNotNullOrEmpty(vo.getRhesus())) {
			produk.setRhesus(rhesusConverter.transferVOToModel(vo.getRhesus(), new Rhesus()));
		}

		Produk resultModel = produkDao.save(produk);

		Map<String, Object> result = new HashMap<String, Object>();
		if (resultModel != null) {
			result.put("id", resultModel.getId());
			result.put("namaBarang", resultModel.getNamaProduk());
		}

		return result;
	}

	@Override
	public Map<String, Object> addBarangNonMedis(ProdukVO vo) {

		Produk produk = new Produk();

		if (CommonUtil.isNotNullOrEmpty(vo)) {
			produk = produkConverter.transferVOToModel(vo, new Produk());
		}

		if (CommonUtil.isNotNullOrEmpty(vo.getSatuanStandar())) {
			produk.setSatuanStandar(
					satuanStandarVOConverter.transferVOToModel(vo.getSatuanStandar(), new SatuanStandar()));
		}
		if (CommonUtil.isNotNullOrEmpty(vo.getBahanProduk())) {
			produk.setBahanProduk(bahanProdukConverter.transferVOToModel(vo.getBahanProduk(), new BahanProduk()));
		}
		if (CommonUtil.isNotNullOrEmpty(vo.getMerkProduk())) {
			produk.setMerkProduk(merkProdukConverter.transferVOToModel(vo.getMerkProduk(), new MerkProduk()));
		}
		if (CommonUtil.isNotNullOrEmpty(vo.getTypeProduk())) {
			produk.setTypeProduk(typeProdukConverter.transferVOToModel(vo.getTypeProduk(), new TypeProduk()));
		}
		if (CommonUtil.isNotNullOrEmpty(vo.getWarnaProduk())) {
			produk.setWarnaProduk(warnaProdukConverter.transferVOToModel(vo.getWarnaProduk(), new WarnaProduk()));
		}
		if (CommonUtil.isNotNullOrEmpty(vo.getDepartemen())) {
			produk.setDepartemen(departemenConverter.transferVOToModel(vo.getDepartemen(), new Departemen()));
		}
		if (CommonUtil.isNotNullOrEmpty(vo.getDetailGolonganProduk())) {
			produk.setDetailGolonganProduk(detailGolonganProdukVOConverter
					.transferVOToModel(vo.getDetailGolonganProduk(), new DetailGolonganProduk()));
		}
		if (CommonUtil.isNotNullOrEmpty(vo.getDetailJenisProduk())) {
			produk.setDetailJenisProduk(
					detailJenisProdukVOConverter.transferVOToModel(vo.getDetailJenisProduk(), new DetailJenisProduk()));
		}

		produk = produkDao.save(produk);

		Map<String, Object> result = new HashMap<String, Object>();
		return result;

	}

	@Override
	public Map<String, Object> updateBarangNonMedis(ProdukVO vo) {

		Produk produk = new Produk();
		if (CommonUtil.isNotNullOrEmpty(vo)) {
			produk = produkConverter.transferVOToModel(vo, new Produk());
		}

		if (CommonUtil.isNotNullOrEmpty(vo.getSatuanStandar())) {
			produk.setSatuanStandar(
					satuanStandarVOConverter.transferVOToModel(vo.getSatuanStandar(), new SatuanStandar()));
		}
		if (CommonUtil.isNotNullOrEmpty(vo.getBahanProduk())) {
			produk.setBahanProduk(bahanProdukConverter.transferVOToModel(vo.getBahanProduk(), new BahanProduk()));
		}
		if (CommonUtil.isNotNullOrEmpty(vo.getMerkProduk())) {
			produk.setMerkProduk(merkProdukConverter.transferVOToModel(vo.getMerkProduk(), new MerkProduk()));
		}
		if (CommonUtil.isNotNullOrEmpty(vo.getTypeProduk())) {
			produk.setTypeProduk(typeProdukConverter.transferVOToModel(vo.getTypeProduk(), new TypeProduk()));
		}
		if (CommonUtil.isNotNullOrEmpty(vo.getWarnaProduk())) {
			produk.setWarnaProduk(warnaProdukConverter.transferVOToModel(vo.getWarnaProduk(), new WarnaProduk()));
		}
		if (CommonUtil.isNotNullOrEmpty(vo.getDepartemen())) {
			produk.setDepartemen(departemenConverter.transferVOToModel(vo.getDepartemen(), new Departemen()));
		}
		if (CommonUtil.isNotNullOrEmpty(vo.getDetailGolonganProduk())) {
			produk.setDetailGolonganProduk(detailGolonganProdukVOConverter
					.transferVOToModel(vo.getDetailGolonganProduk(), new DetailGolonganProduk()));
		}
		if (CommonUtil.isNotNullOrEmpty(vo.getDetailJenisProduk())) {
			produk.setDetailJenisProduk(
					detailJenisProdukVOConverter.transferVOToModel(vo.getDetailJenisProduk(), new DetailJenisProduk()));
		}

		produk = produkDao.save(produk);

		Map<String, Object> result = new HashMap<String, Object>();
		return result;

	}

	@Override
	public Map<String, Object> addJenisLimbahB3(JenisLimbahB3MasukVO vo) {
		Produk produk = new Produk();
		DetailJenisProduk detailJenisProduk = new DetailJenisProduk();
		detailJenisProduk.setId(172);// misal kode detail jenis produk utk jeni
										// limbah
		detailJenisProduk.setKdProfile((short) 0);
		produk.setDetailJenisProduk(detailJenisProduk);
		produk.setNamaProduk(vo.getJenisLimbahB3masuk());
		produk.setKdProduk("hghg");
		produk.setNilaiNormal((short) 0);
		produk.setqProduk(1);
		produk.setQtyJualTerkecil((double) 0);
		produk.setQtySatuKemasan(0);
		produk.setQtyTerkecil((double) 0);
		produk.setKdProduk(StringUtil.formatNumber(String.valueOf(produkDao.getCount() + 1), 6));
		produk.setKdProdukIntern(StringUtil.formatNumber(String.valueOf(produkDao.getCount() + 1), 6));
		produk.setStatusEnabled(vo.getStatusEnabled());
		if (CommonUtil.isNotNullOrEmpty(vo.getDetailJenisProduk())) {
			produk.setDetailJenisProduk(
					detailJenisProdukVOConverter.transferVOToModel(vo.getDetailJenisProduk(), new DetailJenisProduk()));
		}
		Produk produkResult = produkDao.save(produk);
		Map<String, Object> result = new HashMap<String, Object>();
		if (CommonUtil.isNotNullOrEmpty(produkResult)) {
			result.put("id", produkResult.getId());
		}

		return result;

	}

	@Override
	public Map<String, Object> findAllJenisLimbah() {
		Map<String, Object> result = new HashMap<String, Object>();
		List<Produk> resultModel = (List<Produk>) produkDao.findProdukJenisLimbah();
		if (CommonUtil.isNotNullOrEmpty(resultModel)) {
			result.put("jenisLimbahB3Masuk", resultModel);
			result.put("dataFound", true);
		} else {
			result.put("dataFound", false);
		}
		return result;
	}

	@Override
	public List<ProdukVO> findDetailProdukByDetailJenisProdukAndNamaProduk(Integer idDetailJenisProduk,
			String namaProduk) {
		List<ProdukVO> data = new ArrayList<ProdukVO>();
		return produkConverter.transferListOfModelToListOfVO(
				produkDao.findDetailProdukByDetailJenisProdukAndNamaProduk(idDetailJenisProduk, namaProduk), data,
				ProdukVO.class);
	}

	@Override
	public List<ProdukVO> findProdukByKelompokProduk(int kdKelompokProduk, String keyWord) {
		List<ProdukVO> data = new ArrayList<ProdukVO>();
		return produkConverter.transferListOfModelToListOfVO(
				produkDao.findFirst10ByDetailJenisProdukJenisProdukKelompokProdukIdAndNamaProdukContaining(
						kdKelompokProduk, keyWord, new PageRequest(0, 10)),
				data, ProdukVO.class);
	}

	@Override
	public Map<String, Object> addProductFromInputKantongBarang(ProdukVO vo) {
		Map<String, Object> result = new HashMap<String, Object>();
		Produk produk = new Produk();
		if (CommonUtil.isNotNullOrEmpty(vo)) {
			produk = produkConverter.transferVOToModel(vo, new Produk());
		}

		Produk model = produkDao.save(produk);
		if (CommonUtil.isNotNullOrEmpty(model)) {
			result.put("Id", model.getId());
		}
		return result;
	}

	@Override
	public Produk findByBentukProdukIdAndRhesusIdAndGolonganDarahId(Integer idBentuk, Integer idRhesus,
			Integer idGolonganDarah) {
		return produkDao.findByBentukProdukIdAndRhesusIdAndGolonganDarahId(idBentuk, idRhesus, idGolonganDarah);
	}

	@Override
	public Map<String, Object> findByProdukId(Integer id) {
		Map<String, Object> result = new HashMap<String, Object>();
		List<ProdukDetailLaboratorium> resultModel = detailDao.getDetailProduk(id);
		if (CommonUtil.isNotNullOrEmpty(resultModel)) {
			try {
				result.put("data", JsonUtil.ToMaps(resultModel));
				result.put("dataFound", true);
			} catch (IllegalArgumentException e) {
				e.printStackTrace();
			} catch (IllegalAccessException e) {
				e.printStackTrace();
			}
		} else {
			result.put("dataFound", false);
		}
		return result;
	}

	@Override
	public Map<String, Object> addDetailHasil(List<ProdukDetailLaboratoriumHasilVO> vos) {
		Map<String, Object> result = new HashMap<String, Object>();
		List<ProdukDetailLaboratoriumHasil> models = new ArrayList<ProdukDetailLaboratoriumHasil>();

		if (CommonUtil.isNotNullOrEmpty(vos)) {
			for (ProdukDetailLaboratoriumHasilVO vo : vos) {
				ProdukDetailLaboratoriumHasil model = new ProdukDetailLaboratoriumHasil();
				model = produkDetailHasilConverter.transferVOToModel(vo, new ProdukDetailLaboratoriumHasil());
				model.setProdukDetail(detailDao.getDetailProduk(model.getProdukDetailId()).get(0));

				models.add(model);
			}
		}
		detailHasilDao.save(models);
		return result;
	}

	@Override
	public List<Map<String, Object>> findByGenericId(Integer idGeneric) {
		try {
			return JsonUtil.ToMaps(produkDao.findByGenerikId(idGeneric));
		} catch (IllegalArgumentException | IllegalAccessException e) {
			e.printStackTrace();
		}
		return null;
	}

	@Autowired
	private BaseConverterImpl<KelompokProdukVO, KelompokProduk> kelompokProdukConverter;

	@Override
	public List<KelompokProdukVO> findKelompokProdukHaveStok() {
		return kelompokProdukConverter.transferListOfModelToListOfVO(produkDao.getKelompokProdukHaveStok(),
				new ArrayList<KelompokProdukVO>(), KelompokProdukVO.class);
	}

	@Override
	public List<ProdukVO> findProdukByKelompokProduk(String id, String values) {
		List<ProdukVO> data = new ArrayList<ProdukVO>();
		return produkConverter.transferListOfModelToListOfVO(
				produkDao.findFirst10ByDetailJenisProdukJenisProdukKelompokProdukIdAndNamaProdukContaining(
						Integer.parseInt(id), values, new PageRequest(0, 10)),
				data, ProdukVO.class);
	}

	@Override
	@Transactional
	public Map<String, Object> findProdukByKelompok(Integer id, String values) {
		Pageable topTen = new PageRequest(0, 10);
		Map<String, Object> data = new HashMap<String, Object>();
		data.put("data", produkDao.findProdukByKelompok(id, values, topTen));
		return data;
	}

	@Override
	@Transactional
	public List<SatuanStandarVO> findAllSatuanStandardProduk(String id) {
		Produk p = produkDao.findProdukWithSatuanStandard(Integer.parseInt(id));
		SatuanStandar satuan = new SatuanStandar();
		if (CommonUtil.isNotNullOrEmpty(p)) {
			satuan = p.getSatuanStandar();
		}
		satuan = HibernateInitialize.initializeAndUnproxy(satuan);
		if (satuan == null)
			return null;
		List<SatuanStandarVO> result = new ArrayList<>();
		satuanStandarVOConverter.setUseExclude(true);
		while (satuan != null) {
			result.add(satuanStandarVOConverter.transferModelToVO(satuan, new SatuanStandarVO()));
			satuan = satuan.getSatuanStandarHead();
			if (satuan != null) {
				satuan = HibernateInitialize.initializeAndUnproxy(satuan);
			}
		}

		return result;
	}

	@Override
	public List<ProdukVO> findTindakanByName(String values, Integer idRuangan) {
		List<ProdukVO> data = new ArrayList<ProdukVO>();
		produkConverter.setUseGson(false);
		List<Produk> page = produkDao.findTindakan(values, idRuangan, new PageRequest(0, 25));

		return produkConverter.transferListOfModelToListOfVO(page, data, ProdukVO.class);
	}

	@Autowired
	private AntrianPasienDiPeriksaDao antrianPasienDiPeriksaDao;

	@Override
	public Map<String, Object> saveDeposite(String noRec, Double deposite, String tanggal) {
		AntrianPasienDiPeriksa pasienDaftar = antrianPasienDiPeriksaDao.findByNoRec(noRec);
		Produk produk = new Produk();
		produk.setId(402611);

		// masukan ke pelayanan
		Calendar c = new GregorianCalendar();
		c.set(Calendar.HOUR_OF_DAY, 0); // anything 0 - 23
		c.set(Calendar.MINUTE, 0);
		c.set(Calendar.SECOND, 0);
		Date d1 = c.getTime(); //

		PelayananPasien newsubModel = new PelayananPasien();

		newsubModel.setHargaSatuan(deposite);
		newsubModel.setHargaJual(deposite);
		newsubModel.setTglPelayanan(d1);
		newsubModel.setKeteranganLain("-");
		newsubModel.setAturanPakai("-");
		// newsubModel.setKeteranganPakai();
		newsubModel.setKeteranganPakai2("-");
		newsubModel.setPasien(pasienDaftar);
		newsubModel.setProduk(produk);
		newsubModel.setStock(1.0);
		newsubModel.setJumlah(1.0);

		PelayananPasienDetail newsubModelDetail = new PelayananPasienDetail();
		newsubModelDetail.setHargaSatuan(deposite);
		newsubModelDetail.setHargaJual(deposite);
		newsubModelDetail.setTglPelayanan(d1);
		newsubModelDetail.setJumlah(1.0);
		newsubModelDetail.setPasien(pasienDaftar);
		newsubModelDetail.setKeteranganLain("-");
		newsubModelDetail.setAturanPakai("-");
		// newsubModelDetail.setKeteranganPakai("-");
		newsubModelDetail.setStock(1);
		newsubModelDetail.setKeteranganPakai2("-");
		KomponenHarga KomponenHarga = new KomponenHarga();
		KomponenHarga.setId(30);
		newsubModelDetail.setKomponenHarga(KomponenHarga);
		newsubModelDetail.setProduk(produk);
		newsubModel = pelayananPasienDao.save(newsubModel);
		newsubModelDetail.setPelayananPasien(newsubModel);
		pelayananPasienDetailDao.save(newsubModelDetail);

		pelayananPetugasConverter.setUseGson(true);
		PelayananPasienPetugas model = null;
		try {
			model = pelayananPetugasConverter.transferVOToModel(newsubModel.ToMap(), new PelayananPasienPetugas());
		} catch (IllegalArgumentException | IllegalAccessException e) {
			e.printStackTrace();
		}
		model.setObjectProduk(newsubModel.getProduk());
		AsalProduk asalProduk = new AsalProduk();
		asalProduk.setId(1);
		model.setObjectRuangan(pasienDaftar.getRuangan());
		model.setObjectAsalProduk(asalProduk);
		JenisPetugasPelaksana kdjenispetugaspe = new JenisPetugasPelaksana();
		kdjenispetugaspe.setId(3);
		model.setObjectJenisPetugasPe(kdjenispetugaspe);
		model.setObjectPegawai(LoginUserService.getLoginUser().getPegawai());
		model.setPelayananPasien(newsubModel);
		model.setNoMasuk(newsubModel.getPasien());
		pelayananPasienPetugasDao.save(model);
		Map<String, Object> data = new HashMap<>();
		data.put("message", "Data berhasil di simpan");
		return data;
	}

	@Override
	public Map<String, Object> saveTotalBiaya(String noRec, Double total) {
		AntrianPasienDiPeriksa pasienDaftar = antrianPasienDiPeriksaDao.findByNoRec(noRec);
		PasienDaftar pasienDaftar2 = pasienDaftar.getPasienDaftar();
		pasienDaftar2.setTotalBiaya(total);
		pasienDaftarDao.save(pasienDaftar2);
		Map<String, Object> data = new HashMap<>();
		data.put("message", "Data berhasil di simpan");
		return data;
	}

	@Override
	public Map<String, Object> findProdukByDetailJenisProdukAndNamaProduk(Integer idDetailJenisProduk) {
		Map<String, Object> result = new HashMap<String, Object>();
		result.put("produk",
				produkDao.findProdukByDetailJenisProdukAndNamaProduk(idDetailJenisProduk, new PageRequest(0, 10)));
		return result;
	}

	@Override
	public Map<String, Object> detailJenisProduk() {
		Map<String, Object> result = new HashMap<String, Object>();
		result.put("detailJenisProduk", produkDao.detailJenisProduk());
		return result;
	}

	@Override
	public Map<String, Object> getSatuanProduk(Integer id) {
		Map<String, Object> result = new HashMap<String, Object>();
		result.put("data", produkDao.getSatuanProdukByProduk(id));
		return result;
	}

	@Override
	public List<ProdukVO> findProdukByDetailJenisProduk(Integer id) {
		List<ProdukVO> data = new ArrayList<ProdukVO>();
		return produkConverter.transferListOfModelToListOfVO(produkDao.findProdukByDetailJenisProduk(id), data,
				ProdukVO.class);
	}

	@Override
	public Map<String, Object> findProdukByJenisProdukAndNamaProduk(Integer id, String values) {
		Pageable topTen = new PageRequest(0, 10);
		Map<String, Object> data = new HashMap<String, Object>();
		data.put("data", produkDao.findProdukByJenisProdukAndNamaProduk(id, values, topTen));
		return data;
	}

	public Map<String, Object> setAkomodasiRawatInap(String noRec) {
		Map<String, Object> data = new HashMap<String, Object>();
		List<PelayananPasien> list = new ArrayList<PelayananPasien>();
		AntrianPasienDiPeriksa antrianPasienDiPeriksa = antrianPasienDiPeriksaDao.findByNoRec(noRec);
		Ruangan ruangan = antrianPasienDiPeriksa.getRuangan();
		List<MapRuanganToProduk> listProduk = mapRuanganToProdukDao.findProdukByRuangan(ruangan.getId());
		Produk produk = null;
		for (MapRuanganToProduk mapRuanganToProduk : listProduk) {
			produk = produkDao.findOne(mapRuanganToProduk.getProduk().getId());
		}
		System.out.println("PRODUK ID : " + produk.getId());
		ambilHarga(antrianPasienDiPeriksa, produk, list);
		try {
			data.put("list", JsonUtil.ToMaps(list));
		} catch (IllegalArgumentException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		}
		return data;
	}

	@Override
	public Map<String, Object> findProdukAset(String values) {
		Pageable topTen = new PageRequest(0, 10);
		Map<String, Object> data = new HashMap<String, Object>();
		data.put("data", produkDao.findProdukAset(values, topTen));
		return data;
	}

	@Override
	public Map<String, Object> findAsetByProduk(Integer id, String values) {
		Pageable topTen = new PageRequest(0, 10);
		Map<String, Object> data = new HashMap<String, Object>();
		data.put("data", produkDao.findAsetByProduk(id, values, getRuanganByUserLogin().getId(), topTen));
		return data;
	}

	@Override
	public Map<String, Object> findProduk(String values) {
		Pageable topTen = new PageRequest(0, 10);
		Map<String, Object> data = new HashMap<String, Object>();
		String result = "";
		if (CommonUtil.isNotNullOrEmpty(values.toLowerCase())) {
			result = values.toLowerCase();
		}
		data.put("data", produkDao.findProduk(result, topTen));
		return data;
	}

	@Override
	public Map<String, Object> findSupplier(String values) {
		Pageable topTen = new PageRequest(0, 10);
		Map<String, Object> data = new HashMap<String, Object>();
		data.put("data", produkDao.findSupplier(values.toLowerCase(), topTen));
		return data;
	}

	@Override
	public List<Map<String, Object>> findObat() {
		List<Map<String, Object>> result = produkDao.findObat();
		return result;
	}

	@Override
	public List<Map<String, Object>> findTarifLayanan(Integer idRuangan, Integer idKelas, Integer idProduk) {
		List<Map<String, Object>> result = new ArrayList<>();
		List<Map<String, Object>> data = new ArrayList<>();

		List<Integer> listProduk = new ArrayList<>();
		List<Integer> listKelas = new ArrayList<>();

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

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

		if (CommonUtil.isNotNullOrEmpty(idKelas) && CommonUtil.isNotNullOrEmpty(idProduk)) {
			data = produkDao.findTarifLayananKelasProduk(idRuangan, idProduk, idKelas);
		} else if (CommonUtil.isNotNullOrEmpty(idKelas) && CommonUtil.isNullOrEmpty(idProduk)) {
			data = produkDao.findTarifLayananKelas(idRuangan, idKelas);
		} else if (CommonUtil.isNullOrEmpty(idKelas) && CommonUtil.isNotNullOrEmpty(idProduk)) {
			data = produkDao.findTarifLayananProduk(idRuangan, idProduk);
		} else if (CommonUtil.isNullOrEmpty(idKelas) && CommonUtil.isNullOrEmpty(idProduk)) {
			data = produkDao.findTarifLayananRuangan(idRuangan);
		}

		for (Map<String, Object> map : data) {
			if (!listProduk.contains(map.get("idProduk"))) {
				listProduk.add(Integer.parseInt(map.get("idProduk").toString()));
			}
			if (!listKelas.contains(map.get("idKelas"))) {
				listKelas.add(Integer.parseInt(map.get("idKelas").toString()));
			}
		}

		for (Integer produkId : listProduk) {
			for (Integer kelasId : listKelas) {
				Map<String, Object> mapRs = new HashMap<>();
				Double jasaMedis = 0.0;
				Double jasaParamedis = 0.0;
				Double jasaSarana = 0.0;
				Double jasaUmum = 0.0;
				for (Map<String, Object> map : data) {
					if (map.get("idProduk").equals(produkId) && map.get("idKelas").equals(kelasId)) {
						if (Arrays.asList(Master.KomponenHarga.JASA_MEDIS).contains(map.get("idJasa"))) {
							if (CommonUtil.isNotNullOrEmpty(map.get("hargaJasa"))) {
								jasaMedis += Double.parseDouble(map.get("hargaJasa").toString());
							} else {
								jasaMedis += 0.0;
							}
						} else if (Arrays.asList(Master.KomponenHarga.JASA_PARAMEDIS).contains(map.get("idJasa"))) {
							if (CommonUtil.isNotNullOrEmpty(map.get("hargaJasa"))) {
								jasaParamedis += Double.parseDouble(map.get("hargaJasa").toString());
							} else {
								jasaParamedis += 0.0;
							}
						} else if (Arrays.asList(Master.KomponenHarga.JASA_SARANA).contains(map.get("idJasa"))) {
							if (CommonUtil.isNotNullOrEmpty(map.get("hargaJasa"))) {
								jasaSarana += Double.parseDouble(map.get("hargaJasa").toString());
							} else {
								jasaSarana += 0.0;
							}
						} else {
							if (CommonUtil.isNotNullOrEmpty(map.get("hargaJasa"))) {
								jasaUmum += Double.parseDouble(map.get("hargaJasa").toString());
							} else {
								jasaUmum += 0.0;
							}
						}
						mapRs.putAll(map);
						mapRs.put("hargaLayanan",
								kursINA.format(Double.parseDouble(map.get("hargaLayanan").toString())).toString());
						if (!jasaMedis.equals(0.0)) {
							mapRs.put("jasaMedis", kursINA.format(jasaMedis).toString());
						} else {
							mapRs.put("jasaMedis", "-");
						}
						if (!jasaParamedis.equals(0.0)) {
							mapRs.put("jasaParamedis", kursINA.format(jasaParamedis).toString());
						} else {
							mapRs.put("jasaParamedis", "-");
						}
						if (!jasaSarana.equals(0.0)) {
							mapRs.put("jasaSarana", kursINA.format(jasaSarana).toString());
						} else {
							mapRs.put("jasaSarana", "-");
						}
						if (!jasaUmum.equals(0.0)) {
							mapRs.put("jasaUmum", kursINA.format(jasaUmum).toString());
						} else {
							mapRs.put("jasaUmum", "-");
						}

						mapRs.remove("idJasa");
						mapRs.remove("hargaJasa");
					}
				}
				if (CommonUtil.isNotNullOrEmpty(mapRs)) {
					result.add(mapRs);
				}
			}
		}

		return result;
	}
	
	@Override
	public List<Map<String, Object>> findTarifLayananLama(Integer idRuangan, Integer idKelas, Integer idProduk) {
		List<Map<String, Object>> result = new ArrayList<>();
		List<Map<String, Object>> data = new ArrayList<>();

		List<Integer> listProduk = new ArrayList<>();
		List<Integer> listKelas = new ArrayList<>();

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

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

		if (CommonUtil.isNotNullOrEmpty(idKelas) && CommonUtil.isNotNullOrEmpty(idProduk)) {
			data = produkDao.findTarifLayananLamaKelasProduk(idRuangan, idProduk, idKelas);
		} else if (CommonUtil.isNotNullOrEmpty(idKelas) && CommonUtil.isNullOrEmpty(idProduk)) {
			data = produkDao.findTarifLayananLamaKelas(idRuangan, idKelas);
		} else if (CommonUtil.isNullOrEmpty(idKelas) && CommonUtil.isNotNullOrEmpty(idProduk)) {
			data = produkDao.findTarifLayananLamaProduk(idRuangan, idProduk);
		} else if (CommonUtil.isNullOrEmpty(idKelas) && CommonUtil.isNullOrEmpty(idProduk)) {
			data = produkDao.findTarifLayananLamaRuangan(idRuangan);
		}

		for (Map<String, Object> map : data) {
			if (!listProduk.contains(map.get("idProduk"))) {
				listProduk.add(Integer.parseInt(map.get("idProduk").toString()));
			}
			if (!listKelas.contains(map.get("idKelas"))) {
				listKelas.add(Integer.parseInt(map.get("idKelas").toString()));
			}
		}

		for (Integer produkId : listProduk) {
			for (Integer kelasId : listKelas) {
				Map<String, Object> mapRs = new HashMap<>();
				Double jasaMedis = 0.0;
				Double jasaParamedis = 0.0;
				Double jasaSarana = 0.0;
				Double jasaUmum = 0.0;
				for (Map<String, Object> map : data) {
					if (map.get("idProduk").equals(produkId) && map.get("idKelas").equals(kelasId)) {
						if (Arrays.asList(Master.KomponenHarga.JASA_MEDIS).contains(map.get("idJasa"))) {
							if (CommonUtil.isNotNullOrEmpty(map.get("hargaJasa"))) {
								jasaMedis += Double.parseDouble(map.get("hargaJasa").toString());
							} else {
								jasaMedis += 0.0;
							}
						} else if (Arrays.asList(Master.KomponenHarga.JASA_PARAMEDIS).contains(map.get("idJasa"))) {
							if (CommonUtil.isNotNullOrEmpty(map.get("hargaJasa"))) {
								jasaParamedis += Double.parseDouble(map.get("hargaJasa").toString());
							} else {
								jasaParamedis += 0.0;
							}
						} else if (Arrays.asList(Master.KomponenHarga.JASA_SARANA).contains(map.get("idJasa"))) {
							if (CommonUtil.isNotNullOrEmpty(map.get("hargaJasa"))) {
								jasaSarana += Double.parseDouble(map.get("hargaJasa").toString());
							} else {
								jasaSarana += 0.0;
							}
						} else {
							if (CommonUtil.isNotNullOrEmpty(map.get("hargaJasa"))) {
								jasaUmum += Double.parseDouble(map.get("hargaJasa").toString());
							} else {
								jasaUmum += 0.0;
							}
						}
						mapRs.putAll(map);
						mapRs.put("hargaLayanan",
								kursINA.format(Double.parseDouble(map.get("hargaLayanan").toString())).toString());
						if (!jasaMedis.equals(0.0)) {
							mapRs.put("jasaMedis", kursINA.format(jasaMedis).toString());
						} else {
							mapRs.put("jasaMedis", "-");
						}
						if (!jasaParamedis.equals(0.0)) {
							mapRs.put("jasaParamedis", kursINA.format(jasaParamedis).toString());
						} else {
							mapRs.put("jasaParamedis", "-");
						}
						if (!jasaSarana.equals(0.0)) {
							mapRs.put("jasaSarana", kursINA.format(jasaSarana).toString());
						} else {
							mapRs.put("jasaSarana", "-");
						}
						if (!jasaUmum.equals(0.0)) {
							mapRs.put("jasaUmum", kursINA.format(jasaUmum).toString());
						} else {
							mapRs.put("jasaUmum", "-");
						}

						mapRs.remove("idJasa");
						mapRs.remove("hargaJasa");
					}
				}
				if (CommonUtil.isNotNullOrEmpty(mapRs)) {
					result.add(mapRs);
				}
			}
		}

		return result;
	}

	@Override
	public Map<String, Object> validateNamaProduk(Integer idProduk, String namaProduk) {
		Map<String, Object> result = new HashMap<>();

		String patternText = settingDataFixedDao.getSettingDataFixed("patternTextDuplicate");
		String replacedNamaProduk = namaProduk.replaceAll(patternText, "").toLowerCase();
		if (CommonUtil.isNotNullOrEmpty(idProduk)) {
			List<Map<String, Object>> listNamaProduk = produkDao.checkNamaProdukLama(patternText, idProduk,
					replacedNamaProduk);
			if (CommonUtil.isNotNullOrEmpty(listNamaProduk)) {
				result.put("msg", "Produk " + namaProduk + " sudah tersedia!");
			}
		} else {
			List<Map<String, Object>> listNamaProduk = produkDao.checkNamaProdukBaru(patternText, replacedNamaProduk);
			if (CommonUtil.isNotNullOrEmpty(listNamaProduk)) {
				result.put("msg", "Produk " + namaProduk + " sudah tersedia!");
			}
		}

		return result;
	}

	@Override
	public Map<String, Object> getMappingPaketToProduk(Integer idMapping) {
		Map<String, Object> result = new HashMap<>();

		result = produkDao.getMappingPaketToProduk(idMapping);

		return result;
	}

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

		result = mapPaketToProdukDao.getAllData();

		return result;
	}

	@Override
	public List<Map<String, Object>> findExistingMapHargaKelas(Integer idKelas, Integer idProduk, Integer idMapping) {
		List<Map<String, Object>> result = new ArrayList<>();

		if (CommonUtil.isNotNullOrEmpty(idMapping)) {
			result = hargaNettoProdukByKelasDao.checkExisting(idKelas, idProduk, idMapping);
		} else {
			result = hargaNettoProdukByKelasDao.checkExisting(idKelas, idProduk);
		}

		return result;
	}

}
