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

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

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

import org.springframework.stereotype.Repository;

import com.jasamedika.medifirst2000.dao.custom.CssdReturDaoCustom;
import com.jasamedika.medifirst2000.util.CommonUtil;
import com.jasamedika.medifirst2000.util.DateUtil;

/**
 * Repository Custom class
 * 
 * @author Roberto
 */

@Repository("CssdReturDaoCustom")
public class CssdReturDaoCustomImpl   implements CssdReturDaoCustom {
	
	@PersistenceContext
	protected EntityManager em;
	
	@Override
	public Map<String, Object> findPenerimaanHeaderByNoRec(String noRec) {
		StringBuffer buffer = new StringBuffer();
		buffer.append(" select new map(strukPelayanan.tglstruk as tanggal,strukPelayanan.nostruk as noOrder) 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(produk.namaProduk as namaProduk,strukPelayananDetail.noRec as noRecDetail, ");
		buffer.append(" 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 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 String findNoKirim(String noRec) {
		StringBuffer buffer = new StringBuffer();
		buffer.append(" select strukPlaning.noplanning_intern from PlanningPelayanan p left join p.strukPelayanan strukPelayanan left join p.strukPlaning strukPlaning where strukPelayanan.noRec=:noRec and strukPlaning.namaplanning='Distribusi' ");
		Query query = em.createQuery(buffer.toString());
		
		query.setParameter("noRec", noRec);	
		query.setMaxResults(1);

		String list = (String) query.getSingleResult();
		
		return list;
	}
	
	@Override
	public List<Map<String, Object>> listReturCssdList(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(strukPelayanan.nostruk as noOrder,strukRetur.tglRetur as tglRetur, strukRetur.keteranganLainnya as keterangan,strukRetur.noRetur as noRetur,ruangan.namaRuangan as namaRuangan,pegawai.namaLengkap as namaPegawai, produk.namaProduk as namaProduk,strukPelayananDetail.qtyproduk as qtyProduk)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.kdruanganasal 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 strukRetur.tglRetur between :tanggalAwal and :tanggalAhir");
		}
		buffer.append(" order by strukRetur.noRec desc ");
		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 listReturCssdCount(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 strukRetur.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();
	}

	
	
	
	
}
