package com.jasamedika.medifirst2000.service.impl;

import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.jasamedika.medifirst2000.converter.base.BaseVoConverter;
import com.jasamedika.medifirst2000.dao.ProdukDao;
import com.jasamedika.medifirst2000.dao.ProdukFormulaProduksiDao;
import com.jasamedika.medifirst2000.dao.ProdukProduksiDao;
import com.jasamedika.medifirst2000.dao.RuanganDao;
import com.jasamedika.medifirst2000.dao.SatuanStandarDao;
import com.jasamedika.medifirst2000.dao.StokProdukDetailDao;
import com.jasamedika.medifirst2000.dao.StokProdukGlobalDao;
import com.jasamedika.medifirst2000.dao.StrukHistoriDao;
import com.jasamedika.medifirst2000.dao.StrukPelayananDao;
import com.jasamedika.medifirst2000.dao.custom.StokProdukGlobalDaoCustom;
import com.jasamedika.medifirst2000.entities.AsalProduk;
import com.jasamedika.medifirst2000.entities.DetailJenisProduk;
import com.jasamedika.medifirst2000.entities.HargaNettoProdukByTerima;
import com.jasamedika.medifirst2000.entities.KelompokTransaksi;
import com.jasamedika.medifirst2000.entities.Produk;
import com.jasamedika.medifirst2000.entities.ProdukFormulaProduksi;
import com.jasamedika.medifirst2000.entities.ProdukProduksi;
import com.jasamedika.medifirst2000.entities.Ruangan;
import com.jasamedika.medifirst2000.entities.SatuanStandar;
import com.jasamedika.medifirst2000.entities.StokProdukDetail;
import com.jasamedika.medifirst2000.entities.StokProdukGlobal;
import com.jasamedika.medifirst2000.entities.StrukHistori;
import com.jasamedika.medifirst2000.entities.StrukPelayanan;
import com.jasamedika.medifirst2000.entities.StrukPelayananDetail;
import com.jasamedika.medifirst2000.service.CssdBmhpService;
import com.jasamedika.medifirst2000.service.KartuStokService;
import com.jasamedika.medifirst2000.service.StokProdukGlobalService;
import com.jasamedika.medifirst2000.service.StrukOrderService;
import com.jasamedika.medifirst2000.util.CommonUtil;
import com.jasamedika.medifirst2000.util.StringUtil;
import com.jasamedika.medifirst2000.vo.CssdBmhpDetailVO;
import com.jasamedika.medifirst2000.vo.CssdBmhpHeaderVO;
import com.jasamedika.medifirst2000.vo.CssdProduksiBmhpDetailVO;
import com.jasamedika.medifirst2000.vo.CssdProduksiBmhpHeaderVO;
import com.jasamedika.medifirst2000.vo.ProdukVO;

@Service("cssdBmhpService")
public class CssdBmhpServiceImpl extends BaseAngaranServiceImpl implements CssdBmhpService {

	@Autowired
	private ProdukDao produkDao;

	@Autowired
	private StokProdukGlobalDaoCustom stokProdukGlobalDaoCustom;

	@Autowired
	private ProdukProduksiDao produkProduksiDao;

	@Autowired
	private StokProdukDetailDao stokProdukDetailDao;

	@Autowired
	private StokProdukGlobalService stokProdukGlobalService;

	@Autowired
	private RuanganDao ruanganDao;

	@Autowired
	private StokProdukGlobalDao stokProdukGlobalDao;

	@Autowired
	private StrukOrderService strukOrderService;

	@Autowired
	private KartuStokService kartuStokService;

	// @Autowired
	// private BaseVoConverter<ProdukVO, Produk> produkKonverter;

	// @Autowired
	// private KelompokTransaksiDao kelompokTransaksiDao;

	@Autowired
	private SatuanStandarDao satuanStandarDao;

	@Autowired
	private ProdukFormulaProduksiDao produkFormulaProduksiDao;

	@Autowired
	private StrukHistoriDao strukHistoriDao;

	@Autowired
	private StrukPelayananDao strukPelayananDao;

	// @Autowired
	// private BaseVoConverter<SatuanStandarVO, SatuanStandar>
	// satuanStandarConverter;

	@Autowired
	private BaseVoConverter<ProdukVO, Produk> produkConverter;

	@Override
	@Transactional(readOnly = false)
	public Map<String, Object> saveCssdBmhp(CssdBmhpHeaderVO vo) {
		Map<String, Object> data = new HashMap<String, Object>();

		Produk produk = new Produk();
		DetailJenisProduk detailJenisProduk = new DetailJenisProduk();
		detailJenisProduk.setId(1319); //
		detailJenisProduk.setKdProfile((short) 0);
		produk.setDetailJenisProduk(detailJenisProduk);
		produk.setNamaProduk(vo.getNamaProduk());
		produk.setNilaiNormal((short) 0);
		produk.setqProduk(1);
		if (CommonUtil.isNotNullOrEmpty(vo.getSatuanStandar())) {
			SatuanStandar ss = new SatuanStandar();
			ss.setId(vo.getSatuanStandar().getId());
			produk.setSatuanStandar(ss);
		}
		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.setVerifikasiAnggaran(false);
		Produk produkResult = produkDao.save(produk);

		for (CssdBmhpDetailVO cssdBmhpDetail : vo.getCssdBmhpDetail()) {
			ProdukFormulaProduksi produkFormulaProduksi = new ProdukFormulaProduksi();
			produkFormulaProduksi.setProdukHasil(produk);
			if (CommonUtil.isNotNullOrEmpty(cssdBmhpDetail.getProduk())) {
				produkFormulaProduksi
						.setProdukAsal(produkConverter.transferVOToModel(cssdBmhpDetail.getProduk(), new Produk()));
			}
			produkFormulaProduksi.setFormulaProduksi("barang Bmhp");
			if (CommonUtil.isNotNullOrEmpty(vo.getSatuanStandar())) {
				SatuanStandar satuanStandar = satuanStandarDao.findById(vo.getSatuanStandar().getId());
				if (CommonUtil.isNotNullOrEmpty(satuanStandar.getSatuanStandar())) {
					produkFormulaProduksi.setSatuanProdukAsal((Integer) satuanStandar.getId());
				}
			}

			produkFormulaProduksi.setProdukHasil(produkResult);
			produkFormulaProduksi.setStatusEnabled(true);
			produkFormulaProduksi.setFormulaProduksi("Barang bmhp");
			produkFormulaProduksi.setqtyProdukAsal(cssdBmhpDetail.getQtyProduk());
			produkFormulaProduksiDao.save(produkFormulaProduksi);
		}
		data.put("id", produkResult.getId());

		return data;
	}

	@Override
	@Transactional(readOnly = false)
	public Map<String, Object> produksiBmhp(CssdProduksiBmhpHeaderVO vo) {
		StrukHistori strukHistori = new StrukHistori();
		KelompokTransaksi kelompokTransaksi = new KelompokTransaksi();
		kelompokTransaksi.setId(Integer.parseInt(GetSettingDataFixed("KdKelompokTransasksiProduksiBmhp")));
		strukHistori.setKelompokTransaksi(kelompokTransaksi);
		Ruangan r = new Ruangan();
		r.setId(Integer.parseInt(GetSettingDataFixed("kdRuanganCssd")));
		strukHistori.setRuangan(r);
		strukHistori.setStatusEnabled(true);
		strukHistori.setKdProfile((short) 0);
		strukHistori.setTglHistori(new Date());
		strukHistori.setQtyProduk(vo.getQtyProduk());
		if (CommonUtil.isNotNullOrEmpty(vo.getProduk())) {
			strukHistori.setProdukHasil(produkConverter.transferVOToModel(vo.getProduk(), new Produk()));
		}
		strukHistori = strukHistoriDao.save(strukHistori);

		for (CssdProduksiBmhpDetailVO detail : vo.getCssdProduksiBmhpDetail()) {

			ProdukProduksi produkProduksi = new ProdukProduksi();
			produkProduksi.setNoHistori(strukHistori);
			produkProduksi.setKeteranganLainnya("Produksi Bmhp");
			if (CommonUtil.isNotNullOrEmpty(detail.getProduk())) {
				produkProduksi.setProdukAsal(produkConverter.transferVOToModel(detail.getProduk(), new Produk()));
			}
			if (CommonUtil.isNotNullOrEmpty(vo.getProduk())) {
				produkProduksi.setProdukHasil(produkConverter.transferVOToModel(vo.getProduk(), new Produk()));
			}
			produkProduksi.setQtyProdukAsal(detail.getQty());
			stokProdukGlobalService.updateStokProdukDetailPemusnahanBarang(detail.getProduk().getId(), r,
					detail.getQty() * vo.getQtyProduk(), null);
			stokProdukGlobalService.updateStokPemusnahanBarang(produkProduksi.getProdukAsal(),
					detail.getQty() * vo.getQtyProduk(), r);
			produkProduksiDao.save(produkProduksi);

			String keterangan = "Produksi Bmhp";
			Produk p = produkDao.findById(detail.getProduk().getId());

			kartuStokService.saveKartuStok(detail.getQty() * vo.getQtyProduk(), p, r, keterangan, false, new Date());
		}

		StrukPelayanan strukPelayanan = new StrukPelayanan();
		strukPelayanan.setTglterimakiriman(new Date());
		strukPelayanan.setNofaktur(null);
		String noUrut = strukOrderService.formatNoUrut("Penerimaan Supplier", "PNB");
		strukPelayanan.setNostruk(noUrut);
		strukPelayanan.setNostruk_intern(noUrut);
		strukPelayanan.setTglfaktur(null);
		strukPelayanan.setKdruangan(getRuanganByUserLogin());
		strukPelayanan.setTgljatuhtempo(null);
		strukPelayanan.setTotalbeamaterai(null);
		strukPelayanan.setTglstruk(new Date());
		strukPelayanan.setNoDokumen(null);
		strukPelayanan.setTglDokumen(null);
		strukPelayanan.setNoPesanan(null);
		strukPelayanan.setNoSppb(null);
		strukPelayanan.setTanggalSpk(null);
		strukPelayanan.setNoKontrak(null);
		strukPelayanan.setTanggalKontrak(null);
		strukPelayanan.setKeteranganlainnya("Produksi Bmhp");
		strukPelayanan.setKdkelompoktransaksi(strukHistori.getKelompokTransaksi());

		strukPelayanan.setMenerima(getPegawaiByUserLogin());

		strukPelayanan.setVerifikasi("1");

		// Double persenPpn = 0.0;
		// Double persenDiskon = 0.0;
		// Double ppn = 0.0;
		// Double diskon = 0.0;
		Double hargaSatuan = 0.0;

		if (CommonUtil.isNotNullOrEmpty(vo.getHarga())) {
			hargaSatuan = vo.getHarga();
		}

		// ppn = ((persenDiskon / hargaSatuan) * 100);
		// diskon = ((persenPpn / hargaSatuan) * 100);
		// Double hargaNetto1 = hargaSatuan + ppn;
		// Double hargaNetto2 = hargaNetto1 - diskon;

		List<StrukPelayananDetail> listStrukPeayananDetail = new ArrayList<StrukPelayananDetail>();
		StrukPelayananDetail strukPelayananDetail = new StrukPelayananDetail();
		AsalProduk ap = new AsalProduk();
		ap.setId(1);
		strukPelayananDetail.setKdProfile((short) 0);
		strukPelayananDetail.setKdasalproduk(ap);
		strukPelayananDetail.setQtyproduk(vo.getQtyProduk());
		strukPelayananDetail.setTglKadaluarsa(null);
		strukPelayananDetail.setNobatch(null);
		strukPelayananDetail.setHargasatuan(hargaSatuan);
		strukPelayananDetail.setPersendiscount(0.0);
		strukPelayananDetail.setNostruk(strukPelayanan);
		strukPelayananDetail.setHargadiscount(0.0);
		strukPelayananDetail.setHargadiscount(0.0);
		strukPelayananDetail.setHargadiscountgive(0.0);
		strukPelayananDetail.setHargadiscountsave(0.0);
		strukPelayananDetail.setHarganetto(0.0);
		strukPelayananDetail.setHargapph(0.0);
		strukPelayananDetail.setHargappn(0.0);
		strukPelayananDetail.setHargasatuandijamin(0.0);
		strukPelayananDetail.setHargasatuanppenjamin(0.0);
		strukPelayananDetail.setHargasatuanpprofile(0.0);
		strukPelayananDetail.setHargatambahan(0.0);
		strukPelayananDetail.setHargatambahan(0.0);
		strukPelayananDetail.setQtyorang((byte) 0);
		strukPelayananDetail.setIsonsiteservice((byte) 0);
		strukPelayananDetail.setQtyprodukoutext(0.0);
		strukPelayananDetail.setQtyprodukoutint(0.0);
		strukPelayananDetail.setQtyprodukretur(0.0);
		strukPelayananDetail.setSatuan("");
		strukPelayananDetail.setTglpelayanan(strukPelayanan.getTglstruk());
		strukPelayananDetail.setKeteranganlainnya("Produksi Bmhp");
		strukPelayananDetail.setHargasatuanpprofile(0.0);

		// noVerifikasi(strukPelayananDetail);// add by Arya

		if (CommonUtil.isNotNullOrEmpty(vo.getProduk())) {
			Produk p = produkDao.findById(vo.getProduk().getId());
			strukPelayananDetail.setKdproduk(p);
			if (CommonUtil.isNotNullOrEmpty(vo.getProduk())) {
				strukPelayananDetail.setKdsatuanstandar(p.getSatuanStandar());
			}
		}

		strukPelayananDetail.setHasilKonversi(vo.getQtyProduk());
		updateStokGlobal(strukPelayananDetail);
		strukPelayanan.getStrukPelayananDetail().add(strukPelayananDetail);
		strukPelayanan.getHargaNettoProdukByTerima().add(initializeHargaNettoProdukByTerima(strukPelayananDetail));
		listStrukPeayananDetail.add(strukPelayananDetail);

		strukPelayanan.getStrukPelayananDetail().clear();
		strukPelayanan.getStrukPelayananDetail().addAll(listStrukPeayananDetail);
		strukPelayanan = strukPelayananDao.save(strukPelayanan);
		Map<String, Object> data = new HashMap<>();
		data.put("noRec", strukHistori.getNoRec());
		return data;

	}

	// Initiaize HargaNettoProdukByTerima
	private HargaNettoProdukByTerima initializeHargaNettoProdukByTerima(StrukPelayananDetail strukPelayananDetail) {
		Double persenPpn = 0.0;
		Double persenDiskon = 0.0;
		Double ppn = 0.0;
		Double diskon = 0.0;
		Double hargaSatuan = 0.0;

		if (CommonUtil.isNotNullOrEmpty(strukPelayananDetail.getPersenppn())) {
			persenPpn = strukPelayananDetail.getPersenppn();
		}
		if (CommonUtil.isNotNullOrEmpty(strukPelayananDetail.getPersendiscount())) {
			persenDiskon = strukPelayananDetail.getPersendiscount();
		}

		if (CommonUtil.isNotNullOrEmpty(strukPelayananDetail.getHargasatuan())) {
			hargaSatuan = strukPelayananDetail.getHargasatuan();
		}

		ppn = ((persenDiskon / hargaSatuan) * 100);
		diskon = ((persenPpn / hargaSatuan) * 100);
		Double hargaNetto1 = hargaSatuan + ppn;
		Double hargaNetto2 = hargaNetto1 - diskon;
		HargaNettoProdukByTerima hargaNettoProdukByTerima = new HargaNettoProdukByTerima();

		hargaNettoProdukByTerima.setAsalProduk(strukPelayananDetail.getKdasalproduk());
		hargaNettoProdukByTerima.setFactorRate(0.0);
		hargaNettoProdukByTerima.setHargaDiscount(diskon);
		hargaNettoProdukByTerima.setHargaNetto1(hargaNetto1);
		hargaNettoProdukByTerima.setHargaNetto2(hargaNetto2);
		hargaNettoProdukByTerima.setHargaSatuan(hargaSatuan);
		hargaNettoProdukByTerima.setKdProfile((short) 0);

		hargaNettoProdukByTerima.setNoStrukTerima(strukPelayananDetail.getNostruk());
		hargaNettoProdukByTerima.setPersenDiscount(strukPelayananDetail.getPersendiscount());
		hargaNettoProdukByTerima.setProduk(strukPelayananDetail.getKdproduk());
		hargaNettoProdukByTerima.setQtyProduk(strukPelayananDetail.getHasilKonversi());
		hargaNettoProdukByTerima.setQtyProdukOutExt(0.0);
		hargaNettoProdukByTerima.setStatusEnabled(true);
		hargaNettoProdukByTerima.setTglKadaluarsaLast(strukPelayananDetail.getTglKadaluarsa());

		return hargaNettoProdukByTerima;

	}

	public Set<StokProdukDetail> initializeStokProdukDetail(StrukPelayananDetail detail) {
		Set<StokProdukDetail> setStokprodukDetail = new HashSet<StokProdukDetail>();

		// updateuntuk Stok Produk Global
		Double persenPpn = 0.0;
		Double persenDiskon = 0.0;
		Double ppn = 0.0;
		Double diskon = 0.0;
		Double hargaSatuan = 0.0;

		if (CommonUtil.isNotNullOrEmpty(detail.getPersenppn())) {
			persenPpn = detail.getPersenppn();
		}
		if (CommonUtil.isNotNullOrEmpty(detail.getPersendiscount())) {
			persenDiskon = detail.getPersendiscount();
		}

		if (CommonUtil.isNotNullOrEmpty(detail.getHargasatuan())) {
			hargaSatuan = detail.getHargasatuan();
		}

		ppn = ((persenDiskon / hargaSatuan) * 100);
		diskon = ((persenPpn / hargaSatuan) * 100);
		Double hargaNetto1 = hargaSatuan + ppn;
		Double hargaNetto2 = hargaNetto1 - diskon;
		StrukPelayanan strukPelayanan = detail.getNostruk();
		StokProdukDetail stokProdukDetail = new StokProdukDetail();
		stokProdukDetail.setQtyProdukOnHand(new Double(0));
		stokProdukDetail.setQtyProdukOutInt(0.0);
		stokProdukDetail.setQtyProdukOutExt(0.0);
		stokProdukDetail.setQtyProduk(detail.getQtyproduk());
		stokProdukDetail.setTglpelayanan(new Date());
		stokProdukDetail.setStrukPelayanan(strukPelayanan);
		stokProdukDetail.setAsalProduk(detail.getKdasalproduk());
		stokProdukDetail.setHargaDiscount(diskon);
		stokProdukDetail.setHargaNetto1(hargaNetto1);
		stokProdukDetail.setHargaNetto2(hargaNetto2);
		stokProdukDetail.setPersenDiscount(detail.getPersendiscount());
		stokProdukDetail.setProduk(detail.getKdproduk());
		stokProdukDetail.setRuangan(ruanganDao.findById(new Integer(GetSettingDataFixed("kdRuanganCssd"))));
		stokProdukDetailDao.save(stokProdukDetail);

		return setStokprodukDetail;
	}

	// update stok Produk Global
	public void updateStokGlobal(StrukPelayananDetail detail) {
		// updateuntuk Stok Produk Global
		Double persenPpn = 0.0;
		Double persenDiskon = 0.0;
		Double ppn = 0.0;
		Double diskon = 0.0;
		Double hargaSatuan = 0.0;

		if (CommonUtil.isNotNullOrEmpty(detail.getPersenppn())) {
			persenPpn = detail.getPersenppn();
		}
		if (CommonUtil.isNotNullOrEmpty(detail.getPersendiscount())) {
			persenDiskon = detail.getPersendiscount();
		}

		if (CommonUtil.isNotNullOrEmpty(detail.getHargasatuan())) {
			hargaSatuan = detail.getHargasatuan();
		}

		ppn = ((persenDiskon / hargaSatuan) * 100);
		diskon = ((persenPpn / hargaSatuan) * 100);
		Double hargaNetto1 = hargaSatuan + ppn;
		Double hargaNetto2 = hargaNetto1 - diskon;
		if (CommonUtil.isNotNullOrEmpty(detail.getKdproduk())
				&& CommonUtil.isNotNullOrEmpty(detail.getKdasalproduk())) {
			Integer id = new Integer(GetSettingDataFixed("kdRuanganCssd"));
			Integer kdProduk = detail.getKdproduk().getId();
			List<StokProdukGlobal> listStokProdukGlobal = stokProdukGlobalDao.findStokWitAsalProduk(kdProduk, id);
			if (CommonUtil.isNotNullOrEmpty(listStokProdukGlobal)) {
				StokProdukGlobal stokProdukGlobal = listStokProdukGlobal.get(0);
				stokProdukGlobal.setQtyProduk(stokProdukGlobal.getQtyProduk() + detail.getHasilKonversi());
				stokProdukGlobal.setAsalProduk(detail.getKdasalproduk());
				stokProdukGlobal.setHargaDiscount(diskon);
				stokProdukGlobal.setHargaNetto1(hargaNetto1);
				stokProdukGlobal.setHargaNetto2(hargaNetto2);
				stokProdukGlobal.setPersenDiscount(detail.getPersendiscount());
				stokProdukGlobal.setNamaExternal(detail.getKdproduk().getNamaProduk());
				stokProdukGlobal.setKodeExternal("0");
				stokProdukGlobal.setReportDisplay(detail.getKdproduk().getNamaProduk());
				stokProdukGlobalDao.save(stokProdukGlobal);
			} else {
				StokProdukGlobal stokProdukGlobal = new StokProdukGlobal();
				stokProdukGlobal.setQtyProdukOnHand(new Double(0));
				stokProdukGlobal.setQtyProdukMin(new Double(0));
				stokProdukGlobal.setQtyProdukMax(new Double(0));
				stokProdukGlobal.setQtyProduk(detail.getHasilKonversi());
				stokProdukGlobal.setAsalProduk(detail.getKdasalproduk());
				stokProdukGlobal.setHargaDiscount(diskon);
				stokProdukGlobal.setHargaNetto1(hargaNetto1);
				stokProdukGlobal.setHargaNetto2(hargaNetto2);
				stokProdukGlobal.setPersenDiscount(detail.getPersendiscount());
				stokProdukGlobal.setProduk(detail.getKdproduk());
				stokProdukGlobal.setRuangan(ruanganDao.findById(new Integer(GetSettingDataFixed("kdRuanganCssd"))));
				stokProdukGlobal.setNamaExternal(detail.getKdproduk().getNamaProduk());
				stokProdukGlobal.setKodeExternal("0");
				stokProdukGlobal.setReportDisplay(detail.getKdproduk().getNamaProduk());
				stokProdukGlobalDao.save(stokProdukGlobal);
			}

		}
		initializeStokProdukDetail(detail);
	}

	@Override
	public Map<String, Object> listBarangBmhp(Integer page, Integer limit, String sort, String dir, Integer produkId) {
		Ruangan r = getRuanganByUserLogin();
		int totalRow = stokProdukGlobalDaoCustom.daftarBarangBmHpCount(produkId, r.getId());
		int totalPages = 0;
		int pageRequested = page;

		if (totalRow > 0) {
			totalPages = (int) Math.ceil((double) totalRow / (double) limit);
		} else {
			totalPages = 0;
		}

		if (pageRequested > totalPages)
			pageRequested = totalPages;
		int rowStart = pageRequested * limit - limit;
		if (rowStart < 0) {
			rowStart = 0;
		}
		int rowEnd = limit;
		Map<String, Object> result = new HashMap<String, Object>();
		result.put("data",
				stokProdukGlobalDaoCustom.daftarBarangBmHpList(rowStart, rowEnd, sort, dir, produkId, r.getId()));
		result.put("totalPages", totalPages);
		result.put("totalRow", totalRow);
		return result;
	}

	@Override
	public Map<String, Object> masterBmhp(Integer page, Integer limit, String sort, String dir) {
		int totalRow = stokProdukGlobalDaoCustom.masterBmhpCount();
		int totalPages = 0;
		int pageRequested = page;

		if (totalRow > 0) {
			totalPages = (int) Math.ceil((double) totalRow / (double) limit);
		} else {
			totalPages = 0;
		}

		if (pageRequested > totalPages)
			pageRequested = totalPages;
		int rowStart = pageRequested * limit - limit;
		if (rowStart < 0) {
			rowStart = 0;
		}
		int rowEnd = limit;
		Map<String, Object> result = new HashMap<String, Object>();
		result.put("data", stokProdukGlobalDaoCustom.masterBmhpList(rowStart, rowEnd, sort, dir));
		result.put("totalPages", totalPages);
		result.put("totalRow", totalRow);
		return result;
	}

	@Override
	public Map<String, Object> barangPersediaan(Integer page, Integer limit, String sort, String dir) {
		int totalRow = stokProdukGlobalDaoCustom.barangPersediaanCount();
		int totalPages = 0;
		int pageRequested = page;

		if (totalRow > 0) {
			totalPages = (int) Math.ceil((double) totalRow / (double) limit);
		} else {
			totalPages = 0;
		}

		if (pageRequested > totalPages)
			pageRequested = totalPages;
		int rowStart = pageRequested * limit - limit;
		if (rowStart < 0) {
			rowStart = 0;
		}
		int rowEnd = limit;
		Map<String, Object> result = new HashMap<String, Object>();
		result.put("data", stokProdukGlobalDaoCustom.barangPersediaanList(rowStart, rowEnd, sort, dir));
		result.put("totalPages", totalPages);
		result.put("totalRow", totalRow);
		return result;
	}

	@Override
	public Map<String, Object> detailProdukBmhp(Integer produkId) {
		Map<String, Object> result = new HashMap<String, Object>();
		result.put("produkBmhp", produkDao.findProdukById(produkId));
		result.put("bahanMentah", produkDao.findBahanMentah(produkId));
		return result;
	}

}
