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.DestroyProdukDetailDaoCustom;
import com.jasamedika.medifirst2000.dao.custom.base.impl.CoreDaoImpl;
import com.jasamedika.medifirst2000.entities.DestroyProdukDetail;
import com.jasamedika.medifirst2000.util.CommonUtil;
import com.jasamedika.medifirst2000.util.DateUtil;

/**
 * Repository Custom class
 * 
 * @author Roberto
 */
@Repository//("DestroyProdukDetailDaoCustom")
public class DestroyProdukDetailDaoCustomImpl extends CoreDaoImpl<DestroyProdukDetail> implements
		DestroyProdukDetailDaoCustom {

	public DestroyProdukDetailDaoCustomImpl() {
		super(DestroyProdukDetail.class);
	}

	@Override
	public int daftarPemusnahanBarangCount(String dateStar, String dateEnd, Integer kelompokProdukId,Integer jenisProdukId, Integer produkId) {
		StringBuffer buffer = new StringBuffer();
		buffer.append(" select count(destroyProdukDetail.noRec) ");
		buffer.append(" from DestroyProdukDetail destroyProdukDetail  ");
		buffer.append(" left join destroyProdukDetail.destroyProduk destroyProduk ");
		buffer.append(" left join destroyProduk.strukHistory srukHistory ");
		buffer.append(" left join destroyProdukDetail.produk 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 produk.satuanStandar satuanStandar where destroyProdukDetail.noRec 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(dateStar) && CommonUtil.isNotNullOrEmpty(dateEnd)) {
			buffer.append("and date(srukHistory.tglHistori) between :dateStar and :dateEnd ");
		}

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

		
		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>> daftarPemusnahanBarangList(int rowStart, int rowEnd, String sort, String dir,String dateStar, String dateEnd, Integer kelompokProdukId, Integer jenisProdukId, Integer produkId) {
		StringBuffer buffer = new StringBuffer();
		buffer.append(" select new Map ( ");
		buffer.append(" srukHistory.nonHistori as no, ");
		buffer.append(" produk.kdProduk as kodeProduk, ");
		buffer.append(" produk.namaProduk as namaProduk,destroyProduk.keteranganAlasan as keterangan, ");
		buffer.append(" destroyProdukDetail.nobatch as noBatch, ");
		buffer.append(" destroyProdukDetail.tglKadaluarsa as tanggalKadaluarsa, ");
		buffer.append(" destroyProdukDetail.qtyProduk as qtyPemusnahan, ");
		buffer.append(" satuanStandar.satuanStandar as satuanStandar ) ");
		buffer.append(" from DestroyProdukDetail destroyProdukDetail  ");
		buffer.append(" left join destroyProdukDetail.destroyProduk destroyProduk ");
		buffer.append(" left join destroyProduk.strukHistory srukHistory ");
		buffer.append(" left join destroyProdukDetail.produk 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 produk.satuanStandar satuanStandar where srukHistory.noRec 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(dateStar) && CommonUtil.isNotNullOrEmpty(dateEnd)) {
			buffer.append("and date(srukHistory.tglHistori) between :dateStar and :dateEnd ");
		}

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

		
		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 List<Map<String, Object>> cetakDaftarPemusnahanBarangList(String dateStart, String dateEnd,
			Integer kelompokProdukId, Integer jenisProdukId, Integer produkId) {
		StringBuffer buffer = new StringBuffer();
		buffer.append(" select new Map ( ");
		buffer.append(" srukHistory.noRec as no, ");
		buffer.append(" produk.kdProduk as kodeProduk, ");
		buffer.append(" produk.namaProduk as namaProduk, ");
		buffer.append(" destroyProdukDetail.nobatch as noBatch, ");
		buffer.append(" destroyProdukDetail.tglKadaluarsa as tanggalKadaluarsa, ");
		buffer.append(" destroyProdukDetail.qtyProduk as qtyPemusnahan, ");
		buffer.append(" satuanStandar.satuanStandar as satuanStandar ) ");
		buffer.append(" from DestroyProdukDetail destroyProdukDetail  ");
		buffer.append(" left join destroyProdukDetail.destroyProduk destroyProduk ");
		buffer.append(" left join destroyProduk.strukHistory srukHistory ");
		buffer.append(" left join destroyProdukDetail.produk 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 produk.satuanStandar satuanStandar where srukHistory.noRec 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(dateStart) && CommonUtil.isNotNullOrEmpty(dateEnd)) {
			buffer.append("and date(srukHistory.tglHistori) between :dateStar and :dateEnd ");
		}

		Query query = em.createQuery(buffer.toString());
		if (CommonUtil.isNotNullOrEmpty(dateStart) && CommonUtil.isNotNullOrEmpty(dateEnd)) {
			query.setParameter("dateStar", DateUtil.toDate(dateStart));
			query.setParameter("dateEnd", DateUtil.toDate(dateEnd));
		}

		
		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;
	}

}
