package com.jasamedika.medifirst2000.dao.custom.impl;

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

import javax.persistence.Query;

import org.springframework.stereotype.Repository;

import com.jasamedika.medifirst2000.dao.custom.StrukPelayananDetailDaoCustom;
import com.jasamedika.medifirst2000.dao.custom.base.impl.CoreDaoImpl;
import com.jasamedika.medifirst2000.entities.KelompokUser;
import com.jasamedika.medifirst2000.entities.Ruangan;
import com.jasamedika.medifirst2000.entities.StrukPelayananDetail;
import com.jasamedika.medifirst2000.util.CommonUtil;
import com.jasamedika.medifirst2000.util.DateUtil;

/**
 * Repository Custom class
 * 
 * @author Roberto
 */
@Repository//("AgamaDaoCustom")
public class StrukPelayananDetailDaoCustomImpl extends CoreDaoImpl<StrukPelayananDetail> implements StrukPelayananDetailDaoCustom {

	public StrukPelayananDetailDaoCustomImpl() {
		super(StrukPelayananDetail.class);
	}

	@Override
	public int gridPenerimaanBarangCount(String tanggalTerimAwal, String tanggalTerimAhir, String nofaktur,Integer idProduk,Integer kdKelompokTransaksi,KelompokUser kelompokUser,Integer supplierId) {

		StringBuffer buffer = new StringBuffer();
		buffer.append(" select count(detail.noRec) ");
		buffer.append(" from StrukPelayananDetail detail ");
		buffer.append(" left join detail.kdproduk produk ");
		buffer.append(" left join produk.detailJenisProduk detailJenisProduk ");
		buffer.append(" left join detailJenisProduk.jenisProduk jenisProduk ");
		buffer.append(" left join jenisProduk.kelompokProduk kelompokProduk ");
		buffer.append(" left join detail.kdasalproduk asalProduk ");
		buffer.append(" left join detail.nostruk strukPelayanan ");
		buffer.append(" left join strukPelayanan.kdkelompoktransaksi kelompokTransaksi left join strukPelayanan.kdrekanan supplier ");
		buffer.append(" where detail.noRec is not null and kelompokTransaksi.id=:kdKelompokTransaksi ");
		if(CommonUtil.isNotNullOrEmpty(kelompokUser)){
			if(CommonUtil.isNotNullOrEmpty(kelompokUser)){
				if(kelompokUser.getKelompokUser().equalsIgnoreCase("bagianUmum")){
					buffer.append(" and kelompokProduk.id in (20) ");
				}else if(kelompokUser.getKelompokUser().equalsIgnoreCase("logistik")){
					buffer.append(" and kelompokProduk.id in (24,5) ");
				}
			}
		}
		
		if (CommonUtil.isNotNullOrEmpty(nofaktur) ) {
			buffer.append("and lower(strukPelayanan.nofaktur) like :nofaktur ");
		}
		
		if (CommonUtil.isNotNullOrEmpty(idProduk) ) {
			buffer.append("and produk.id =:idProduk ");
		}
		
		if (CommonUtil.isNotNullOrEmpty(supplierId) ) {
			buffer.append("and supplier.id =:supplierId ");
		}
		if (CommonUtil.isNotNullOrEmpty(tanggalTerimAwal) && CommonUtil.isNotNullOrEmpty(tanggalTerimAhir)) {
			buffer.append("and date(detail.tglpelayanan) between :tanggalTerimAwal and :tanggalTerimAhir ");
		}
		

		Query query = em.createQuery(buffer.toString());
		query.setParameter("kdKelompokTransaksi", kdKelompokTransaksi);
		if (CommonUtil.isNotNullOrEmpty(tanggalTerimAwal) && CommonUtil.isNotNullOrEmpty(tanggalTerimAhir)) {
			query.setParameter("tanggalTerimAwal", DateUtil.toDate(tanggalTerimAwal));
			query.setParameter("tanggalTerimAhir", DateUtil.toDate(tanggalTerimAhir));
		}

		if (CommonUtil.isNotNullOrEmpty(nofaktur)) {
			query.setParameter("nofaktur", "%"+nofaktur.toLowerCase()+"%");
		}
		
		if (CommonUtil.isNotNullOrEmpty(idProduk)) {
			query.setParameter("idProduk", idProduk);
		}
		
		if (CommonUtil.isNotNullOrEmpty(supplierId)) {
			query.setParameter("supplierId", supplierId);
		}

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

	}

	@Override
	public List<Map<String, Object>> gridPenerimaanBarangList(int rowStart, int rowEnd, String sort, String dir,String tanggalTerimAwal, String tanggalTerimAhir, String nofaktur, Integer idProduk,Integer kdKelompokTransaksi,KelompokUser kelompokUser,Integer supplierId) {
		StringBuffer buffer = new StringBuffer();
		buffer.append(" select new Map (strukPelayanan.tglstruk as tanggalStruk, satuanStandar.satuanStandar as satuanStandar  ,");
		buffer.append(" produk.namaProduk as namaBarang, ");
		buffer.append(" detail.noRec as noRec, ");
		buffer.append(" detail.tglpelayanan as tanggalPenerimaan, ");
		buffer.append(" asalProduk.asalProduk as sumberDana, ");
		buffer.append(" detail.qtyproduk as qtyProduk, ");
		buffer.append(" strukPelayanan.tglfaktur as tanggalFaktur, ");
		buffer.append(" strukPelayanan.nofaktur as noFaktur ) ");
		buffer.append(" From StrukPelayananDetail detail ");
		buffer.append(" left join detail.kdproduk produk ");
		buffer.append(" left join produk.detailJenisProduk detailJenisProduk ");
		buffer.append(" left join detailJenisProduk.jenisProduk jenisProduk ");
		buffer.append(" left join jenisProduk.kelompokProduk kelompokProduk ");
		buffer.append(" left join detail.kdasalproduk asalProduk ");
		buffer.append(" left join detail.nostruk strukPelayanan left join detail.kdsatuanstandar satuanStandar ");
		buffer.append(" left join strukPelayanan.kdkelompoktransaksi kelompokTransaksi left join strukPelayanan.kdrekanan supplier  ");
		buffer.append(" where detail.noRec is not null and kelompokTransaksi.id=:kdKelompokTransaksi ");
		if(CommonUtil.isNotNullOrEmpty(kelompokUser)){
			if(kelompokUser.getKelompokUser().equalsIgnoreCase("bagianUmum")){
				buffer.append(" and kelompokProduk.id in (20) ");
			}else if(kelompokUser.getKelompokUser().equalsIgnoreCase("logistik")){
				buffer.append(" and kelompokProduk.id in (24,5) ");
			}
		}
		if (CommonUtil.isNotNullOrEmpty(nofaktur) ) {
			buffer.append("and lower(strukPelayanan.nofaktur) like :nofaktur ");
		}
		
		if (CommonUtil.isNotNullOrEmpty(idProduk) ) {
			buffer.append("and produk.id =:idProduk ");
		}
		if (CommonUtil.isNotNullOrEmpty(tanggalTerimAwal) && CommonUtil.isNotNullOrEmpty(tanggalTerimAhir)) {
			buffer.append("and date(detail.tglpelayanan) between :tanggalTerimAwal and :tanggalTerimAhir ");
		}
		if (CommonUtil.isNotNullOrEmpty(supplierId) ) {
			buffer.append(" and supplier.id =:supplierId ");
		}
		
		Query query = em.createQuery(buffer.toString());
		query.setParameter("kdKelompokTransaksi", kdKelompokTransaksi);
		if (CommonUtil.isNotNullOrEmpty(tanggalTerimAwal) && CommonUtil.isNotNullOrEmpty(tanggalTerimAhir)) {
			query.setParameter("tanggalTerimAwal", DateUtil.toDate(tanggalTerimAwal));
			query.setParameter("tanggalTerimAhir", DateUtil.toDate(tanggalTerimAhir));
		}

		if (CommonUtil.isNotNullOrEmpty(nofaktur)) {
			query.setParameter("nofaktur", "%"+nofaktur.toLowerCase()+"%");
		}
		
		if (CommonUtil.isNotNullOrEmpty(idProduk)) {
			query.setParameter("idProduk", idProduk);
		}
		if (CommonUtil.isNotNullOrEmpty(supplierId)) {
			query.setParameter("supplierId", supplierId);
		}
		
		query.setFirstResult(rowStart);
		query.setMaxResults(rowEnd);

		List<Map<String, Object>> list = query.getResultList();
		
		return list;
	}
	
	@Override
	public Boolean CheckLogistikTerhadapPphp(String noRec) {
		
		StringBuffer buffer = new StringBuffer();
		buffer.append("  select coalesce(sum(detail.hasilKonversi)-(select sum(detail.hasilKonversi) ");
		buffer.append("  from StrukPelayananDetail detail ");
		buffer.append("  left join detail.kdsatuanstandar satuanStandarPphp ");
		buffer.append("  left join detail.nostruk header ");
		buffer.append("  left join detail.strukPelayananDetail pphp ");
		buffer.append("  left join pphp.nostruk pphpHeader ");
		buffer.append("  where  pphpHeader.noRec=:noRec ");
		buffer.append("  group by  pphpHeader.noRec),1) ");
		buffer.append("  from StrukPelayananDetail detail ");
		buffer.append("  left join detail.nostruk header "); 
		buffer.append("  where header.noRec=:noRec ");
		
		Query query = em.createQuery(buffer.toString());
		
		query.setParameter("noRec", noRec);
		
		

		Double result = (Double) query.getSingleResult();
		if(result>=1){
			return false;
		}else{
			return true;
		}
	}
	
	
	@Override
	public Boolean CheckPphpTerhadapSppb(String noRec) {
		
		StringBuffer buffer = new StringBuffer();
		buffer.append(" select count(distinct header.noRec) from StrukPelayananDetail detail ");
		buffer.append(" left join detail.nostruk header ");
		buffer.append(" left join detail.strukPelayananDetail sppb ");
		buffer.append(" left join sppb.nostruk sppHeader where sppHeader.noRec=:noRec ");
		
		Query query = em.createQuery(buffer.toString());
		
		query.setParameter("noRec", noRec);
		
		

		Long result = (Long) query.getSingleResult();
		if(result>=1){
			return false;
		}else{
			return true;
		}
	}

	@Override
	public int listPenerimaanCount(String tanggalAwal, String tanggalAhir, String noTerima, Integer produkId,Integer ruanganId,Integer kelompokTransaksiReturId) {
		StringBuffer buffer = new StringBuffer();
		buffer.append(" select count(kirimProduk.noRec) ");
		buffer.append(" from KirimProduk kirimProduk ");
		buffer.append(" left join kirimProduk.noKirim strukKirim ");
		buffer.append(" left join strukKirim.kdruanganasal ruanganAsal ");
		buffer.append(" left join strukKirim.kdruangantujuan ruanganTujuan ");
		buffer.append(" left join kirimProduk.produk produk ");
		buffer.append(" left join strukKirim.nostruk strukPelayanan ");
		buffer.append(" left join strukPelayanan.kdrekanan rekanan  right join kirimProduk.noKonfirmasi strukKonfirmasi left join strukKonfirmasi.kelompokTransaksi kelompokTransaksi ");
		buffer.append(" where strukKirim.noRec is not null and kelompokTransaksi.id!=:kelompokTransaksiReturId  and strukKonfirmasi.noKonfirmasi is not null and strukKirim.kdruangantujuan.id=:ruanganId ");
		
		if (CommonUtil.isNotNullOrEmpty(tanggalAwal) && CommonUtil.isNotNullOrEmpty(tanggalAhir)) {
			buffer.append("and date(strukKirim.tglkirim) between :tanggalAwal and :tanggalAhir ");
		}
		
		if (CommonUtil.isNotNullOrEmpty(produkId) ) {
			buffer.append("and produk.id=:produkId ");
		}
		
		if (CommonUtil.isNotNullOrEmpty(noTerima) ) {
			buffer.append("and strukKonfirmasi.noKonfirmasi like :noTerima ");
		}
		
		Query query = em.createQuery(buffer.toString());
		if (CommonUtil.isNotNullOrEmpty(tanggalAwal) && CommonUtil.isNotNullOrEmpty(tanggalAhir)) {
			query.setParameter("tanggalAwal", DateUtil.toDate(tanggalAwal));
			query.setParameter("tanggalAhir", DateUtil.toDate(tanggalAhir));
		}
		if (CommonUtil.isNotNullOrEmpty(noTerima)) {
			query.setParameter("noTerima", "%" + noTerima + "%");
		}
		if (CommonUtil.isNotNullOrEmpty(produkId)) {
			query.setParameter("produkId", produkId);
		}

		query.setParameter("ruanganId", ruanganId);	
		query.setParameter("kelompokTransaksiReturId", kelompokTransaksiReturId);	

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

	@Override
	public List<Map<String, Object>> listPenerimaan(int rowStart, int rowEnd, String sort, String dir,String tanggalAwal, String tanggalAhir, String noTerima, Integer produkId,Integer ruanganId,Integer kelompokTransaksiReturId) {

		StringBuffer buffer = new StringBuffer();
		buffer.append(" select new Map( strukKirim.nokirim as noKirim,strukKonfirmasi.noRec as noRecStrukKonfirmasi, ");
		buffer.append(" strukKirim.tglkirim as tanggalKirim, ");
		buffer.append(" ruanganAsal.namaRuangan as ruanganAsal, strukKonfirmasi.noKonfirmasi as noKonfirmasi,");
		buffer.append(" ruanganTujuan.namaRuangan as ruanganTujuan )");
		buffer.append(" from KirimProduk kirimProduk ");
		buffer.append(" left join kirimProduk.noKirim strukKirim ");
		buffer.append(" left join strukKirim.kdruanganasal ruanganAsal ");
		buffer.append(" left join strukKirim.kdruangantujuan ruanganTujuan ");
		buffer.append(" left join kirimProduk.produk produk ");
		buffer.append(" left join strukKirim.nostruk strukPelayanan ");
		buffer.append(" left join strukPelayanan.kdrekanan rekanan  right join kirimProduk.noKonfirmasi strukKonfirmasi left join strukKonfirmasi.kelompokTransaksi kelompokTransaksi ");
		buffer.append(" where strukKirim.noRec is not null and kelompokTransaksi.id!=:kelompokTransaksiReturId  and strukKonfirmasi.noKonfirmasi is not null and  strukKirim.kdruanganasal.id=:ruanganId  ");
		
		if (CommonUtil.isNotNullOrEmpty(tanggalAwal) && CommonUtil.isNotNullOrEmpty(tanggalAhir)) {
			buffer.append("and date(strukKirim.tglkirim) between :tanggalAwal and :tanggalAhir ");
		}
		
		if (CommonUtil.isNotNullOrEmpty(produkId) ) {
			buffer.append("and produk.id=:produkId ");
		}
		
		if (CommonUtil.isNotNullOrEmpty(noTerima) ) {
			buffer.append("and strukKonfirmasi.noKonfirmasi like :noTerima ");
		}
		buffer.append("group by strukKirim.nokirim,strukKonfirmasi.noRec,strukKirim.tglkirim,ruanganAsal.namaRuangan, strukKonfirmasi.noKonfirmasi, ruanganTujuan.namaRuangan   ");
		buffer.append(" order by strukKirim.tglkirim desc ");
		Query query = em.createQuery(buffer.toString());
		if (CommonUtil.isNotNullOrEmpty(tanggalAwal) && CommonUtil.isNotNullOrEmpty(tanggalAhir)) {
			query.setParameter("tanggalAwal", DateUtil.toDate(tanggalAwal));
			query.setParameter("tanggalAhir", DateUtil.toDate(tanggalAhir));
		}
		if (CommonUtil.isNotNullOrEmpty(noTerima)) {
			query.setParameter("noTerima", "%" + noTerima + "%");
		}
		if (CommonUtil.isNotNullOrEmpty(produkId)) {
			query.setParameter("produkId", produkId);
		}

		query.setParameter("ruanganId", ruanganId);
		query.setParameter("kelompokTransaksiReturId", kelompokTransaksiReturId);	
		query.setFirstResult(rowStart);
		query.setMaxResults(rowEnd);

		List<Map<String, Object>> list = query.getResultList();
		
		return list;
	
	}

	@Override
	public Map<String, Object> findStrukKirimHeaderByNoRec(String noRec) {
		StringBuffer buffer = new StringBuffer();
		buffer.append(" select new Map( strukKirim.nokirim as noKirim, ");
		buffer.append(" strukKirim.tglkirim as tanggalKirim, ");
		buffer.append(" ruanganAsal.namaRuangan as ruanganAsal,ruanganAsal.id as ruanganAsalId, strukKonfirmasi.noKonfirmasi as noKonfirmasi,");
		buffer.append(" ruanganTujuan.namaRuangan as ruanganTujuan,ruanganTujuan.id as ruanganTujuanId )");
		buffer.append(" from KirimProduk kirimProduk ");
		buffer.append(" left join kirimProduk.noKirim strukKirim ");
		buffer.append(" left join strukKirim.kdruanganasal ruanganAsal ");
		buffer.append(" left join strukKirim.kdruangantujuan ruanganTujuan ");
		buffer.append(" left join kirimProduk.produk produk ");
		buffer.append(" left join strukKirim.nostruk strukPelayanan ");
		buffer.append(" left join strukPelayanan.kdrekanan rekanan  right join kirimProduk.noKonfirmasi strukKonfirmasi ");
		buffer.append(" where strukKirim.noRec is not null  and strukKonfirmasi.noRec=:noRec ");
		
		Query query = em.createQuery(buffer.toString());
		
		
		if (CommonUtil.isNotNullOrEmpty(noRec)) {
			query.setParameter("noRec", noRec);
		}
		
		Map<String, Object> data = (Map<String, Object>) query.getSingleResult();
		
		return data;
	}

	@Override
	public List<Map<String, Object>> findStrukKirimDetailByNoRec(String noRec) {
		StringBuffer buffer = new StringBuffer();
		buffer.append(" select new Map( ");
		buffer.append(" jenisProduk.jenisProduk as jenisProduk, ");
		buffer.append(" jenisProduk.id as jenisProdukId, ");
		buffer.append(" produk.namaProduk as namaProduk, ");
		buffer.append(" produk.id as produkId, ");
		buffer.append(" asalProduk.asalProduk as asalProduk, ");
		buffer.append(" asalProduk.id as asalProdukId, ");
		buffer.append(" satuanStandar.satuanStandar as satuanStandar, ");
		buffer.append(" satuanStandar.id as satuanStandarId, ");
		buffer.append(" kirimProduk.hargaSatuan as hargaSatuan, ");
		buffer.append(" kirimProduk.qtyProdukTerima as qty, ");
		buffer.append(" kirimProduk.noRec as noRecKirimProduk )  ");
		buffer.append(" from KirimProduk kirimProduk  ");
		buffer.append(" left join kirimProduk.produk produk ");
		buffer.append(" left join kirimProduk.asalProduk asalProduk ");
		buffer.append(" left join produk.detailJenisProduk detailJenisProduk ");
		buffer.append(" left join detailJenisProduk.jenisProduk jenisProduk ");
		buffer.append(" left join kirimProduk.satuanStandar satuanStandar ");
		buffer.append(" left join kirimProduk.noKonfirmasi strukKonfirmasi ");
		buffer.append(" where strukKonfirmasi.noRec=:noRec ");
		Query query = em.createQuery(buffer.toString());

		if (CommonUtil.isNotNullOrEmpty(noRec)) {
			query.setParameter("noRec", noRec);
		}
		
		List<Map<String, Object>> list = query.getResultList();
		
		return list;
	}

	/*@Override
	public int listPenerimaanCount(String tanggalAwal, String tanggalAhir, Ruangan ruangan) {
		
		StringBuffer buffer = new StringBuffer();
		buffer.append(" select count(strukRetur.noRetur) ");
		buffer.append(" from KirimProduk kirimProduk ");
		buffer.append(" left join kirimProduk.noKirim strukKirim ");
		buffer.append(" left join kirimProduk.noRetur strukRetur ");
		buffer.append(" left join strukKirim.kdruanganasal as ruanganAsal ");
		buffer.append(" left join strukKirim.kdruangantujuan as ruanganTujuan ");
		buffer.append(" where strukRetur is not null ");
		
		if (CommonUtil.isNotNullOrEmpty(tanggalAwal) && CommonUtil.isNotNullOrEmpty(tanggalAhir)) {
			buffer.append("and date(strukRetur.tglRetur) between :tanggalAwal and :tanggalAhir ");
		}
		
		if (CommonUtil.isNotNullOrEmpty(ruangan)) {
			buffer.append("and ruanganTujuan.id=:ruanganId ");
		}
		
		
		Query query = em.createQuery(buffer.toString());
		if (CommonUtil.isNotNullOrEmpty(tanggalAwal) && CommonUtil.isNotNullOrEmpty(tanggalAhir)) {
			query.setParameter("tanggalAwal", DateUtil.toDate(tanggalAwal));
			query.setParameter("tanggalAhir", DateUtil.toDate(tanggalAhir));
		}
		
		if(CommonUtil.isNotNullOrEmpty(ruangan)){
			query.setParameter("ruanganId", ruangan.getId());
		}
			

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

	@Override
	public List<Map<String, Object>> listPenerimaan(int rowStart, int rowEnd, String sort, String dir,String tanggalAwal, String tanggalAhir, Ruangan ruangan) {
		StringBuffer buffer = new StringBuffer();
		buffer.append(" select new map("
				+ "strukRetur.noRec as noRec,"
				+ "strukRetur.noRetur as noRetur,"
				+ "strukRetur.tglRetur as tanggalRetur,"
				+ "ruanganAsal.namaRuangan as ruanganAsal,"
				+ "ruanganTujuan.namaRuangan as ruanganTujuan) ");
		buffer.append(" from KirimProduk kirimProduk ");
		buffer.append(" left join kirimProduk.noKirim strukKirim ");
		buffer.append(" left join kirimProduk.noRetur strukRetur ");
		buffer.append(" left join strukKirim.kdruanganasal as ruanganAsal ");
		buffer.append(" left join strukKirim.kdruangantujuan as ruanganTujuan ");
		buffer.append(" where strukRetur is not null ");
		
		if (CommonUtil.isNotNullOrEmpty(tanggalAwal) && CommonUtil.isNotNullOrEmpty(tanggalAhir)) {
			buffer.append("and date(strukRetur.tglRetur) between :tanggalAwal and :tanggalAhir ");
		}
		
		if (CommonUtil.isNotNullOrEmpty(ruangan)) {
			buffer.append("and ruanganTujuan.id=:ruanganId ");
		}
		buffer.append(" group by strukRetur.noRec,"
				+ "strukRetur.noRetur,"
				+ "strukRetur.tglRetur,"
				+ "ruanganAsal.namaRuangan,"
				+ "ruanganTujuan.namaRuangan");
		
		Query query = em.createQuery(buffer.toString());
		if (CommonUtil.isNotNullOrEmpty(tanggalAwal) && CommonUtil.isNotNullOrEmpty(tanggalAhir)) {
			query.setParameter("tanggalAwal", DateUtil.toDate(tanggalAwal));
			query.setParameter("tanggalAhir", DateUtil.toDate(tanggalAhir));
		}
		
		if(CommonUtil.isNotNullOrEmpty(ruangan)){
			query.setParameter("ruanganId", ruangan.getId());
		}
			

		query.setFirstResult(rowStart);
		query.setMaxResults(rowEnd);

		List<Map<String, Object>> list = query.getResultList();
		
		return list;
	}*/

	@Override
	public int listPengirimanCount(String tanggalAwal, String tanggalAhir, Ruangan ruangan,Integer kelompokProdukId,Integer jenisProdukId,Integer produkId) {
		StringBuffer buffer = new StringBuffer();
		buffer.append(" select count(kirimProduk.noRec) ");
		buffer.append(" from KirimProduk kirimProduk ");
		buffer.append(" left join kirimProduk.noKirim strukKirim ");
		buffer.append(" left join kirimProduk.asalProduk asalProduk ");
		buffer.append(" left join kirimProduk.noRetur strukRetur ");
		buffer.append(" left join kirimProduk.kirimProduk  kirimProdukParent ");
		buffer.append(" left join kirimProdukParent.produk produk ");
		buffer.append(" left join kirimProduk.satuanStandar  satuanStandar ");
		buffer.append(" left join strukKirim.kdruanganasal  ruanganAsal ");
		buffer.append(" left join strukKirim.kdruangantujuan  ruanganTujuan ");
		buffer.append(" left join strukRetur.pegawai pegawai ");
		buffer.append(" left join produk.detailJenisProduk detailJenisProduk ");
		buffer.append(" left join detailJenisProduk.jenisProduk jenisProduk ");
		buffer.append(" left join jenisProduk.kelompokProduk kelompokProduk ");
		buffer.append("  where strukRetur is not null ");
		
		if (CommonUtil.isNotNullOrEmpty(tanggalAwal) && CommonUtil.isNotNullOrEmpty(tanggalAhir)) {
			buffer.append("and date(strukRetur.tglRetur) between :tanggalAwal and :tanggalAhir ");
		}
		
		if (CommonUtil.isNotNullOrEmpty(kelompokProdukId)) {
			buffer.append("and kelompokProduk.id=:kelompokProdukId ");
		}
		
		if (CommonUtil.isNotNullOrEmpty(jenisProdukId)) {
			buffer.append("and jenisProduk.id=:jenisProdukId ");
		}
		
		if (CommonUtil.isNotNullOrEmpty(produkId)) {
			buffer.append("and produk.id=:produkId ");
		}
		
		if (CommonUtil.isNotNullOrEmpty(ruangan)) {
			buffer.append("and ruanganAsal.id=:ruanganId ");
		}
		
		
		Query query = em.createQuery(buffer.toString());
		if (CommonUtil.isNotNullOrEmpty(tanggalAwal) && CommonUtil.isNotNullOrEmpty(tanggalAhir)) {
			query.setParameter("tanggalAwal", DateUtil.toDate(tanggalAwal));
			query.setParameter("tanggalAhir", DateUtil.toDate(tanggalAhir));
		}
		
		if(CommonUtil.isNotNullOrEmpty(ruangan)){
			query.setParameter("ruanganId", ruangan.getId());
		}
		if (CommonUtil.isNotNullOrEmpty(kelompokProdukId)) {
			query.setParameter("kelompokProdukId", kelompokProdukId);
		}
		
		if (CommonUtil.isNotNullOrEmpty(jenisProdukId)) {
			query.setParameter("jenisProdukId", jenisProdukId);
		}
		
		if (CommonUtil.isNotNullOrEmpty(produkId)) {
			query.setParameter("produkId", produkId);
		}
			

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

	@Override
	public List<Map<String, Object>> listPengiriman(int rowStart, int rowEnd, String sort, String dir,String tanggalAwal, String tanggalAhir, Ruangan ruangan,Integer kelompokProdukId,Integer jenisProdukId,Integer produkId) {
		StringBuffer buffer = new StringBuffer();
		buffer.append(" select ");
		buffer.append(" new map(produk.namaProduk as namaProduk, ");
		buffer.append(" kirimProduk.qtyProdukKonfirmasiKonversi as saldo, ");
		buffer.append(" kirimProduk.qtyProdukRetur as qtyProdukRetur, ");
		buffer.append(" satuanStandar.satuanStandar as satuanStandar, ");
		buffer.append(" strukRetur.noRetur as noRetur, ");
		buffer.append(" asalProduk.asalProduk as asalProduk, ");
		buffer.append(" kirimProduk.hargaSatuan as hargaSatuan, ");
		buffer.append(" strukRetur.tglRetur as tanggalRetur, ");
		buffer.append(" ruanganAsal.namaRuangan as ruanganAsal, ");
		buffer.append(" ruanganTujuan.namaRuangan as ruanganTujuan, ");
		buffer.append(" pegawai.namaLengkap as pegawai ) ");
		buffer.append(" from KirimProduk kirimProduk ");
		buffer.append(" left join kirimProduk.noKirim strukKirim ");
		buffer.append(" left join kirimProduk.asalProduk asalProduk ");
		buffer.append(" left join kirimProduk.noRetur strukRetur ");
		buffer.append(" left join kirimProduk.kirimProduk  kirimProdukParent ");
		buffer.append(" left join kirimProdukParent.produk produk ");
		buffer.append(" left join kirimProduk.satuanStandar  satuanStandar ");
		buffer.append(" left join strukKirim.kdruanganasal  ruanganAsal ");
		buffer.append(" left join strukKirim.kdruangantujuan  ruanganTujuan ");
		buffer.append(" left join strukRetur.pegawai pegawai ");
		buffer.append(" left join produk.detailJenisProduk detailJenisProduk ");
		buffer.append(" left join detailJenisProduk.jenisProduk jenisProduk ");
		buffer.append(" left join jenisProduk.kelompokProduk kelompokProduk ");
		buffer.append("  where strukRetur is not null ");
		
		if (CommonUtil.isNotNullOrEmpty(tanggalAwal) && CommonUtil.isNotNullOrEmpty(tanggalAhir)) {
			buffer.append("and date(strukRetur.tglRetur) between :tanggalAwal and :tanggalAhir ");
		}
		
		if (CommonUtil.isNotNullOrEmpty(kelompokProdukId)) {
			buffer.append("and kelompokProduk.id=:kelompokProdukId ");
		}
		
		if (CommonUtil.isNotNullOrEmpty(jenisProdukId)) {
			buffer.append("and jenisProduk.id=:jenisProdukId ");
		}
		
		if (CommonUtil.isNotNullOrEmpty(produkId)) {
			buffer.append("and produk.id=:produkId ");
		}
		
		if (CommonUtil.isNotNullOrEmpty(ruangan)) {
			buffer.append("and ruanganAsal.id=:ruanganId ");
		}
		buffer.append(" order by strukRetur.noRetur desc ");
		
		Query query = em.createQuery(buffer.toString());
		if (CommonUtil.isNotNullOrEmpty(tanggalAwal) && CommonUtil.isNotNullOrEmpty(tanggalAhir)) {
			query.setParameter("tanggalAwal", DateUtil.toDate(tanggalAwal));
			query.setParameter("tanggalAhir", DateUtil.toDate(tanggalAhir));
		}
		
		if(CommonUtil.isNotNullOrEmpty(ruangan)){
			query.setParameter("ruanganId", ruangan.getId());
		}
		if (CommonUtil.isNotNullOrEmpty(kelompokProdukId)) {
			query.setParameter("kelompokProdukId", kelompokProdukId);
		}
		
		if (CommonUtil.isNotNullOrEmpty(jenisProdukId)) {
			query.setParameter("jenisProdukId", jenisProdukId);
		}
		
		if (CommonUtil.isNotNullOrEmpty(produkId)) {
			query.setParameter("produkId", produkId);
		}
			

		query.setFirstResult(rowStart);
		query.setMaxResults(rowEnd);

		List<Map<String, Object>> list = query.getResultList();
		
		return list;
	}

	@Override
	public Map<String, Object> findReturHeader(String noRec) {
		StringBuffer buffer = new StringBuffer();
		buffer.append(" select ");
		buffer.append(" new map( ");
		buffer.append(" strukRetur.noRetur as noRetur,");
		buffer.append(" strukRetur.tglRetur as tanggalRetur, ");
		buffer.append(" ruanganAsal.namaRuangan as ruanganAsal, ");
		buffer.append(" ruanganTujuan.namaRuangan as ruanganTujuan,noKonfirmasi.noKonfirmasi as noTerima, ");
		buffer.append(" pegawai.namaLengkap as pegawai ) ");
		buffer.append(" from KirimProduk kirimProduk ");
		buffer.append(" left join kirimProduk.noKirim strukKirim ");
		buffer.append(" left join kirimProduk.asalProduk asalProduk ");
		buffer.append(" left join kirimProduk.noRetur strukRetur ");
		buffer.append(" left join kirimProduk.noKonfirmasi strukKonfirmasi ");
		buffer.append(" left join kirimProduk.kirimProduk  kirimProdukParent ");
		buffer.append(" left join kirimProdukParent.produk produk ");
		buffer.append(" left join kirimProduk.satuanStandar  satuanStandar ");
		buffer.append(" left join strukKirim.kdruanganasal  ruanganAsal ");
		buffer.append(" left join strukKirim.kdruangantujuan  ruanganTujuan ");
		buffer.append(" left join strukRetur.pegawai pegawai ");
		buffer.append(" left join produk.detailJenisProduk detailJenisProduk ");
		buffer.append(" left join detailJenisProduk.jenisProduk jenisProduk ");
		buffer.append(" left join jenisProduk.kelompokProduk kelompokProduk  left join kirimProduk.kirimProduk kirimProdukHead left join kirimProdukHead.noKonfirmasi noKonfirmasi ");
		buffer.append("  where strukRetur.noRec=:noRec ");
		
		Query query = em.createQuery(buffer.toString());
		query.setParameter("noRec", noRec);
		
		Map<String, Object> list = (Map<String, Object>) query.getSingleResult();
		
		return list;
	}

	@Override
	public List<Map<String, Object>> findReturDetail(String noRec) {
		StringBuffer buffer = new StringBuffer();
		buffer.append(" select ");
		buffer.append(" new map(produk.namaProduk as namaProduk, ");
		buffer.append(" kirimProduk.qtyProdukRetur as qtyProdukRetur, ");
		buffer.append(" satuanStandar.satuanStandar as satuanStandar, ");
		buffer.append(" strukRetur.noRetur as noRetur, ");
		buffer.append(" kirimProduk.hargaSatuan as hargaSatuan, ");
		buffer.append(" strukRetur.tglRetur as tanggalRetur, ");
		buffer.append(" ruanganAsal.namaRuangan as ruanganAsal, ");
		buffer.append(" ruanganTujuan.namaRuangan as ruanganTujuan,ruanganTujuan.id as idRuangan,produk.satuanStandarId as satuanAwal,satuanStandar.id as satuanAhir,produk.id as produkId, ");
		buffer.append(" kirimProduk.noRec as noRec, ");
		buffer.append(" pegawai.namaLengkap as pegawai ) ");
		buffer.append(" from KirimProduk kirimProduk ");
		buffer.append(" left join kirimProduk.noKirim strukKirim ");
		buffer.append(" left join kirimProduk.asalProduk asalProduk ");
		buffer.append(" left join kirimProduk.noRetur strukRetur ");
		buffer.append(" left join kirimProduk.kirimProduk  kirimProdukParent ");
		buffer.append(" left join kirimProdukParent.produk produk ");
		buffer.append(" left join kirimProduk.satuanStandar  satuanStandar ");
		buffer.append(" left join strukKirim.kdruanganasal  ruanganAsal ");
		buffer.append(" left join strukKirim.kdruangantujuan  ruanganTujuan ");
		buffer.append(" left join strukRetur.pegawai pegawai ");
		buffer.append(" left join produk.detailJenisProduk detailJenisProduk ");
		buffer.append(" left join detailJenisProduk.jenisProduk jenisProduk ");
		buffer.append(" left join jenisProduk.kelompokProduk kelompokProduk ");
		buffer.append("  where strukRetur.noRec=:noRec ");
		
		Query query = em.createQuery(buffer.toString());
		query.setParameter("noRec", noRec);
		
		List<Map<String, Object>> list = query.getResultList();
		
		return list;
	}


	@Override
	public int listPenerimaanCountSupplier(String tanggalAwal, String tanggalAhir, Integer produkId,Integer ruanganId,Integer kelompokTansaksiId,Integer jenisProdukId,Integer kelompokProdukId,String noTerima) {
		StringBuffer buffer = new StringBuffer();
		buffer.append(" select count(strukPelayanan.noRec) ");
		buffer.append(" From StrukPelayananDetail detail  ");
		buffer.append(" left join detail.kdasalproduk asalProduk  ");
		buffer.append(" left join detail.nostruk strukPelayanan  ");
		buffer.append(" left join strukPelayanan.kdruangan ruangan ");
		buffer.append(" left join strukPelayanan.kdrekanan rekanan ");
		buffer.append(" left join strukPelayanan.kdkelompoktransaksi kelompokTransaksi ");
		buffer.append(" left join detail.kdproduk produk ");
		buffer.append(" left join produk.detailJenisProduk detailJenisProduk ");
		buffer.append(" left join detailJenisProduk.jenisProduk jenisProduk ");
		buffer.append(" left join jenisProduk.kelompokProduk kelompokProduk ");
		buffer.append(" where kelompokTransaksi.id=:kelompokTansaksiId  ");
		
		if (CommonUtil.isNotNullOrEmpty(tanggalAwal) && CommonUtil.isNotNullOrEmpty(tanggalAhir)) {
			buffer.append("and date(strukPelayanan.tglstruk) between :tanggalAwal and :tanggalAhir ");
		}
		
		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 ");
		}
		
		if (CommonUtil.isNotNullOrEmpty(noTerima) ) {
			buffer.append("and strukPelayanan.nostruk like :noTerima ");
		}
		
		if (CommonUtil.isNotNullOrEmpty(ruanganId) ) {
			buffer.append("and ruangan.id=:ruanganId ");
		}
	
		Query query = em.createQuery(buffer.toString());
		if (CommonUtil.isNotNullOrEmpty(tanggalAwal) && CommonUtil.isNotNullOrEmpty(tanggalAhir)) {
			query.setParameter("tanggalAwal", DateUtil.toDate(tanggalAwal));
			query.setParameter("tanggalAhir", DateUtil.toDate(tanggalAhir));
		}
		if (CommonUtil.isNotNullOrEmpty(produkId)) {
			query.setParameter("produkId", produkId);
		}

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

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

	@Override
	public List<Map<String, Object>> listPenerimaanSupplier(int rowStart, int rowEnd, String sort, String dir,String tanggalAwal, String tanggalAhir, Integer produkId,Integer ruanganId,Integer kelompokTansaksiId,Integer jenisProdukId,Integer kelompokProdukId,String noTerima) {

		StringBuffer buffer = new StringBuffer();
		buffer.append(" select new map (strukPelayanan.nostruk as noTerima,strukPelayanan.noRec as noRec, ");
		buffer.append(" rekanan.namaRekanan as namaRekanan, ");
		buffer.append(" ruangan.namaRuangan as namaRuangan, ");
		buffer.append(" strukPelayanan.tglstruk as tanggal) ");
		buffer.append(" From StrukPelayananDetail detail  ");
		buffer.append(" left join detail.kdasalproduk asalProduk  ");
		buffer.append(" left join detail.nostruk strukPelayanan  ");
		buffer.append(" left join strukPelayanan.kdruangan ruangan ");
		buffer.append(" left join strukPelayanan.kdrekanan rekanan ");
		buffer.append(" left join strukPelayanan.kdkelompoktransaksi kelompokTransaksi ");
		buffer.append(" left join detail.kdproduk produk ");
		buffer.append(" left join produk.detailJenisProduk detailJenisProduk ");
		buffer.append(" left join detailJenisProduk.jenisProduk jenisProduk ");
		buffer.append(" left join jenisProduk.kelompokProduk kelompokProduk ");
		buffer.append(" where kelompokTransaksi.id=:kelompokTansaksiId  ");
		
		if (CommonUtil.isNotNullOrEmpty(tanggalAwal) && CommonUtil.isNotNullOrEmpty(tanggalAhir)) {
			buffer.append("and date(strukPelayanan.tglstruk) between :tanggalAwal and :tanggalAhir ");
		}
		
		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 ");
		}
		
		if (CommonUtil.isNotNullOrEmpty(noTerima) ) {
			buffer.append("and strukPelayanan.nostruk like :noTerima ");
		}
		
		if (CommonUtil.isNotNullOrEmpty(ruanganId) ) {
			buffer.append("and ruangan.id=:ruanganId ");
		}
		
		buffer.append(" group by strukPelayanan.nostruk,strukPelayanan.noRec,rekanan.namaRekanan,ruangan.namaRuangan order by strukPelayanan.tglstruk desc ");
		Query query = em.createQuery(buffer.toString());
		if (CommonUtil.isNotNullOrEmpty(tanggalAwal) && CommonUtil.isNotNullOrEmpty(tanggalAhir)) {
			query.setParameter("tanggalAwal", DateUtil.toDate(tanggalAwal));
			query.setParameter("tanggalAhir", DateUtil.toDate(tanggalAhir));
		}
		if (CommonUtil.isNotNullOrEmpty(produkId)) {
			query.setParameter("produkId", produkId);
		}

		if (CommonUtil.isNotNullOrEmpty(ruanganId)) {
			query.setParameter("ruanganId", ruanganId);
		}
		
		if (CommonUtil.isNotNullOrEmpty(jenisProdukId) ) {
			query.setParameter("jenisProdukId", jenisProdukId);
		}
		
		if (CommonUtil.isNotNullOrEmpty(kelompokProdukId) ) {
			query.setParameter("kelompokProdukId", kelompokProdukId);
		}
		
		if (CommonUtil.isNotNullOrEmpty(noTerima) ) {
			query.setParameter("noTerima","%"+ noTerima+"%");
		}
		query.setParameter("kelompokTansaksiId", kelompokTansaksiId);	
		query.setFirstResult(rowStart);
		query.setMaxResults(rowEnd);

		List<Map<String, Object>> list = query.getResultList();
		
		return list;
	
	}
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	@Override
	public int listPemakaianBarangHabisPakaiCount(String tanggalAwal, String tanggalAhir,Integer kelompokProdukId,Integer jenisProdukId,Integer produkId,Integer ruanganId,Integer kelompokTransaksiId) {
		StringBuffer buffer = new StringBuffer();
		buffer.append(" select count(produk.id) from StrukPelayananDetail strukPelayananDetail ");
		buffer.append(" left join strukPelayananDetail.nostruk strukPelayanan");
		buffer.append(" left join strukPelayanan.kdkelompoktransaksi kelompokTransaksi");
		buffer.append(" left join strukPelayananDetail.kdproduk produk");
		buffer.append(" left join produk.detailJenisProduk detailJenisProduk");
		buffer.append(" left join detailJenisProduk.jenisProduk jenisProduk");
		buffer.append(" left join strukPelayanan.kdruangan ruangan left join strukPelayananDetail.kdsatuanstandar satuanStandar " );
		buffer.append(" left join jenisProduk.kelompokProduk kelompokProduk where produk is not null ");
		if(CommonUtil.isNotNullOrEmpty(ruanganId)){
			buffer.append(" and ruangan.id=:ruanganId ");
		}
		if(CommonUtil.isNotNullOrEmpty(kelompokProdukId)){
			buffer.append(" and kelompokProduk.id=:kelompokProdukId ");
		}
		if(CommonUtil.isNotNullOrEmpty(kelompokTransaksiId)){
			buffer.append(" and kelompokTransaksi.id=:kelompokTransaksiId ");
		}
		if(CommonUtil.isNotNullOrEmpty(jenisProdukId)){
			buffer.append(" and jenisProduk.id=:jenisProdukId ");
		}
		if(CommonUtil.isNotNullOrEmpty(produkId)){
			buffer.append(" and produk.id=:produkId ");
		}
		if (CommonUtil.isNotNullOrEmpty(tanggalAwal) && CommonUtil.isNotNullOrEmpty(tanggalAhir)) {
			buffer.append(" and strukPelayanan.tglstruk between :tanggalAwal and :tanggalAhir");
		}
		Query query = em.createQuery(buffer.toString());
		
		if(CommonUtil.isNotNullOrEmpty(ruanganId)){
			query.setParameter("ruanganId", ruanganId);	
		}
		if(CommonUtil.isNotNullOrEmpty(kelompokProdukId)){
			query.setParameter("kelompokProdukId", kelompokProdukId);
		}
		if(CommonUtil.isNotNullOrEmpty(kelompokTransaksiId)){
			query.setParameter("kelompokTransaksiId", kelompokTransaksiId);
		}
		if(CommonUtil.isNotNullOrEmpty(jenisProdukId)){
			query.setParameter("jenisProdukId", jenisProdukId);
		}
		if(CommonUtil.isNotNullOrEmpty(produkId)){
			query.setParameter("produkId", produkId);
		}
		
		if (CommonUtil.isNotNullOrEmpty(tanggalAwal) && CommonUtil.isNotNullOrEmpty(tanggalAhir)) {
			query.setParameter("tanggalAwal", DateUtil.toDate(tanggalAwal));
			query.setParameter("tanggalAhir", DateUtil.toDate(tanggalAhir));
		}
		return ((Long) query.getSingleResult()).intValue();
	}

	@Override
	public List<Map<String, Object>> listPemakaianBarangHabisPakai(int rowStart, int rowEnd, String sort, String dir,String tanggalAwal, String tanggalAhir,Integer kelompokProdukId,Integer jenisProdukId,Integer produkId,Integer ruanganId,Integer kelompokTransaksiId) {

		StringBuffer buffer = new StringBuffer();
		buffer.append(" select new map(produk.namaProduk as namaProduk,satuanStandar.satuanStandar as satuanStandar,strukPelayananDetail.qtyproduk as qtyProduk,coalesce(strukPelayanan.keteranganlainnya,'-') as keterangan) from StrukPelayananDetail strukPelayananDetail ");
		buffer.append(" left join strukPelayananDetail.nostruk strukPelayanan");
		buffer.append(" left join strukPelayanan.kdkelompoktransaksi kelompokTransaksi");
		buffer.append(" left join strukPelayananDetail.kdproduk produk");
		buffer.append(" left join produk.detailJenisProduk detailJenisProduk");
		buffer.append(" left join detailJenisProduk.jenisProduk jenisProduk");
		buffer.append(" left join strukPelayanan.kdruangan ruangan left join strukPelayananDetail.kdsatuanstandar satuanStandar");
		buffer.append(" left join jenisProduk.kelompokProduk kelompokProduk where produk is not null ");
		if(CommonUtil.isNotNullOrEmpty(ruanganId)){
			buffer.append(" and ruangan.id=:ruanganId ");
		}
		if(CommonUtil.isNotNullOrEmpty(kelompokProdukId)){
			buffer.append(" and kelompokProduk.id=:kelompokProdukId ");
		}
		if(CommonUtil.isNotNullOrEmpty(kelompokTransaksiId)){
			buffer.append(" and kelompokTransaksi.id=:kelompokTransaksiId ");
		}
		if(CommonUtil.isNotNullOrEmpty(jenisProdukId)){
			buffer.append(" and jenisProduk.id=:jenisProdukId ");
		}
		if(CommonUtil.isNotNullOrEmpty(produkId)){
			buffer.append(" and produk.id=:produkId ");
		}
		if (CommonUtil.isNotNullOrEmpty(tanggalAwal) && CommonUtil.isNotNullOrEmpty(tanggalAhir)) {
			buffer.append(" and strukPelayanan.tglstruk between :tanggalAwal and :tanggalAhir");
		}
		Query query = em.createQuery(buffer.toString());
		
		if(CommonUtil.isNotNullOrEmpty(ruanganId)){
			query.setParameter("ruanganId", ruanganId);	
		}
		if(CommonUtil.isNotNullOrEmpty(kelompokProdukId)){
			query.setParameter("kelompokProdukId", kelompokProdukId);
		}
		if(CommonUtil.isNotNullOrEmpty(kelompokTransaksiId)){
			query.setParameter("kelompokTransaksiId", kelompokTransaksiId);
		}
		if(CommonUtil.isNotNullOrEmpty(jenisProdukId)){
			query.setParameter("jenisProdukId", jenisProdukId);
		}
		if(CommonUtil.isNotNullOrEmpty(produkId)){
			query.setParameter("produkId", produkId);
		}
		
		if (CommonUtil.isNotNullOrEmpty(tanggalAwal) && CommonUtil.isNotNullOrEmpty(tanggalAhir)) {
			query.setParameter("tanggalAwal", DateUtil.toDate(tanggalAwal));
			query.setParameter("tanggalAhir", DateUtil.toDate(tanggalAhir));
		}

		List<Map<String, Object>> list = query.getResultList();
		
		return list;
	
	}

	@Override
	public Map<String, Object> findPenerimaanHeaderByNoRec(String noRec) {
		StringBuffer buffer = new StringBuffer();
		buffer.append(" select new map(strukPelayanan.tglstruk as tanggal,strukPelayanan.nofaktur as noFaktur,strukPelayanan.nostruk as noTerima,rekanan.namaRekanan as namaSupplier) from StrukPelayananDetail strukPelayananDetail ");
		buffer.append(" left join strukPelayananDetail.nostruk strukPelayanan ");
		buffer.append(" left join strukPelayananDetail.kdsatuanstandar satuanStandar ");
		buffer.append(" left join strukPelayananDetail.kdproduk produk ");
		buffer.append(" left join produk.detailJenisProduk detailJenisProduk ");
		buffer.append(" left join detailJenisProduk.jenisProduk jenisProduk  ");
		buffer.append(" left join jenisProduk.kelompokProduk kelompokProduk left join strukPelayanan.kdrekanan rekanan ");
		buffer.append(" left join strukPelayananDetail.kdasalproduk asalProduk where strukPelayanan.noRec=:noRec ");
		Query query = em.createQuery(buffer.toString());
		
		query.setParameter("noRec", noRec);	

		Map<String, Object> list = (Map<String, Object>) query.getSingleResult();
		
		return list;
	}

	@Override
	public List<Map<String, Object>> findPenerimaanDetailByNoRec(String noRec) {
		StringBuffer buffer = new StringBuffer();
		buffer.append(" select new map(satuanStandar.satuanStandar as satuanStandar,produk.satuanStandarId as satuanAwal,satuanStandar.id as satuanAhirId,produk.namaProduk as namaProduk,asalProduk.asalProduk as asalProduk,strukPelayananDetail.noRec as noRecDetail, ");
		buffer.append(" strukPelayananDetail.hargasatuan as hargaSatuan,strukPelayananDetail.qtyproduk as qtyProduk) from StrukPelayananDetail strukPelayananDetail ");
		buffer.append(" left join strukPelayananDetail.nostruk strukPelayanan ");
		buffer.append(" left join strukPelayananDetail.kdsatuanstandar satuanStandar ");
		buffer.append(" left join strukPelayananDetail.kdproduk produk ");
		buffer.append(" left join produk.detailJenisProduk detailJenisProduk ");
		buffer.append(" left join detailJenisProduk.jenisProduk jenisProduk  ");
		buffer.append(" left join jenisProduk.kelompokProduk kelompokProduk left join strukPelayanan.kdrekanan rekanan ");
		buffer.append(" left join strukPelayananDetail.kdasalproduk asalProduk where strukPelayanan.noRec=:noRec and strukPelayananDetail.noretur is null ");
		Query query = em.createQuery(buffer.toString());
		
		query.setParameter("noRec", noRec);	

		List<Map<String, Object>> list = query.getResultList();
		
		return list;
	}

	@Override
	public List<Map<String, Object>> listReturSupplierList(int rowStart, int rowEnd, String sort, String dir,
			String tanggalAwal, String tanggalAhir, Integer produkId, Integer jenisProdukId, Integer kelompokProdukId,
			Integer supplierId,Integer kelompokTransaksiId) {
		StringBuffer buffer = new StringBuffer();
		buffer.append(" select new Map( strukRetur.noRec as noRetur,strukPelayananDetail.hargasatuan as hargaSatuan,asalProduk.asalProduk as asalProduk,pegawai.namaLengkap as namaPegawai, produk.namaProduk as namaProduk,satuanStandar.satuanStandar as satuanStandar,strukPelayananDetail.qtyproduk as qtyProduk,coalesce(strukPelayanan.keteranganlainnya,'-') as keterangan )from StrukPelayananDetail strukPelayananDetail ");
		buffer.append(" left join strukPelayananDetail.nostruk strukPelayanan ");
		buffer.append(" right join strukPelayananDetail.noretur strukRetur ");
		buffer.append(" left join strukRetur.kelompokTransaksi kelompokTransaksi ");
		buffer.append(" left join strukPelayananDetail.kdproduk produk ");
		buffer.append(" left join produk.detailJenisProduk detailJenisProduk ");
		buffer.append(" left join detailJenisProduk.jenisProduk jenisProduk ");
		buffer.append(" left join jenisProduk.kelompokProduk kelompokProduk ");
		buffer.append(" left join strukPelayanan.kdruangan ruangan  ");
		buffer.append(" left join strukPelayananDetail.kdasalproduk asalProduk ");
		buffer.append(" left join strukPelayananDetail.kdsatuanstandar satuanStandar ");
		buffer.append(" left join strukRetur.pegawai pegawai ");
		buffer.append(" left join jenisProduk.kelompokProduk kelompokProduk where strukRetur is not null ");
		
		if(CommonUtil.isNotNullOrEmpty(kelompokProdukId)){
			buffer.append(" and kelompokProduk.id=:kelompokProdukId ");
		}
		if(CommonUtil.isNotNullOrEmpty(kelompokTransaksiId)){
			buffer.append(" and kelompokTransaksi.id=:kelompokTransaksiId ");
		}
		if(CommonUtil.isNotNullOrEmpty(jenisProdukId)){
			buffer.append(" and jenisProduk.id=:jenisProdukId ");
		}
		if(CommonUtil.isNotNullOrEmpty(produkId)){
			buffer.append(" and produk.id=:produkId ");
		}
		if(CommonUtil.isNotNullOrEmpty(supplierId)){
			buffer.append(" and strukPelayanan.kdrekanan.id=:supplierId ");
		}
		if (CommonUtil.isNotNullOrEmpty(tanggalAwal) && CommonUtil.isNotNullOrEmpty(tanggalAhir)) {
			buffer.append(" and strukPelayanan.tglRetur between :tanggalAwal and :tanggalAhir");
		}
		Query query = em.createQuery(buffer.toString());
		
		if(CommonUtil.isNotNullOrEmpty(kelompokProdukId)){
			query.setParameter("kelompokProdukId", kelompokProdukId);
		}
		if(CommonUtil.isNotNullOrEmpty(kelompokTransaksiId)){
			query.setParameter("kelompokTransaksiId", kelompokTransaksiId);
		}
		if(CommonUtil.isNotNullOrEmpty(jenisProdukId)){
			query.setParameter("jenisProdukId", jenisProdukId);
		}
		if(CommonUtil.isNotNullOrEmpty(produkId)){
			query.setParameter("produkId", produkId);
		}
		if(CommonUtil.isNotNullOrEmpty(supplierId)){
			query.setParameter("supplierId", supplierId);
		}
		
		if (CommonUtil.isNotNullOrEmpty(tanggalAwal) && CommonUtil.isNotNullOrEmpty(tanggalAhir)) {
			query.setParameter("tanggalAwal", DateUtil.toDate(tanggalAwal));
			query.setParameter("tanggalAhir", DateUtil.toDate(tanggalAhir));
		}
		List<Map<String, Object>> list = query.getResultList();
		
		return list;
	}

	@Override
	public int listReturSupplierCount(String tanggalAwal, String tanggalAhir, Integer produkId, Integer jenisProdukId,
			Integer kelompokProdukId, Integer supplierId,Integer kelompokTransaksiId) {
		StringBuffer buffer = new StringBuffer();
		buffer.append(" select count(strukRetur.noRec) from StrukPelayananDetail strukPelayananDetail ");
		buffer.append(" left join strukPelayananDetail.nostruk strukPelayanan ");
		buffer.append(" right join strukPelayananDetail.noretur strukRetur ");
		buffer.append(" left join strukRetur.kelompokTransaksi kelompokTransaksi ");
		buffer.append(" left join strukPelayananDetail.kdproduk produk ");
		buffer.append(" left join produk.detailJenisProduk detailJenisProduk ");
		buffer.append(" left join detailJenisProduk.jenisProduk jenisProduk ");
		buffer.append(" left join jenisProduk.kelompokProduk kelompokProduk ");
		buffer.append(" left join strukPelayanan.kdruangan ruangan  ");
		buffer.append(" left join strukPelayananDetail.kdasalproduk asalProduk ");
		buffer.append(" left join strukPelayananDetail.kdsatuanstandar satuanStandar ");
		buffer.append(" left join strukRetur.pegawai pegawai ");
		buffer.append(" left join jenisProduk.kelompokProduk kelompokProduk where strukRetur is not null ");
		
		if(CommonUtil.isNotNullOrEmpty(kelompokProdukId)){
			buffer.append(" and kelompokProduk.id=:kelompokProdukId ");
		}
		if(CommonUtil.isNotNullOrEmpty(jenisProdukId)){
			buffer.append(" and jenisProduk.id=:jenisProdukId ");
		}
		if(CommonUtil.isNotNullOrEmpty(produkId)){
			buffer.append(" and produk.id=:produkId ");
		}
		if(CommonUtil.isNotNullOrEmpty(supplierId)){
			buffer.append(" and strukPelayanan.kdrekanan.id=:supplierId ");
		}
		if (CommonUtil.isNotNullOrEmpty(tanggalAwal) && CommonUtil.isNotNullOrEmpty(tanggalAhir)) {
			buffer.append(" and strukPelayanan.tglRetur between :tanggalAwal and :tanggalAhir");
		}
		if(CommonUtil.isNotNullOrEmpty(kelompokTransaksiId)){
			buffer.append(" and kelompokTransaksi.id=:kelompokTransaksiId ");
		}
		Query query = em.createQuery(buffer.toString());
		
		if(CommonUtil.isNotNullOrEmpty(kelompokProdukId)){
			query.setParameter("kelompokProdukId", kelompokProdukId);
		}
		if(CommonUtil.isNotNullOrEmpty(jenisProdukId)){
			query.setParameter("jenisProdukId", jenisProdukId);
		}
		if(CommonUtil.isNotNullOrEmpty(produkId)){
			query.setParameter("produkId", produkId);
		}
		if(CommonUtil.isNotNullOrEmpty(supplierId)){
			query.setParameter("supplierId", supplierId);
		}
		
		if(CommonUtil.isNotNullOrEmpty(kelompokTransaksiId)){
			query.setParameter("kelompokTransaksiId", kelompokTransaksiId);
		}
		
		if (CommonUtil.isNotNullOrEmpty(tanggalAwal) && CommonUtil.isNotNullOrEmpty(tanggalAhir)) {
			query.setParameter("tanggalAwal", DateUtil.toDate(tanggalAwal));
			query.setParameter("tanggalAhir", DateUtil.toDate(tanggalAhir));
		}
		
		return ((Long) query.getSingleResult()).intValue();
	}

	@Override
	public Double findSumRetur(String noRec) {
		StringBuffer buffer = new StringBuffer();
		buffer.append("select c.qtyproduk-(select sum(strukPelayananDetail.qtyproduk) from StrukPelayananDetail strukPelayananDetail "
				+ "left join strukPelayananDetail.strukPelayananDetail strukPelayananetaildua "
				+ "where strukPelayananetaildua.noRec=:noRec) from StrukPelayananDetail c "
				+ "where c.noRec=:noRec");
	
		Query query = em.createQuery(buffer.toString());
		
			query.setParameter("noRec", noRec);
		
		return ((Double) query.getSingleResult());
	}

	@Override
	public Map<String, Object> findStrukKirimHeaderByNoRecReport(String noRec) {
		StringBuffer buffer = new StringBuffer();
		buffer.append(" select new map('-' as noDokumen,'-' as tanggalDokumen,'-' as noSpk,'-' as tanggalSpk ,rekanan.namaRekanan as namaSupplier,strukPelayanan.nostruk as noPesanan,0.0 as diskon,0.0 as ppn,ruanganTujuan.namaRuangan as gudang,'-' as noKontrak,'-'  as  tanggalKontrak,'-' as  keterangan,asalProduk.asalProduk as sumberDana) from StrukPelayananDetail strukPelayananDetail ");
		buffer.append(" left join strukPelayananDetail.nostruk strukPelayanan left join strukPelayanan.kdruangan as ruanganTujuan ");
		buffer.append(" left join strukPelayananDetail.kdsatuanstandar satuanStandar ");
		buffer.append(" left join strukPelayananDetail.kdproduk produk ");
		buffer.append(" left join produk.detailJenisProduk detailJenisProduk ");
		buffer.append(" left join detailJenisProduk.jenisProduk jenisProduk  ");
		buffer.append(" left join jenisProduk.kelompokProduk kelompokProduk left join strukPelayanan.kdrekanan rekanan ");
		buffer.append(" left join strukPelayananDetail.kdasalproduk asalProduk where strukPelayanan.noRec=:noRec ");
		Query query = em.createQuery(buffer.toString());
		
		query.setParameter("noRec", noRec);	

		Map<String, Object> list = (Map<String, Object>) query.getSingleResult();
		
		return list;
		
	}

	@Override
	public List<Map<String, Object>> findStrukKirimDetailByNoRecReport(String noRec) {
		StringBuffer buffer = new StringBuffer();
		buffer.append(" select new map(satuanStandar.satuanStandar as satuan,produk.namaProduk as namaBarang,produk.kdProduk as kdBarang, ");
		buffer.append(" strukPelayananDetail.hargasatuan as hargaSatuan,strukPelayananDetail.hasilKonversi as banyakNya,strukPelayananDetail.hasilKonversi*strukPelayananDetail.hargasatuan as jumlahHarga) from StrukPelayananDetail strukPelayananDetail ");
		buffer.append(" left join strukPelayananDetail.nostruk strukPelayanan ");
		buffer.append(" left join strukPelayananDetail.kdsatuanstandar satuanStandar ");
		buffer.append(" left join strukPelayananDetail.kdproduk produk ");
		buffer.append(" left join produk.detailJenisProduk detailJenisProduk ");
		buffer.append(" left join detailJenisProduk.jenisProduk jenisProduk  ");
		buffer.append(" left join jenisProduk.kelompokProduk kelompokProduk left join strukPelayanan.kdrekanan rekanan ");
		buffer.append(" left join strukPelayananDetail.kdasalproduk asalProduk where strukPelayanan.noRec=:noRec and strukPelayananDetail.noretur is null ");
		Query query = em.createQuery(buffer.toString());
		
		query.setParameter("noRec", noRec);	

		List<Map<String, Object>> list = query.getResultList();
		
		return list;
	}

	@Override
	public Double totalPenerimaanSupplier(String noRec) {
		StringBuffer buffer = new StringBuffer();
		buffer.append(" select sum(strukPelayananDetail.hasilKonversi*strukPelayananDetail.hargasatuan) from StrukPelayananDetail strukPelayananDetail ");
		buffer.append(" left join strukPelayananDetail.nostruk strukPelayanan ");
		buffer.append(" left join strukPelayananDetail.kdsatuanstandar satuanStandar ");
		buffer.append(" left join strukPelayananDetail.kdproduk produk ");
		buffer.append(" left join produk.detailJenisProduk detailJenisProduk ");
		buffer.append(" left join detailJenisProduk.jenisProduk jenisProduk  ");
		buffer.append(" left join jenisProduk.kelompokProduk kelompokProduk left join strukPelayanan.kdrekanan rekanan ");
		buffer.append(" left join strukPelayananDetail.kdasalproduk asalProduk where strukPelayanan.noRec=:noRec and strukPelayananDetail.noretur is null ");
		Query query = em.createQuery(buffer.toString());
		
		query.setParameter("noRec", noRec);	

		return (Double) query.getSingleResult();
	}

	@Override
	public Map<String, Object> reportMutasiBarangHeader(String noRec) {
		StringBuffer buffer = new StringBuffer();
		buffer.append(" select new Map(  ");
		buffer.append(" '-' as noDokumen, ");
		buffer.append(" '-' as tanggalDokumen, ");
		buffer.append(" strukKonfirmasi.noKonfirmasi as noKonfirmasi,  ");
		buffer.append(" strukOrder.noOrderIntern as noPermintaan, ");
		buffer.append(" to_char(strukOrder.tglOrder,'dd-MM-yyyy') as tanggalPermintaan, ");
		buffer.append(" coalesce(ruangan.namaRuangan,'-') as ruanganPemesan, ");
		buffer.append(" coalesce(pegawai.namaLengkap,'-') as userPemesan, ");
		buffer.append(" coalesce(ruanganTujuan.namaRuangan,'-') as gudangMeminta, ");
		buffer.append(" coalesce(ruanganTujuan.namaRuangan,'-') as dariGudang, ");
		buffer.append(" jenisPermintaan.name as jenisPermintaan,strukOrder.keteranganOrder as keteranganOrder ) ");
		buffer.append(" from KirimProduk kirimProduk  ");
		buffer.append(" right join kirimProduk.noKirim kirim  ");
		buffer.append(" left join kirimProduk.noKonfirmasi strukKonfirmasi  ");
		buffer.append(" right join kirim.noorder strukOrder   ");
		buffer.append(" left join strukOrder.ruangan ruangan  ");
		buffer.append(" left join strukOrder.ruanganTujuan ruanganTujuan  ");
		buffer.append(" left join strukOrder.jenisPermintaan jenisPermintaan  ");
		buffer.append(" left join strukOrder.pegawaiOrder pegawai  ");
		buffer.append(" where strukOrder.noRec=:noRec ");
		Query query = em.createQuery(buffer.toString());
		
		query.setParameter("noRec", noRec);	
		query.setMaxResults(1);
		Map<String, Object> list = (Map<String, Object>) query.getSingleResult();
		
		return list;
	}

	@Override
	public List<Map<String, Object>> reportMutasiBarangDetail(String noRec) {
		StringBuffer buffer = new StringBuffer();
		buffer.append(" select new map( produk.kdProduk as kdProduk, ");
		buffer.append(" produk.namaProduk as namaProduk, ");
		buffer.append(" satuanStandar.satuanStandar as satuan, ");
		buffer.append(" orderpelayanan.qtyProduk as diminta, ");
		buffer.append(" kirimProduk.hargaSatuan as hargaSatuan, ");
		buffer.append(" kirimProduk.qtyProdukTerima as terima, ");
		buffer.append(" (kirimProduk.qtyProdukTerima*kirimProduk.hargaSatuan) as total, ");
		buffer.append("  to_char(strukKirim.tglkirim,'dd-MM-yyyy') as tanggalKirim) ");
		buffer.append(" from KirimProduk kirimProduk ");
		buffer.append(" left join kirimProduk.noKirim strukKirim ");
		buffer.append(" left join strukKirim.noorder strukOrder ");
		buffer.append(" left join kirimProduk.produk produk ");
		buffer.append(" left join kirimProduk.satuanStandar satuanStandar, ");
		buffer.append(" OrderPelayanan orderpelayanan where orderpelayanan.produkId=kirimProduk.produkId  ");
		buffer.append(" and strukOrder.noRec=:noRec and orderpelayanan.noOrder.noRec=:noRec  ");
		Query query = em.createQuery(buffer.toString());
		
		query.setParameter("noRec", noRec);	

		List<Map<String, Object>> list = query.getResultList();
		
		return list;
		
		 
	}

	@Override
	public Double totalMutasiBarang(String noRec) {
		StringBuffer buffer = new StringBuffer();
		buffer.append(" select sum(kirimProduk.qtyProdukTerima*kirimProduk.hargaSatuan) ");
		buffer.append(" from KirimProduk kirimProduk ");
		buffer.append(" left join kirimProduk.noKirim strukKirim ");
		buffer.append(" left join strukKirim.noorder strukOrder ");
		buffer.append(" left join kirimProduk.produk produk ");
		buffer.append(" left join kirimProduk.satuanStandar satuanStandar, ");
		buffer.append(" OrderPelayanan orderpelayanan where orderpelayanan.produkId=kirimProduk.produkId  ");
		buffer.append(" and strukOrder.noRec=:noRec   and orderpelayanan.noOrder.noRec=:noRec ");
		Query query = em.createQuery(buffer.toString());
		
		query.setParameter("noRec", noRec);	

		return (Double) query.getSingleResult();
	}

	@Override
	public int gridPenerimaanCountSupplier(String tanggalAwal, String tanggalAhir, Integer produkId, Integer ruanganId,
			Integer kelompokTransaksiId, Integer jenisProdukId, Integer kelompokProdukId, String noTerima) {
		StringBuffer buffer = new StringBuffer();
		buffer.append(" select count(strukPelayanan.noRec) ");
		buffer.append(" From StrukPelayanan strukPelayanan  ");
		buffer.append(" left join strukPelayanan.kdruangan ruangan ");
		buffer.append(" left join strukPelayanan.kdrekanan rekanan ");
		buffer.append(" left join strukPelayanan.kdkelompoktransaksi kelompokTransaksi ");
		buffer.append(" where kelompokTransaksi.id=:kelompokTansaksiId  ");
		
		if (CommonUtil.isNotNullOrEmpty(tanggalAwal) && CommonUtil.isNotNullOrEmpty(tanggalAhir)) {
			buffer.append("and date(strukPelayanan.tglstruk) between :tanggalAwal and :tanggalAhir ");
		}
		
		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 ");
		}
		
		if (CommonUtil.isNotNullOrEmpty(noTerima) ) {
			buffer.append("and strukPelayanan.nostruk like :noTerima ");
		}
		
		if (CommonUtil.isNotNullOrEmpty(ruanganId) ) {
			buffer.append("and ruangan.id=:ruanganId ");
		}
		
		Query query = em.createQuery(buffer.toString());
		if (CommonUtil.isNotNullOrEmpty(tanggalAwal) && CommonUtil.isNotNullOrEmpty(tanggalAhir)) {
			query.setParameter("tanggalAwal", DateUtil.toDate(tanggalAwal));
			query.setParameter("tanggalAhir", DateUtil.toDate(tanggalAhir));
		}
		if (CommonUtil.isNotNullOrEmpty(produkId)) {
			query.setParameter("produkId", produkId);
		}

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

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

	@Override
	public List<Map<String, Object>> gridPenerimaanSupplier(int rowStart, int rowEnd, String sort, String dir,
			String tanggalAwal, String tanggalAhir, Integer produkId, Integer ruanganId, Integer kelompokTransaksiId,
			Integer jenisProdukId, Integer kelompokProdukId, String noTerima) {
		
		StringBuffer buffer = new StringBuffer();
		buffer.append(" select new map (strukPelayanan.noRec as noRec,strukPelayanan.noRec as noDokumen,to_char(tglDokumen,'dd-MM-yyyy') as tanggalDokumen,strukPelayanan.noSppb as noSpk,to_char(strukPelayanan.tanggalSpk,'dd-MM-yyyy') as tanggalSpk ,rekanan.namaRekanan as namaSupplier,strukPelayanan.nostruk as noPesanan,0.0 as diskon,0.0 as ppn,ruangan.namaRuangan as gudang,strukPelayanan.noKontrak as noKontrak,to_char(strukPelayanan.tanggalKontrak,'dd-MM-yyyy')  as  tanggalKontrak,strukPelayanan.keteranganlainnya as  keterangan,to_char(strukPelayanan.tglstruk,'dd-MM-yyyy') as tanggalStruk) ");
		buffer.append(" From StrukPelayanan strukPelayanan  ");
		buffer.append(" left join strukPelayanan.kdruangan ruangan ");
		buffer.append(" left join strukPelayanan.kdrekanan rekanan ");
		buffer.append(" left join strukPelayanan.kdkelompoktransaksi kelompokTransaksi ");
		buffer.append(" where kelompokTransaksi.id=:kelompokTansaksiId  ");
		
		if (CommonUtil.isNotNullOrEmpty(tanggalAwal) && CommonUtil.isNotNullOrEmpty(tanggalAhir)) {
			buffer.append("and date(strukPelayanan.tglstruk) between :tanggalAwal and :tanggalAhir ");
		}
		
		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 ");
		}
		
		if (CommonUtil.isNotNullOrEmpty(noTerima) ) {
			buffer.append("and strukPelayanan.nostruk like :noTerima ");
		}
		
		if (CommonUtil.isNotNullOrEmpty(ruanganId) ) {
			buffer.append("and ruangan.id=:ruanganId ");
		}
		buffer.append(" order by strukPelayanan.nostruk desc ");
		
		Query query = em.createQuery(buffer.toString());
		if (CommonUtil.isNotNullOrEmpty(tanggalAwal) && CommonUtil.isNotNullOrEmpty(tanggalAhir)) {
			query.setParameter("tanggalAwal", DateUtil.toDate(tanggalAwal));
			query.setParameter("tanggalAhir", DateUtil.toDate(tanggalAhir));
		}
		if (CommonUtil.isNotNullOrEmpty(produkId)) {
			query.setParameter("produkId", produkId);
		}

		if (CommonUtil.isNotNullOrEmpty(ruanganId)) {
			query.setParameter("ruanganId", ruanganId);
		}
		
		if (CommonUtil.isNotNullOrEmpty(jenisProdukId) ) {
			query.setParameter("jenisProdukId", jenisProdukId);
		}
		
		if (CommonUtil.isNotNullOrEmpty(kelompokProdukId) ) {
			query.setParameter("kelompokProdukId", kelompokProdukId);
		}
		
		if (CommonUtil.isNotNullOrEmpty(noTerima) ) {
			query.setParameter("noTerima","%"+ noTerima+"%");
		}
		query.setParameter("kelompokTansaksiId", kelompokTransaksiId);	
		query.setFirstResult(rowStart);
		query.setMaxResults(rowEnd);

		List<Map<String, Object>> list = query.getResultList();
		
		return list;
	
	}


	@Override
	public List<Map<String, Object>> cetakQrCodePersediaan(String noRec) {
		StringBuffer buffer = new StringBuffer();
		buffer.append(" select new map( produk.kdProduk as kodeProduk,produk.namaProduk as namaProduk,to_char(strukPelayanan.tglstruk,'dd-MM-yyyy') as tanggalTerima,stokProdukDetail.nobatch as noBatch,to_char(stokProdukDetail.tglkadaluarsa,'dd-MM-yyyy') as tanggalKadaluarsa) from StokProdukDetail stokProdukDetail");
		buffer.append(" left join stokProdukDetail.strukPelayananDetail strukPelayananDetail ");
		buffer.append(" left join strukPelayananDetail.nostruk strukPelayanan ");
		buffer.append(" left join stokProdukDetail.produk produk where stokProdukDetail.strukPelayanan.noRec=:noRec ");
		Query query = em.createQuery(buffer.toString());
		
		query.setParameter("noRec", noRec);	

		List<Map<String, Object>> list = query.getResultList();
		
		return list;
		
		
	}

	@Override
	public List<Map<String, Object>> cetakQrCodeAset(String noRec) {
		StringBuffer buffer = new StringBuffer();
		buffer.append(" select new Map( registrasiAset.noRegisterAset as noRegisterAset,produk.namaProduk as namaProduk,to_char(strukPelayanan.tglstruk,'dd-MM-yyyy') as tanggalTerima,'-' as noBatch,'-' as tanggalKadaluarsa )");
		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 where strukPelayanan.noRec=:noRec ");
		Query query = em.createQuery(buffer.toString());
		
		query.setParameter("noRec", noRec);	

		List<Map<String, Object>> list = query.getResultList();
		
		return list;
		
		
	}

	@Override
	public List<Map<String, Object>> cetakListPemakaianBarangHabisPakai(String tanggalAwal, String tanggalAhir,Integer kelompokProdukId, Integer jenisProdukId, Integer produkId, Integer ruanganId,Integer kelompokTransaksiId) {

		StringBuffer buffer = new StringBuffer();
		buffer.append(" select new map(produk.namaProduk as namaProduk,satuanStandar.satuanStandar as satuanStandar,strukPelayananDetail.qtyproduk as qtyProduk,coalesce(strukPelayanan.keteranganlainnya,'-') as keterangan) from StrukPelayananDetail strukPelayananDetail ");
		buffer.append(" left join strukPelayananDetail.nostruk strukPelayanan");
		buffer.append(" left join strukPelayanan.kdkelompoktransaksi kelompokTransaksi");
		buffer.append(" left join strukPelayananDetail.kdproduk produk");
		buffer.append(" left join produk.detailJenisProduk detailJenisProduk");
		buffer.append(" left join detailJenisProduk.jenisProduk jenisProduk");
		buffer.append(" left join strukPelayanan.kdruangan ruangan left join strukPelayananDetail.kdsatuanstandar satuanStandar");
		buffer.append(" left join jenisProduk.kelompokProduk kelompokProduk where produk is not null ");
		if(CommonUtil.isNotNullOrEmpty(ruanganId)){
			buffer.append(" and ruangan.id=:ruanganId ");
		}
		if(CommonUtil.isNotNullOrEmpty(kelompokProdukId)){
			buffer.append(" and kelompokProduk.id=:kelompokProdukId ");
		}
		if(CommonUtil.isNotNullOrEmpty(kelompokTransaksiId)){
			buffer.append(" and kelompokTransaksi.id=:kelompokTransaksiId ");
		}
		if(CommonUtil.isNotNullOrEmpty(jenisProdukId)){
			buffer.append(" and jenisProduk.id=:jenisProdukId ");
		}
		if(CommonUtil.isNotNullOrEmpty(produkId)){
			buffer.append(" and produk.id=:produkId ");
		}
		if (CommonUtil.isNotNullOrEmpty(tanggalAwal) && CommonUtil.isNotNullOrEmpty(tanggalAhir)) {
			buffer.append(" and strukPelayanan.tglstruk between :tanggalAwal and :tanggalAhir");
		}
		Query query = em.createQuery(buffer.toString());
		
		if(CommonUtil.isNotNullOrEmpty(ruanganId)){
			query.setParameter("ruanganId", ruanganId);	
		}
		if(CommonUtil.isNotNullOrEmpty(kelompokProdukId)){
			query.setParameter("kelompokProdukId", kelompokProdukId);
		}
		if(CommonUtil.isNotNullOrEmpty(kelompokTransaksiId)){
			query.setParameter("kelompokTransaksiId", kelompokTransaksiId);
		}
		if(CommonUtil.isNotNullOrEmpty(jenisProdukId)){
			query.setParameter("jenisProdukId", jenisProdukId);
		}
		if(CommonUtil.isNotNullOrEmpty(produkId)){
			query.setParameter("produkId", produkId);
		}
		
		if (CommonUtil.isNotNullOrEmpty(tanggalAwal) && CommonUtil.isNotNullOrEmpty(tanggalAhir)) {
			query.setParameter("tanggalAwal", DateUtil.toDate(tanggalAwal));
			query.setParameter("tanggalAhir", DateUtil.toDate(tanggalAhir));
		}

		List<Map<String, Object>> list = query.getResultList();
		
		return list;
	

	}

	@Override
	public List<Map<String, Object>> cetakListPengiriman(String tanggalAwal, String tanggalAhir, Ruangan ruangan,Integer kelompokProdukId, Integer jenisProdukId, Integer produkId) {
		StringBuffer buffer = new StringBuffer();
		buffer.append(" select ");
		buffer.append(" new map(produk.namaProduk as namaProduk, ");
		buffer.append(" kirimProduk.qtyProdukKonfirmasiKonversi as saldo, ");
		buffer.append(" kirimProduk.qtyProdukRetur as qtyProdukRetur, ");
		buffer.append(" satuanStandar.satuanStandar as satuanStandar, ");
		buffer.append(" strukRetur.noRetur as noRetur, ");
		buffer.append(" kirimProduk.hargaSatuan as hargaSatuan, ");
		buffer.append(" strukRetur.tglRetur as tanggalRetur, ");
		buffer.append(" ruanganAsal.namaRuangan as ruanganAsal, ");
		buffer.append(" ruanganTujuan.namaRuangan as ruanganTujuan, ");
		buffer.append(" pegawai.namaLengkap as pegawai ) ");
		buffer.append(" from KirimProduk kirimProduk ");
		buffer.append(" left join kirimProduk.noKirim strukKirim ");
		buffer.append(" left join kirimProduk.asalProduk asalProduk ");
		buffer.append(" left join kirimProduk.noRetur strukRetur ");
		buffer.append(" left join kirimProduk.kirimProduk  kirimProdukParent ");
		buffer.append(" left join kirimProdukParent.produk produk ");
		buffer.append(" left join kirimProduk.satuanStandar  satuanStandar ");
		buffer.append(" left join strukKirim.kdruanganasal  ruanganAsal ");
		buffer.append(" left join strukKirim.kdruangantujuan  ruanganTujuan ");
		buffer.append(" left join strukRetur.pegawai pegawai ");
		buffer.append(" left join produk.detailJenisProduk detailJenisProduk ");
		buffer.append(" left join detailJenisProduk.jenisProduk jenisProduk ");
		buffer.append(" left join jenisProduk.kelompokProduk kelompokProduk ");
		buffer.append("  where strukRetur is not null ");
		
		if (CommonUtil.isNotNullOrEmpty(tanggalAwal) && CommonUtil.isNotNullOrEmpty(tanggalAhir)) {
			buffer.append("and date(strukRetur.tglRetur) between :tanggalAwal and :tanggalAhir ");
		}
		
		if (CommonUtil.isNotNullOrEmpty(kelompokProdukId)) {
			buffer.append("and kelompokProduk.id=:kelompokProdukId ");
		}
		
		if (CommonUtil.isNotNullOrEmpty(jenisProdukId)) {
			buffer.append("and jenisProduk.id=:jenisProdukId ");
		}
		
		if (CommonUtil.isNotNullOrEmpty(produkId)) {
			buffer.append("and produk.id=:produkId ");
		}
		
		if (CommonUtil.isNotNullOrEmpty(ruangan)) {
			buffer.append("and ruanganTujuan.id=:ruanganId ");
		}
		
		
		Query query = em.createQuery(buffer.toString());
		if (CommonUtil.isNotNullOrEmpty(tanggalAwal) && CommonUtil.isNotNullOrEmpty(tanggalAhir)) {
			query.setParameter("tanggalAwal", DateUtil.toDate(tanggalAwal));
			query.setParameter("tanggalAhir", DateUtil.toDate(tanggalAhir));
		}
		
		if(CommonUtil.isNotNullOrEmpty(ruangan)){
			query.setParameter("ruanganId", ruangan.getId());
		}
		if (CommonUtil.isNotNullOrEmpty(kelompokProdukId)) {
			query.setParameter("kelompokProdukId", kelompokProdukId);
		}
		
		if (CommonUtil.isNotNullOrEmpty(jenisProdukId)) {
			query.setParameter("jenisProdukId", jenisProdukId);
		}
		
		if (CommonUtil.isNotNullOrEmpty(produkId)) {
			query.setParameter("produkId", produkId);
		}
			

		List<Map<String, Object>> list = query.getResultList();
		
		return list;
	}

	@Override
	public List<Map<String, Object>> cetakListReturSupplierList(String tanggalAwal, String tanggalAhir,Integer produkId, Integer jenisProdukId, Integer kelompokProdukId, Integer supplierId,Integer kelompokTransaksiId) {
		StringBuffer buffer = new StringBuffer();
		buffer.append(" select new Map( strukRetur.noRec as noRetur,strukPelayananDetail.hargasatuan as hargaSatuan,asalProduk.asalProduk as asalProduk,pegawai.namaLengkap as namaPegawai, produk.namaProduk as namaProduk,satuanStandar.satuanStandar as satuanStandar,strukPelayananDetail.qtyproduk as qtyProduk,coalesce(strukPelayanan.keteranganlainnya,'-') as keterangan )from StrukPelayananDetail strukPelayananDetail ");
		buffer.append(" left join strukPelayananDetail.nostruk strukPelayanan ");
		buffer.append(" right join strukPelayananDetail.noretur strukRetur ");
		buffer.append(" left join strukRetur.kelompokTransaksi kelompokTransaksi ");
		buffer.append(" left join strukPelayananDetail.kdproduk produk ");
		buffer.append(" left join produk.detailJenisProduk detailJenisProduk ");
		buffer.append(" left join detailJenisProduk.jenisProduk jenisProduk ");
		buffer.append(" left join jenisProduk.kelompokProduk kelompokProduk ");
		buffer.append(" left join strukPelayanan.kdruangan ruangan  ");
		buffer.append(" left join strukPelayananDetail.kdasalproduk asalProduk ");
		buffer.append(" left join strukPelayananDetail.kdsatuanstandar satuanStandar ");
		buffer.append(" left join strukRetur.pegawai pegawai ");
		buffer.append(" left join jenisProduk.kelompokProduk kelompokProduk where strukRetur is not null ");
		
		if(CommonUtil.isNotNullOrEmpty(kelompokProdukId)){
			buffer.append(" and kelompokProduk.id=:kelompokProdukId ");
		}
		if(CommonUtil.isNotNullOrEmpty(kelompokTransaksiId)){
			buffer.append(" and kelompokTransaksi.id=:kelompokTransaksiId ");
		}
		if(CommonUtil.isNotNullOrEmpty(jenisProdukId)){
			buffer.append(" and jenisProduk.id=:jenisProdukId ");
		}
		if(CommonUtil.isNotNullOrEmpty(produkId)){
			buffer.append(" and produk.id=:produkId ");
		}
		if(CommonUtil.isNotNullOrEmpty(supplierId)){
			buffer.append(" and strukPelayanan.kdrekanan.id=:supplierId ");
		}
		if (CommonUtil.isNotNullOrEmpty(tanggalAwal) && CommonUtil.isNotNullOrEmpty(tanggalAhir)) {
			buffer.append(" and strukPelayanan.tglRetur between :tanggalAwal and :tanggalAhir");
		}
		Query query = em.createQuery(buffer.toString());
		
		if(CommonUtil.isNotNullOrEmpty(kelompokProdukId)){
			query.setParameter("kelompokProdukId", kelompokProdukId);
		}
		if(CommonUtil.isNotNullOrEmpty(kelompokTransaksiId)){
			query.setParameter("kelompokTransaksiId", kelompokTransaksiId);
		}
		if(CommonUtil.isNotNullOrEmpty(jenisProdukId)){
			query.setParameter("jenisProdukId", jenisProdukId);
		}
		if(CommonUtil.isNotNullOrEmpty(produkId)){
			query.setParameter("produkId", produkId);
		}
		if(CommonUtil.isNotNullOrEmpty(supplierId)){
			query.setParameter("supplierId", supplierId);
		}
		
		if (CommonUtil.isNotNullOrEmpty(tanggalAwal) && CommonUtil.isNotNullOrEmpty(tanggalAhir)) {
			query.setParameter("tanggalAwal", DateUtil.toDate(tanggalAwal));
			query.setParameter("tanggalAhir", DateUtil.toDate(tanggalAhir));
		}
		List<Map<String, Object>> list = query.getResultList();
		
		return list;
	}

	@Override
	public int findAsetByRuanganCount(String periodeAwal, String periodeAhir, Integer ruanganId) {
		StringBuffer buffer = new StringBuffer();
		buffer.append(" select count(registrasiAset.noRec) ");
		buffer.append(" from RegistrasiAset registrasiAset ");
		buffer.append(" left join registrasiAset.produk produk ");
		buffer.append(" left join registrasiAset.ruangan ruangan ");
		buffer.append(" left join registrasiAset.asalProduk asalProduk ");
		buffer.append(" left join registrasiAset.strukPelayananDetail strukPelayananDetail ");
		buffer.append(" left join strukPelayananDetail.nostruk strukPelayanan where strukPelayanan.noRec is not null ");
		
		if(CommonUtil.isNotNullOrEmpty(ruanganId)){
			buffer.append(" and ruangan.id=:ruanganId ");
		}
	
		if (CommonUtil.isNotNullOrEmpty(periodeAwal) && CommonUtil.isNotNullOrEmpty(periodeAhir)) {
			buffer.append(" and strukPelayanan.tglstruk between :tanggalAwal and :tanggalAhir");
		}
		Query query = em.createQuery(buffer.toString());
		
		if(CommonUtil.isNotNullOrEmpty(ruanganId)){
			query.setParameter("ruanganId", ruanganId);
		}

		
		if (CommonUtil.isNotNullOrEmpty(periodeAwal) && CommonUtil.isNotNullOrEmpty(periodeAhir)) {
			query.setParameter("tanggalAwal", DateUtil.toDate(periodeAwal));
			query.setParameter("tanggalAhir", DateUtil.toDate(periodeAhir));
		}
		
		return ((Long) query.getSingleResult()).intValue();
	}

	@Override
	public List<Map<String, Object>> findAsetByRuanganList(int rowStart, int rowEnd, String sort, String dir,String periodeAwal, String periodeAhir, Integer ruanganId) {
		StringBuffer buffer = new StringBuffer();
		buffer.append(" select new Map( ");
		buffer.append(" registrasiAset.noRec as noRec,produk.namaProduk as namaProduk, ");
		buffer.append(" registrasiAset.noRegisterAset as noAset, ");
		buffer.append(" ruangan.namaRuangan as ruangan, ");
		buffer.append(" asalProduk.asalProduk as suberDana, ");
		buffer.append(" strukPelayanan.tglstruk as tanggalPenerimaan  ) ");
		buffer.append(" from RegistrasiAset registrasiAset ");
		buffer.append(" left join registrasiAset.produk produk ");
		buffer.append(" left join registrasiAset.ruangan ruangan ");
		buffer.append(" left join registrasiAset.asalProduk asalProduk ");
		buffer.append(" left join registrasiAset.strukPelayananDetail strukPelayananDetail ");
		buffer.append(" left join strukPelayananDetail.nostruk strukPelayanan where strukPelayanan.noRec is not null ");
		
		if(CommonUtil.isNotNullOrEmpty(ruanganId)){
			buffer.append(" and ruangan.id=:ruanganId ");
		}
	
		if (CommonUtil.isNotNullOrEmpty(periodeAwal) && CommonUtil.isNotNullOrEmpty(periodeAhir)) {
			buffer.append(" and strukPelayanan.tglstruk between :tanggalAwal and :tanggalAhir");
		}
		Query query = em.createQuery(buffer.toString());
		
		if(CommonUtil.isNotNullOrEmpty(ruanganId)){
			query.setParameter("ruanganId", ruanganId);
		}

		
		if (CommonUtil.isNotNullOrEmpty(periodeAwal) && CommonUtil.isNotNullOrEmpty(periodeAhir)) {
			query.setParameter("tanggalAwal", DateUtil.toDate(periodeAwal));
			query.setParameter("tanggalAhir", DateUtil.toDate(periodeAhir));
		}
		
		List<Map<String, Object>> list = query.getResultList();
		
		return list;
	}

	@Override
	public List<Map<String, Object>> findSlowMoving(String tanggalAwal, String tanggalAhir, Integer kelompokProdukId,Integer jenisProdukId, Integer produkId,Integer ruanganId) {

		StringBuffer buffer = new StringBuffer();
		buffer.append(" select new Map( sum(p.jumlah) as jumlah,p.kdProduk as kdProduk ,p.kdRuangan as kdRuangan,p.namaProduk as namaProduk,p.namaRuangan as namaRuangan )");
		
		buffer.append(" from produkfastslowmoving_v p where p.kdRuangan=:ruanganId ");
	
		if(CommonUtil.isNotNullOrEmpty(kelompokProdukId)){
			buffer.append(" and p.kelompokProdukId=:kelompokProdukId");
		}
		if(CommonUtil.isNotNullOrEmpty(jenisProdukId)){
			buffer.append(" and p.jenisProdukId=:jenisProdukId");
		}
		if(CommonUtil.isNotNullOrEmpty(produkId)){
			buffer.append(" and p.kdProduk=:produkId");
		}
		
		if (CommonUtil.isNotNullOrEmpty(tanggalAwal) && CommonUtil.isNotNullOrEmpty(tanggalAhir)) {
			buffer.append(" and date(p.tglPelayanan) between :tanggalAwal and :tanggalAhir");
		}
		buffer.append(" group by p.kdProduk,p.kdRuangan,p.namaProduk,p.namaRuangan order by sum(p.jumlah) asc ");
		Query query = em.createQuery(buffer.toString());
		
		if(CommonUtil.isNotNullOrEmpty(kelompokProdukId)){
			query.setParameter("kelompokProdukId", kelompokProdukId);
		}
		if(CommonUtil.isNotNullOrEmpty(jenisProdukId)){
			query.setParameter("jenisProdukId", jenisProdukId);
		}
		if(CommonUtil.isNotNullOrEmpty(produkId)){
			query.setParameter("produkId", produkId);
		}
		query.setParameter("ruanganId", ruanganId);

		if (CommonUtil.isNotNullOrEmpty(tanggalAwal) && CommonUtil.isNotNullOrEmpty(tanggalAhir)) {
			query.setParameter("tanggalAwal", DateUtil.toDate(tanggalAwal));
			query.setParameter("tanggalAhir", DateUtil.toDate(tanggalAhir));
		}
		query.setMaxResults(100);
		
		List<Map<String, Object>> list = query.getResultList();
		
		return list;
	
	}

	@Override
	public List<Map<String, Object>> findFastMoving(String tanggalAwal, String tanggalAhir, Integer kelompokProdukId,
			Integer jenisProdukId, Integer produkId, Integer ruanganId) {
		StringBuffer buffer = new StringBuffer();
		buffer.append(" select new Map( sum(p.jumlah) as jumlah,p.kdProduk as kdProduk ,p.kdRuangan as kdRuangan,p.namaProduk as namaProduk,p.namaRuangan as namaRuangan )");
		
		buffer.append(" from produkfastslowmoving_v p where p.kdRuangan=:ruanganId ");
	
		if(CommonUtil.isNotNullOrEmpty(kelompokProdukId)){
			buffer.append(" and p.kelompokProdukId=:kelompokProdukId");
		}
		if(CommonUtil.isNotNullOrEmpty(jenisProdukId)){
			buffer.append(" and p.jenisProdukId=:jenisProdukId");
		}
		if(CommonUtil.isNotNullOrEmpty(produkId)){
			buffer.append(" and p.kdProduk=:produkId");
		}
		
		if (CommonUtil.isNotNullOrEmpty(tanggalAwal) && CommonUtil.isNotNullOrEmpty(tanggalAhir)) {
			buffer.append(" and date(p.tglPelayanan) between :tanggalAwal and :tanggalAhir");
		}
		buffer.append(" group by p.kdProduk,p.kdRuangan,p.namaProduk,p.namaRuangan order by sum(p.jumlah) desc ");
		Query query = em.createQuery(buffer.toString());
		
		if(CommonUtil.isNotNullOrEmpty(kelompokProdukId)){
			query.setParameter("kelompokProdukId", kelompokProdukId);
		}
		if(CommonUtil.isNotNullOrEmpty(jenisProdukId)){
			query.setParameter("jenisProdukId", jenisProdukId);
		}
		if(CommonUtil.isNotNullOrEmpty(produkId)){
			query.setParameter("produkId", produkId);
		}
		query.setParameter("ruanganId", ruanganId);

		if (CommonUtil.isNotNullOrEmpty(tanggalAwal) && CommonUtil.isNotNullOrEmpty(tanggalAhir)) {
			query.setParameter("tanggalAwal", DateUtil.toDate(tanggalAwal));
			query.setParameter("tanggalAhir", DateUtil.toDate(tanggalAhir));
		}
		query.setMaxResults(100);
		
		List<Map<String, Object>> list = query.getResultList();
		
		return list;
	}

	@Override
	public int listPenerimaanReturCount(String tanggalAwal, String tanggalAhir, Ruangan ruangan,Integer kelompokProdukId,Integer jenisProdukId,Integer produkId) {
		StringBuffer buffer = new StringBuffer();
		buffer.append(" select count(kirimProduk.noRec) ");
		buffer.append(" from KirimProduk kirimProduk ");
		buffer.append(" left join kirimProduk.noKirim strukKirim ");
		buffer.append(" left join kirimProduk.asalProduk asalProduk ");
		buffer.append(" left join kirimProduk.noRetur strukRetur ");
		buffer.append(" left join kirimProduk.kirimProduk  kirimProdukParent ");
		buffer.append(" left join kirimProdukParent.produk produk ");
		buffer.append(" left join kirimProduk.satuanStandar  satuanStandar ");
		buffer.append(" left join strukKirim.kdruanganasal  ruanganAsal ");
		buffer.append(" left join strukKirim.kdruangantujuan  ruanganTujuan ");
		buffer.append(" left join strukRetur.pegawai pegawai ");
		buffer.append(" left join produk.detailJenisProduk detailJenisProduk ");
		buffer.append(" left join detailJenisProduk.jenisProduk jenisProduk ");
		buffer.append(" left join jenisProduk.kelompokProduk kelompokProduk ");
		buffer.append("  where strukRetur is not null ");
		
		if (CommonUtil.isNotNullOrEmpty(tanggalAwal) && CommonUtil.isNotNullOrEmpty(tanggalAhir)) {
			buffer.append("and date(strukRetur.tglRetur) between :tanggalAwal and :tanggalAhir ");
		}
		
		if (CommonUtil.isNotNullOrEmpty(kelompokProdukId)) {
			buffer.append("and kelompokProduk.id=:kelompokProdukId ");
		}
		
		if (CommonUtil.isNotNullOrEmpty(jenisProdukId)) {
			buffer.append("and jenisProduk.id=:jenisProdukId ");
		}
		
		if (CommonUtil.isNotNullOrEmpty(produkId)) {
			buffer.append("and produk.id=:produkId ");
		}
		
		if (CommonUtil.isNotNullOrEmpty(ruangan)) {
			buffer.append("and ruanganTujuan.id=:ruanganId ");
		}
		
		
		Query query = em.createQuery(buffer.toString());
		if (CommonUtil.isNotNullOrEmpty(tanggalAwal) && CommonUtil.isNotNullOrEmpty(tanggalAhir)) {
			query.setParameter("tanggalAwal", DateUtil.toDate(tanggalAwal));
			query.setParameter("tanggalAhir", DateUtil.toDate(tanggalAhir));
		}
		
		if(CommonUtil.isNotNullOrEmpty(ruangan)){
			query.setParameter("ruanganId", ruangan.getId());
		}
		if (CommonUtil.isNotNullOrEmpty(kelompokProdukId)) {
			query.setParameter("kelompokProdukId", kelompokProdukId);
		}
		
		if (CommonUtil.isNotNullOrEmpty(jenisProdukId)) {
			query.setParameter("jenisProdukId", jenisProdukId);
		}
		
		if (CommonUtil.isNotNullOrEmpty(produkId)) {
			query.setParameter("produkId", produkId);
		}
			

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

	@Override
	public List<Map<String, Object>> listPenerimaanRetur(int rowStart, int rowEnd, String sort, String dir,String tanggalAwal, String tanggalAhir, Ruangan ruangan,Integer kelompokProdukId,Integer jenisProdukId,Integer produkId) {
		StringBuffer buffer = new StringBuffer();
		buffer.append(" select ");
		buffer.append(" new map(produk.namaProduk as namaProduk, ");
		buffer.append(" kirimProduk.qtyProdukKonfirmasiKonversi as saldo, ");
		buffer.append(" kirimProduk.qtyProdukRetur as qtyProdukRetur, ");
		buffer.append(" satuanStandar.satuanStandar as satuanStandar, ");
		buffer.append(" strukRetur.noRetur as noRetur, ");
		buffer.append(" asalProduk.asalProduk as asalProduk, ");
		buffer.append(" kirimProduk.hargaSatuan as hargaSatuan, ");
		buffer.append(" strukRetur.tglRetur as tanggalRetur, ");
		buffer.append(" ruanganAsal.namaRuangan as ruanganAsal, ");
		buffer.append(" ruanganTujuan.namaRuangan as ruanganTujuan, ");
		buffer.append(" pegawai.namaLengkap as pegawai ) ");
		buffer.append(" from KirimProduk kirimProduk ");
		buffer.append(" left join kirimProduk.noKirim strukKirim ");
		buffer.append(" left join kirimProduk.asalProduk asalProduk ");
		buffer.append(" left join kirimProduk.noRetur strukRetur ");
		buffer.append(" left join kirimProduk.kirimProduk  kirimProdukParent ");
		buffer.append(" left join kirimProdukParent.produk produk ");
		buffer.append(" left join kirimProduk.satuanStandar  satuanStandar ");
		buffer.append(" left join strukKirim.kdruanganasal  ruanganAsal ");
		buffer.append(" left join strukKirim.kdruangantujuan  ruanganTujuan ");
		buffer.append(" left join strukRetur.pegawai pegawai ");
		buffer.append(" left join produk.detailJenisProduk detailJenisProduk ");
		buffer.append(" left join detailJenisProduk.jenisProduk jenisProduk ");
		buffer.append(" left join jenisProduk.kelompokProduk kelompokProduk ");
		buffer.append("  where strukRetur is not null and kirimProduk.kirimProduk is not null ");
		
		if (CommonUtil.isNotNullOrEmpty(tanggalAwal) && CommonUtil.isNotNullOrEmpty(tanggalAhir)) {
			buffer.append("and date(strukRetur.tglRetur) between :tanggalAwal and :tanggalAhir ");
		}
		
		if (CommonUtil.isNotNullOrEmpty(kelompokProdukId)) {
			buffer.append("and kelompokProduk.id=:kelompokProdukId ");
		}
		
		if (CommonUtil.isNotNullOrEmpty(jenisProdukId)) {
			buffer.append("and jenisProduk.id=:jenisProdukId ");
		}
		
		if (CommonUtil.isNotNullOrEmpty(produkId)) {
			buffer.append("and produk.id=:produkId ");
		}
		
		if (CommonUtil.isNotNullOrEmpty(ruangan)) {
			buffer.append("and ruanganTujuan.id=:ruanganId ");
		}
		buffer.append(" order by strukRetur.noRetur desc ");
		
		Query query = em.createQuery(buffer.toString());
		if (CommonUtil.isNotNullOrEmpty(tanggalAwal) && CommonUtil.isNotNullOrEmpty(tanggalAhir)) {
			query.setParameter("tanggalAwal", DateUtil.toDate(tanggalAwal));
			query.setParameter("tanggalAhir", DateUtil.toDate(tanggalAhir));
		}
		
		if(CommonUtil.isNotNullOrEmpty(ruangan)){
			query.setParameter("ruanganId", ruangan.getId());
		}
		if (CommonUtil.isNotNullOrEmpty(kelompokProdukId)) {
			query.setParameter("kelompokProdukId", kelompokProdukId);
		}
		
		if (CommonUtil.isNotNullOrEmpty(jenisProdukId)) {
			query.setParameter("jenisProdukId", jenisProdukId);
		}
		
		if (CommonUtil.isNotNullOrEmpty(produkId)) {
			query.setParameter("produkId", produkId);
		}
			

		query.setFirstResult(rowStart);
		query.setMaxResults(rowEnd);

		List<Map<String, Object>> list = query.getResultList();
		
		return list;
	}

	
	@Override
	public int preAddPenerimaanReturCount(String tanggalAwal, String tanggalAhir, Ruangan ruangan) {
		StringBuffer buffer = new StringBuffer();
		buffer.append(" select count(strukRetur.noRetur) ");
		buffer.append(" from KirimProduk kirimProduk ");
		buffer.append(" left join kirimProduk.noKirim strukKirim ");
		buffer.append(" left join kirimProduk.noRetur strukRetur ");
		buffer.append(" left join strukKirim.kdruanganasal as ruanganAsal ");
		buffer.append(" left join strukKirim.kdruangantujuan as ruanganTujuan ");
		buffer.append(" where strukRetur is not null ");
		
		if (CommonUtil.isNotNullOrEmpty(tanggalAwal) && CommonUtil.isNotNullOrEmpty(tanggalAhir)) {
			buffer.append("and date(strukRetur.tglRetur) between :tanggalAwal and :tanggalAhir ");
		}
		
		if (CommonUtil.isNotNullOrEmpty(ruangan)) {
			buffer.append("and ruanganTujuan.id=:ruanganId ");
		}
		
		
		Query query = em.createQuery(buffer.toString());
		if (CommonUtil.isNotNullOrEmpty(tanggalAwal) && CommonUtil.isNotNullOrEmpty(tanggalAhir)) {
			query.setParameter("tanggalAwal", DateUtil.toDate(tanggalAwal));
			query.setParameter("tanggalAhir", DateUtil.toDate(tanggalAhir));
		}
		
		if(CommonUtil.isNotNullOrEmpty(ruangan)){
			query.setParameter("ruanganId", ruangan.getId());
		}
			

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

	@Override
	public List<Map<String, Object>> preAddPenerimaanReturList(int rowStart, int rowEnd, String sort, String dir,String tanggalAwal, String tanggalAhir, Ruangan ruangan) {
		StringBuffer buffer = new StringBuffer();
		buffer.append(" select new map("
				+ "strukRetur.noRec as noRec,"
				+ "strukRetur.noRetur as noRetur,"
				+ "strukRetur.tglRetur as tanggalRetur,"
				+ "ruanganAsal.namaRuangan as ruanganAsal,"
				+ "ruanganTujuan.namaRuangan as ruanganTujuan) ");
		buffer.append(" from KirimProduk kirimProduk ");
		buffer.append(" left join kirimProduk.noKirim strukKirim ");
		buffer.append(" left join kirimProduk.noRetur strukRetur ");
		buffer.append(" left join strukKirim.kdruanganasal as ruanganAsal ");
		buffer.append(" left join strukKirim.kdruangantujuan as ruanganTujuan ");
		buffer.append(" where strukRetur is not null ");
		
		if (CommonUtil.isNotNullOrEmpty(tanggalAwal) && CommonUtil.isNotNullOrEmpty(tanggalAhir)) {
			buffer.append("and date(strukRetur.tglRetur) between :tanggalAwal and :tanggalAhir ");
		}
		
		if (CommonUtil.isNotNullOrEmpty(ruangan)) {
			buffer.append("and ruanganTujuan.id=:ruanganId ");
		}
		buffer.append(" group by strukRetur.noRec,"
				+ "strukRetur.noRetur,"
				+ "strukRetur.tglRetur,"
				+ "ruanganAsal.namaRuangan,"
				+ "ruanganTujuan.namaRuangan");
		
		Query query = em.createQuery(buffer.toString());
		if (CommonUtil.isNotNullOrEmpty(tanggalAwal) && CommonUtil.isNotNullOrEmpty(tanggalAhir)) {
			query.setParameter("tanggalAwal", DateUtil.toDate(tanggalAwal));
			query.setParameter("tanggalAhir", DateUtil.toDate(tanggalAhir));
		}
		
		if(CommonUtil.isNotNullOrEmpty(ruangan)){
			query.setParameter("ruanganId", ruangan.getId());
		}
			

		query.setFirstResult(rowStart);
		query.setMaxResults(rowEnd);

		List<Map<String, Object>> list = query.getResultList();
		
		return list;
	}

	

}
