package com.jasamedika.medifirst2000.dao;

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

import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.PagingAndSortingRepository;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;

import com.jasamedika.medifirst2000.dto.MappingCycleDto;
import com.jasamedika.medifirst2000.dto.MesinDto;
import com.jasamedika.medifirst2000.dto.OrderAmbulanceDto;
import com.jasamedika.medifirst2000.dto.PaketDanNonPaketDto;
import com.jasamedika.medifirst2000.dto.PemakaianRumahDukaDto;
/*import com.jasamedika.medifirst2000.dto.SetAlatDanAlatCssdDto;*/
import com.jasamedika.medifirst2000.dto.SewaLahanDto;
import com.jasamedika.medifirst2000.entities.DetailJenisProduk;
import com.jasamedika.medifirst2000.entities.Generik;
import com.jasamedika.medifirst2000.entities.JenisProduk;
import com.jasamedika.medifirst2000.entities.KelompokProduk;
import com.jasamedika.medifirst2000.entities.Pegawai;
import com.jasamedika.medifirst2000.entities.Produk;

/**
 * Repository class for Produk
 * 
 * @author Chandra
 */
@Repository("ProdukDao")
public interface ProdukDao extends PagingAndSortingRepository<Produk, Integer> {

	@Query("select NEW com.jasamedika.medifirst2000.entities.Produk(p.kdProduk,p.namaProduk,p.id,p.satuanStandar) from Produk p where p.namaProduk like %:namaObat% and p.detailJenisProduk.jenisProduk.kelompokProduk.isHavingPrice='1' and  p.statusEnabled=true")
	List<Produk> findTindakan(@Param("namaObat") String namaObat, Pageable page);

	@Query("select NEW com.jasamedika.medifirst2000.entities.Produk(p.produk.kdProduk,p.produk.namaProduk,p.produk.id,p.produk.satuanStandar) from MapRuanganToProduk p where p.ruangan.id=:idRuangan  and p.produk.namaProduk like %:namaObat% and p.produk.detailJenisProduk.jenisProduk.kelompokProduk.isHavingPrice='1' and  p.statusEnabled=true")
	List<Produk> findTindakan(@Param("namaObat") String values, @Param("idRuangan") Integer idRuangan, Pageable page);

	@Query("select NEW com.jasamedika.medifirst2000.entities.JenisProduk(p.jenisProduk,p.kdJenisProduk,p.id) from JenisProduk p where p.kelompokProduk.id=:idKelompokProduk and  p.statusEnabled =true and p.id <> 34 "
			+ "and p.id not in (Select cast(s.nilaiField as int) from SettingDataFixed s where s.namaField='KdJenisProdukNotInBedah')")
	List<JenisProduk> findJenisProdukByKelompokProduk(@Param("idKelompokProduk") Integer idKelompokProduk);

	@Query("select NEW com.jasamedika.medifirst2000.entities.DetailJenisProduk(p.detailJenisProduk,p.kdDetailJenisProduk,p.id)  from DetailJenisProduk p where p.jenisProduk.id=:idJenisProduk and  p.statusEnabled=true order by detailJenisProduk asc")
	List<DetailJenisProduk> findDetailJenisProdukByJenisProduk(@Param("idJenisProduk") Integer idJenisProduk);

	@Query("select NEW com.jasamedika.medifirst2000.entities.Produk(p.kdProduk,p.namaProduk,p.id,p.bahanSample,p.keterangan) from Produk p where p.detailJenisProduk.id=:idDetailJenisProduk and  p.statusEnabled=true 	order by p.namaProduk asc")
	List<Produk> findDetailProdukByDetailJenisProduk(@Param("idDetailJenisProduk") Integer idDetailJenisProduk);

	@Query("select NEW com.jasamedika.medifirst2000.entities.Produk(p.kdProduk,p.namaProduk,p.id,p.satuanStandar) from Produk p where p.namaProduk like %:namaObat% and p.detailJenisProduk.jenisProduk.kelompokProduk.id='5' and  p.statusEnabled=true")
	List<Produk> findObatByNama(@Param("namaObat") String namaObat);

	@Query("select SUM(p.qtyProduk) from StokProdukGlobal p where p.ruangan.id=:idRuangan and p.produk.id=:idProduk")
	Integer findStokRuangan(@Param("idProduk") Integer idProduk, @Param("idRuangan") Integer idRuangan);

	@Query("select SUM(p.qtyProduk) from StokProdukGlobal p where p.ruangan.id=:idRuangan and p.produk.id=:idProduk")
	Double findStokRuanganDouble(@Param("idProduk") Integer idProduk, @Param("idRuangan") Integer idRuangan);

	@Query("select NEW com.jasamedika.medifirst2000.entities.Produk(p.kdProduk,p.namaProduk,p.id,p.satuanStandar) from Produk p where p.namaProduk like %:namaObat% and p.detailJenisProduk.jenisProduk.kelompokProduk.id='5' and  p.statusEnabled=true")
	List<Produk> findObatByNama(@Param("namaObat") String namaObat, Pageable page);

	@Query("select NEW com.jasamedika.medifirst2000.entities.Produk(p.kdProduk,p.namaProduk,p.id) from Produk p where p.detailJenisProduk.id=:idDetailJenisProduk and p.namaProduk like %:namaProduk% and  p.statusEnabled=true")
	List<Produk> findDetailProdukByDetailJenisProdukAndNamaProduk(
			@Param("idDetailJenisProduk") Integer idDetailJenisProduk, @Param("namaProduk") String namaProduk);

	Page<Produk> findFirst10ByDetailJenisProdukJenisProdukKelompokProdukIdAndNamaProdukContaining(int kdKelompokProduk,
			String keyWord, Pageable pageable);

	@Query("SELECT distinct kp FROM KelompokProduk kp,JenisProduk jm ,DetailJenisProduk djp where kp.kdKelompokProduk = jm.kelompokProduk.kdKelompokProduk  and djp.jenisProduk.kdJenisProduk = jm.kdJenisProduk  and  kp.statusEnabled=true and kp.isHavingStok =1")
	public List<KelompokProduk> getKelompokProdukHaveStok();

	@Query("select count(p.id) from Produk p ")
	public Integer getCount();

	@Query("select NEW com.jasamedika.medifirst2000.entities.Pegawai(p.namaLengkap, p.namaPanggilan, p.nikIntern, p.nipPns, p.noIdentitas,p.npwp,p.id) from SettingDataFixed s,JenisPegawai j,Pegawai p where  j.kdJenisPegawai=s.nilaiField and j.id=p.jenisPegawaiId and j.id= (Select cast(s.nilaiField as int) from  SettingDataFixed s where s.namaField='KdJenisPegawaiDokter') group by p.id")
	public List<Pegawai> getAllDokter();

	@Query("select NEW com.jasamedika.medifirst2000.entities.Produk(p.kdProduk,p.namaProduk,p.id) from Produk p where p.detailJenisProduk.id = (Select cast(s.nilaiField as int) from  SettingDataFixed s where s.namaField='KdJenisLimbahInProduk')")
	List<Produk> findProdukJenisLimbah();

	@Query("select m from Produk m join fetch m.satuanStandar where m.id=:id")
	Produk findProdukWithSatuanStandard(@Param("id") Integer id);

	Produk findByBentukProdukIdAndRhesusIdAndGolonganDarahId(Integer idBentuk, Integer idRhesus,
			Integer idGolonganDarah);

	@Query("select NEW Map(p.id as idProduk,p.namaProduk as namaProduk, " + " h.hargaSatuan as hargaSatuan) "
			+ " from Produk p,HargaNettoProdukByKelas h " + " where p.id=h.produkId and "
			+ " lower(p.namaProduk) like '%rumah duka , pasien%' " + " group by p.id, p.namaProduk, h.hargaSatuan")
	List<PemakaianRumahDukaDto> findProdukRumahDuka();

	@Query("select NEW com.jasamedika.medifirst2000.entities.Produk(p.kdProduk,p.namaProduk,p.id) from Produk p, DetailJenisProduk d, JenisProduk j, KelompokProduk k where d.id=p.detailJenisProdukId and j.id=d.jenisProdukId and k.id=j.kelompokProdukId and k.kdKelompokProduk=(Select cast(s.nilaiField as int) from SettingDataFixed s where s.namaField='KdKelompokProdukPM') order by p.id")
	List<Produk> findProdukByKelompokProduk();

	@Query("select NEW com.jasamedika.medifirst2000.entities.Produk(p.kdProduk,p.namaProduk,p.id) from Produk p where p.id=:id")
	Produk findById(@Param("id") Integer id);

	@Query("select p from Produk p where p.id=:id")
	Produk findByIdProduk(@Param("id") Integer id);

	// Sewa Lahan - Sarpras
	@Query("select NEW Map(p.id as idProduk,p.namaProduk as namaProduk,r.id as idRuangan,r.namaRuangan as namaRuangan,"
			+ "dtl.detailJenisProduk as detailJenisProduk,hrg.hargaSatuan as hargaSatuan) "
			+ "from Produk p,HargaNettoProdukByKelas hrg,DetailJenisProduk dtl,Departemen dpt,Ruangan r "
			+ "where lower(deskripsiProduk) like '%inventaris - gedung%' and p.id=hrg.produkId "
			+ "and dtl.id=p.detailJenisProdukId and dpt.id=r.departemenId "
			+ " and dpt.id=p.departemenId and r.namaRuangan like '%Sarana%' "
			+ " group by p.id,p.namaProduk,r.id,r.namaRuangan,dtl.detailJenisProduk,hrg.hargaSatuan")
	List<SewaLahanDto> findProdukSewaLahan();

	@Query("select model from Produk model where model.id = :id")
	Produk findByProdukId(@Param("id") Integer id);

	@Query("select NEW com.jasamedika.medifirst2000.entities.Produk(p.kdProduk,p.namaProduk,p.id) from Produk p where p.namaProduk=:namaProduk")
	List<Produk> findKodeProdukByNamaProduk(@Param("namaProduk") String namaProduk);

	@Query("select NEW com.jasamedika.medifirst2000.dto.OrderAmbulanceDto(p.id,p.namaProduk,h.hargaSatuan) from "
			+ "Produk p, HargaNettoProdukByKelas h where p.id=h.produkId and lower(p.deskripsiProduk) like '%ambulan%' order by p.id")
	List<OrderAmbulanceDto> findProdukAmbulance();

	@Query("select NEW com.jasamedika.medifirst2000.dto.MappingCycleDto(p.namaProduk,p.kdProduk,s.satuanStandar,s.id,p.id) from Produk p, DetailJenisProduk d, JenisProduk j, SatuanStandar s where d.id=p.detailJenisProdukId and j.id=d.jenisProdukId and s.id=p.satuanStandarId and d.id=(Select cast(s.nilaiField as int) from SettingDataFixed s where s.namaField='KdDetailJenisProdukBahanLoundry') order by p.id")
	List<MappingCycleDto> findNamaBahan();

	@Query("select NEW com.jasamedika.medifirst2000.entities.Produk(p.kdProduk,p.namaProduk,p.id) from Produk p "
			+ "where p.id in (Select cast(s.nilaiField as int) from SettingDataFixed s where s.namaField='KdProdukAmbulance') order by p.id")
	List<Produk> findNamaAssetAmbulance();

	@Query("select NEW com.jasamedika.medifirst2000.entities.Produk(p.kdProduk,p.namaProduk,p.id) from Produk p, DetailJenisProduk d, JenisProduk j, KelompokProduk k where d.id=p.detailJenisProdukId and j.id=d.jenisProdukId and k.id=j.kelompokProdukId and k.kdKelompokProduk=(Select cast(s.nilaiField as int) from SettingDataFixed s where s.namaField='KdKelompokProdukKendaraanDinas') order by p.id")
	List<Produk> findNamaAssetKendaraanDinas();

	// Humas - Sarpras
	@Query("select NEW com.jasamedika.medifirst2000.entities.Produk(p.kdProduk,p.namaProduk,p.id) from Produk p where p.detailJenisProduk.id in (Select cast(s.nilaiField as int) from  SettingDataFixed s where s.namaField='KdDetailJenisProdukAkomodasi') ")
	List<Produk> findProdukByDetailJenisProdukAkomodasi();

	List<Produk> findByGenerikId(Integer idGeneric);

	@Query("select p.generik from Produk p where p.id=:id")
	Generik findGenerikByProdukId(@Param("id") Integer id);

	// Rumah Tangga - Sarpras
	@Query("select p from Produk p where p.id=:id and p.status='Tersedia'")
	Produk findStatusTersedia(@Param("id") Integer id);

	// Rumah Tangga - Sarpras
	@Query("select p from Produk p where p.id=:id and p.status='DIPAKAI'")
	Produk findStatusDipakai(@Param("id") Integer id);

	// Rumah Tangga - Sarpras
	@Query("select p from Produk p where p.id=:id and p.status='ORDER'")
	Produk findStatusOrder(@Param("id") Integer id);

	// Mesin Loundry - Sarpras
	@Query("select NEW com.jasamedika.medifirst2000.dto.MesinDto(p.namaProduk,p.kdProduk,s.satuanStandar,s.id,p.id) from Produk p, DetailJenisProduk d, JenisProduk j, SatuanStandar s where d.id=p.detailJenisProdukId and j.id=d.jenisProdukId and s.id=p.satuanStandarId and d.id=(Select cast(s.nilaiField as int) from SettingDataFixed s where s.namaField='KdDetailJenisProdukMesinLoundry') order by p.id")
	List<MesinDto> findMesin();

	// Mesin Loundry Dengan Kapasitas - Sarpras
	@Query("select NEW com.jasamedika.medifirst2000.dto.MesinDto(m.kapasitas,p.namaProduk,p.kdProduk,s.satuanStandar,ss.satuanStandar as satuanKapasitas,m.id,s.id,ss.id as idKapasitas,p.id) from Produk p, DetailJenisProduk d, JenisProduk j, SatuanStandar s, SatuanStandar ss, Mesin m where ss.id=m.satuanId and p.id=m.mesinId and d.id=p.detailJenisProdukId and j.id=d.jenisProdukId and s.id=p.satuanStandarId and d.id=(Select cast(s.nilaiField as int) from SettingDataFixed s where s.namaField='KdDetailJenisProdukMesinLoundry') order by p.id")
	List<MesinDto> findMesinDenganKapasitas();

	// Set Paket Penerimaan Sterilisasi Alat
	@Query("select NEW com.jasamedika.medifirst2000.dto.PaketDanNonPaketDto(pkt.id,pkt.kdPaket,pkt.namaPaket,jp.id,jp.jenisPaket,p.id,p.namaProduk,mptp.qtyProduk,ss.id,ss.satuanStandar) from Produk p, Paket pkt, JenisPaket jp, MapPaketToProduk mptp, SatuanStandar ss where jp.id=pkt.jenisPaketId and pkt.id=mptp.paketId and p.id=mptp.produkId and ss.id=mptp.satuanId order by pkt.id")
	List<PaketDanNonPaketDto> findPaket();

	// Status Sewa Lahan - Sarpras
	@Query("select NEW com.jasamedika.medifirst2000.dto.SewaLahanDto(p.id,p.namaProduk,h.hargaSatuan,so.tglPelayananAwal,so.tglPelayananAkhir,"
			+ "so.status) from HargaNettoProdukByKelas h, Produk p, StrukOrder so "
			+ "where date(so.tglPelayananAwal) between date(:periodeAwal) and date(:periodeAkhir) "
			+ "and so.status='DIPAKAI' and p.id=h.produkId and p.id=:idProduk and so.noOrderIntern like '%SL%'")
	List<SewaLahanDto> findStatusLahan(@Param("periodeAwal") String periodeAwal,
			@Param("periodeAkhir") String periodeAkhir, @Param("idProduk") Integer idProduk);

	// Pelayanan Pemulasaraan Jenazah - Sarpras
	@Query("select NEW Map(p.id as idProduk,p.namaProduk as namaProduk,h.id as idHarga,h.hargaSatuan as hargaSatuan) "
			+ "from Produk p,HargaNettoProdukByKelas h where p.id=h.produkId and lower(p.namaProduk) like '%jenazah%'")
	List<Produk> findPelayananPemulasaraanJenazah();

	@Query("select NEW map(p.kdProduk as kdProduk,p.namaProduk as namaProduk,p.id as id) from Produk p where p.detailJenisProduk.id=:idDetailJenisProduk and  p.statusEnabled=true")
	List<Map<String, Object>> findProdukByDetailJenisProdukAndNamaProduk(
			@Param("idDetailJenisProduk") Integer idDetailJenisProduk, Pageable pageable);

	String strTindakanSkor = "select distinct new Map(prd.id as id,prd.namaProduk as namaProduk) "
			+ "from HargaNettoProdukByKelas hnk, MapRuanganToProduk mrp " + "inner join hnk.produk prd "
			+ "where hnk.produkId = mrp.produkId " + "and mrp.produkId = prd.id " + "and hnk.statusEnabled is true "
			+ "and prd.statusEnabled is true " + "and hnk.kodeExternal = '2017' " + "and mrp.kodeExternal = '2017' "
			+ "and prd.detailJenisProdukId in (:listDetailJenisProdukId)";

	String whrDaftarTindakan = " and prd.id not in (:listProdukId)";

	String whrNamaTindakan = " and lower(prd.namaProduk) like %:namaProduk%";

	String srtTindakan = " order by prd.namaProduk";

	/**
	 * @param listIdDetailJenisProduk
	 *            Kategori tindakan yang boleh masuk logbook skor kinerja dokter
	 * @param listIdProduk
	 *            Daftar tindakan yang sudah dilakukan skor remunerasi
	 * @return Daftar tindakan belum ada skor remunerasi
	 */
	@Query(strTindakanSkor + whrDaftarTindakan + srtTindakan)
	List<Map<String, Object>> findTindakanBelumAdaSkor(
			@Param("listDetailJenisProdukId") List<Integer> listIdDetailJenisProduk,
			@Param("listProdukId") List<Integer> listIdProduk);

	/**
	 * @param listIdDetailJenisProduk
	 *            Kategori tindakan yang boleh masuk logbook skor kinerja dokter
	 * @param pageable
	 *            Pengaturan limit dan offset
	 * @return Daftar tindakan logbook skor kinerja dokter
	 */
	@Query(strTindakanSkor + srtTindakan)
	List<Map<String, Object>> findTindakanLogbookSkor(
			@Param("listDetailJenisProdukId") List<Integer> listIdDetailJenisProduk, Pageable pageable);

	/**
	 * @param listIdDetailJenisProduk
	 *            Kategori tindakan yang boleh masuk logbook skor kinerja dokter
	 * @param namaProduk
	 *            Nama tindakan
	 * @param pageable
	 *            Pengaturan limit dan offset
	 * @return Daftar tindakan logbook skor kinerja dokter
	 */
	@Query(strTindakanSkor + whrNamaTindakan + srtTindakan)
	List<Map<String, Object>> findTindakanLogbookSkor(
			@Param("listDetailJenisProdukId") List<Integer> listIdDetailJenisProduk,
			@Param("namaProduk") String namaProduk, Pageable pageable);

	@Query("select new Map (p.namaExternal as jenisProduk,p.id as id ) from DetailJenisProduk p where p.jenisProdukId in "
			+ "(select jenisPro.id from JenisProduk jenisPro where jenisPro.kelompokProduk.id in "
			+ "(select t from KelompokProduk t where t.id in (20,24))))")
	List<Map<String, Object>> detailJenisProduk();

	@Query("select new Map (p.id as id,p.namaProduk as namaProduk) from Produk p where p.deskripsiProduk = 'Pelayanan Gizi'")
	List<Map<String, Object>> findMenuGizi();

	@Query("select new Map (p.id as id,p.namaProduk as namaProduk) from Produk p where p.deskripsiProduk = 'Bahan Makanan'")
	List<Map<String, Object>> findBahanGizi();

	@Query("select new map( p.id as id,p.namaProduk as namaProduk,satuan.id as idSatuan,satuan.satuanStandar as namaSatuan ) from Produk p left join p.detailJenisProduk djp left join djp.jenisProduk jenisProduk left join p.satuanStandar satuan left join jenisProduk.kelompokProduk kelompokProduk where kelompokProduk.id=:id and lower (p.namaProduk) like '%' || :value || '%' )")
	List<Map<String, Object>> findProdukByKelompok(@Param("id") Integer id, @Param("value") String value,
			Pageable topTen);

	@Query("select p from Produk p where p.id=:id")
	Produk findByIdObject(@Param("id") Integer id);

	@Query("select new Map(satuanStandar as satuan,satuanStandar.satuanStandar as satuanStandar,satuanStandar.id as id) from Produk p left join p.satuanStandar satuanStandar where p.id=:id")
	Map<String, Object> getSatuanProdukByProduk(@Param("id") Integer id);

	@Query("select model from Produk model where model.detailJenisProduk.id=:id ")
	List<Produk> findProdukByDetailJenisProduk(@Param("id") Integer id);

	@Query(" select new Map( \n" + " p.id as id, \n" + " p.kdProduk as kdProduk, \n" + " p.namaProduk as namaProduk, \n"
			+ " bp.id as bentukProdukId, \n" + " bp.namaBentukProduk as namaBentukProduk, \n"
			+ " djp.id as detailJenisId, \n" + " djp.detailJenisProduk as detailJenisProduk) \n" + " from Produk p \n"
			+ " left join p.bentukProduk bp \n" + " left join p.detailJenisProduk djp \n"
			+ " where p.departemenId = 6 \n" + " and   p.deskripsiProduk = 'Pelayanan Gizi'")
	List<Map<String, Object>> findMenuProduk();

	@Query("select new map(p.id as id,p.namaProduk as namaProduk ,satuanStandar.id as idSatuanStandar,satuanStandar.satuanStandar as namaSatuanStandar) from Produk p left join p.detailJenisProduk djp left join djp.jenisProduk jenisProduk left join jenisProduk.kelompokProduk kelompokProduk left join p.satuanStandar satuanStandar where jenisProduk.id=:id and lower (p.namaProduk) like '%' || :value || '%' )")
	List<Map<String, Object>> findProdukByJenisProdukAndNamaProduk(@Param("id") Integer id,
			@Param("value") String value, Pageable topTen);

	@Query("select djp.isRegistrasiAset from Produk p left join p.detailJenisProduk djp where p.id=:id ")
	Byte isRegisterAset(@Param("id") Integer id);

	@Query("select a from Produk a " + "left join a.detailJenisProduk b " + "left join b.jenisProduk c "
			+ "where c = (Select cast(s.nilaiField as int) from  SettingDataFixed s where s.namaField='kdProdukMenuGizi')  ")
	List<Produk> findProdukGiziMenuTambahan();

	@Query("select new Map(produk.id as id,produk.namaProduk as namaProduk) from RegistrasiAset registerAset left join registerAset.produk produk where  lower (produk.namaProduk) like '%' || :values || '%' group by produk.id,produk.namaProduk")
	List<Map<String, Object>> findProdukAset(@Param("values") String values, Pageable topTen);

	@Query("select new map(registerAset.noRec as noRec,registerAset.noRegisterAset as noRegisterAset,produk.namaProduk as namaProduk,produk.id as idProduk) from RegistrasiAset registerAset "
			+ "left join registerAset.produk produk where registerAset.ruanganId  "
			+ " in (:ruanganId) and lower (registerAset.noRegisterAset) like '%' || :values || '%' and produk.id=:id ")
	List<Map<String, Object>> findAsetByProduk(@Param("id") Integer id, @Param("values") String values,
			@Param("ruanganId") Integer ruanganId, Pageable topTen);

	@Query("select NEW map (p.namaProduk as namaProduk,p.id as id) from Produk p where lower(p.namaProduk) like %:values%")
	List<Map<String, Object>> findProduk(@Param("values") String values, Pageable topTen);

	@Query("select NEW map (p.id as id,p.namaRekanan as namaRekanan) from Rekanan p where lower(p.namaRekanan) like %:values% ")
	List<Map<String, Object>> findSupplier(@Param("values") String values, Pageable topTen);

	@Query("select NEW com.jasamedika.medifirst2000.entities.JenisProduk(p.jenisProduk,p.kdJenisProduk,p.id) from JenisProduk p where p.kelompokProduk.id = 1 and p.id <> 34 and p.id <> 45 and p.id <> 4 and p.id <> 111 and p.id <> 8 and p.id <> 35  and  p.statusEnabled =true "
			+ "and p.id not in (Select cast(s.nilaiField as int) from SettingDataFixed s where s.namaField='KdJenisProdukNotInBedah')")
	List<JenisProduk> findJenisProdukLaboratorium();

	@Query("select NEW map (produk.namaProduk as namaObat, produk.id as id) " + "from Produk produk "
			+ "left join produk.detailJenisProduk detail " + "left join detail.jenisProduk jenisProduk "
			+ "where jenisProduk.id = 97 ")
	List<Map<String, Object>> findObat();

	@Query("select new Map(model.id as produkId, " + "model.namaProduk as namaProduk, "
			+ "satuanstandar.id as satuanStandarId, " + "satuanstandar.satuanStandar as namaSatuanStandar) "
			+ " from Produk model " + "left join model.satuanStandar satuanstandar " + "where model.id=:produkId")
	Map<String, Object> findProdukAndSatuanStandar(@Param("produkId") Integer produkId);

	@Query("select NEW map(p.kdProduk as kdProduk,p.namaProduk as namaProduk,p.id as id) from Produk p where p.id=:produkId")
	Map<String, Object> findProdukById(@Param("produkId") Integer produkId);

	@Query("select NEW map(produkAsal.namaProduk as namaProduk,produkAsal.id as idProduk,pfp.qtyProdukAsal as qtyProdukAsal) from ProdukFormulaProduksi pfp left join pfp.produkAsal produkAsal left join pfp.produkHasil produkHasil where produkHasil.id=:produkId")
	List<Map<String, Object>> findBahanMentah(@Param("produkId") Integer produkId);

	@Query("select NEW  Produk(p.kdProduk,p.namaProduk,p.id) from Produk p where lower(p.namaProduk) = lower (:name) and p.detailJenisProduk.jenisProduk.kelompokProduk.id='279' and  p.statusEnabled=true")
	Produk findProdukByName(@Param("name") String name);

	String strQueryTarifLayananBaru = "select distinct new Map(pd.id as idProduk,pd.namaProduk as namaProduk,"
			+ "kl.id as idKelas,kl.namaKelas as namaKelas,"
			+ "kh.id as idJasa,hp.hargaNetto1 as hargaLayanan,hd.hargaNetto1 as hargaJasa) "
			+ "from MapRuanganToProduk mr, HargaNettoProdukByKelas hp, HargaNettoProdukByKelasD hd "
			+ "inner join mr.produk pd " + "inner join mr.ruangan ru " + "inner join hp.kelas kl "
			+ "inner join hd.komponenHarga kh " + "inner join pd.detailJenisProduk dj " + "inner join ru.departemen dp "
			+ "inner join dj.jenisProduk jp " + "where mr.produkId = hp.produkId and mr.produkId = hd.produkId "
			+ "and hp.produkId = hd.produkId and hp.kelasId = hd.kelasId and hp.produkId = pd.id "
			+ "and hd.produkId = pd.id and hd.kelasId = kl.id "
			+ "and pd.id not in (402611,10011571,10011572,10014240,10014241,10014242,10014243) "
			+ "and ((kl.id in (1,2,3,5,6,8) and dp.id = 25 or (dp.id in (1,16) and ru.id in (42,45,75,76,79,80,328,463,464,466))) "
			+ "or (kl.id in (1,2,3,5,8) and dp.id = 16 and ru.id not in (45,75,76,79,80,328,463,464,466)) "
			+ "or (kl.id = 6 and dp.id in (3,18,24,27,28))) " + "and kh.id in (6,21,22,25,26,27,30,35,38) "
			+ "and jp.id not in (43,82,91,97,116,178,184,186,188,191,197,216) " + "and ru.id = :idRuangan "
			+ "and hp.statusEnabled is true " + "and hd.statusEnabled is true " + "and pd.statusEnabled is true "
			+ "and kh.statusEnabled is true ";
	
	String strQueryTarifLayananLama = "select distinct new Map(pd.id as idProduk,pd.namaProduk as namaProduk,"
			+ "kl.id as idKelas,kl.namaKelas as namaKelas,"
			+ "kh.id as idJasa,hp.hargaNetto1 as hargaLayanan,hd.hargaNetto1 as hargaJasa) "
			+ "from MapRuanganToProduk mr, HargaNettoProdukByKelas hp, HargaNettoProdukByKelasD hd "
			+ "inner join mr.produk pd " + "inner join mr.ruangan ru " + "inner join hp.kelas kl "
			+ "inner join hd.komponenHarga kh " + "inner join pd.detailJenisProduk dj " + "inner join ru.departemen dp "
			+ "inner join dj.jenisProduk jp " + "where mr.produkId = hp.produkId and mr.produkId = hd.produkId "
			+ "and hp.produkId = hd.produkId and hp.kelasId = hd.kelasId and hp.produkId = pd.id "
			+ "and hd.produkId = pd.id and hd.kelasId = kl.id "
			+ "and pd.id not in (402611,10011571,10011572,10014240,10014241,10014242,10014243) "
			+ "and ((kl.id in (1,2,3,5,6,8) and dp.id = 25 or (dp.id in (1,16) and ru.id in (42,45,75,76,79,80,328,463,464,466))) "
			+ "or (kl.id in (1,2,3,5,8) and dp.id = 16 and ru.id not in (45,75,76,79,80,328,463,464,466)) "
			+ "or (kl.id = 6 and dp.id in (3,18,24,27,28))) " + "and kh.id in (6,21,22,25,26,27,30,35,38) "
			+ "and jp.id not in (43,82,91,97,116,178,184,186,188,191,197,216) " + "and ru.id = :idRuangan "
			+ "and hp.statusEnabled is false " + "and pd.statusEnabled is true "
			+ "and kh.statusEnabled is true ";

	String produkTarifLayanan = "and pd.id = :idProduk ";

	String kelasTarifLayanan = "and kl.id = :idKelas ";

	String sortTarifLayanan = " order by pd.namaProduk,kl.namaKelas";

	@Query(strQueryTarifLayananBaru + produkTarifLayanan + kelasTarifLayanan + sortTarifLayanan)
	public List<Map<String, Object>> findTarifLayananKelasProduk(@Param("idRuangan") Integer idRuangan,
			@Param("idProduk") Integer idProduk, @Param("idKelas") Integer idKelas);

	@Query(strQueryTarifLayananBaru + produkTarifLayanan + sortTarifLayanan)
	public List<Map<String, Object>> findTarifLayananProduk(@Param("idRuangan") Integer idRuangan,
			@Param("idProduk") Integer idProduk);

	@Query(strQueryTarifLayananBaru + kelasTarifLayanan + sortTarifLayanan)
	public List<Map<String, Object>> findTarifLayananKelas(@Param("idRuangan") Integer idRuangan,
			@Param("idKelas") Integer idKelas);

	@Query(strQueryTarifLayananBaru + sortTarifLayanan)
	public List<Map<String, Object>> findTarifLayananRuangan(@Param("idRuangan") Integer idRuangan);
	

	@Query(strQueryTarifLayananLama + produkTarifLayanan + kelasTarifLayanan + sortTarifLayanan)
	public List<Map<String, Object>> findTarifLayananLamaKelasProduk(@Param("idRuangan") Integer idRuangan,
			@Param("idProduk") Integer idProduk, @Param("idKelas") Integer idKelas);

	@Query(strQueryTarifLayananLama + produkTarifLayanan + sortTarifLayanan)
	public List<Map<String, Object>> findTarifLayananLamaProduk(@Param("idRuangan") Integer idRuangan,
			@Param("idProduk") Integer idProduk);

	@Query(strQueryTarifLayananLama + kelasTarifLayanan + sortTarifLayanan)
	public List<Map<String, Object>> findTarifLayananLamaKelas(@Param("idRuangan") Integer idRuangan,
			@Param("idKelas") Integer idKelas);

	@Query(strQueryTarifLayananLama + sortTarifLayanan)
	public List<Map<String, Object>> findTarifLayananLamaRuangan(@Param("idRuangan") Integer idRuangan);

	String strQryCekNamaProduk = "select new Map(pd.id as id,pd.namaProduk as namaProduk) "
			+ "from Produk pd where pd.statusEnabled is true "
			+ "and lower(regexp_replace(pd.namaProduk,:patternText,'','g')) = :namaProduk";

	String idProdukLama = " and pd.id <> :idProduk";

	@Query(strQryCekNamaProduk)
	public List<Map<String, Object>> checkNamaProdukBaru(@Param("patternText") String patternText,
			@Param("namaProduk") String namaProduk);

	@Query(strQryCekNamaProduk + idProdukLama)
	public List<Map<String, Object>> checkNamaProdukLama(@Param("patternText") String patternText,
			@Param("idProduk") Integer idProduk, @Param("namaProduk") String namaProduk);

	@Query("select new Map(mpp.statusEnabled as statusEnabled," + "pd.id as idProduk,pd.namaProduk as namaProduk,"
			+ "ss.id as idSatuanStandar,ss.satuanStandar as satuanStandar,"
			+ "djp.id as idDetailJenisProduk,djp.detailJenisProduk as detailJenisProduk,"
			+ "jp.id as idJenisProduk,jp.jenisProduk as jenisProduk,"
			+ "kp.id as idKelompokProduk,kp.kelompokProduk as kelompokProduk,"
			+ "jpk.id as idJenisPaket,jpk.jenisPaket as jenisPaket," + "pk.id as idPaket,pk.namaPaket as namaPaket) "
			+ "from Produk pd, MapPaketToProduk mpp " + "left join pd.detailJenisProduk djp "
			+ "left join djp.jenisProduk jp " + "left join jp.kelompokProduk kp " + "left join mpp.paket pk "
			+ "left join pk.jenisPaket jpk " + "left join pd.satuanStandar ss " + "where pd.id = mpp.produkId "
			+ "and mpp.id = :idMapping")
	public Map<String, Object> getMappingPaketToProduk(@Param("idMapping") Integer idMapping);

	@Query("select distinct new Map(prd.id as id, prd.namaProduk as namaProduk) "
			+ "from MapRuanganToProduk mpr, HargaNettoProdukByKelas hnp " + "inner join mpr.produk prd "
			+ "inner join mpr.ruangan ru " + "inner join hnp.kelas kls " + "where mpr.produkId = hnp.produkId "
			+ "and mpr.ruanganId = :ruanganId " + "and hnp.statusEnabled is true " + "and mpr.kodeExternal = '2017' "
			+ "and hnp.kodeExternal = '2017' " + "order by prd.namaProduk")
	List<Map<String, Object>> findDaftarInputTindakanByRuangan(@Param("ruanganId") Integer idRuangan);
}
