package com.jasamedika.medifirst2000.dao.custom;

import java.util.List;
import java.util.Map;

import javax.persistence.Query;

import org.springframework.stereotype.Repository;

import com.jasamedika.medifirst2000.dao.custom.base.impl.CoreDaoImpl;
import com.jasamedika.medifirst2000.entities.Ruangan;
import com.jasamedika.medifirst2000.entities.StokProdukGlobal;
import com.jasamedika.medifirst2000.util.CommonUtil;

/**
 * Repository Custom class
 * 
 * @author Roberto
 */
@Repository//("StokProdukGlobalDaoCustom")
public class StokProdukGlobalDaoCustomImpl extends CoreDaoImpl<StokProdukGlobal> implements
		StokProdukGlobalDaoCustom {

	public StokProdukGlobalDaoCustomImpl() {
		super(StokProdukGlobal.class);
	}

	@Override
	public int stokCount(Integer kelompokProdukId, Integer produkId, Integer asalProdukId, Integer ruanganId,Integer jenisProdukId) {
		StringBuffer buffer = new StringBuffer();
		buffer.append(" select count(produk.id) from StokProdukGlobal stokProdukGlobal ");
		buffer.append(" left join stokProdukGlobal.produk produk ");
		buffer.append(" left join stokProdukGlobal.ruangan ruangan ");
		buffer.append(" left join stokProdukGlobal.asalProduk asalProduk ");
		buffer.append(" left join produk.detailJenisProduk detailJenisProduk ");
		buffer.append(" left join detailJenisProduk.jenisProduk jenisProduk ");
		buffer.append(" left join jenisProduk.kelompokProduk kelompokProduk where produk.id is not null ");


		if (CommonUtil.isNotNullOrEmpty(produkId)) {
			buffer.append(" and produk.id =:produkId ");
		}

		if (CommonUtil.isNotNullOrEmpty(asalProdukId)) {
			buffer.append(" and asalProduk.id =:asalProdukId ");
		}

		if (CommonUtil.isNotNullOrEmpty(ruanganId)) {
			buffer.append(" and ruangan.id =:ruanganId ");
		}
		if (CommonUtil.isNotNullOrEmpty(kelompokProdukId)) {
			buffer.append(" and kelompokProduk.id =:kelompokProdukId ");
		}
		if (CommonUtil.isNotNullOrEmpty(jenisProdukId)) {
			buffer.append(" and jenisProduk.id =:jenisProdukId ");
		}


		Query query = em.createQuery(buffer.toString());

		if (CommonUtil.isNotNullOrEmpty(produkId)) {
			query.setParameter("produkId", produkId);
		}

		if (CommonUtil.isNotNullOrEmpty(asalProdukId)) {
			query.setParameter("asalProdukId", asalProdukId);
		}

		if (CommonUtil.isNotNullOrEmpty(ruanganId)) {
			query.setParameter("ruanganId", ruanganId);
		}
		if (CommonUtil.isNotNullOrEmpty(kelompokProdukId)) {
			query.setParameter("kelompokProdukId", kelompokProdukId);
		}
		if (CommonUtil.isNotNullOrEmpty(jenisProdukId)) {
			query.setParameter("jenisProdukId", jenisProdukId);
		}



		return ((Long) query.getSingleResult()).intValue();
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<Map<String, Object>> stokList(int rowStart, int rowEnd, String sort, String dir,Integer kelompokProdukId, Integer produkId, Integer asalProdukId, Integer ruanganId,Integer jenisProdukId) {
		StringBuffer buffer = new StringBuffer();
		buffer.append(" select new map( satuanStandar.satuanStandar as satuanStandar,");
		buffer.append(" stokProdukGlobal.qtyProduk as qtyProduk, ");
		buffer.append(" produk.namaProduk as namaProduk,coalesce(produk.kdProduk,'-') as kodeBarang, ruangan.namaRuangan as namaRuangan,");
		buffer.append(" coalesce(asalProduk.asalProduk,'-') as asalProduk, ");
		buffer.append(" produk.qtyTerkecil as qtyTerkecil ) from StokProdukGlobal stokProdukGlobal ");
		buffer.append(" left join stokProdukGlobal.produk produk ");
		buffer.append(" left join stokProdukGlobal.ruangan ruangan ");
		buffer.append(" left join stokProdukGlobal.asalProduk asalProduk ");
		buffer.append(" left join produk.detailJenisProduk detailJenisProduk ");
		buffer.append(" left join produk.satuanStandar satuanStandar ");
		buffer.append(" left join detailJenisProduk.jenisProduk jenisProduk ");
		buffer.append(" left join jenisProduk.kelompokProduk kelompokProduk where produk.id is not null  ");

		if (CommonUtil.isNotNullOrEmpty(produkId)) {
			buffer.append(" and produk.id =:produkId ");
		}
		
		if (CommonUtil.isNotNullOrEmpty(kelompokProdukId)) {
			buffer.append(" and kelompokProduk.id =:kelompokProdukId ");
		}

		if (CommonUtil.isNotNullOrEmpty(asalProdukId)) {
			buffer.append(" and asalProduk.id =:asalProdukId ");
		}

		if (CommonUtil.isNotNullOrEmpty(ruanganId)) {
			buffer.append(" and ruangan.id =:ruanganId ");
		}
		
		if (CommonUtil.isNotNullOrEmpty(kelompokProdukId)) {
			buffer.append(" and kelompokProduk.id =:kelompokProdukId ");
		}
		
		if (CommonUtil.isNotNullOrEmpty(jenisProdukId)) {
			buffer.append(" and jenisProduk.id =:jenisProdukId ");
		}

		Query query = em.createQuery(buffer.toString());

		if (CommonUtil.isNotNullOrEmpty(produkId)) {
			query.setParameter("produkId", produkId);
		}

		if (CommonUtil.isNotNullOrEmpty(asalProdukId)) {
			query.setParameter("asalProdukId", asalProdukId);
		}

		if (CommonUtil.isNotNullOrEmpty(ruanganId)) {
			query.setParameter("ruanganId", ruanganId);
		}
		if (CommonUtil.isNotNullOrEmpty(kelompokProdukId)) {
			query.setParameter("kelompokProdukId", kelompokProdukId);
		}
		
		if (CommonUtil.isNotNullOrEmpty(kelompokProdukId)) {
			query.setParameter("kelompokProdukId", kelompokProdukId);
		}
		if (CommonUtil.isNotNullOrEmpty(jenisProdukId)) {
			query.setParameter("jenisProdukId", jenisProdukId);
		}

		return query.getResultList();
	}

	
	@SuppressWarnings("unchecked")
	@Override
	public List<Map<String, Object>> daftarBarangBmHpList(int rowStart, int rowEnd, String sort, String dir,Integer produkId,Integer ruanganId) {

		StringBuffer buffer = new StringBuffer();
		buffer.append(" select new map( satuanStandar.satuanStandar as satuanStandar, ");
		buffer.append(" stokProdukGlobal.qtyProduk as qtyProduk, ");
		buffer.append(" produk.namaProduk as namaProduk,coalesce(produk.kdProduk,'-') as kodeBarang, ruangan.namaRuangan as namaRuangan ) from StokProdukGlobal stokProdukGlobal ");
		buffer.append(" left join stokProdukGlobal.produk produk ");
		buffer.append(" left join stokProdukGlobal.ruangan ruangan ");
		buffer.append(" left join stokProdukGlobal.asalProduk asalProduk ");
		buffer.append(" left join produk.detailJenisProduk detailJenisProduk ");
		buffer.append(" left join produk.satuanStandar satuanStandar ");
		buffer.append(" left join detailJenisProduk.jenisProduk jenisProduk ");
		buffer.append(" left join jenisProduk.kelompokProduk kelompokProduk where produk.id is not null ");
		buffer.append(" and detailJenisProduk.id=1318  ");

		if (CommonUtil.isNotNullOrEmpty(produkId)) {
			buffer.append(" and produk.id =:produkId ");
		}
		if (CommonUtil.isNotNullOrEmpty(ruanganId)) {
			buffer.append(" and ruangan.id =:ruanganId ");
		}
		
		Query query = em.createQuery(buffer.toString());

		if (CommonUtil.isNotNullOrEmpty(produkId)) {
			query.setParameter("produkId", produkId);
		}
		if (CommonUtil.isNotNullOrEmpty(ruanganId)) {
			query.setParameter("ruanganId", ruanganId);
		}

		return query.getResultList();
	}
	
	@Override
	public int daftarBarangBmHpCount(Integer produkId,Integer ruanganId) {
		StringBuffer buffer = new StringBuffer();
		buffer.append(" select count(stokProdukGlobal.id) from StokProdukGlobal stokProdukGlobal ");
		buffer.append(" left join stokProdukGlobal.produk produk ");
		buffer.append(" left join stokProdukGlobal.ruangan ruangan ");
		buffer.append(" left join stokProdukGlobal.asalProduk asalProduk ");
		buffer.append(" left join produk.detailJenisProduk detailJenisProduk ");
		buffer.append(" left join produk.satuanStandar satuanStandar ");
		buffer.append(" left join detailJenisProduk.jenisProduk jenisProduk ");
		buffer.append(" left join jenisProduk.kelompokProduk kelompokProduk where produk.id is not null ");
		buffer.append(" and detailJenisProduk.id=1319  ");

		if (CommonUtil.isNotNullOrEmpty(produkId)) {
			buffer.append(" and produk.id =:produkId ");
		}
		if (CommonUtil.isNotNullOrEmpty(ruanganId)) {
			buffer.append(" and ruangan.id =:ruanganId ");
		}
		
		Query query = em.createQuery(buffer.toString());
		if (CommonUtil.isNotNullOrEmpty(produkId)) {
			query.setParameter("produkId", produkId);
		}
		
		if (CommonUtil.isNotNullOrEmpty(ruanganId)) {
			query.setParameter("ruanganId", ruanganId);
		}

		return ((Long) query.getSingleResult()).intValue();
	}
	
	@SuppressWarnings("unchecked")
	@Override
	public List<Map<String, Object>> getStokGlobalByProduk(Integer kelompokProdukId, Integer produkId,Ruangan ruangan,Integer jenisProdukId) {
		StringBuffer buffer = new StringBuffer();
		buffer.append(" select new map( ");
		buffer.append(" stokProdukGlobal.qtyProduk as qtyProduk, ");
		buffer.append(" stokProdukGlobal.id as id, ");
		buffer.append(" produk.id as idProduk, ");
		buffer.append(" produk.namaProduk as namaProduk, ruangan.namaRuangan as namaRuangan,satuan.satuanStandar as satuan,");
		buffer.append(" coalesce(asalProduk.asalProduk,'-') as asalProduk, ");
		buffer.append(" stokProdukGlobal.qtyProduk as qtyProduk ) from StokProdukGlobal stokProdukGlobal ");
		buffer.append(" left join stokProdukGlobal.produk produk ");
		buffer.append(" left join stokProdukGlobal.ruangan ruangan ");
		buffer.append(" left join stokProdukGlobal.asalProduk asalProduk ");
		buffer.append(" left join produk.detailJenisProduk detailJenisProduk ");
		buffer.append(" left join produk.satuanStandar satuan ");
		buffer.append(" left join detailJenisProduk.jenisProduk jenisProduk ");
		buffer.append(" left join jenisProduk.kelompokProduk kelompokProduk where produk.id is not null and stokProdukGlobal.qtyProduk > 0  ");

		if (CommonUtil.isNotNullOrEmpty(produkId)) {
			buffer.append(" and produk.id =:produkId ");
		}
		
		if (CommonUtil.isNotNullOrEmpty(kelompokProdukId)) {
			buffer.append(" and kelompokProduk.id =:kelompokProdukId ");
		}

		if (CommonUtil.isNotNullOrEmpty(ruangan)) {
			buffer.append(" and ruangan.id =:ruanganId ");
		}
		
		if(CommonUtil.isNotNullOrEmpty(jenisProdukId)){
			buffer.append(" and jenisProduk.id =:jenisProdukId");
		}
		
		Query query = em.createQuery(buffer.toString());

		if (CommonUtil.isNotNullOrEmpty(produkId)) {
			query.setParameter("produkId", produkId);
		}
		
		if (CommonUtil.isNotNullOrEmpty(kelompokProdukId)) {
			query.setParameter("kelompokProdukId", kelompokProdukId);
		}

		if (CommonUtil.isNotNullOrEmpty(ruangan)) {
			query.setParameter("ruanganId", ruangan.getId());
		}
		
		if(CommonUtil.isNotNullOrEmpty(jenisProdukId)){
			query.setParameter("jenisProdukId", jenisProdukId);
		}

		return query.getResultList();
	}

	@Override
	public int stokCountList(Integer kelompokProdukId, Integer produkId, Integer asalProdukId, Integer ruanganId,String noTerima) {
		StringBuffer buffer = new StringBuffer();
		buffer.append(" select count(produk.id) from StokProdukDetail stokProdukDetail ");
		buffer.append(" left join stokProdukDetail.produk produk ");
		buffer.append(" left join stokProdukDetail.ruangan ruangan ");
		buffer.append(" left join stokProdukDetail.asalProduk asalProduk ");
		buffer.append(" left join produk.detailJenisProduk detailJenisProduk ");
		buffer.append(" left join detailJenisProduk.jenisProduk jenisProduk left join stokProdukDetail.strukPelayanan strukPelayanan ");
		buffer.append(" left join jenisProduk.kelompokProduk kelompokProduk where produk.id is not null and stokProdukDetail.qtyProduk > 0 ");


		if (CommonUtil.isNotNullOrEmpty(produkId)) {
			buffer.append(" and produk.id =:produkId ");
		}

		if (CommonUtil.isNotNullOrEmpty(asalProdukId)) {
			buffer.append(" and asalProduk.id =:asalProdukId ");
		}

		if (CommonUtil.isNotNullOrEmpty(ruanganId)) {
			buffer.append(" and ruangan.id =:ruanganId ");
		}
		if (CommonUtil.isNotNullOrEmpty(kelompokProdukId)) {
			buffer.append(" and kelompokProduk.id =:kelompokProdukId ");
		}
		if(CommonUtil.isNotNullOrEmpty(noTerima)){
			buffer.append(" and strukPelayanan.nostruk like  :noTerima ");
		}

		Query query = em.createQuery(buffer.toString());

		if (CommonUtil.isNotNullOrEmpty(produkId)) {
			query.setParameter("produkId", produkId);
		}

		if (CommonUtil.isNotNullOrEmpty(asalProdukId)) {
			query.setParameter("asalProdukId", asalProdukId);
		}

		if (CommonUtil.isNotNullOrEmpty(ruanganId)) {
			query.setParameter("ruanganId", ruanganId);
		}
		if (CommonUtil.isNotNullOrEmpty(kelompokProdukId)) {
			query.setParameter("kelompokProdukId", kelompokProdukId);
		}
		if(CommonUtil.isNotNullOrEmpty(noTerima)){
			query.setParameter("noTerima", "%"+noTerima+"%");
		}

		return ((Long) query.getSingleResult()).intValue();
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<Map<String, Object>> stokListList(int rowStart, int rowEnd, String sort, String dir,Integer kelompokProdukId, Integer jenisProdukId, Integer produkId, Integer asalProdukId, Integer ruanganId,String noTerima) {
		StringBuffer buffer = new StringBuffer();
		buffer.append(" select new map ( satuanStandar.satuanStandar as satuanStandar,strukPelayanan.nostruk as noTerima,");
		buffer.append(" stokProdukDetail.qtyProduk as qtyProduk,");
		buffer.append(" produk.namaProduk as namaProduk,coalesce(produk.kdProduk,'-') as kodeBarang, ruangan.namaRuangan as namaRuangan,");
		buffer.append(" coalesce(asalProduk.asalProduk,'-') as asalProduk,");
		buffer.append(" stokProdukDetail.qtyProduk as qtyProduk, ");
		buffer.append(" stokProdukDetail.tglkadaluarsa as tanggalKadaluarsa,");
		buffer.append(" stokProdukDetail.nobatch as noBatch,");
		buffer.append(" produk.qtyTerkecil as qtyTerkecil)  from StokProdukDetail stokProdukDetail ");
		buffer.append(" left join stokProdukDetail.produk produk ");
		buffer.append(" left join stokProdukDetail.ruangan ruangan ");
		buffer.append(" left join stokProdukDetail.asalProduk asalProduk ");
		buffer.append(" left join produk.detailJenisProduk detailJenisProduk ");
		buffer.append(" left join produk.satuanStandar satuanStandar ");
		buffer.append(" left join detailJenisProduk.jenisProduk jenisProduk left join stokProdukDetail.strukPelayanan strukPelayanan ");
		buffer.append(" left join jenisProduk.kelompokProduk kelompokProduk where produk.id is not null and stokProdukDetail.qtyProduk > 0  ");

		if (CommonUtil.isNotNullOrEmpty(produkId)) {
			buffer.append(" and produk.id =:produkId ");
		}
		
		if (CommonUtil.isNotNullOrEmpty(kelompokProdukId)) {
			buffer.append(" and kelompokProduk.id =:kelompokProdukId ");
		}
		
		if (CommonUtil.isNotNullOrEmpty(jenisProdukId)) {
			buffer.append(" and detailJenisProduk.jenisProduk.id=:jenisProdukId");
		}

		if (CommonUtil.isNotNullOrEmpty(asalProdukId)) {
			buffer.append(" and asalProduk.id =:asalProdukId ");
		}

		if (CommonUtil.isNotNullOrEmpty(ruanganId)) {
			buffer.append(" and ruangan.id =:ruanganId ");
		}
		
		if (CommonUtil.isNotNullOrEmpty(kelompokProdukId)) {
			buffer.append(" and kelompokProduk.id =:kelompokProdukId ");
		}
		
		if(CommonUtil.isNotNullOrEmpty(noTerima)){
			buffer.append(" and strukPelayanan.nostruk like  :noTerima ");
		}

		Query query = em.createQuery(buffer.toString());

		if (CommonUtil.isNotNullOrEmpty(produkId)) {
			query.setParameter("produkId", produkId);
		}

		if (CommonUtil.isNotNullOrEmpty(asalProdukId)) {
			query.setParameter("asalProdukId", asalProdukId);
		}

		if (CommonUtil.isNotNullOrEmpty(ruanganId)) {
			query.setParameter("ruanganId", ruanganId);
		}
		if (CommonUtil.isNotNullOrEmpty(kelompokProdukId)) {
			query.setParameter("kelompokProdukId", kelompokProdukId);
		}
		
		if (CommonUtil.isNotNullOrEmpty(kelompokProdukId)) {
			query.setParameter("kelompokProdukId", kelompokProdukId);
		}

		if(CommonUtil.isNotNullOrEmpty(noTerima)){
			query.setParameter("noTerima", "%"+noTerima+"%");
		}

		return query.getResultList();
	}

	@Override
	public int preAddPemusnahanBarangKadaluarsa(Integer kelompokProdukId, Integer jenisProdukId, Integer produkId) {
		StringBuffer buffer = new StringBuffer();
		buffer.append(" select count(produk.id) from StokProdukDetail stokProdukDetail ");
		buffer.append(" left join stokProdukDetail.produk produk ");
		buffer.append(" left join stokProdukDetail.ruangan ruangan ");
		buffer.append(" left join stokProdukDetail.asalProduk asalProduk ");
		buffer.append(" left join produk.detailJenisProduk detailJenisProduk ");
		buffer.append(" left join detailJenisProduk.jenisProduk jenisProduk ");
		buffer.append(" left join jenisProduk.kelompokProduk kelompokProduk where produk.id is not null and stokProdukDetail.qtyProduk > 0 ");

		if (CommonUtil.isNotNullOrEmpty(produkId)) {
			buffer.append(" and produk.id =:produkId ");
		}
		
		if (CommonUtil.isNotNullOrEmpty(jenisProdukId)) {
			buffer.append(" and jenisProduk.id =:jenisProdukId ");
		}

		if (CommonUtil.isNotNullOrEmpty(kelompokProdukId)) {
			buffer.append(" and kelompokProduk.id =:kelompokProdukId ");
		}
		
		buffer.append(" and ruangan.id =:ruanganId ");

		Query query = em.createQuery(buffer.toString());

		if (CommonUtil.isNotNullOrEmpty(produkId)) {
			query.setParameter("produkId", produkId);
		}

		if (CommonUtil.isNotNullOrEmpty(kelompokProdukId)) {
			query.setParameter("kelompokProdukId", kelompokProdukId);
		}

		if (CommonUtil.isNotNullOrEmpty(jenisProdukId)) {
			query.setParameter("jenisProdukId", jenisProdukId);
		}
		query.setParameter("ruanganId", 50);
		
		return ((Long) query.getSingleResult()).intValue();
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<Map<String, Object>> preAddPemusnahanBarangKadaluarsaList(int rowStart, int rowEnd, String sort,String dir, Integer kelompokProdukId, Integer jenisProdukId, Integer produkId) {
		StringBuffer buffer = new StringBuffer();
		buffer.append(" select new map ( ");
		buffer.append(" stokProdukDetail.qtyProduk as qtyProduk,");
		buffer.append(" produk.id as produkId,");
		buffer.append(" produk.kdProduk as kdProduk,");
		buffer.append(" strukPelayanan.noRec as noRecStrukPelayanan,");
		buffer.append(" produk.namaProduk as namaProduk, ruangan.namaRuangan as namaRuangan,satuanStandar.satuanStandar as satuan,");
		buffer.append(" coalesce(asalProduk.asalProduk,'-') as asalProduk,");
		buffer.append(" asalProduk.id as asalProdukId,");
		buffer.append(" stokProdukDetail.qtyProduk as qtyProduk, ");
		buffer.append(" stokProdukDetail.tglkadaluarsa as tanggalKadaluarsa,'-' as noRegisterAset,");
		buffer.append(" stokProdukDetail.nobatch as noBatch,");
		buffer.append(" produk.qtyTerkecil as qtyTerkecil)  from StokProdukDetail stokProdukDetail ");
		buffer.append(" left join stokProdukDetail.produk produk ");
		buffer.append(" left join stokProdukDetail.ruangan ruangan ");
		buffer.append(" left join stokProdukDetail.strukPelayanan strukPelayanan ");
		buffer.append(" left join stokProdukDetail.asalProduk asalProduk ");
		buffer.append(" left join produk.detailJenisProduk detailJenisProduk ");
		buffer.append(" left join detailJenisProduk.jenisProduk jenisProduk ");
		buffer.append(" left join produk.satuanStandar satuanStandar ");
		buffer.append(" left join jenisProduk.kelompokProduk kelompokProduk where produk.id is not null and stokProdukDetail.qtyProduk > 0  ");
		
		if (CommonUtil.isNotNullOrEmpty(produkId)) {
			buffer.append(" and produk.id =:produkId ");
		}
		
		if (CommonUtil.isNotNullOrEmpty(jenisProdukId)) {
			buffer.append(" and jenisProduk.id =:jenisProdukId ");
		}

		if (CommonUtil.isNotNullOrEmpty(kelompokProdukId)) {
			buffer.append(" and kelompokProduk.id =:kelompokProdukId ");
		}

		buffer.append(" and ruangan.id =:ruanganId ");
		
		Query query = em.createQuery(buffer.toString());

		if (CommonUtil.isNotNullOrEmpty(produkId)) {
			query.setParameter("produkId", produkId);
		}

		if (CommonUtil.isNotNullOrEmpty(kelompokProdukId)) {
			query.setParameter("kelompokProdukId", kelompokProdukId);
		}

		if (CommonUtil.isNotNullOrEmpty(jenisProdukId)) {
			query.setParameter("jenisProdukId", jenisProdukId);
		}
		query.setParameter("ruanganId", 50);
		
		return query.getResultList();
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<Map<String, Object>> stokListCetak(Integer kelompokProdukId, Integer produkId, Integer asalProdukId,Integer ruanganId, Integer jenisProdukId) {
		StringBuffer buffer = new StringBuffer();
		buffer.append(" select new map( satuanStandar.satuanStandar as satuanStandar,");
		buffer.append(" stokProdukGlobal.qtyProduk as qtyProduk, ");
		buffer.append(" produk.namaProduk as namaProduk,coalesce(produk.kdProduk,'-') as kodeBarang, ruangan.namaRuangan as namaRuangan,");
		buffer.append(" coalesce(asalProduk.asalProduk,'-') as asalProduk, ");
		buffer.append(" produk.qtyTerkecil as qtyTerkecil ) from StokProdukGlobal stokProdukGlobal ");
		buffer.append(" left join stokProdukGlobal.produk produk ");
		buffer.append(" left join stokProdukGlobal.ruangan ruangan ");
		buffer.append(" left join stokProdukGlobal.asalProduk asalProduk ");
		buffer.append(" left join produk.detailJenisProduk detailJenisProduk ");
		buffer.append(" left join produk.satuanStandar satuanStandar ");
		buffer.append(" left join detailJenisProduk.jenisProduk jenisProduk ");
		buffer.append(" left join jenisProduk.kelompokProduk kelompokProduk where produk.id is not null  ");

		if (CommonUtil.isNotNullOrEmpty(produkId)) {
			buffer.append(" and produk.id =:produkId ");
		}
		
		if (CommonUtil.isNotNullOrEmpty(kelompokProdukId)) {
			buffer.append(" and kelompokProduk.id =:kelompokProdukId ");
		}

		if (CommonUtil.isNotNullOrEmpty(asalProdukId)) {
			buffer.append(" and asalProduk.id =:asalProdukId ");
		}

		if (CommonUtil.isNotNullOrEmpty(ruanganId)) {
			buffer.append(" and ruangan.id =:ruanganId ");
		}
		
		if (CommonUtil.isNotNullOrEmpty(kelompokProdukId)) {
			buffer.append(" and kelompokProduk.id =:kelompokProdukId ");
		}
		
		if (CommonUtil.isNotNullOrEmpty(jenisProdukId)) {
			buffer.append(" and jenisProduk.id =:jenisProdukId ");
		}

		Query query = em.createQuery(buffer.toString());

		if (CommonUtil.isNotNullOrEmpty(produkId)) {
			query.setParameter("produkId", produkId);
		}

		if (CommonUtil.isNotNullOrEmpty(asalProdukId)) {
			query.setParameter("asalProdukId", asalProdukId);
		}

		if (CommonUtil.isNotNullOrEmpty(ruanganId)) {
			query.setParameter("ruanganId", ruanganId);
		}
		if (CommonUtil.isNotNullOrEmpty(kelompokProdukId)) {
			query.setParameter("kelompokProdukId", kelompokProdukId);
		}
		
		if (CommonUtil.isNotNullOrEmpty(kelompokProdukId)) {
			query.setParameter("kelompokProdukId", kelompokProdukId);
		}
		if (CommonUtil.isNotNullOrEmpty(jenisProdukId)) {
			query.setParameter("jenisProdukId", jenisProdukId);
		}

		return query.getResultList();
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<Map<String, Object>> cetakStokListList(Integer kelompokProdukId, Integer produkId, Integer asalProdukId,Integer ruanganId, String noTerima) {
		StringBuffer buffer = new StringBuffer();
		buffer.append(" select new map ( satuanStandar.satuanStandar as satuanStandar,strukPelayanan.nostruk as noTerima,");
		buffer.append(" stokProdukDetail.qtyProduk as qtyProduk,");
		buffer.append(" produk.namaProduk as namaProduk,coalesce(produk.kdProduk,'-') as kodeBarang, ruangan.namaRuangan as namaRuangan,");
		buffer.append(" coalesce(asalProduk.asalProduk,'-') as asalProduk,");
		buffer.append(" stokProdukDetail.qtyProduk as qtyProduk, ");
		buffer.append(" stokProdukDetail.tglkadaluarsa as tanggalKadaluarsa,");
		buffer.append(" stokProdukDetail.nobatch as noBatch,");
		buffer.append(" produk.qtyTerkecil as qtyTerkecil)  from StokProdukDetail stokProdukDetail ");
		buffer.append(" left join stokProdukDetail.produk produk ");
		buffer.append(" left join stokProdukDetail.ruangan ruangan ");
		buffer.append(" left join stokProdukDetail.asalProduk asalProduk ");
		buffer.append(" left join produk.detailJenisProduk detailJenisProduk ");
		buffer.append(" left join produk.satuanStandar satuanStandar ");
		buffer.append(" left join detailJenisProduk.jenisProduk jenisProduk left join stokProdukDetail.strukPelayanan strukPelayanan ");
		buffer.append(" left join jenisProduk.kelompokProduk kelompokProduk where produk.id is not null and stokProdukDetail.qtyProduk > 0  ");

		if (CommonUtil.isNotNullOrEmpty(produkId)) {
			buffer.append(" and produk.id =:produkId ");
		}
		
		if (CommonUtil.isNotNullOrEmpty(kelompokProdukId)) {
			buffer.append(" and kelompokProduk.id =:kelompokProdukId ");
		}

		if (CommonUtil.isNotNullOrEmpty(asalProdukId)) {
			buffer.append(" and asalProduk.id =:asalProdukId ");
		}

		if (CommonUtil.isNotNullOrEmpty(ruanganId)) {
			buffer.append(" and ruangan.id =:ruanganId ");
		}
		
		if (CommonUtil.isNotNullOrEmpty(kelompokProdukId)) {
			buffer.append(" and kelompokProduk.id =:kelompokProdukId ");
		}
		
		if(CommonUtil.isNotNullOrEmpty(noTerima)){
			buffer.append(" and strukPelayanan.nostruk like  :noTerima ");
		}

		Query query = em.createQuery(buffer.toString());

		if (CommonUtil.isNotNullOrEmpty(produkId)) {
			query.setParameter("produkId", produkId);
		}

		if (CommonUtil.isNotNullOrEmpty(asalProdukId)) {
			query.setParameter("asalProdukId", asalProdukId);
		}

		if (CommonUtil.isNotNullOrEmpty(ruanganId)) {
			query.setParameter("ruanganId", ruanganId);
		}
		if (CommonUtil.isNotNullOrEmpty(kelompokProdukId)) {
			query.setParameter("kelompokProdukId", kelompokProdukId);
		}
		
		if (CommonUtil.isNotNullOrEmpty(kelompokProdukId)) {
			query.setParameter("kelompokProdukId", kelompokProdukId);
		}

		if(CommonUtil.isNotNullOrEmpty(noTerima)){
			query.setParameter("noTerima", "%"+noTerima+"%");
		}

		return query.getResultList();
	}

	@Override
	public int preAddPemusnahanBarangAset(Integer kelompokProdukId, Integer jenisProdukId, Integer produkId) {
		StringBuffer buffer = new StringBuffer();
		buffer.append(" select count(registrasiAset.noRec) ");
		buffer.append(" from RegistrasiAset registrasiAset ");
		buffer.append(" left join registrasiAset.strukPelayananDetail strukPelayananDetail ");
		buffer.append(" left join strukPelayananDetail.nostruk strukPelayanan  ");
		buffer.append(" left join strukPelayananDetail.kdproduk produk ");
		buffer.append(" left join registrasiAset.ruangan ruangan ");
		buffer.append(" left join strukPelayananDetail.kdasalproduk asalProduk ");
		buffer.append(" left join produk.detailJenisProduk detailJenisProduk ");
		buffer.append(" left join detailJenisProduk.jenisProduk jenisProduk ");
		buffer.append(" left join jenisProduk.kelompokProduk kelompokProduk ");
		buffer.append(" where produk.id is not null  ");

		if (CommonUtil.isNotNullOrEmpty(produkId)) {
			buffer.append(" and produk.id =:produkId ");
		}
		
		if (CommonUtil.isNotNullOrEmpty(jenisProdukId)) {
			buffer.append(" and jenisProduk.id =:jenisProdukId ");
		}

		if (CommonUtil.isNotNullOrEmpty(kelompokProdukId)) {
			buffer.append(" and kelompokProduk.id =:kelompokProdukId ");
		}
		
		buffer.append(" and ruangan.id =:ruanganId ");

		Query query = em.createQuery(buffer.toString());

		if (CommonUtil.isNotNullOrEmpty(produkId)) {
			query.setParameter("produkId", produkId);
		}

		if (CommonUtil.isNotNullOrEmpty(kelompokProdukId)) {
			query.setParameter("kelompokProdukId", kelompokProdukId);
		}

		if (CommonUtil.isNotNullOrEmpty(jenisProdukId)) {
			query.setParameter("jenisProdukId", jenisProdukId);
		}
		query.setParameter("ruanganId", 50);
		
		return ((Long) query.getSingleResult()).intValue();
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<Map<String, Object>> preAddPemusnahanBarangAset(int rowStart, int rowEnd, String sort, String dir,Integer kelompokProdukId, Integer jenisProdukId, Integer produkId) {
		StringBuffer buffer = new StringBuffer();
		buffer.append(" select new Map( ");
		buffer.append(" 1 as qtyProduk, ");
		buffer.append(" produk.id as produkId, ");
		buffer.append(" produk.kdProduk as kdProduk, ");
		buffer.append(" strukPelayanan.noRec as noRecStrukPelayanan, ");
		buffer.append(" produk.namaProduk as namaProduk,  ");
		buffer.append(" ruangan.namaRuangan as namaRuangan, ");
		buffer.append(" coalesce(asalProduk.asalProduk,'-') as asalProduk, ");
		buffer.append(" asalProduk.id as asalProdukId, ");
		buffer.append(" 1 as qtyProduk, ");
		buffer.append(" '-' as noBatch, ");
		buffer.append(" 1 as qtyTerkecil,'' as tanggalKadaluarsa, ");
		buffer.append(" registrasiAset.noRegisterAset as noRegisterAset,satuanStandar.satuanStandar as satuan ) ");
		buffer.append(" from RegistrasiAset registrasiAset ");
		buffer.append(" left join registrasiAset.strukPelayananDetail strukPelayananDetail ");
		buffer.append(" left join strukPelayananDetail.nostruk strukPelayanan  ");
		buffer.append(" left join strukPelayananDetail.kdproduk produk ");
		buffer.append(" left join registrasiAset.ruangan ruangan ");
		buffer.append(" left join strukPelayananDetail.kdasalproduk asalProduk ");
		buffer.append(" left join produk.detailJenisProduk detailJenisProduk ");
		buffer.append(" left join detailJenisProduk.jenisProduk jenisProduk ");
		buffer.append(" left join jenisProduk.kelompokProduk kelompokProduk left join produk.satuanStandar satuanStandar ");
		buffer.append(" where produk.id is not null  ");
		
		if (CommonUtil.isNotNullOrEmpty(produkId)) {
			buffer.append(" and produk.id =:produkId ");
		}
		
		if (CommonUtil.isNotNullOrEmpty(jenisProdukId)) {
			buffer.append(" and jenisProduk.id =:jenisProdukId ");
		}

		if (CommonUtil.isNotNullOrEmpty(kelompokProdukId)) {
			buffer.append(" and kelompokProduk.id =:kelompokProdukId ");
		}
		
		buffer.append(" and ruangan.id =:ruanganId ");

		Query query = em.createQuery(buffer.toString());

		if (CommonUtil.isNotNullOrEmpty(produkId)) {
			query.setParameter("produkId", produkId);
		}

		if (CommonUtil.isNotNullOrEmpty(kelompokProdukId)) {
			query.setParameter("kelompokProdukId", kelompokProdukId);
		}

		if (CommonUtil.isNotNullOrEmpty(jenisProdukId)) {
			query.setParameter("jenisProdukId", jenisProdukId);
		}
		query.setParameter("ruanganId", 50);
		
		return query.getResultList();
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<Map<String, Object>> stokRuanganIp3Rs(Integer ruanganId) {
		StringBuffer buffer = new StringBuffer();
		buffer.append(" select new map( satuanStandar.satuanStandar as satuanStandar,satuanStandar.id as satuanStandarId, ");
		buffer.append(" stokProdukGlobal.qtyProduk as qtyProduk,produk.id as idProduk,  ");
		buffer.append(" produk.namaProduk as namaProduk,coalesce(produk.kdProduk,'-') as kodeBarang, ruangan.namaRuangan as namaRuangan,");
		buffer.append(" coalesce(asalProduk.asalProduk,'-') as asalProduk, ");
		buffer.append(" produk.qtyTerkecil as qtyTerkecil ) from StokProdukGlobal stokProdukGlobal ");
		buffer.append(" left join stokProdukGlobal.produk produk ");
		buffer.append(" left join stokProdukGlobal.ruangan ruangan ");
		buffer.append(" left join stokProdukGlobal.asalProduk asalProduk ");
		buffer.append(" left join produk.detailJenisProduk detailJenisProduk ");
		buffer.append(" left join produk.satuanStandar satuanStandar ");
		buffer.append(" left join detailJenisProduk.jenisProduk jenisProduk ");
		buffer.append(" left join jenisProduk.kelompokProduk kelompokProduk where produk.id is not null  ");
		buffer.append(" and ruangan.id =:ruanganId ");
		
		Query query = em.createQuery(buffer.toString());
		query.setParameter("ruanganId", ruanganId);

		return query.getResultList();
	}

	@Override
	public int masterBmhpCount() {
		StringBuffer buffer = new StringBuffer();
		buffer.append(" select  count(produk.id) from Produk produk ");
		buffer.append(" left join produk.detailJenisProduk detailJenisProduk  ");
		buffer.append(" left join produk.satuanStandar satuanStandar  ");
		buffer.append(" left join detailJenisProduk.jenisProduk jenisProduk ");
		buffer.append(" left join jenisProduk.kelompokProduk kelompokProduk where produk.id is not null  ");
		buffer.append(" and detailJenisProduk.id=1319 ");
		
		Query query = em.createQuery(buffer.toString());
		return ((Long) query.getSingleResult()).intValue();
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<Map<String, Object>> masterBmhpList(int rowStart, int rowEnd, String sort, String dir) {
		StringBuffer buffer = new StringBuffer();
		buffer.append(" select new map( produk.id as idProduk,satuanStandar.satuanStandar as satuanStandar, ");
		buffer.append(" produk.namaProduk as namaProduk,coalesce(produk.kdProduk,'-') as kodeBarang ) from Produk produk ");
		buffer.append(" left join produk.detailJenisProduk detailJenisProduk ");
		buffer.append(" left join produk.satuanStandar satuanStandar ");
		buffer.append(" left join detailJenisProduk.jenisProduk jenisProduk ");
		buffer.append(" left join jenisProduk.kelompokProduk kelompokProduk where produk.id is not null ");
		buffer.append(" and detailJenisProduk.id=1319");
		
		Query query = em.createQuery(buffer.toString());
		return query.getResultList();
	}
	
	@Override
	public int barangPersediaanCount() {
		StringBuffer buffer = new StringBuffer();
		buffer.append(" select  count(produk.id) from Produk produk ");
		buffer.append(" left join produk.detailJenisProduk detailJenisProduk  ");
		buffer.append(" left join produk.satuanStandar satuanStandar  ");
		buffer.append(" left join detailJenisProduk.jenisProduk jenisProduk ");
		buffer.append(" left join jenisProduk.kelompokProduk kelompokProduk where produk.id is not null  ");
		buffer.append(" and kelompokProduk.id in (24,5) ");
		
		Query query = em.createQuery(buffer.toString());
		return ((Long) query.getSingleResult()).intValue();
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<Map<String, Object>> barangPersediaanList(int rowStart, int rowEnd, String sort, String dir) {
		StringBuffer buffer = new StringBuffer();
		buffer.append(" select new map( produk.id as idProduk,satuanStandar.satuanStandar as satuanStandar, ");
		buffer.append(" produk.namaProduk as namaProduk,coalesce(produk.kdProduk,'-') as kodeBarang ) from Produk produk ");
		buffer.append(" left join produk.detailJenisProduk detailJenisProduk ");
		buffer.append(" left join produk.satuanStandar satuanStandar ");
		buffer.append(" left join detailJenisProduk.jenisProduk jenisProduk ");
		buffer.append(" left join jenisProduk.kelompokProduk kelompokProduk where produk.id is not null ");
		buffer.append(" and kelompokProduk.id in (24,5)");
		
		Query query = em.createQuery(buffer.toString());
		return query.getResultList();
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<Map<String, Object>> getProdukBmhp(int detailJenisProduk) {
		StringBuffer buffer = new StringBuffer();
		buffer.append(" select new map( ");
		buffer.append(" produk.id as idProduk, ");
		buffer.append(" produk.namaProduk as namaProduk ) from Produk produk ");
		buffer.append(" left join produk.detailJenisProduk detailJenisProduk ");
		buffer.append(" left join produk.satuanStandar satuan ");
		buffer.append(" left join detailJenisProduk.jenisProduk jenisProduk ");
		buffer.append(" left join jenisProduk.kelompokProduk kelompokProduk where produk.id is not null   ");

		if (CommonUtil.isNotNullOrEmpty(detailJenisProduk)) {
			buffer.append(" and produk.detailJenisProdukId =:detailJenisProduk ");
		}

		Query query = em.createQuery(buffer.toString());
		if (CommonUtil.isNotNullOrEmpty(detailJenisProduk)) {
			query.setParameter("detailJenisProduk", detailJenisProduk);
		}

		return query.getResultList();
	}

}
