package com.jasamedika.medifirst2000.service.impl;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
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.orm.jpa.JpaSystemException;
import org.springframework.stereotype.Service;

import com.jasamedika.medifirst2000.constants.Master;
import com.jasamedika.medifirst2000.converter.BaseConverterImpl;
import com.jasamedika.medifirst2000.dao.BridgingDao;
import com.jasamedika.medifirst2000.dao.IndikatorBIOSDao;
import com.jasamedika.medifirst2000.dao.IndikatorBIOSTransaksiDao;
import com.jasamedika.medifirst2000.dao.LogBiosDao;
import com.jasamedika.medifirst2000.entities.IndikatorBIOS;
import com.jasamedika.medifirst2000.entities.IndikatorBiosTransaksi;
import com.jasamedika.medifirst2000.entities.LogBios;
import com.jasamedika.medifirst2000.exception.ServiceVOException;
import com.jasamedika.medifirst2000.service.IndikatorBIOSService;
import com.jasamedika.medifirst2000.util.CommonUtil;
import com.jasamedika.medifirst2000.vo.IndikatorBIOSCustomVO;
import com.jasamedika.medifirst2000.vo.IndikatorBIOSTransaksiVO;
import com.jasamedika.medifirst2000.vo.IndikatorBIOSVO;

@Service("IndikatorBIOSService")
public class IndikatorBIOSServiceImpl extends BaseVoServiceImpl implements IndikatorBIOSService {

	@Autowired
	private BaseConverterImpl<IndikatorBIOSVO, IndikatorBIOS> indikatorConverter;

	@Autowired
	private BridgingDao bridgingDao;

	@Autowired
	private IndikatorBIOSDao indikatorBIOSDao;

	@Autowired
	private IndikatorBIOSTransaksiDao indikatorBIOSTransaksiDao;

	@Autowired
	private LogBiosDao logBiosDao;

	@Override
	public IndikatorBIOSVO add(IndikatorBIOSVO vo) throws JpaSystemException, ServiceVOException {
		IndikatorBIOS indikatorBIOS = indikatorConverter.transferVOToModel(vo, new IndikatorBIOS());
		IndikatorBIOS resultModel = indikatorBIOSDao.save(indikatorBIOS);

		IndikatorBIOSVO resultVO = new IndikatorBIOSVO();
		resultVO = indikatorConverter.transferModelToVO(resultModel, resultVO);

		return resultVO;
	}

	@Override
	public IndikatorBIOSVO update(IndikatorBIOSVO vo) throws JpaSystemException, ServiceVOException {
		IndikatorBIOS indikatorBIOSLama = indikatorBIOSDao.findOne(vo.getId());
		IndikatorBIOS indikatorBIOSBaru = indikatorConverter.transferVOToModel(vo, indikatorBIOSLama);
		IndikatorBIOS resultModel = indikatorBIOSDao.save(indikatorBIOSBaru);

		IndikatorBIOSVO resultVO = new IndikatorBIOSVO();
		resultVO = indikatorConverter.transferModelToVO(resultModel, resultVO);

		return resultVO;
	}

	@Override
	public Boolean delete(Integer key) throws JpaSystemException {
		indikatorBIOSDao.delete(key);
		return true;
	}

	@Override
	public IndikatorBIOSVO findById(Integer key) throws JpaSystemException {
		IndikatorBIOSVO result = new IndikatorBIOSVO();

		IndikatorBIOS indikatorBIOS = indikatorBIOSDao.findOne(key);
		if (CommonUtil.isNotNullOrEmpty(indikatorBIOS)) {
			result = indikatorConverter.transferModelToVO(indikatorBIOS, result);
		}

		return result;
	}

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

		Iterable<IndikatorBIOS> models = indikatorBIOSDao.findAll();
		if (CommonUtil.isNotNullOrEmpty(models)) {
			for (IndikatorBIOS model : models) {
				IndikatorBIOSVO vo = new IndikatorBIOSVO();
				vo = indikatorConverter.transferModelToVO(model, vo);
				result.add(vo);
			}
		}

		return result;
	}

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

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

	@Override
	public Map<String, Object> saveIndikatorBIOS(IndikatorBIOSCustomVO vos) {
		Map<String, Object> result = new HashMap<String, Object>();
		for (IndikatorBIOSVO vo : vos.getRef_indikator()) {

			IndikatorBIOS model = indikatorConverter.transferVOToModel(vo, new IndikatorBIOS());
			if (CommonUtil.isNotNullOrEmpty(model)) {
				if (model.getNmrumpun().equals("Kesehatan")) {
					IndikatorBIOS indikator = indikatorBIOSDao.findByIdIndikatorBIOS(model.getIndikator());
					if (CommonUtil.isNullOrEmpty(indikator)) {
						IndikatorBIOS newModel = indikatorBIOSDao.save(model);
						if (CommonUtil.isNotNullOrEmpty(newModel)) {
							result.put("noRec", newModel.getNoRec());
						}
					}

				}
			}
		}

		return result;
	}

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

		Map<String, Object> totalKunjungan = new HashMap<String, Object>();
		String tahun = tanggal_update.substring(0, 4);
		String bulan = tanggal_update.substring(5, 7);
		Long jumlahKunjungan = bridgingDao.findTotalKunjungan(tahun, bulan);
		totalKunjungan.put("kode_satker", "520611");
		totalKunjungan.put("tahun", tahun);
		totalKunjungan.put("bulan", bulan);
		totalKunjungan.put("indikator", "0039");
		totalKunjungan.put("jumlah", jumlahKunjungan.toString());
		totalKunjungan.put("tanggal_update", new SimpleDateFormat("yyyy/MM/dd hh:mm:ss").format(new java.util.Date()));
		saveLogBios(tanggal_update, "0039", jumlahKunjungan.toString());
		result.add(totalKunjungan);

		Map<String, Object> totalPasien = new HashMap<String, Object>();
		Long jumlahPasien = bridgingDao.findTotalPasien(tahun, bulan);
		totalPasien.put("kode_satker", "520611");
		totalPasien.put("tahun", tahun);
		totalPasien.put("bulan", bulan);
		totalPasien.put("indikator", "0133");
		totalPasien.put("jumlah", jumlahPasien.toString());
		totalPasien.put("tanggal_update", new SimpleDateFormat("yyyy/MM/dd hh:mm:ss").format(new java.util.Date()));
		saveLogBios(tanggal_update, "0133", jumlahPasien.toString());
		result.add(totalPasien);

		Map<String, Object> totalKunjunganPasienUmum = new HashMap<String, Object>();
		String idPasienUmum = bridgingDao.findIdPasienUmum();
		Long jumlahKunjunganPasienUmum = bridgingDao.findTotalKunjunganPasienUmum(tahun, bulan,
				Integer.valueOf(idPasienUmum));
		totalKunjunganPasienUmum.put("kode_satker", "520611");
		totalKunjunganPasienUmum.put("tahun", tahun);
		totalKunjunganPasienUmum.put("bulan", bulan);
		totalKunjunganPasienUmum.put("indikator", "0037");
		totalKunjunganPasienUmum.put("jumlah", jumlahKunjunganPasienUmum.toString());
		totalKunjunganPasienUmum.put("tanggal_update",
				new SimpleDateFormat("yyyy/MM/dd hh:mm:ss").format(new java.util.Date()));
		saveLogBios(tanggal_update, "0037", jumlahKunjunganPasienUmum.toString());
		result.add(totalKunjunganPasienUmum);

		Map<String, Object> totalPasienUmum = new HashMap<String, Object>();
		Long jumlahPasienUmum = bridgingDao.findTotalPasienUmum(tahun, bulan, Integer.valueOf(idPasienUmum));
		totalPasienUmum.put("kode_satker", "520611");
		totalPasienUmum.put("tahun", tahun);
		totalPasienUmum.put("bulan", bulan);
		totalPasienUmum.put("indikator", "0131");
		totalPasienUmum.put("jumlah", jumlahPasienUmum.toString());
		totalPasienUmum.put("tanggal_update", new SimpleDateFormat("yyyy/MM/dd hh:mm:ss").format(new java.util.Date()));
		saveLogBios(tanggal_update, "0131", jumlahPasienUmum.toString());
		result.add(totalPasienUmum);

		Map<String, Object> totalKunjunganPasienJaminan = new HashMap<String, Object>();
		String idPasienJaminan = bridgingDao.findIdPasienUmum();
		Long jumlahKunjunganPasienJaminan = bridgingDao.findTotalKunjunganPasienJaminan(tahun, bulan,
				Integer.valueOf(idPasienJaminan));
		totalKunjunganPasienJaminan.put("kode_satker", "520611");
		totalKunjunganPasienJaminan.put("tahun", tahun);
		totalKunjunganPasienJaminan.put("bulan", bulan);
		totalKunjunganPasienJaminan.put("indikator", "0038");
		totalKunjunganPasienJaminan.put("jumlah", jumlahKunjunganPasienJaminan.toString());
		totalKunjunganPasienJaminan.put("tanggal_update",
				new SimpleDateFormat("yyyy/MM/dd hh:mm:ss").format(new java.util.Date()));
		saveLogBios(tanggal_update, "0038", jumlahKunjunganPasienJaminan.toString());
		result.add(totalKunjunganPasienJaminan);

		Map<String, Object> totalPasienJaminan = new HashMap<String, Object>();
		Long jumlahPasienJaminan = bridgingDao.findTotalPasienJaminan(tahun, bulan, Integer.valueOf(idPasienJaminan));
		totalPasienJaminan.put("kode_satker", "520611");
		totalPasienJaminan.put("tahun", tahun);
		totalPasienJaminan.put("bulan", bulan);
		totalPasienJaminan.put("indikator", "0132");
		totalPasienJaminan.put("jumlah", jumlahPasienJaminan.toString());
		totalPasienJaminan.put("tanggal_update",
				new SimpleDateFormat("yyyy/MM/dd hh:mm:ss").format(new java.util.Date()));
		saveLogBios(tanggal_update, "0132", jumlahPasienJaminan.toString());
		result.add(totalPasienJaminan);

		Map<String, Object> totalKunjunganPasienUGD = new HashMap<String, Object>();
		String idDepUGD = bridgingDao.findIdUGD();
		Long jumlahKunjunganPasienUGD = bridgingDao.findTotalKunjunganPasienUGD(tahun, bulan,
				Integer.valueOf(idDepUGD));
		totalKunjunganPasienUGD.put("kode_satker", "520611");
		totalKunjunganPasienUGD.put("tahun", tahun);
		totalKunjunganPasienUGD.put("bulan", bulan);
		totalKunjunganPasienUGD.put("indikator", "0035");
		totalKunjunganPasienUGD.put("jumlah", jumlahKunjunganPasienUGD.toString());
		totalKunjunganPasienUGD.put("tanggal_update",
				new SimpleDateFormat("yyyy/MM/dd hh:mm:ss").format(new java.util.Date()));
		saveLogBios(tanggal_update, "0035", jumlahKunjunganPasienUGD.toString());
		result.add(totalKunjunganPasienUGD);

		Map<String, Object> totalPasienUGD = new HashMap<String, Object>();
		Long jumlahPasienUGD = bridgingDao.findTotalPasienUGD(tahun, bulan, Integer.valueOf(idDepUGD));
		totalPasienUGD.put("kode_satker", "520611");
		totalPasienUGD.put("tahun", tahun);
		totalPasienUGD.put("bulan", bulan);
		totalPasienUGD.put("indikator", "0130");
		totalPasienUGD.put("jumlah", jumlahPasienUGD.toString());
		totalPasienUGD.put("tanggal_update", new SimpleDateFormat("yyyy/MM/dd hh:mm:ss").format(new java.util.Date()));
		saveLogBios(tanggal_update, "0130", jumlahPasienUGD.toString());
		result.add(totalPasienUGD);

		Map<String, Object> totalKunjunganPasienRawatjalan = new HashMap<String, Object>();
		String idDep = bridgingDao.findIdRawatjalan();
		String[] id = idDep.split(",");
		List<Integer> idDepartemen = new ArrayList<Integer>();
		for (int i = 0; i < id.length; i++) {
			idDepartemen.add(Integer.valueOf(id[i]));
		}
		Long jumlahKunjunganPasienRawatjalan = bridgingDao.findTotalKunjunganPasienRawatJalan(tahun, bulan,
				idDepartemen);
		totalKunjunganPasienRawatjalan.put("kode_satker", "520611");
		totalKunjunganPasienRawatjalan.put("tahun", tahun);
		totalKunjunganPasienRawatjalan.put("bulan", bulan);
		totalKunjunganPasienRawatjalan.put("indikator", "0034");
		totalKunjunganPasienRawatjalan.put("jumlah", jumlahKunjunganPasienRawatjalan.toString());
		totalKunjunganPasienRawatjalan.put("tanggal_update",
				new SimpleDateFormat("yyyy/MM/dd hh:mm:ss").format(new java.util.Date()));
		saveLogBios(tanggal_update, "0034", jumlahKunjunganPasienRawatjalan.toString());
		result.add(totalKunjunganPasienRawatjalan);

		Map<String, Object> totalPasienRawatjalan = new HashMap<String, Object>();
		Long jumlahPasienRawatjalan = bridgingDao.findTotalPasienRawatJalan(tahun, bulan, idDepartemen);
		totalPasienRawatjalan.put("kode_satker", "520611");
		totalPasienRawatjalan.put("tahun", tahun);
		totalPasienRawatjalan.put("bulan", bulan);
		totalPasienRawatjalan.put("indikator", "0129");
		totalPasienRawatjalan.put("jumlah", jumlahPasienRawatjalan.toString());
		totalPasienRawatjalan.put("tanggal_update",
				new SimpleDateFormat("yyyy/MM/dd hh:mm:ss").format(new java.util.Date()));
		saveLogBios(tanggal_update, "0129", jumlahPasienRawatjalan.toString());
		result.add(totalPasienRawatjalan);

		Map<String, Object> totalKunjunganPasienRawatInap = new HashMap<String, Object>();
		String idDepRawatinap = bridgingDao.findIdRawatInap();
		String[] idRawatinap = idDepRawatinap.split(",");
		List<Integer> listRawatinap = new ArrayList<Integer>();
		for (int i = 0; i < idRawatinap.length; i++) {
			listRawatinap.add(Integer.valueOf(idRawatinap[i]));
		}
		Long jumlahKunjunganPasienRawatInap = bridgingDao.findTotalKunjunganPasienRawatJalan(tahun, bulan,
				listRawatinap);
		totalKunjunganPasienRawatInap.put("kode_satker", "520611");
		totalKunjunganPasienRawatInap.put("tahun", tahun);
		totalKunjunganPasienRawatInap.put("bulan", bulan);
		totalKunjunganPasienRawatInap.put("indikator", "0036");
		totalKunjunganPasienRawatInap.put("jumlah", jumlahKunjunganPasienRawatInap.toString());
		totalKunjunganPasienRawatInap.put("tanggal_update",
				new SimpleDateFormat("yyyy/MM/dd hh:mm:ss").format(new java.util.Date()));
		saveLogBios(tanggal_update, "0036", jumlahKunjunganPasienRawatInap.toString());
		result.add(totalKunjunganPasienRawatInap);

		String idProduk = bridgingDao.findIdProdukAkomodasi();
		List<Map<String, Object>> tarif = bridgingDao.findTarifAkomodasi(Integer.valueOf(idProduk));
		for (Map<String, Object> kelas : tarif) {
			Map<String, Object> tarifKelas = new HashMap<String, Object>();
			if (CommonUtil.isNotNullOrEmpty(kelas.get("namaKelas"))) {
				if (((String) kelas.get("namaKelas")).equals("Kelas I")) {
					tarifKelas.put("kode_satker", "520611");
					tarifKelas.put("tahun", tahun);
					tarifKelas.put("bulan", bulan);
					tarifKelas.put("indikator", "0141");
					tarifKelas.put("jumlah", kelas.get("hargaSatuan").toString());
					tarifKelas.put("tanggal_update",
							new SimpleDateFormat("yyyy/MM/dd hh:mm:ss").format(new java.util.Date()));

				} else if (((String) kelas.get("namaKelas")).equals("Kelas II")) {
					tarifKelas.put("kode_satker", "520611");
					tarifKelas.put("tahun", tahun);
					tarifKelas.put("bulan", bulan);
					tarifKelas.put("indikator", "0142");
					tarifKelas.put("jumlah", kelas.get("hargaSatuan").toString());
					tarifKelas.put("tanggal_update",
							new SimpleDateFormat("yyyy/MM/dd hh:mm:ss").format(new java.util.Date()));
				} else if (((String) kelas.get("namaKelas")).equals("Kelas III")) {
					tarifKelas.put("kode_satker", "520611");
					tarifKelas.put("tahun", tahun);
					tarifKelas.put("bulan", bulan);
					tarifKelas.put("indikator", "0143");
					tarifKelas.put("jumlah", kelas.get("hargaSatuan").toString());
					tarifKelas.put("tanggal_update",
							new SimpleDateFormat("yyyy/MM/dd hh:mm:ss").format(new java.util.Date()));
				}
			}
			if (tarifKelas.get("indikator") != null) {
				saveLogBios(tanggal_update, tarifKelas.get("indikator") + "", kelas.get("hargaSatuan") + "");
				result.add(tarifKelas);
			}

		}

		return result;

	}

	@Override
	public List<Map<String, Object>> layananKesehatanBIOS(String tanggal_update) {
		List<Map<String, Object>> result = new ArrayList<Map<String, Object>>();
		String tahun = tanggal_update.substring(0, 4);
		String bulan = tanggal_update.substring(5, 7);
		String tgl = tanggal_update.substring(8, 10);
		List<Map<String, Object>> listKodeKelas = bridgingDao.findKelasId();
		for (Map<String, Object> data : listKodeKelas) {
			List<Integer> listIdKelas = bridgingDao.findMappingKelasToKelasBios((Integer) data.get("idKelas"));
			Integer jumlah = bridgingDao.findTotalKunjunganPasienPerKelas(tahun, bulan, listIdKelas);
			Map<String, Object> kelasBios = new HashMap<String, Object>();
			kelasBios.put("kode_satker", "520611");
			kelasBios.put("tahun", tahun);
			kelasBios.put("bulan", bulan);
			kelasBios.put("kelas", data.get("kode_kelas"));
			kelasBios.put("indikator", data.get("idKelas"));
			kelasBios.put("jumlah_pasien", jumlah.toString());
			kelasBios.put("jumlah_hari", countDays(Integer.valueOf(bulan), tahun, tgl));
			kelasBios.put("tgl_update", new SimpleDateFormat("yyyy/MM/dd hh:mm:ss").format(new java.util.Date()));
			result.add(kelasBios);
			saveLogBios(tanggal_update, data.get("idKelas").toString(), jumlah.toString());
		}

		return result;
	}

	public String countDays(Integer bulan, String tahun, String tgl) {
		Calendar date = Calendar.getInstance();
		Integer dates = date.get(Calendar.DATE);
		Integer month = date.get(Calendar.MONTH) + 1;// bulan sekarang
		if (month > bulan) {
			SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
			try {
				date.setTime(sdf.parse(tahun + "-" + bulan + "-01"));
			} catch (ParseException e) {
				e.printStackTrace();
			}
			dates = date.getActualMaximum(Calendar.DAY_OF_MONTH);
		} else if (month < bulan) {
			dates = 0;
		} else if (month == bulan) {
			if (Integer.valueOf(tgl) < 32) {
				return tgl;
			}
		}
		return dates.toString();
	}

	public String reduceDate(String tanggal) {
		String year = tanggal.substring(0, 4);
		String month = tanggal.substring(5, 7);
		String date = tanggal.substring(8, 10);
		Integer dates = Integer.valueOf(date);
		dates -= 1;
		if ((dates.toString()).length() == 1) {
			date = "0" + dates;
		} else {
			date = dates + "";
		}
		year = year + "-" + month + "-" + date + " 00:00:00";
		return year;
	}

	@Override
	public List<Map<String, Object>> penerimaanBLU(String tanggal) {
		List<Map<String, Object>> result = new ArrayList<Map<String, Object>>();
		Map<String, Object> data = new HashMap<String, Object>();
		String dt = reduceDate(tanggal);
		data.put("Tanggal", dt);
		data.put("KodeAkun", "424121");
		data.put("Saldo", "21000000");
		data.put("TanggalUpdate", tanggal + " 00:00:00");
		result.add(data);
		return result;
	}

	@Override
	public List<Map<String, Object>> pengeluaranBLU(String tanggal) {
		List<Map<String, Object>> result = new ArrayList<Map<String, Object>>();
		Map<String, Object> data = new HashMap<String, Object>();
		String dt = reduceDate(tanggal);
		data.put("Tanggal", dt);
		data.put("KodeAkun", "5251190");
		data.put("Saldo", "1000");
		data.put("TanggalUpdate", tanggal + " 00:00:00");
		result.add(data);
		return result;
	}

	@Override
	public List<Map<String, Object>> saldoBLU(String tanggal) {
		List<Map<String, Object>> result = new ArrayList<Map<String, Object>>();
		Map<String, Object> data = new HashMap<String, Object>();
		String dt = reduceDate(tanggal);
		data.put("Tanggal", dt);
		data.put("KodeJenisRekening", "3");
		data.put("NamaBank", "BCA");
		data.put("Saldo", "1000");
		data.put("TanggalUpdate", tanggal + " 00:00:00");
		result.add(data);
		return result;
	}

	@Override
	public Map<String, Object> saveIndikatorBIOSPengeluaran(List<IndikatorBIOSVO> vos) {
		Map<String, Object> result = new HashMap<String, Object>();
		for (IndikatorBIOSVO vo : vos) {

			IndikatorBIOS model = indikatorConverter.transferVOToModel(vo, new IndikatorBIOS());
			model.setNmrumpun("Saldo Rekening");
			if (CommonUtil.isNotNullOrEmpty(model)) {
				IndikatorBIOS indikator = indikatorBIOSDao.findByIdIndikatorBIOS(model.getIndikator());
				if (CommonUtil.isNullOrEmpty(indikator)) {
					IndikatorBIOS newModel = indikatorBIOSDao.save(model);
					if (CommonUtil.isNotNullOrEmpty(newModel)) {
						result.put("noRec", newModel.getNoRec());
					}
				}
			}
		}

		return result;
	}

	@Override
	public List<Map<String, Object>> layananLainBIOSNew(String tanggal_update) {
		List<Map<String, Object>> result = new ArrayList<Map<String, Object>>();
		String tahun = tanggal_update.substring(0, 4);
		String bulan = tanggal_update.substring(5, 7);
		List<Map<String, Object>> temp = indikatorBIOSTransaksiDao.findByLayanan("Layanan Lainnya", tahun, bulan);
		for (Map<String, Object> data : temp) {
			Map<String, Object> map = new HashMap<String, Object>();
			map.put("kode_satker", "520611");
			map.put("tahun", tahun);
			map.put("bulan", bulan);
			map.put("indikator", data.get("indikator") + "");
			map.put("jumlah", data.get("jumlah") + "");
			map.put("tanggal_update", new SimpleDateFormat("yyyy/MM/dd hh:mm:ss").format(new java.util.Date()));
			result.add(map);
		}
		return result;
	}

	@Override
	public List<Map<String, Object>> layananKesehatanBIOSNew(String tanggal_update) {
		List<Map<String, Object>> result = new ArrayList<Map<String, Object>>();
		String tahun = tanggal_update.substring(0, 4);
		String bulan = tanggal_update.substring(5, 7);
		String tgl = tanggal_update.substring(8, 10);
		List<Map<String, Object>> temp = indikatorBIOSTransaksiDao.findByLayanan("Layanan Kesehatan", tahun, bulan);
		for (Map<String, Object> data : temp) {
			Map<String, Object> map = new HashMap<String, Object>();
			map.put("kode_satker", "520611");
			map.put("tahun", tahun);
			map.put("kelas", data.get("namaExternal") + "");
			map.put("jumlah_hari", countDays(Integer.valueOf(bulan), tahun, tgl));
			map.put("bulan", bulan);
			map.put("indikator", data.get("indikator") + "");
			map.put("jumlah_pasien", data.get("jumlah") + "");
			map.put("tanggal_update", new SimpleDateFormat("yyyy/MM/dd hh:mm:ss").format(new java.util.Date()));
			result.add(map);
		}
		return result;
	}

	@Override
	public List<Map<String, Object>> penerimaanPengeluaranBLUNew(String tanggal, String layanan) {
		List<Map<String, Object>> result = new ArrayList<Map<String, Object>>();
		List<Map<String, Object>> temp = indikatorBIOSTransaksiDao.findByLayanan(layanan, tanggal.substring(0, 4),
				tanggal.substring(5, 7));
		for (Map<String, Object> data : temp) {
			Map<String, Object> map = new HashMap<String, Object>();
			String dt = reduceDate(tanggal);
			map.put("Tanggal", dt);
			map.put("KodeAkun", data.get("indikator") + "");
			map.put("Saldo", data.get("jumlah") + "");
			map.put("TanggalUpdate", tanggal + " 00:00:00");
			result.add(map);
		}
		return result;
	}

	@Override
	public List<Map<String, Object>> saldoBLUNew(String tanggal) {
		List<Map<String, Object>> result = new ArrayList<Map<String, Object>>();
		List<Map<String, Object>> temp = indikatorBIOSTransaksiDao.findByLayanan("Saldo Rekening",
				tanggal.substring(0, 4), tanggal.substring(5, 7));
		for (Map<String, Object> data : temp) {
			Map<String, Object> map = new HashMap<String, Object>();
			String dt = reduceDate(tanggal);
			map.put("Tanggal", dt);
			map.put("KodeJenisRekening", data.get("indikator") + "");
			map.put("NamaBank", "BCA");
			map.put("Saldo", data.get("jumlah") + "");
			map.put("TanggalUpdate", tanggal + " 00:00:00");

			result.add(map);
		}
		return result;
	}

	public void saveLogBios(String tglUpdate, String indikator, String jumlah) {
		LogBios model = new LogBios();
		model.setIndikator(indikator);
		model.setJumlah(jumlah);
		model.setTglUpdate(tglUpdate);
		model.setTglAccess(new Date());
		logBiosDao.save(model);
	}

	@Override
	public Map<String, Object> saveIndikatorBIOSTransaksi(IndikatorBIOSTransaksiVO vo) {
		Map<String, Object> result = new HashMap<>();
		Date tglTransaksi = new Date();

		IndikatorBiosTransaksi model = new IndikatorBiosTransaksi();
		model.setBulan(vo.getBulan());
		model.setIndikatorBIOS(indikatorConverter.transferVOToModel(vo.getIndikatorBIOSVO(), new IndikatorBIOS()));
		model.setJumlah(vo.getJumlah());
		model.setJumlahHari(vo.getJumlahHari());
		model.setKdProfile(Master.KODE_PROFILE);
		model.setStatusEnabled(Master.STATUS_ENABLE_TRUE);
		model.setTahun(vo.getTahun());
		model.setTglTransaksi(tglTransaksi);

		IndikatorBiosTransaksi rs = indikatorBIOSTransaksiDao.save(model);
		if (CommonUtil.isNotNullOrEmpty(rs)) {
			result.put("noRec", rs.getNoRec());
		}

		return result;
	}

	@Override
	public List<Map<String, Object>> saveIndikatorBIOSTransaksi(List<IndikatorBIOSTransaksiVO> vos) {
		List<Map<String, Object>> result = new ArrayList<>();
		List<IndikatorBiosTransaksi> models = new ArrayList<>();

		Date tglEntri = new Date();

		for (IndikatorBIOSTransaksiVO vo : vos) {
			if (CommonUtil.isNotNullOrEmpty(vo.getNoRec())) {
				IndikatorBiosTransaksi model = indikatorBIOSTransaksiDao.findOne(vo.getNoRec());
				model.setStatusKirim(true);

				models.add(model);
			} else {
				IndikatorBiosTransaksi model = new IndikatorBiosTransaksi();
				model.setBulan(vo.getBulan());
				if (CommonUtil.isNotNullOrEmpty(vo.getIndikatorBIOSVO())) {
					model.setIndikatorBIOS(
							indikatorConverter.transferVOToModel(vo.getIndikatorBIOSVO(), new IndikatorBIOS()));
				}
				model.setJumlah(vo.getJumlah());
				model.setJumlahHari(vo.getJumlahHari());
				model.setKdProfile(Master.KODE_PROFILE);
				model.setStatusEnabled(Master.STATUS_ENABLE_TRUE);
				model.setTahun(vo.getTahun());
				model.setBulan(vo.getBulan());
				model.setTglTransaksi(vo.getTglTransaksi());
				model.setTglUpdate(tglEntri);
				model.setStatusKirim(false);
				model.setKdBank(vo.getKdBank());
				model.setNorek(vo.getNorek());
				model.setKdRek(vo.getKdRek());

				models.add(model);
			}
		}

		Iterable<IndikatorBiosTransaksi> rss = indikatorBIOSTransaksiDao.save(models);
		for (IndikatorBiosTransaksi rs : rss) {
			Map<String, Object> mapRs = new HashMap<>();
			mapRs.put("norec", rs.getNoRec());
			result.add(mapRs);
		}

		return result;
	}

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

		List<String> listKdIndikator = new ArrayList<>();
		listKdIndikator.addAll(Arrays.asList(Master.BIOS.LAYANAN_KESEHATAN));
		listKdIndikator.addAll(Arrays.asList(Master.BIOS.JUMLAH_PASIEN));
		listKdIndikator.addAll(Arrays.asList(Master.BIOS.INDIKATOR_PELAYANAN));

		result = indikatorBIOSDao.listIndikatorLainnya(listKdIndikator);

		return result;
	}

	@Override
	public List<Map<String, Object>> findAllIndikatorPenerimaanKeuangan() {
		List<Map<String, Object>> result = indikatorBIOSDao.listIndikatorPenerimaanKeuangan();

		return result;
	}

	@Override
	public List<Map<String, Object>> findAllIndikatorPengeluaranKeuangan() {
		List<Map<String, Object>> result = indikatorBIOSDao.listIndikatorPengeluaranKeuangan();

		return result;
	}

}
