package com.jasamedika.medifirst2000.dao;

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.Pasien;

@Repository("ReportingDao")
public interface ReportingDao extends PagingAndSortingRepository<Pasien, Integer> {
	
	@Query("select soap.s as s,soap.o as o,soap.a as a, soap.p as p,to_char(soap.tglInput,'yyyy-MM-dd / HH:mm') as tglInput,pasien.noCm as noCm, pasien.namaPasien as namaPasien,to_char(pasien.tglLahir,'yyyy-MM-dd') as tglLahir,to_char(pasienDaftar.tglRegistrasi,'yyyy-MM-dd') as tglRegistrasi,jenisKelamin.jenisKelamin, ruangan.namaRuangan,pegawai.namaLengkap as namaPegawai from Soap soap left join soap.pegawai pegawai left join soap.pasienDaftar antrian left join antrian.pasienDaftar pasienDaftar left join pasienDaftar.pasien pasien left join pasien.jenisKelamin jenisKelamin left join pasienDaftar.ruangan ruangan where pasien.noCm=:noCm and to_char(pasienDaftar.tglRegistrasi,'yyyy-MM-dd') =:tglRegistrasi")
	public List<Object[]> findCppt(@Param("noCm") String noCm,@Param("tglRegistrasi") String tglRegistrasi);
	
	@Query("select diagnosaTindakan.namaDiagnosaTindakan, diagnosa.namaDiagnosa,pasien.noCm as noCm, pasien.namaPasien as namaPasien,to_char(pasien.tglLahir,'yyyy-MM-dd') as tglLahir,to_char(pasienDaftar.tglRegistrasi,'yyyy-MM-dd') as tglRegistrasi,jenisKelamin.jenisKelamin, ruangan.namaRuangan, dokterPenanggungJawab.namaLengkap from DiagnosaTindakanPasien diagnosaTindakanPasien left join diagnosaTindakanPasien.diagnosisTindakan detailDiagnosa left join detailDiagnosa.diagnosaTindakan diagnosaTindakan left join diagnosaTindakan.diagnosaTindakan diagnosa left join diagnosaTindakanPasien.pasienDaftar antrian left join antrian.pasienDaftar pasienDaftar left join pasienDaftar.pasien pasien left join pasien.jenisKelamin jenisKelamin left join pasienDaftar.ruangan ruangan left join pasienDaftar.dokterPenanggungJawab dokterPenanggungJawab where pasien.noCm=:noCm and to_char(pasienDaftar.tglRegistrasi,'yyyy-MM-dd') =:tglRegistrasi")
	public List<Object[]> findResume(@Param("noCm") String noCm,@Param("tglRegistrasi") String tglRegistrasi);
	
	@Query("select new map (pegawai.namaLengkap as nama, "+
			"pegawai.nipPns as nip) "+
			"from MapPegawaiJabatanToUnitKerja mapPegawai "
			+ "left join mapPegawai.pegawai pegawai "
			+ "left join mapPegawai.jabatan jabatanInternal "
			+ "where mapPegawai.isPrimary is true "
			+ "and mapPegawai.statusEnabled is true "
			+ "and jabatanInternal.id = 896")
	public Map<String,Object> findDataDirut();
	
	@Query("select new map (ruangan.namaRuangan as namaRuangan, pegawai.namaLengkap as namaPegawai,pegawai.nipPns as nip) "+
			"from Ruangan ruangan "+
			"left join ruangan.pegawaiKepala pegawai "+
			"where ruangan.id = :ruanganId")
	public Map<String,Object> findDataKA(@Param("ruanganId") Integer ruanganId);
	
	@Query("select new map (suratPermintaanMasuk.instruksi as instruksi, "+
			"caraMasuk.caraMasuk as caraMasuk, "+
			"to_char(suratPermintaanMasuk.tglRegistrasi, 'dd-MM-yyyy') as tglRegistrasi, "+
			"dokterPenanggungJawab.namaLengkap as dokterPenanggungJawab, "+
			"ruangan.namaRuangan as ruangan, "+
			"petugas.namaLengkap as petugas, "+
			"caraMasuk.caraMasuk as caraMasuk, "+
			"perawatan.name as perawatan, "+
			"dokterPengirim.namaLengkap as dokterPengirim, "+
			"pasien.noCm as noCm, "+
			"pasien.namaPasien as namaPasien, "+
			"to_char(pasien.tglLahir, 'dd-MM-yyyy') as tglLahir, "+
			"jenisKelamin.jenisKelamin as jenisKelamin) "+
			"from SuratPermintaanMasuk suratPermintaanMasuk "+
			"left join suratPermintaanMasuk.caraMasuk caraMasuk "+
			"left join suratPermintaanMasuk.petugas petugas "+
			"left join suratPermintaanMasuk.dokterPenanggungJawab dokterPenanggungJawab "+
			"left join suratPermintaanMasuk.perawatan perawatan "+
			"left join suratPermintaanMasuk.dokterPengirim dokterPengirim "+
			"left join suratPermintaanMasuk.pasienDaftar antrianPasienDiperiksa "+
			"left join antrianPasienDiperiksa.pasienDaftar pasienDaftar "+
			"left join pasienDaftar.pasien pasien "+
			"left join pasien.jenisKelamin jenisKelamin "+
			"left join suratPermintaanMasuk.unit ruangan "+
			"where pasienDaftar.noRegistrasi= :noRegistrasi")
	public Map<String,Object> findSPMRS(@Param("noRegistrasi") String noRegistrasi);
	
	@Query("select new map (diagnosa.namaDiagnosa as diagnosa) "+
			"from DetailDiagnosaPasien detailDiagnosaPasien "+
			"left join detailDiagnosaPasien.diagnosa diagnosa "+
			"left join detailDiagnosaPasien.diagnosaPasien diagnosaPasien "+
			"left join detailDiagnosaPasien.diagnosaPasien diagnosaPasien "+
			"left join detailDiagnosaPasien.pasienDaftar antrianPasienDiperiksa "+
			"left join antrianPasienDiperiksa.pasienDaftar pasienDaftar "+
			"where pasienDaftar.noRegistrasi= :noRegistrasi")
	public List<String> findDiagnosa(@Param("noRegistrasi") String noRegistrasi);
	
	@Query("select new map (antrianPasienDiPeriksa.tglDipanggilSuster as tglDipanggilSuster, "+
			"antrianPasienDiPeriksa.tglDipanggilDokter as tglDipanggilDokter, "+
			"pasien.namaPasien as namaPasien, "+
			"pasien.noCm as noCm) "+
			"From AntrianPasienDiPeriksa antrianPasienDiPeriksa "+
			"left join antrianPasienDiPeriksa.pasienDaftar pasienDaftar "+
			"left join pasienDaftar.pasien pasien "+
			"where to_char(antrianPasienDiPeriksa.tglRegistrasi, 'dd-MM-yyyy') between :startDate and :endDate "+
			"and tglDipanggilSuster is not null  and tglDipanggilDokter is not null ")
	public List<Map<String,Object>> FindSasaranMutuByPeriode(@Param("startDate") String startDate,@Param("endDate") String endDate);
	
	@Query("select new map (antrianPasienDiPeriksa.tglDipanggilSuster as tglDipanggilSuster, "+
			"antrianPasienDiPeriksa.tglDipanggilDokter as tglDipanggilDokter, "+
			"pasien.namaPasien as namaPasien, "+
			"pasien.noCm as noCm, "+
			"dokter.namaLengkap as dokter) "+
			"From AntrianPasienDiPeriksa antrianPasienDiPeriksa "+
			"left join antrianPasienDiPeriksa.pasienDaftar pasienDaftar "+
			"left join pasienDaftar.pasien pasien "+
			"left join antrianPasienDiPeriksa.pegawai dokter "+
			"where dokter.id = :DokterId "+
			"and tglDipanggilSuster is not null  and tglDipanggilDokter is not null ")
	public List<Map<String,Object>> FindSasaranMutuByDokter(@Param("DokterId") Integer DokterId);
	
	@Query("select new map (antrianPasienDiPeriksa.tglDipanggilSuster as tglDipanggilSuster, "+
			"antrianPasienDiPeriksa.tglDipanggilDokter as tglDipanggilDokter, "+
			"pasien.namaPasien as namaPasien, "+
			"pasien.noCm as noCm, "+
			"ruangan.namaRuangan as klinik) "+
			"From AntrianPasienDiPeriksa antrianPasienDiPeriksa "+
			"left join antrianPasienDiPeriksa.pasienDaftar pasienDaftar "+
			"left join pasienDaftar.pasien pasien "+
			"left join antrianPasienDiPeriksa.ruangan ruangan "+
			"where ruangan.id = :ruanganId "+
			"and tglDipanggilSuster is not null  and tglDipanggilDokter is not null")
	public List<Map<String,Object>> FindSasaranMutuByKlinik(@Param("ruanganId") Integer ruanganId);
	
	@Query("select new map (pasien.namaPasien as namaPasien, "+
			"pasien.noCm as noCm, pasien.namaBelakang as namaBelakang, "+
			"to_char(pasien.tglLahir,'dd-MM-yyyy') as tglLahir, "+
			"jenisKelamin.jenisKelamin as jenisKelamin, "+
			"pasien.tglLahir as tanggalLahir, "+
			"kecamatan.namaKecamatan as kecamatan, "+
			"kelurahan.namaDesaKelurahan as kelurahan, "+
			"alamat.rtrw as rtRw, "+
			"pasien.noHp as hp, "+
			"alamat.alamatLengkap as alamatlengkap, "+
			"kota.namaKotaKabupaten as kota, "+
			"pasien.noTelepon as noTelepon, "+
			"pasien.tempatLahir as tempatLahir, "+
			"agama.agama as agama, "+
			"kebangsaan.name as kebangsaan, "+
			"pekerjaan.pekerjaan as pekerjaan, "+
			"pasien.noIdentitas as identitas, "+
			"statusPerkawinan.statusPerkawinan as statusPerkawinan	) "+
			"from Pasien pasien "+
			"left join pasien.jenisKelamin jenisKelamin  "+
			"left join pasien.alamats alamat "+
			"left join pasien.kebangsaan  kebangsaan "+
			"left join alamat.desaKelurahan kelurahan "+
			"left join alamat.kecamatan kecamatan "+
			"left join alamat.kotaKabupaten kota "+
			"left join pasien.agama  agama "+
			"left join pasien.pekerjaan pekerjaan "+
			"left join pasien.statusPerkawinan statusPerkawinan "+
			"where noCm =:noCm")
	public List<Map<String, Object>> findMapPasienByNoCm(@Param("noCm") String noCm);
	
	@Query("select new map (strukBuktiPenerimaan.nosbm as noSbm, "+
			"to_char(strukBuktiPenerimaan.tglsbm, 'dd-MM-yyyy') as tglSbm,  "+
			"strukBuktiPenerimaan.keteranganlainnya as keteranganLainnya,  "+
			"strukBuktiPenerimaan.totaldibayar as totalDibayar,  "+
			"strukBuktiPenerimaan.pembayaranke as pembayaranKe,  "+
			"pasien.namaPasien as namaPasien,  "+
			"pasienRegistrasi.noRegistrasi as noRegistrasi,  "+
			"pasien.noCm as noCm,  "+
			"caraBayar.caraBayar as caraBayar,  "+
			"pasienRegistrasi.noRec as noRecPasiendaftar, "+
			"penanggungJawab.namaLengkap as pembayar, "+
			"strukBuktiPenerimaan.noRec as noRec)  "+			
			"from StrukBuktiPenerimaan strukBuktiPenerimaan "+ 			
			"inner join strukBuktiPenerimaan.nostruk strukPelayanan "+			 
			"inner join strukPelayanan.noregistrasi pasienRegistrasi "+	
			"left join pasienRegistrasi.penanggungJawabPasien penanggungJawab "+
			"inner join pasienRegistrasi.pasien pasien, "+			
			"StrukBuktiPenerimaanCaraBayar strukBuktiPenerimaanCaraBayar "+
			"inner join strukBuktiPenerimaanCaraBayar.kdcarabayar caraBayar "+ 
			"where  strukBuktiPenerimaanCaraBayar.NoSBMId = strukBuktiPenerimaan.noRec "+
			"and strukBuktiPenerimaan.nosbm = :noSBM")
	public Map<String,Object> findPembayaranDeposit (@Param("noSBM") String noSBM);	
	
	@Query("select new map (strukBuktiPenerimaan.nosbm as noSbm, "+
			"to_char(strukBuktiPenerimaan.tglsbm, 'dd-MM-yyyy') as tglSbm, "+
			"strukBuktiPenerimaan.keteranganlainnya as keteranganLainnya, "+ 
			"strukBuktiPenerimaan.totaldibayar as totalDibayar, "+ 
			"strukBuktiPenerimaan.pembayaranke as pembayaranKe, "+ 
			"pasien.namaPasien as namaPasien, "+ 
			"pasienRegistrasi.noRegistrasi as noRegistrasi, "+ 
			"pasien.noCm as noCm, "+
			"pasienRegistrasi.noRec as noRecPasiendaftar, "+
			"penanggungJawab.namaLengkap as pembayar, "+
			"penjamin.totalHarusDibayar as piutangAwal, "+
			"penjamin.totalSudahDibayar as totalCicilan, "+
			"(penjamin.totalHarusDibayar - penjamin.totalSudahDibayar) as sisaPiutang, "+
			"strukBuktiPenerimaan.noRec as noRec) "+
			"from StrukBuktiPenerimaan strukBuktiPenerimaan "+ 			
			"inner join strukBuktiPenerimaan.nostruk strukPelayanan "+	
			"inner join strukPelayanan.penjamin penjamin "+
			"inner join strukPelayanan.noregistrasi pasienRegistrasi "+	
			"left join pasienRegistrasi.penanggungJawabPasien penanggungJawab "+
			"inner join pasienRegistrasi.pasien pasien "+
			"where  strukBuktiPenerimaan.nosbm = :noSBM")
	public Map<String,Object> findPembayaranCicilan (@Param("noSBM") String noSBM);	
	
	@Query("select new map (strukPelayanan.nostruk as noStruk, "+
			"strukPelayanan.totalharusdibayar as totalDibayar, "+
			"rekanan.namaRekanan as namaRekanan, "+
			"strukPelayanan.keteranganlainnya as keterangan, "+
			"to_char(strukPelayanan.tglstruk,'dd-MM-yyyy') as tglStruk) "+
			"from StrukPelayanan strukPelayanan "+
			"left join strukPelayanan.kdrekanan rekanan "+
			"where strukPelayanan.nostruk = :noStruk")
	public Map<String,Object> findBuktiKas (@Param("noStruk") String noStruk);	
	
	@Query(" select setting.nilaiField as nilaiField "+  
			" from SettingDataFixed setting"+			
			" where setting.namaField = 'PegawaiVerifikasiReportBuktiKas'")
	public String findPegawaiVerifikasi();	
	
	@Query("select new map (strukBuktiPenerimaan.nosbm as noSbm, "+
			"strukBuktiPenerimaan.namapegawaipembayar as pembayar, "+
			"strukBuktiPenerimaan.totaldibayar as totalDibayar, "+
			"strukBuktiPenerimaan.keteranganlainnya as keterangan, "+
			"to_char(strukBuktiPenerimaan.tglsbm, 'dd-MM-yyyy') as tglSbm, "+
			"pegawaiPenerima.namaLengkap as penerima) "+
			"from StrukBuktiPenerimaan strukBuktiPenerimaan "+
			"left join strukBuktiPenerimaan.kdpegawaipembayar kdpegawaipembayar "+
			"left join kdpegawaipembayar.pegawai pegawaipembayar  "+
			"left join strukBuktiPenerimaan.kdpegawaipenerima kdpegawaipenerima "+
			"left join kdpegawaipenerima.pegawai pegawaiPenerima "+
			"where strukBuktiPenerimaan.nosbm =:noSbm")
	public Map<String,Object> findKwitansiUmum (@Param("noSbm") String noSbm);
	
	@Query("select new map (sbk.keteranganLainnya as keterangan, "+
			"sbk.totalDiBayar as totalDibayar,sbk.noSBK as noSbk, "+
			"to_char(sbk.tglSBK,'dd-MM-yyyy') as tglSbk, "+
			"pegawaipembayar.namaLengkap as pembayar) "+
			"from StrukBuktiPengeluaran sbk "+
			"left join sbk.pegawaiPembayar loginUser "+
			"left join loginUser.pegawai pegawaipembayar  "+
			"where sbk.noSBK =:noSbk")
	public Map<String,Object> findKwitansiPengeluaran (@Param("noSbk") String noSbk);
	
	@Query("select new map (tandaVital.suhu as suhu, "+
			"tandaVital.nadi as nadi, "+
			"tandaVital.pernapasan as pernapasan, "+
			"tandaVital.tekananDarah as tekananDarah, "+
			"tandaVital.alergi as alergi, "+
			"tandaVital.beratBadan as beratBadan, "+
			"tandaVital.tinggiBadan as tinggiBadan, "+
			"tandaVital.statusGizi as statusGizi, "+
			"tandaVital.lingkarKepala as lingkarkepala) "+
			"from PapTandaVital tandaVital "+
			"left join tandaVital.pasienDaftar antrian "+
			"left join antrian.pasienDaftar pasienDaftar "+
			"where antrian.noRec=:noRec")
	public Map<String,Object> findTandaVitalNeonatus (@Param("noRec") String noRec);
	
	@Query("select new map (antrian.noRec as noRec, antrian.noAntrian as noAntrian, "+
			"antrian.noMasuk as noMasuk, antrian.statusAntrian as statusAntrian, "+
			"antrian.statusPasien as statusPasien, antrian.statusPenyakit as statusPenyakit, "+
			"antrian.statusKunjungan as statusKunjungan, "+
			"antrian.tglRegistrasi as tglRegistrasi, "+
			"pasien.namaPasien as namaPasien, "+
			"to_char(pasien.tglLahir,'dd-mm-yyyy') as tglLahir, "+
			"pasien.noCm as noCm, "+
			"pasien.tglLahir as tanggalLahir, "+
			"pasienDaftar.tglRegistrasi as tanggalRegistrasi, "+
			"jenisKelamin.jenisKelamin as jenisKelamin, "+
			"to_char(antrian.tglDipanggilSuster, 'dd-mm-yyyy HH:mm') as waktuPemeriksaan, "+
			"ruangan.namaRuangan as namaRuangan, "+
			"ruanganLast.namaRuangan as ruanganLast, "+
			"kelompokPasien.kelompokPasien as kelompokPasien, "+
			"kamar.namaKamar as kamar, "+
			"kelas.namaKelas as namaKelas, "+
			"antrian.noBed as tempatTidur, "+
			"dokter.namaLengkap as dokter, "+
			"rujukan.asalRujukan as rujukan, "+
			"pasienDaftar.jenisPelayanan as tipe, "+
			"to_char(pasienDaftar.tglPulang , 'dd-mm-yyyy HH:mm')as tglKeluar, "+
			"pegawai.namaLengkap as dokter, "+
			"to_char(pasienDaftar.tglRegistrasi, 'dd-mm-yyyy') as tglRegistrasi) "+
			"from AntrianPasienDiPeriksa antrian "+
			"left join antrian.ruangan ruangan "+
			"left join antrian.pasienDaftar pasienDaftar "+
			"left join pasienDaftar.ruangan ruanganLast "+
			"left join antrian.kamar kamar "+
			"left join antrian.asalRujukan rujukan "+
			"left join pasienDaftar.pasien pasien "+
			"left join pasienDaftar.kelas kelas "+
			"left join pasienDaftar.dokterPenanggungJawab dokter "+
			"left join pasienDaftar.kelompokPasien kelompokPasien "+
			"left join pasien.jenisKelamin jenisKelamin "+
			"left join antrian.pegawai pegawai "+
			"where antrian.noRec =:noRec")
	public Map<String,Object> findPasienByNoRegistrasi (@Param("noRec") String noRec);	
	
	@Query("select pengkajianAwalBaru.noRec "+
			"from PengkajianAwalBaru  pengkajianAwalBaru "+
			"left join pengkajianAwalBaru.noRegistrasi antrian "+
			"where pengkajianAwalBaru.kdPap =:kdPap and antrian.noRec = :noRec")
	public String findPengkajianAwalByNoRec (@Param("kdPap") String kdPap,@Param("noRec") String noRec);
	
	@Query("select pengkajianAwalBaru.noRec "+
			"from PengkajianAwalBaru  pengkajianAwalBaru "+
			"left join pengkajianAwalBaru.noRegistrasi antrian "+
			"where pengkajianAwalBaru.kdPap =:kdPap")
	public String findNoRecBykdPap (@Param("kdPap") String kdPap);
	
	@Query("select new map (to_char(diagnosaKeperawatanTransaksi.tglDitemukan, 'dd-mm-yyyy') as tglDitemukan, "+
			"to_char(diagnosaKeperawatanTransaksi.tglTeratasi, 'dd-mm-yyyy') as tglTeratasi, "+
			"diagnosaKeperawatan.namaDiagnosaKep as diagnosa) "+
			"from DiagnosaKeperawatanTransaksi diagnosaKeperawatanTransaksi "+
			"left join diagnosaKeperawatanTransaksi.diagnosaKeperawatan diagnosaKeperawatan "+
			"left join diagnosaKeperawatanTransaksi.pasienDaftar pasienDaftar "+
			"where pasienDaftar.noRec =:noRec")
	public List<Map<String,Object>> findDiagnosaKeperawatanByNoRec (@Param("noRec") String noRec);
	
	@Query("select diagnosa.namaDiagnosa "+
			"from DiagnosaPasien diagnosaPasien "+
			"left join diagnosaPasien.diagnosis diagnosis "+
			"left join diagnosis.jenisDiagnosa jenisDiagnosa "+
			"left join diagnosis.diagnosa diagnosa "+
			"left join diagnosaPasien.pasienDaftar antrian "+
			"left join antrian.pasienDaftar pasienDaftar "+
			"where jenisDiagnosa.id = 1 and antrian.noRec =:noRec")
	public List<String> findDiagnosisUtama (@Param("noRec") String noRec);
	
	@Query("select diagnosa.namaDiagnosa "+
			"from DiagnosaPasien diagnosaPasien "+
			"left join diagnosaPasien.diagnosis diagnosis "+
			"left join diagnosis.jenisDiagnosa jenisDiagnosa "+
			"left join diagnosis.diagnosa diagnosa "+
			"left join diagnosaPasien.pasienDaftar antrian "+
			"left join antrian.pasienDaftar pasienDaftar "+
			"where jenisDiagnosa.id = 2 and antrian.noRec =:noRec")
	public List<String> findDiagnosisSekunder (@Param("noRec") String noRec);
	
	@Query("select new map ( resumeMedis.diagnosisAwal as diagnosisAwal, "+
			"resumeMedis.diet as diet, "+
			"resumeMedis.hasilKonsultasi as hasilKonsultasi, "+
			"resumeMedis.hasilLab as hasilLab, "+
			"resumeMedis.instruksiAnjuran as instruksiAnjuran, "+
			"resumeMedis.pemeriksaanFisik as pemeriksaanFisik, "+
			"resumeMedis.pemeriksaanPenunjang as pemeriksaanPenunjang, "+
			"resumeMedis.penanggungPembayaran as penanggungPembayaran, "+
			"resumeMedis.ringkasanRiwayatPenyakit as ringkasanRiwayatPenyakit, "+
			"pengobatan.name as pengobatanDilanjutkan, "+
			"kondisiKeluar.statusPulang as kondisiKeluar) "+
			"from ResumeMedis resumeMedis "+
			"left join resumeMedis.pengobatanDilanjutkan pengobatan "+
			"left join resumeMedis.kondisiWaktuKeluar kondisiKeluar "+
			"left join resumeMedis.pasienDaftar antrian "+
			"left join antrian.pasienDaftar pasiendaftar "+
			"where antrian.noRec =:noRec")
	public Map<String,Object> findResumeMedis (@Param("noRec") String noRec);
	
	@Query("select new map ( detail.namaObat as namaObat, "+
			"detail.dosis as dosis, "+
			"detail.frekuensi as frekuensi, "+
			"detail.jumlah as jumlah, "+
			"detail.caraPemberian as caraPemberian) "+
			"from ResumeMedis resumeMedis "+
			"left join resumeMedis.detailTerapiPulang detail "+
			"left join resumeMedis.pengobatanDilanjutkan pengobatan "+
			"left join resumeMedis.kondisiWaktuKeluar kondisiKeluar "+
			"left join resumeMedis.pasienDaftar antrian "+
			"left join antrian.pasienDaftar pasiendaftar "+
			"where antrian.noRec =:noRec")
	public List<Map<String,Object>> findDetailTerapiPulang (@Param("noRec") String noRec);
	
	@Query("select produk.namaProduk "+
			"from PelayananPasien pelayananPasien "+
			"left join pelayananPasien.produk produk "+
			"left join pelayananPasien.pasienDaftar antrian "+
			"left join produk.detailJenisProduk detailJenisProduk "+
			"left join detailJenisProduk.jenisProduk jenisProduk "+
			"where jenisProduk.id =97 and  antrian.noRec =:noRec")
	public List<String> findListObat (@Param("noRec") String noRec);
	
	@Query("select produk.namaProduk "+
			"from PelayananPasien pelayananPasien "+
			"left join pelayananPasien.produk produk "+
			"left join pelayananPasien.pasienDaftar antrian "+
			"left join produk.detailJenisProduk detailJenisProduk "+
			"left join detailJenisProduk.jenisProduk jenisProduk "+
			"where jenisProduk.id !=97 and  antrian.noRec =:noRec")
	public List<String> findListTindakan (@Param("noRec") String noRec);
	
	@Query("select antrian.noRec "+
			"from AntrianPasienDiPeriksa antrian "+
			"left join antrian.pasienDaftar pasienDaftar "+
			"where pasienDaftar.noRegistrasi = :noRegistrasi")
	public List<String> findNoRecAntrian (@Param("noRegistrasi") String noRegistrasi);
	
	@Query("select new map (pasien.namaPasien as namaPasien, "+
			"pasien.namaBelakang as namaBelakang, "+
			"pasien.noCm as noCm, "+
			"pasienDaftar.statusPasien as tipe, "+
			"dpjp.namaLengkap as dokter,"+
			"to_char(pasienDaftar.tglRegistrasi,'dd-mm-yyyy') as tglDaftar, "+
			"pasienDaftar.noRegistrasi as noRegistrasi, "+
			"pasien.noHp as telepon, "+
			"ruangan.namaRuangan as namaRuangan, "+
			"pasien.tempatLahir as tempatLahir, "+
			"to_char(pasien.tglLahir, 'dd-mm-yyyy') as tglLahir, "+
			"statusKawin.statusPerkawinan as statusKawin, "+
			"agama.agama as agama, "+
			"pasienDaftar.tglPulang as tglKeluar, "+
			"kelompokPasien.kelompokPasien as jenisPasien, "+
			"jenisKelamin.jenisKelamin as jenisKelamin, "+
			"pekerjaan.pekerjaan as pekerjaan, "+
			"pasien.namaAyah as namaAyah, "+
			"pasien.namaIbu as namaIbu, "+
			"kelas.namaKelas as kelasPerawatan , "+
			"pasien.namaSuamiIstri as namaSuami) "+
			"from PasienDaftar pasienDaftar "+
			"left join pasienDaftar.pasien pasien "+
			"left join pasienDaftar.kelas kelas "+
			"left join pasienDaftar.ruangan ruangan "+
			"left join pasienDaftar.kelompokPasien kelompokPasien "+
			"left join pasien.statusPerkawinan statusKawin "+
			"left join pasien.agama agama "+
			"left join pasien.jenisKelamin jenisKelamin "+
			"left join pasien.pekerjaan pekerjaan "+
			"left join pasienDaftar.dokterPenanggungJawab dpjp "+
			"where pasienDaftar.noRegistrasi= :noRegistrasi")
	public Map<String, Object> findPasienDaftar (@Param("noRegistrasi") String noRegistrasi);
	
	@Query("select new map (pasien.namaPasien as namaPasien, "+
			"pasien.noCm as noCm, "+
			"to_char(pasien.tglLahir,'dd-MM-yyyy') as tglLahir, "+
			"jenisKelamin.jenisKelamin as jenisKelamin, "+
			"pasien.tglLahir as tanggalLahir) "+
			"from Pasien pasien "+
			"left join pasien.jenisKelamin jenisKelamin  "+			
			"where noCm =:noCm")
	public Map<String, Object> findPasienByNoCm(@Param("noCm") String noCm);
	
	@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, "+
			 "pasien.namaPasien as namaPasien, "+
			 "pasien.noCm as noCm, "+
			 "pasienDaftar.noRegistrasi as noRegistrasi, "+
			 "to_char(pasienDaftar.tglRegistrasi, 'yyyy-MM-dd') as tglRegistrasi, "+
			 "ruangan.namaRuangan as namaRuangan, "+
			 "kelompokPasien.kelompokPasien as kelompokPasien) "+
			  "from PelayananPasien pelayananPasien "+
			  "left join pelayananPasien.produk produk  "+
			  "left join produk.detailJenisProduk detail "+
			  "left join detail.jenisProduk jenisProduk "+
			  "left join pelayananPasien.pasienDaftar antrian "+
			  "left join antrian.pasienDaftar pasienDaftar "+
			  "left join pasienDaftar.kelompokPasien kelompokPasien "+
			  "left join pasienDaftar.pasien pasien "+
			 "left join pasienDaftar.ruangan ruangan "+
			 "left join ruangan.departemen departemen "+
			  "where to_char(pelayananPasien.tglPelayanan,'dd-MM-yyyy') = :tglPelayanan and departemen.id = :idDepartemen and jenisProduk.id!= 97 "+
			  "group by produk.namaProduk,produk.id,pelayananPasien.hargaSatuan,detail.id, "+
			  "jenisProduk.id, pasien.namaPasien,pasien.noCm,pasienDaftar.noRegistrasi, "+
			  "to_char(pasienDaftar.tglRegistrasi, 'yyyy-MM-dd'),ruangan.namaRuangan, "+
			  "kelompokPasien.kelompokPasien "+
			  "order by pasienDaftar.noRegistrasi")
	public List<Map<String, Object>> findPelayananPasien(@Param("tglPelayanan") String tglPelayanan,@Param("idDepartemen") Integer idDepartemen);
	
	@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, "+
			 "pasien.namaPasien as namaPasien, "+
			 "pasien.noCm as noCm, "+
			 "pasienDaftar.noRegistrasi as noRegistrasi, "+
			 "to_char(pasienDaftar.tglRegistrasi, 'yyyy-MM-dd') as tglRegistrasi, "+
			 "ruangan.namaRuangan as namaRuangan, "+
			 "kelompokPasien.kelompokPasien as kelompokPasien) "+
			  "from PelayananPasien pelayananPasien "+
			  "left join pelayananPasien.produk produk  "+
			  "left join produk.detailJenisProduk detail "+
			  "left join detail.jenisProduk jenisProduk "+
			  "left join pelayananPasien.pasienDaftar antrian "+
			  "left join antrian.pasienDaftar pasienDaftar "+
			  "left join pasienDaftar.kelompokPasien kelompokPasien "+
			  "left join pasienDaftar.pasien pasien "+
			 "left join pasienDaftar.ruangan ruangan "+
			 "left join ruangan.departemen departemen "+
			  "where to_char(pelayananPasien.tglPelayanan,'dd-MM-yyyy') = :tglPelayanan "+
			  "and produk.id = :idproduk and departemen.id = :idDepartemen and jenisProduk.id!= 97 "+
			  "group by produk.namaProduk,produk.id,pelayananPasien.hargaSatuan,detail.id, "+
			  "jenisProduk.id, pasien.namaPasien,pasien.noCm,pasienDaftar.noRegistrasi, "+
			  "to_char(pasienDaftar.tglRegistrasi, 'yyyy-MM-dd'),ruangan.namaRuangan, "+
			  "kelompokPasien.kelompokPasien "+
			  "order by pasienDaftar.noRegistrasi")
	public List<Map<String, Object>> findPelayananPasienKarcis(@Param("tglPelayanan") String tglPelayanan, @Param("idproduk") Integer idproduk,@Param("idDepartemen") Integer idDepartemen);
	
	@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, "+
			 "pasien.namaPasien as namaPasien, "+
			 "pasien.noCm as noCm, "+
			 "pasienDaftar.noRegistrasi as noRegistrasi, "+
			 "to_char(pasienDaftar.tglRegistrasi, 'yyyy-MM-dd') as tglRegistrasi, "+
			 "ruangan.namaRuangan as namaRuangan, "+
			 "kelompokPasien.kelompokPasien as kelompokPasien,dokter.namaLengkap as dokter) "+
			 "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 "+
			  "left join pelayananPasien.pasienDaftar antrian "+
			  "left join antrian.pasienDaftar pasienDaftar "+
			  "left join pasienDaftar.kelompokPasien kelompokPasien "+
			  "left join pasienDaftar.pasien pasien "+
			 "left join pasienDaftar.ruangan ruangan "+
			 "left join ruangan.departemen departemen "+
			  "where to_char(pelayananPasien.tglPelayanan,'yyyy-MM-dd') = :tglPelayanan and jenisProduk.id!= 97 "+
			 " and dokter.id = :dokter and  produk.id != :idProduk and departemen.id = :idDepartemen "+
			  "group by produk.namaProduk,produk.id,pelayananPasien.hargaSatuan,detail.id, "+
			  "jenisProduk.id, pasien.namaPasien,pasien.noCm,pasienDaftar.noRegistrasi, "+
			  "to_char(pasienDaftar.tglRegistrasi, 'yyyy-MM-dd'),ruangan.namaRuangan, "+
			  "kelompokPasien.kelompokPasien,dokter.namaLengkap "+
			  "order by pasienDaftar.noRegistrasi")
	public List<Map<String, Object>> findPelayananPasienByDokter(@Param("tglPelayanan") String tglPelayanan,@Param("dokter") Integer dokter,@Param("idProduk") Integer idProduk,@Param("idDepartemen") Integer idDepartemen);
	
	@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, "+
			 "pasien.namaPasien as namaPasien, "+
			 "pasien.noCm as noCm, "+
			 "pasienDaftar.noRegistrasi as noRegistrasi, "+
			 "to_char(pasienDaftar.tglRegistrasi, 'yyyy-MM-dd') as tglRegistrasi, "+
			 "ruangan.namaRuangan as namaRuangan, "+
			 "kelompokPasien.kelompokPasien as kelompokPasien,dokter.namaLengkap as dokter) "+
			 "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 "+
			  "left join pelayananPasien.pasienDaftar antrian "+
			  "left join antrian.pasienDaftar pasienDaftar "+
			  "left join pasienDaftar.kelompokPasien kelompokPasien "+
			  "left join pasienDaftar.pasien pasien "+
			 "left join pasienDaftar.ruangan ruangan "+
			  "left join ruangan.departemen departemen "+
			  "where to_char(pelayananPasien.tglPelayanan,'dd-MM-yyyy') = :tglPelayanan and jenisProduk.id!= 97 "+
			 " and  produk.id != :idProduk and departemen.id = :idDepartemen "+
			  "group by produk.namaProduk,produk.id,pelayananPasien.hargaSatuan,detail.id, "+
			  "jenisProduk.id, pasien.namaPasien,pasien.noCm,pasienDaftar.noRegistrasi, "+
			  "to_char(pasienDaftar.tglRegistrasi, 'yyyy-MM-dd'),ruangan.namaRuangan, "+
			  "kelompokPasien.kelompokPasien,dokter.namaLengkap "+
			  "order by pasienDaftar.noRegistrasi")
	public List<Map<String, Object>> findPelayananPasienByAllDokter(@Param("tglPelayanan") String tglPelayanan,@Param("idProduk") Integer idProduk,@Param("idDepartemen") Integer idDepartemen);
	
	@Query(" select  setting.nilaiField as nilaiField "+  
			" from SettingDataFixed setting"+			
			" where setting.namaField = 'Idkarcis'")
	public String findIdJenisProdukKarcis();
	
	@Query(" select  new map(caraBayar.caraBayar as carabayar, "
			+"caraBayar.id as id) "
			+"from StrukBuktiPenerimaanCaraBayar sbpc "
			+"left join sbpc.kdcarabayar caraBayar "
			+"left join sbpc.nosbm sbm "
			+"where sbm.noRec = :noRecSBM")
	public Map<String,Object> getCaraBayar(@Param("noRecSBM") String noRecSBM);
	
	@Query(" select new map(k3.noRec as norec, "+ 
	        " identifikasi.noRec as identifikasiNorec, "+
			" k3.pelaporId as pelaporid, "+ 
			" pelapor.namaLengkap as namapelapor, "+ 
			" k3.verifikasi as verivikasi, "+ 
			" identifikasiKorban.namaKorban as namaKorban, "+ 
			" identifikasiKorban.niKependudukan as niKependudukan, "+ 
			" identifikasiKorban.namaKorban||"+
			" case when (identifikasiKorban.niKependudukan is null) then '' else ('/'||identifikasiKorban.niKependudukan) end as namaKorbanDanNik, "+
			" identifikasiKorban.tempatLahir||'/'||to_char(identifikasiKorban.tglLahir,'dd-MM-yyyy') as tempatTglLahir, "+ 
			" identifikasiKorban.jenisKelamin as jenisKelamin, "+ 
			" identifikasiKorban.statusPekerjaan as statusPekerjaan, "+
			" identifikasiKorban.statusJabatan as statusJabatan, "+
			" unitRuangan.lokasiRuangan as lokasiRuangan, "+ 
			" unitRuangan.namaRuangan as namaRuangan, "+ 
			" unitRuangan.kdRuangan as kdRuangan, "+ 
			" unitRuangan.noRuangan as noRuangan, "+ 
			" departemen.namaDepartemen as namaDepartemen, "+ 
			" departemen.kdDepartemen as kdDepartemen, "+ 
			" identifikasi.tempatKejadian as tempatKejadian, "+     
			" identifikasi.tanggal as tglKejadian, "+ 
			" identifikasi.awalKejadian as awalKejadian, "+ 
			" identifikasi.kondisiSaatKejadian as kondisiSaatKejadian, "+ 
			" identifikasi.jamKejadian as jamKejadian, "+ 
			" identifikasi.penolongPertama as penolongPertama, "+ 
			" identifikasi.tindakanPenolong as tindakanPenolong, "+ 
			" rencanaTindakLanjut.bagianTubuh as bagianTubuh, "+ 
			" rencanaTindakLanjut.jenisCedera as jenisCedera, "+ 
			" rencanaTindakLanjut.jenisPengobatan as jenisPengobatan, "+ 
			" rencanaTindakLanjut.tindakanRawatInap as tindakanRawatInap, "+ 
			" rencanaTindakLanjut.tindakanRawatJalan as tindakanRawatJalan, "+ 
			" rencanaTindakLanjut.tindakanDiLuarRsab as tindakanDiLuarRsab, "+ 
			" perkiraanKerugian.ketKerugianWaktu as kerugianWaktu,  "+ 
			" perkiraanKerugian.biayaPengobatan as biayaPengobatan, "+ 
			" perkiraanKerugian.ketKerugianKesehatan as kerugianKesehatan, "+ 
			" perkiraanKerugian.lamaTidakKerjaPerJam as lamaTidakKerjaPerJam, "+
			" perkiraanKerugian.lamaIstirahatPerJam as lamaIstirahatPerJam, "+
			" perkiraanKerugian.lamaPemulihanPerHari as lamaPemulihanPerHari, "+	
			" perkiraanKerugian.biayaPostKecelakaan as biayaPostKecelakaan, "+	
			" perkiraanKerugian.biayaPemulihan as biayaPemulihan, "+
			" kepalaUnit.namaLengkap as namaKepalaUnit, "+ 
			" kepalaUnit.id as idKepalaUnit, "+ 
			" kepalaUnit.nipPns as nipKepalaUnit, "+
		    " rencanaTindakLanjut.tindakanLanjutan as tindakanLanjutan)  "+    
			" from K3LaporanKecelakaanKerja k3  "+ 
			" left join k3.pelapor pelapor  "+ 
			" left join k3.lkkIdentifikasiKejadian identifikasi "+ 
			" left join identifikasi.lkkIdentifikasiKorban identifikasiKorban "+ 
			" left join identifikasiKorban.unitRuangan unitRuangan "+ 
			" left join unitRuangan.departemen departemen  "+ 
			" left join identifikasiKorban.lkkRencanaTindakLanjut rencanaTindakLanjut  "+ 
			" left join identifikasiKorban.lkkPerkiraanKerugian perkiraanKerugian  "+ 
			" left join unitRuangan.pegawaiKepala kepalaUnit "+
			" where k3.noRec = :noRec " +
			" and (identifikasiKorban.statusEnabled is null or identifikasiKorban.statusEnabled is true)")
	public List<Map<String,Object>> generateFormulirLaporanKecelakaanKerja(@Param("noRec") String noRec);
	
	@Query(" select "+  
	" new map(saksiKejadian.namaSaksi as namaSaksi, "+  
	" saksiKejadian.noKontak as namaKontak) "+    
	" from LkkIdentifikasiKejadian identifikasi "+  
	" left join identifikasi.lkkSaksiKejadian saksiKejadian "+  
	" where identifikasi.noRec = :noRec")
	public List<Map<String,Object>> getSaksi(@Param("noRec") String noRec);
	
	@Query("select new map(coalesce(ruangan9_.namaRuangan, '-') as ruanganPemesan,"+
			" coalesce(pegawai13_.namaLengkap, '-') as namaTeknisi,"+
			" coalesce(pegawai12_.namaLengkap, '-') as namaPelapor, "+ 
			" coalesce(ruangan10_.namaRuangan, '-') as ruanganTujuan,"+
			" strukkonfi4_.tglKonfirmasi as tanggalMulai,"+			
			" strukverif1_.tglverifikasi as tanggalSelesai, "+
			" strukkirim2_.tglkirim as tanggalRespon, "+
			" strukorder7_.tglOrder as tanggalOrder, "+			
			" 'tanggalRespon-tanggalOrder' as waktuRespon,"+ 
			" produk6_.namaProduk as namaProduk,  "+
			" produk6_.id as idProduk,  "+
			" coalesce(merkProduk1_.merkProduk, '') as merkProduk,"+  
			" coalesce(typeProduk1_.typeProduk, '') as typeProduk,"+ 
			" coalesce(registrasi5_.noSeri, '')  as noSeri,"+ 
			" strukorder7_.keteranganLainnya as keteranganLainnya,"+
			" registrasi5_.noRec as noRecRegistrasiAset,"+  
			" registrasi5_.noRegisterAset as noAset,  "+ 
			" produk6_.namaProduk as namaProduk,  "+
			" orderpelay3_.noRec as noRecOrderPelayanan,  "+
			" strukorder7_.noRec as noRec,  "+
			" jenis5_.id as idJenis,  "+
			" jenis5_.jenisProduk as jenisProduk) "+
			" from  KirimProduk kirimprodu0_  "+
			" left join kirimprodu0_.noVerifikasi strukverif1_     "+
			" left join strukverif1_.loginUser loginuser1_  "+
			" left join loginuser1_.pegawai pegawai1_  "+
			" right join kirimprodu0_.noKirim strukkirim2_     "+
			" right join strukkirim2_.noorder strukorder7_   "+
			" left join strukorder7_.ruangan ruangan9_   "+
			" left join strukorder7_.ruanganTujuan ruangan10_  "+
			" left join strukorder7_.jenisPermintaan jenispermi11_  "+
			" left join strukorder7_.pegawaiOrder pegawai12_ "+       
			" left join strukkirim2_.pegawaiPengirim pegawai8_ "+ 
			" left join kirimprodu0_.noKonfirmasi strukkonfi4_ ,"+ 
			" OrderPelayanan orderpelay3_   "+
			" left join orderpelay3_.registrasiAset registrasi5_ "+
			" left join registrasi5_.produk produk6_  "+
			" left join produk6_.merkProduk merkProduk1_ "+ 
			" left join produk6_.typeProduk typeProduk1_  "+
			" left join produk6_.detailJenisProduk detailjenis5_  "+
			" left join detailjenis5_.jenisProduk jenis5_ "+
			" left join strukkirim2_.pegawaiPengirim pegawai13_,"+
			" MapPegawaiIpsrs mappegawai5_  "+
			" left join mappegawai5_.jenisProduk mappegawai0_  "+
			" left join mappegawai5_.pegawai mappegawai1_  "+
			" where orderpelay3_.strukOrderId=strukorder7_.noRec   "+
			" and strukorder7_.keteranganOrder='Permintaan Perbaikan'   "+
			" and strukorder7_.ruanganTujuanId=229  "+
			" and date(strukorder7_.tglOrder) between date(:startDate) and date(:endDate) "+
			" and jenis5_.id = :idJenisProduk "+
			" group by  "+
			" strukorder7_.noRec ,  "+
			" strukverif1_.tglverifikasi ,  "+
			" strukkonfi4_.tglKonfirmasi ,  "+
			" registrasi5_.noRegisterAset , "+ 
			" produk6_.namaProduk ,  "+
			" strukorder7_.tglOrder,  "+
			" ruangan9_.namaRuangan ,  "+
			" ruangan10_.namaRuangan, "+
			" pegawai12_.namaLengkap ,"+
			" pegawai13_.namaLengkap, "+			
			" orderpelay3_.noRec ,  "+
			" strukorder7_.keteranganLainnya ,  "+
			" strukkirim2_.tglkirim ,  "+
			" strukkonfi4_.tglKonfirmasi ,  "+
			" registrasi5_.noRec,  "+
			" merkProduk1_.merkProduk,  "+
			" typeProduk1_.typeProduk, jenis5_.id, jenis5_.jenisProduk,"+
			" pegawai13_.namaLengkap,"+
			" registrasi5_.noSeri,produk6_.id  "+
			" order by strukorder7_.tglOrder desc")
	public List<Map<String,Object>> generateRekapitulasiCorrectiveMaintenance(@Param("startDate") String startDate,@Param("endDate") String endDate,@Param("idJenisProduk") Integer idJenisProduk);
	
	@Query("select new map(a.noRec as noRec, c.noRec as strukOrder, coalesce(a.qtyProduk, 0) as qtyProduk, " +
			" d.id as idProduk, d.namaProduk as namaProduk, coalesce(e.satuanStandar, '') as satuanStandar) from PlanningPelayananDbhp a " +
			" left join a.strukPlanning b " +
			" left join a.strukOrder c " +
			" left join a.produk d "+
			" left join d.satuanStandar e "+
			" where c.noRec=:noRec and d.id = :idProduk ")
	Map<String, Object> getOrderSukuCadangbyStrukOrder(@Param("noRec") String strukOrder,@Param("idProduk") Integer idProduk);
	
	@Query("select new map(coalesce(statuspeke3_.statusPekerjaan, '-') as statusPekerjaan,coalesce(planningpe0_.keterangan, '-') as uraianPekerjaan)  " +
		    " from PlanningPelayanan planningpe0_  " +
		    " left join planningpe0_.strukPlaning strukplann1_  " +
		    " left join strukplann1_.asalSukuCadang asalsukuca2_  " +
		    " left join strukplann1_.statusPekerjaan statuspeke3_ " +
		    " left join planningpe0_.strukOrder strukorder4_  " +
		    " where strukorder4_.noRec=:noRec") 
	public Map<String, Object> getStatusPekerjaan(@Param("noRec") String noRec);

	
}
