package com.jasamedika.medifirst2000.dao;

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

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.entities.IndekKinerja;
import com.jasamedika.medifirst2000.entities.UraianTugasM;

/**
 * Repository class for IndekKinerja
 * 
 * @author Generator
 */
@Repository("IndekKinerjaDao")
public interface IndekKinerjaDao extends PagingAndSortingRepository<IndekKinerja, String> {

	@Query("select model from IndekKinerja model where year(model.tanggal)=:tahun and  month(model.tanggal)=:bulan and model.pegawai.id=:pegawai ")
	List<IndekKinerja> findKinerja(@Param("tahun") Integer tahun, @Param("bulan") Integer bulan,
			@Param("pegawai") Integer pegawai);

	@Query(" select distinct new Map( pelayananPasien.tglPelayanan as tglPelayanan,jenisProduk.id as idJenisProduk,"
			+ " produk.namaProduk as namaProduk, produk.id as idProduk)"
			+ " from PelayananPasienPetugas pelayananPasienPetugas"
			+ " left join pelayananPasienPetugas.kdpegawai dokter"
			+ " left join pelayananPasienPetugas.pelayananPasien pelayananPasien"
			+ " left join pelayananPasien.produk produk " + " left join produk.detailJenisProduk detail"
			+ " left join detail.jenisProduk jenisProduk "
			+ "where dokter.id=:id and to_char(pelayananPasien.tglPelayanan,'yyyy-MM-dd') "
			+ "between :startDate and :endDate and jenisProduk.id not in (:listIdJenisProduk) ")
	public List<Map<String, Object>> findByIdUser(@Param("id") Integer id, @Param("startDate") String startDate,
			@Param("endDate") String endDate, @Param("listIdJenisProduk") List<Integer> listIdJenisProduk);

	@Query(" select distinct new Map( pelayananPasien.tglPelayanan as tglPelayanan,jenisProduk.id as idJenisProduk,"
			+ " produk.namaProduk as namaProduk, produk.id as idProduk)"
			+ " from PelayananPasienPetugas pelayananPasienPetugas"
			+ " left join pelayananPasienPetugas.kdpegawai dokter"
			+ " left join pelayananPasienPetugas.pelayananPasien pelayananPasien"
			+ " left join pelayananPasien.produk produk " + " left join produk.detailJenisProduk detail"
			+ " left join detail.jenisProduk jenisProduk "
			+ "where dokter.id=:id and to_char(pelayananPasien.tglPelayanan,'yyyy-MM-dd') "
			+ "between :startDate and :endDate and jenisProduk.id not in (:listIdJenisProduk) and detail.id not in (:listIdDetailJenisProduk) ")
	public List<Map<String, Object>> findByIdUserWithException(@Param("id") Integer id,
			@Param("startDate") String startDate, @Param("endDate") String endDate,
			@Param("listIdJenisProduk") List<Integer> listIdJenisProduk,
			@Param("listIdDetailJenisProduk") List<Integer> listIdDetailJenisProduk);

	// detail.id as detailId,
	@Query(" select distinct new map (case when pelayananPasienPetugas.kdjenispetugaspe.id in (6,13) then pelayananPasienPetugas.kdjenispetugaspe.id else 4 end as idJenisPelaksana, produk.namaProduk as namaProduk, produk.id as idProduk, "
			+ " pelayananPasien.hargaSatuan as harga, kelas.namaKelas as namaKelas, kelas.id as idKelas, detail.id as detailId, "
			+ " (select distinct harga.hargaNetto1 from HargaNettoProdukByKelas harga where harga.produkId = produk.id "
			+ "and ((harga.statusEnabled is true and harga.reportDisplay = 'tarif_2022_Nov') "
			+ "or (harga.statusEnabled is false and harga.reportDisplay <> 'tarif_2022_Nov')) "
			+ "and harga.kelasId = 3) as hargaKelas1, "
			+ " dokter.id as idPegawai) " + " from PelayananPasienPetugas pelayananPasienPetugas"
			+ " left join pelayananPasienPetugas.kdpegawai dokter"
			+ " left join pelayananPasienPetugas.pelayananPasien pelayananPasien"
			+ " left join pelayananPasien.produk produk " + " left join pelayananPasien.kelas kelas "
			+ " left join produk.detailJenisProduk detail" + " left join detail.jenisProduk jenisProduk "
			+ "where dokter.id=:id and pelayananPasien.tglPelayanan between "
			+ " :start and :end and jenisProduk.id not in (:listIdJenisProduk) "
			+ " group by pelayananPasienPetugas.kdjenispetugaspe.id, kelas.id,kelas.namaKelas,  produk.id, produk.namaProduk ,pelayananPasien.hargaSatuan ,detail.id, dokter.id "
			+ " order by kelas.namaKelas, produk.namaProduk asc ")
	public List<Map<String, Object>> findIdProdukByIdUser(@Param("id") Integer id, @Param("start") Date start,
			@Param("end") Date end, @Param("listIdJenisProduk") List<Integer> listIdJenisProduk);

	@Query(" select distinct new map (case when pelayananPasienPetugas.kdjenispetugaspe.id in (6,13) then pelayananPasienPetugas.kdjenispetugaspe.id else 4 end as idJenisPelaksana, produk.namaProduk as namaProduk, produk.id as idProduk, "
			+ " pelayananPasien.hargaSatuan as harga, kelas.namaKelas as namaKelas, kelas.id as idKelas, detail.id as detailId, "
			+ " (select distinct harga.hargaNetto1 from HargaNettoProdukByKelas harga where harga.produkId = produk.id"
			+ " and ((harga.statusEnabled is true and harga.reportDisplay = 'tarif_2022_Nov') "
			+ "or (harga.statusEnabled is false and harga.reportDisplay <> 'tarif_2022_Nov')) "
			+ "and harga.kelasId = 3) as hargaKelas1, "
			+ " dokter.id as idPegawai) " + " from PelayananPasienPetugas pelayananPasienPetugas"
			+ " left join pelayananPasienPetugas.kdpegawai dokter"
			+ " left join pelayananPasienPetugas.pelayananPasien pelayananPasien"
			+ " left join pelayananPasien.produk produk " + " left join pelayananPasien.kelas kelas "
			+ " left join produk.detailJenisProduk detail" + " left join detail.jenisProduk jenisProduk "
			+ "where dokter.id=:id and pelayananPasien.tglPelayanan between "
			+ " :start and :end and jenisProduk.id not in (:listIdJenisProduk) and detail.id not in (:listIdDetailJenisProduk) "
			+ " group by pelayananPasienPetugas.kdjenispetugaspe.id, kelas.id,kelas.namaKelas,  produk.id, produk.namaProduk ,pelayananPasien.hargaSatuan ,detail.id, dokter.id "
			+ " order by kelas.namaKelas, produk.namaProduk asc ")
	public List<Map<String, Object>> findIdProdukByIdUserWithDetailException(@Param("id") Integer id,
			@Param("start") Date start, @Param("end") Date end,
			@Param("listIdJenisProduk") List<Integer> listIdJenisProduk,
			@Param("listIdDetailJenisProduk") List<Integer> listIdDetailJenisProduk);

	@Query(" select  produk.id " + " from PelayananPasienPetugas pelayananPasienPetugas"
			+ " left join pelayananPasienPetugas.kdpegawai dokter"
			+ " left join pelayananPasienPetugas.pelayananPasien pelayananPasien"
			+ " left join pelayananPasien.produk produk " + " left join pelayananPasien.kelas kelas "
			+ " left join produk.detailJenisProduk detail" + " left join detail.jenisProduk jenisProduk "
			+ "where dokter.id=:id and pelayananPasien.tglPelayanan between "
			+ " :start and :end and jenisProduk.id not in (:listIdJenisProduk) ")
	public List<Integer> findIdProdukByIdUser2(@Param("id") Integer id, @Param("start") Date start,
			@Param("end") Date end, @Param("listIdJenisProduk") List<Integer> listIdJenisProduk);

	@Query(" select  produk.id " + " from PelayananPasienPetugas pelayananPasienPetugas"
			+ " left join pelayananPasienPetugas.kdpegawai dokter"
			+ " left join pelayananPasienPetugas.pelayananPasien pelayananPasien"
			+ " left join pelayananPasien.produk produk " + " left join pelayananPasien.kelas kelas "
			+ " left join produk.detailJenisProduk detail" + " left join detail.jenisProduk jenisProduk "
			+ "where dokter.id=:id and pelayananPasien.tglPelayanan between "
			+ " :start and :end and jenisProduk.id not in (:listIdJenisProduk) and detail.id not in (:listDetailJenisProduk) ")
	public List<Integer> findIdProdukByIdUser2WithException(@Param("id") Integer id, @Param("start") Date start,
			@Param("end") Date end, @Param("listIdJenisProduk") List<Integer> listIdJenisProduk,
			@Param("listDetailJenisProduk") List<Integer> listDetailJenisProduk);

	@Query(" select distinct new map ( produk.namaProduk as namaProduk, produk.id as produkId,"
			+ " count(produk.namaProduk) as count,pelayananPasien.hargaSatuan as harga,detail.id as detailId,jenisProduk.id as idJenisProduk ) "
			+ " from PelayananPasienPetugas pelayananPasienPetugas"
			+ " left join pelayananPasienPetugas.kdpegawai dokter"
			+ " left join pelayananPasienPetugas.pelayananPasien pelayananPasien"
			+ " left join pelayananPasien.produk produk " + " left join produk.detailJenisProduk detail"
			+ " left join detail.jenisProduk jenisProduk "
			+ " where dokter.id=:id and jenisProduk.id not in (:listIdJenisProduk) and pelayananPasien.tglPelayanan between :start and :end "
			+ " group by produk.namaProduk, produk.id,pelayananPasien.hargaSatuan ,detail.id,jenisProduk.id")
	public List<Map<String, Object>> findTindakanByIdUser(@Param("id") Integer id, @Param("start") Date start,
			@Param("end") Date end, @Param("listIdJenisProduk") List<Integer> listIdJenisProduk);

	@Query(" select new map (produk.namaProduk as namaProduk,produk.id as produkId,"
			+ " count(produk.namaProduk) as count,to_char(pelayananPasien.tglPelayanan,'yyyy-MM-dd') as tglPelayanan )"
			+ " from PelayananPasienPetugas pelayananPasienPetugas "
			+ " left join pelayananPasienPetugas.kdpegawai dokter"
			+ " left join pelayananPasienPetugas.pelayananPasien pelayananPasien"
			+ " left join pelayananPasien.produk produk " + " left join produk.detailJenisProduk detail"
			+ " left join detail.jenisProduk jenisProduk "
			+ " where dokter.id=:id and jenisProduk.id not in (:listIdJenisProduk) "
			+ " and pelayananPasien.tglPelayanan between :start and :end "
			+ "group by produk.namaProduk,produk.id,to_char(pelayananPasien.tglPelayanan,'yyyy-MM-dd')"
			+ " order by to_char(pelayananPasien.tglPelayanan,'yyyy-MM-dd')")
	public List<Map<String, Object>> findTindakanByIdUserAndPeriod(@Param("id") Integer id, @Param("start") Date start,
			@Param("end") Date end, @Param("listIdJenisProduk") List<Integer> listIdJenisProduk);

	@Query(" select new map (produk.namaProduk as namaProduk,produk.id as produkId,"
			+ " count(produk.namaProduk) as count,to_char(pelayananPasien.tglPelayanan,'yyyy-MM-dd') as tglPelayanan )"
			+ " from PelayananPasienPetugas pelayananPasienPetugas "
			+ " left join pelayananPasienPetugas.kdpegawai dokter"
			+ " left join pelayananPasienPetugas.pelayananPasien pelayananPasien"
			+ " left join pelayananPasien.produk produk " + " left join produk.detailJenisProduk detail"
			+ " left join detail.jenisProduk jenisProduk "
			+ " where dokter.id=:id and jenisProduk.id not in (:listIdJenisProduk) and detail.id not in (:listIdDetailJenisProduk) "
			+ " and pelayananPasien.tglPelayanan between :start and :end"
			+ " group by produk.namaProduk,produk.id,to_char(pelayananPasien.tglPelayanan,'yyyy-MM-dd')"
			+ " order by to_char(pelayananPasien.tglPelayanan,'yyyy-MM-dd')")
	public List<Map<String, Object>> findTindakanByIdUserAndPeriodWithException(@Param("id") Integer id,
			@Param("start") Date start, @Param("end") Date end,
			@Param("listIdJenisProduk") List<Integer> listIdJenisProduk,
			@Param("listIdDetailJenisProduk") List<Integer> listIdDetailJenisProduk);

	@Query(" select new Map(rincianKegiatan.rincianKegiatan as rincianKegiatan, rincianKegiatan.id as idRincianKegiatan, "
			+ "jabatan.namaJabatan as namaJabatan, jabatan.id as idJabatan)" + " from UraianTugasM uraianTugas"
			+ " left join uraianTugas.rincianKegiatan rincianKegiatan " + " left join uraianTugas.jabatan jabatan "
			+ " left join uraianTugas.pelaksanaanTugas pelaksanaanTugas " + " left join uraianTugas.dokumen dokumen"
			+ " where jabatan.id=:idJabatan and pelaksanaanTugas.id=1" + " and uraianTugas.statusEnabled is true"
			+ " and rincianKegiatan.statusEnabled is true" + " and jabatan.statusEnabled is true"
			+ " and pelaksanaanTugas.statusEnabled is true")
	public List<Map<String, Object>> findUraianTugas(@Param("idJabatan") Integer idJabatan);

	@Query(" select uraianTugas " + " from UraianTugasM uraianTugas"
			+ " left join uraianTugas.rincianKegiatan rincianKegiatan " + " left join uraianTugas.jabatan jabatan "
			+ " left join uraianTugas.pelaksanaanTugas pelaksanaanTugas " + " left join uraianTugas.dokumen dokumen"
			+ " where jabatan.id=:idJabatan and pelaksanaanTugas.id=1" + " and uraianTugas.statusEnabled is true"
			+ " and rincianKegiatan.statusEnabled is true" + " and jabatan.statusEnabled is true"
			+ " and pelaksanaanTugas.statusEnabled is true" + " and dokumen.statusEnabled is true")
	public List<UraianTugasM> findUraianTugasByJabatan(@Param("idJabatan") Integer idJabatan);

	@Query(" select new Map( produk.namaProduk as namaProduk, count( distinct pelayananPasien.noRec) as count,jenisProduk.id as idJenisProduk)"
			+ " from PelayananPasienPetugas pelayananPasienPetugas"
			+ " left join pelayananPasienPetugas.kdpegawai dokter"
			+ " left join pelayananPasienPetugas.pelayananPasien pelayananPasien"
			+ " left join pelayananPasien.produk produk " + " left join produk.detailJenisProduk detail"
			+ " left join detail.jenisProduk jenisProduk"
			+ " where dokter.id=:id and pelayananPasien.tglPelayanan between :start and :end"
			+ " and jenisProduk.id not in (:listIdJenisProduk) group by produk.namaProduk,jenisProduk.id")
	public List<Map<String, Object>> findCountTindakanByIdUserAndPeriod(@Param("id") Integer id,
			@Param("start") Date start, @Param("end") Date end,
			@Param("listIdJenisProduk") List<Integer> listIdJenisProduk);

	@Query(" select new Map( produk.namaProduk as namaProduk, count( distinct pelayananPasien.noRec) as count,jenisProduk.id as idJenisProduk)"
			+ " from PelayananPasienPetugas pelayananPasienPetugas"
			+ " left join pelayananPasienPetugas.kdpegawai dokter"
			+ " left join pelayananPasienPetugas.pelayananPasien pelayananPasien"
			+ " left join pelayananPasien.produk produk " + " left join produk.detailJenisProduk detail"
			+ " left join detail.jenisProduk jenisProduk "
			+ "where dokter.id=:id and to_char(pelayananPasien.tglPelayanan,'yyyy-MM-dd') "
			+ "between :startDate and :endDate and jenisProduk.id not in (:listIdJenisProduk) and detail.id not in (:listIdDetailJenisProduk) group by produk.namaProduk,jenisProduk.id")
	public List<Map<String, Object>> findCountTindakanByIdUserAndPeriodWithException(@Param("id") Integer id,
			@Param("startDate") String startDate, @Param("endDate") String endDate,
			@Param("listIdJenisProduk") List<Integer> listIdJenisProduk,
			@Param("listIdDetailJenisProduk") List<Integer> listIdDetailJenisProduk);

	@Query(" select new map (produk.namaProduk as namaProduk, produk.id as produkId,"
			+ " count(produk.namaProduk) as count,pelayananPasien.hargaSatuan as harga,detail.id as detailId,jenisProduk.id as idJenisProduk)"
			+ " from PelayananPasienPetugas pelayananPasienPetugas"
			+ " left join pelayananPasienPetugas.kdpegawai dokter"
			+ " left join pelayananPasienPetugas.pelayananPasien pelayananPasien"
			+ " left join pelayananPasien.produk produk " + " left join produk.detailJenisProduk detail"
			+ " left join detail.jenisProduk jenisProduk"
			+ " where dokter.id=:id and pelayananPasien.tglPelayanan between :start and :end and jenisProduk.id not in (:listIdJenisProduk)"
			+ " group by produk.namaProduk,produk.id,pelayananPasien.hargaSatuan,detail.id,jenisProduk.id  ")
	public List<Map<String, Object>> findAllProdukPerPeriode(@Param("id") Integer id, @Param("start") Date start,
			@Param("end") Date end, @Param("listIdJenisProduk") List<Integer> listIdJenisProduk);

	@Query(" select new map (produk.namaProduk as namaProduk, produk.id as produkId,"
			+ " count(distinct pelayananPasien.noRec) as count,pelayananPasien.hargaSatuan as harga,detail.id as detailId,jenisProduk.id as idJenisProduk)"
			+ " from PelayananPasienPetugas pelayananPasienPetugas"
			+ " left join pelayananPasienPetugas.kdpegawai dokter"
			+ " left join pelayananPasienPetugas.pelayananPasien pelayananPasien"
			+ " left join pelayananPasien.produk produk " + " left join produk.detailJenisProduk detail"
			+ " left join detail.jenisProduk jenisProduk"
			+ " where dokter.id=:id and to_char(pelayananPasien.tglPelayanan,'yyyy-MM-dd') = :tanggal and jenisProduk.id not in (:listIdJenisProduk)"
			+ " group by produk.namaProduk,produk.id,pelayananPasien.hargaSatuan,detail.id,jenisProduk.id  ")
	public List<Map<String, Object>> findAllProdukPerTanggal(@Param("id") Integer id, @Param("tanggal") String tanggal,
			@Param("listIdJenisProduk") List<Integer> listIdJenisProduk);

	@Query(" select  count(distinct pelayananPasien.noRec) as capaian"
			+ " from PelayananPasienPetugas pelayananPasienPetugas"
			+ " left join pelayananPasienPetugas.kdpegawai dokter"
			+ " left join pelayananPasienPetugas.pelayananPasien pelayananPasien"
			+ " left join pelayananPasien.produk produk " + " left join produk.detailJenisProduk detail"
			+ " left join detail.jenisProduk jenisProduk "
			+ "where dokter.id=:id and to_char(pelayananPasien.tglPelayanan,'yyyy-MM-dd') "
			+ "between :startDate and :endDate and jenisProduk.id not in (:listIdJenisProduk)")
	public Long findTotalTindakan(@Param("id") Integer id, @Param("startDate") String startDate,
			@Param("endDate") String endDate, @Param("listIdJenisProduk") List<Integer> listIdJenisProduk);

	@Query(" select  count(distinct pelayananPasien.noRec) as capaian"
			+ " from PelayananPasienPetugas pelayananPasienPetugas"
			+ " left join pelayananPasienPetugas.kdpegawai dokter"
			+ " left join pelayananPasienPetugas.pelayananPasien pelayananPasien"
			+ " left join pelayananPasien.produk produk " + " left join produk.detailJenisProduk detail"
			+ " left join detail.jenisProduk jenisProduk "
			+ "where dokter.id=:id and to_char(pelayananPasien.tglPelayanan,'yyyy-MM-dd') "
			+ "between :startDate and :endDate and jenisProduk.id not in (:listIdJenisProduk) and detail.id not in (:listIdDetailJenisProduk) ")
	public Long findTotalTindakanWithException(@Param("id") Integer id, @Param("startDate") String startDate,
			@Param("endDate") String endDate, @Param("listIdJenisProduk") List<Integer> listIdJenisProduk,
			@Param("listIdDetailJenisProduk") List<Integer> listIdDetailJenisProduk);

	@Query(" select  count(produk.namaProduk) as namaProduk" + " from PelayananPasienPetugas pelayananPasienPetugas"
			+ " left join pelayananPasienPetugas.kdpegawai dokter"
			+ " left join pelayananPasienPetugas.pelayananPasien pelayananPasien"
			+ " left join pelayananPasien.produk produk " + " left join produk.detailJenisProduk detailjenisProduk"
			+ " left join detailjenisProduk.jenisProduk jenisProduk"
			+ " where dokter.id=:id and to_char(pelayananPasien.tglPelayanan,'yyyy-MM-dd') "
			+ " =:date and jenisProduk.id not in (:listIdJenisProduk)")
	public Long findTotalTindakanPerTanggal(@Param("id") Integer id, @Param("date") String date,
			@Param("listIdJenisProduk") List<Integer> listIdJenisProduk);

	@Query(" select  count(produk.namaProduk) as namaProduk" + " from PelayananPasienPetugas pelayananPasienPetugas"
			+ " left join pelayananPasienPetugas.kdpegawai dokter"
			+ " left join pelayananPasienPetugas.pelayananPasien pelayananPasien"
			+ " left join pelayananPasien.produk produk " + " left join produk.detailJenisProduk detailjenisProduk"
			+ " left join detailjenisProduk.jenisProduk jenisProduk"
			+ " where dokter.id=:id and to_char(pelayananPasien.tglPelayanan,'yyyy-MM-dd') "
			+ " =:date and jenisProduk.id not in (:listIdJenisProduk) and detailjenisProduk.id not in (:listIdDetailJenisProduk) ")
	public Long findTotalTindakanPerTanggalWithException(@Param("id") Integer id, @Param("date") String date,
			@Param("listIdJenisProduk") List<Integer> listIdJenisProduk,
			@Param("listIdDetailJenisProduk") List<Integer> listIdDetailJenisProduk);

	@Query(" select  count(produk.namaProduk) as namaProduk" + " from PelayananPasienPetugas pelayananPasienPetugas"
			+ " left join pelayananPasienPetugas.kdpegawai dokter"
			+ " left join pelayananPasienPetugas.pelayananPasien pelayananPasien"
			+ " left join pelayananPasien.produk produk " + " left join produk.detailJenisProduk detailjenisProduk"
			+ " left join detailjenisProduk.jenisProduk jenisProduk"
			+ " where dokter.id=:id and to_char(pelayananPasien.tglPelayanan,'yyyy-MM-dd') "
			+ " =:date and jenisProduk.id  not in (:idJenisProduk) ")
	public Long findTotalTindakanPerTanggalDanJenisProduk(@Param("id") Integer id, @Param("date") String date,
			@Param("idJenisProduk") List<Integer> idJenisProduk);

	@Query(" select  count(produk.namaProduk) as namaProduk" + " from PelayananPasienPetugas pelayananPasienPetugas"
			+ " left join pelayananPasienPetugas.kdpegawai dokter"
			+ " left join pelayananPasienPetugas.pelayananPasien pelayananPasien"
			+ " left join pelayananPasien.produk produk"
			+ " where dokter.id=:id and pelayananPasien.tglPelayanan between :start and :end"
			+ " and produk.id = :idProduk")
	public Long findTotalProdukPerPeriode(@Param("id") Integer id, @Param("idProduk") Integer idProduk,
			@Param("start") Date start, @Param("end") Date end);

	@Query(" select CAST(sum(pelayananPasien.jumlah) as long) as total"
			+ " from PelayananPasienPetugas pelayananPasienPetugas"
			+ " left join pelayananPasienPetugas.kdpegawai dokter"
			+ " left join pelayananPasienPetugas.pelayananPasien pelayananPasien"
			+ " left join pelayananPasien.produk produk" + " left join produk.detailJenisProduk detailjenisProduk"
			+ " left join detailjenisProduk.jenisProduk jenisProduk"
			+ " where dokter.id=:id and pelayananPasien.tglPelayanan between :start and :end"
			+ " and jenisProduk.id not in(:idJenisProduk)")
	public Long findTotalTindakanPerMonth(@Param("id") Integer id, @Param("start") Date start, @Param("end") Date end,
			@Param("idJenisProduk") List<Integer> idJenisProduk);

	@Query(" select  distinct pelayananPasien.hargaSatuan" + " from PelayananPasienPetugas pelayananPasienPetugas"
			+ " left join pelayananPasienPetugas.kdpegawai dokter"
			+ " left join pelayananPasienPetugas.pelayananPasien pelayananPasien"
			+ " left join pelayananPasien.produk produk" + " where produk.id =:id")
	public Double findHargaSatuan(@Param("id") Integer id);

	@Query(" select  new map(produk.namaProduk as namaProduk,produk.id as produkId,"
			+ " to_char(pelayananPasien.tglPelayanan,'yyyy-MM-dd') as tglPelayanan, count(produk.id) as jumlah) "
			+ " from PelayananPasienPetugas pelayananPasienPetugas"
			+ " left join pelayananPasienPetugas.kdpegawai dokter"
			+ " left join pelayananPasienPetugas.pelayananPasien pelayananPasien"
			+ " left join pelayananPasien.produk produk"
			+ " where dokter.id=:idPegawai and pelayananPasien.tglPelayanan between :start and :end "
			+ " and produk.id = :produkId group by produk.namaProduk,to_char(pelayananPasien.tglPelayanan,'yyyy-MM-dd'),"
			+ " produk.id order by to_char(pelayananPasien.tglPelayanan,'yyyy-MM-dd')")
	public List<Map<String, Object>> findCountTindakanPerTanggalAndProdukId(@Param("idPegawai") Integer idPegawai,
			@Param("produkId") Integer produkId, @Param("start") Date start, @Param("end") Date end);

	@Query(" select  count(produk.id) as jumlah " + " from PelayananPasienPetugas pelayananPasienPetugas"
			+ " left join pelayananPasienPetugas.kdpegawai dokter"
			+ " left join pelayananPasienPetugas.pelayananPasien pelayananPasien"
			+ " left join pelayananPasien.produk produk"
			+ " where dokter.id=:idPegawai and to_char(pelayananPasien.tglPelayanan,'yyyy-MM-dd') = :periode "
			+ " and produk.id = :produkId")
	public Long findTotalTindakanPerTanggalAndProdukId(@Param("idPegawai") Integer idPegawai,
			@Param("produkId") Integer produkId, @Param("periode") String periode);

	@Query(" select  setting.nilaiField as nilaiField " + " from SettingDataFixed setting"
			+ " where setting.namaField = 'rincianKegiatanId'")
	public String findIdPelayananPasien();

	@Query(" select  setting.nilaiField as nilaiField " + " from SettingDataFixed setting"
			+ " where setting.namaField = 'KdJenisProdukAdministrasiForSdm'")
	public String findIdJenisProdukAdministrasi();

	@Query(" select  new map(perhitunganPoin.persentasePoin as persentasePoin,"
			+ " perhitunganPoin.pembagiPoin as pembagiPoin,detailJenisProduk.id as id) "
			+ " from PerhitunganPoin perhitunganPoin" + " left join perhitunganPoin.detailJenisProduk detailJenisProduk"
			+ " where detailJenisProduk.id = :idDetailJenisProduk")
	public Map<String, Object> findVariabelPembagiPoin(@Param("idDetailJenisProduk") Integer idDetailJenisProduk);

	@Query(" select  new map(komponenIKI.id as komponenId,indeksKinerjaIndividu.item as item,komponenIKI.komponenIKI as komponenIKI,"
			+ " indeksKinerjaIndividu.target as target,indeksKinerjaIndividu.bobot as bobot,"
			+ " indeksKinerjaIndividu.keterangan as keterangan, "
			+ " indeksKinerjaIndividu.total as total, indeksKinerjaIndividu.nilai as nilai,indeksKinerjaIndividu.total as capaian,"
			+ " indeksKinerjaIndividu.hasil as hasil, indeksKinerjaIndividu.periode as periode, indeksKinerjaIndividu.noRec as noRec) "
			+ " from IndeksKinerjaIndividu indeksKinerjaIndividu"
			+ " left join indeksKinerjaIndividu.komponenIKI komponenIKI"
			+ " left join indeksKinerjaIndividu.pegawai pegawai"
			+ " where pegawai.id =:idPegawai and indeksKinerjaIndividu.periode =:periode" + " order by komponenIKI.id")
	public List<Map<String, Object>> findKualitasAndInovasi(@Param("idPegawai") Integer idPegawai,
			@Param("periode") String periode);

	@Query(" select  new map(nilaiIndexKinerjaIndividu.noRec as noRec,nilaiIndexKinerjaIndividu.periode as periode,"
			+ " nilaiIndexKinerjaIndividu.totalInovasi as totalInovasi, "
			+ " nilaiIndexKinerjaIndividu.totalKualitas as totalKualitas,"
			+ " nilaiIndexKinerjaIndividu.totalKuantitas as totalKuantitas,"
			+ " nilaiIndexKinerjaIndividu.totalPerilaku as totalPerilaku,"
			+ " nilaiIndexKinerjaIndividu.totalIKI as totalIKI) "
			+ " from NilaiIndexKinerjaIndividu nilaiIndexKinerjaIndividu"
			+ " left join nilaiIndexKinerjaIndividu.pegawai pegawai"
			+ " where nilaiIndexKinerjaIndividu.periode =:periode and pegawai.id =:idPegawai ")
	public Map<String, Object> findNilaiIndeksKinerja(@Param("idPegawai") Integer idPegawai,
			@Param("periode") String periode);

	@Query(" select new map(pegawai.nipPns as nip,shift.kodeExternal as kodeShift, shift.namaShift as namaShift,"
			+ " shift.jamMasuk as jamMasuk, shift.jamPulang as jamPulang, "
			+ " tanggal.hariKeDlmBulan as hari, tanggal.namaBulan as bulan, tanggal.tahunKalender as tahun, tanggal.kdTanggal as tgl,"
			+ " tanggal.tanggal as tanggal, pegawai.idFinger as idFinger, jadwalpegawai.keteranganAlasan as ket)"
			+ " from PegawaiJadwalKerja jadwalpegawai" + " left join jadwalpegawai.pegawai pegawai"
			+ " left join jadwalpegawai.shift shift" + " left join jadwalpegawai.tanggal tanggal"
			+ " where to_char(tanggal.tanggal,'yyyy-MM-dd')=:date and pegawai.idFinger = :idFinger")
	public Map<String, Object> findJadwalPegawaiPerTanggal(@Param("idFinger") String idFinger,
			@Param("date") String date);

	@Query(" select new map (absen.tr_no as tr_no," + "absen.tr_date as date," + "absen.tr_time as time,"
			+ "absen.empl_code as employee," + "absen.ip_addr as ip_addr," + "absen.processtatus as processtatus)"
			+ " from Habsen absen" + " where  absen.empl_code = :idFinger"
			+ " and to_char(absen.tr_date,'yyyy-MM-dd') = :date" + " and loc_code = '99999'" + " and remoteno = '99'"
			+ " order by absen.tr_date, absen.tr_time asc")
	public List<Map<String, Object>> findAbsensiAplikasiPegawai(@Param("idFinger") String idFinger,
			@Param("date") String date);

	@Query(" select new map (absen.tr_no as tr_no," + "absen.tr_date as date," + "absen.tr_time as time,"
			+ "absen.empl_code as employee," + "absen.ip_addr as ip_addr," + "absen.processtatus as processtatus)"
			+ " from Habsen absen" + " where  absen.empl_code = :idFinger"
			+ " and to_char(absen.tr_date,'yyyy-MM-dd') = :date" + " and loc_code <> '99999'" + " and remoteno <> '99'"
			+ " order by absen.tr_date, absen.tr_time asc")
	public List<Map<String, Object>> findAbsensiPegawai(@Param("idFinger") String idFinger, @Param("date") String date);

	@Query(" select  count(produk.id) as jumlah " + " from PelayananPasienPetugas pelayananPasienPetugas"
			+ " left join pelayananPasienPetugas.kdpegawai dokter"
			+ " left join pelayananPasienPetugas.pelayananPasien pelayananPasien"
			+ " left join pelayananPasien.produk produk"
			+ " where dokter.id=:idPegawai and to_char(pelayananPasien.tglPelayanan,'yyyy-MM-dd') = :periode "
			+ " and produk.id = :produkId and pelayananPasien.hargaSatuan =:harga")
	public Long findTotalTindakanPerTanggalAndProdukIdAndHarga(@Param("idPegawai") Integer idPegawai,
			@Param("produkId") Integer produkId, @Param("periode") String periode, @Param("harga") Double harga);

	@Query(" select komponen.persentase" + " from KomponenIKI komponen"
			+ " where komponen.komponenIKI like 'Kehadiran'")
	public Double findBobotKehadiran();

	@Query(" select  pegawaiHistoriRekap.totalNilaiIndex " + "from PegawaiHistoriRekap pegawaiHistoriRekap "
			+ "left join pegawaiHistoriRekap.pegawai pegawai "
			+ "left join pegawaiHistoriRekap.strukHistory strukHistori "
			+ "where pegawai.id = :idPegawai and strukHistori.tglAwal between :start and :end")
	public Double findIndexKehadiran(@Param("idPegawai") Integer idPegawai, @Param("start") Date start,
			@Param("end") Date end);

	@Query(" select new Map( produk.namaProduk as namaProduk, CAST(sum(pelayananPasien.jumlah) as long) as count,jenisProduk.id as idJenisProduk, to_char(pelayananPasien.tglPelayanan,'dd-MM-yyyy') as tglPelayanan)"
			+ " from PelayananPasienPetugas pelayananPasienPetugas"
			+ " left join pelayananPasienPetugas.kdpegawai dokter"
			+ " left join pelayananPasienPetugas.pelayananPasien pelayananPasien"
			+ " left join pelayananPasien.produk produk " + " left join produk.detailJenisProduk detail"
			+ " left join detail.jenisProduk jenisProduk " + "where dokter.id=:id and pelayananPasien.tglPelayanan "
			+ "between :start and :end and jenisProduk.id not in (:listIdJenisProduk) group by produk.namaProduk,jenisProduk.id,to_char(pelayananPasien.tglPelayanan,'dd-MM-yyyy') "
			+ " order by to_char(pelayananPasien.tglPelayanan,'dd-MM-yyyy')")
	public List<Map<String, Object>> findTindakanByIdPegawaiAndPeriod(@Param("start") Date start,
			@Param("end") Date end, @Param("id") Integer id,
			@Param("listIdJenisProduk") List<Integer> listIdJenisProduk);

	@Query(" select new map (produk.namaProduk as namaProduk, produk.id as produkId,"
			+ " count(produk.namaProduk) as count,pelayananPasien.hargaSatuan as harga,detail.id as detailId,jenisProduk.id as idJenisProduk)"
			+ " from PelayananPasienPetugas pelayananPasienPetugas"
			+ " left join pelayananPasienPetugas.kdpegawai dokter"
			+ " left join pelayananPasienPetugas.pelayananPasien pelayananPasien"
			+ " left join pelayananPasien.produk produk " + " left join produk.detailJenisProduk detail"
			+ " left join detail.jenisProduk jenisProduk"
			+ " where dokter.id=:id and to_char(pelayananPasien.tglPelayanan,'yyyy-MM-dd') = :tanggal and jenisProduk.id not in (:listIdJenisProduk) and produk.id = :idProduk"
			+ " group by produk.namaProduk,produk.id,pelayananPasien.hargaSatuan,detail.id,jenisProduk.id  ")
	public List<Map<String, Object>> findCertainProdukPerTanggal(@Param("id") Integer id,
			@Param("idProduk") Integer idProduk, @Param("tanggal") String tanggal,
			@Param("listIdJenisProduk") List<Integer> listIdJenisProduk);

	@Query(" select tabel.indeks " + " from TabelAcuanIndeksIKI tabel "
			+ " where :total between tabel.nilaiBawah and tabel.nilaiAtas")
	public Double findIndeksIKI(@Param("total") Double total);
}
