package com.jasamedika.medifirst2000.entities;

import java.util.Date;
import java.util.HashSet;
import java.util.Set;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.Table;

import com.fasterxml.jackson.annotation.JsonBackReference;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.jasamedika.medifirst2000.base.BaseTransaction;
import com.jasamedika.medifirst2000.helper.Caption;

@Entity
@Table(name="PlanningPegawaiStatus_T")
@JsonIgnoreProperties({ "hibernateLazyInitializer", "handler" })
public class PlanningPegawaiStatus extends BaseTransaction{

	@Caption(value="No Planning")
	@Column(name="NoPlanning", length=15, nullable=true)
	private String noPlanning;
	
	@ManyToOne(fetch=FetchType.LAZY)
	@Caption(value="Object Pegawai")
	@JoinColumn(name="ObjectPegawaiFk")
	private Pegawai pegawai;
	
	@Column(name="ObjectPegawaiFk", nullable=true, insertable=false, updatable=false)
	private Integer pegawaiId;
	
	@ManyToOne(fetch=FetchType.LAZY)
	@Caption(value="Object Status Pegawai Plan")
	@JoinColumn(name="ObjectStatusPegawaiPlanFk")
	private StatusPegawai statusPegawaiPlan;
	
	@Column(name="ObjectStatusPegawaiPlanFk", nullable=true, insertable=false, updatable=false)
	private Integer statusPegawaiPlanId;
	
	@JsonBackReference
	@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "planningPegawaiStatus", orphanRemoval = true)
	private Set<ListTanggalCuti> listTanggal = new HashSet<>();
	
	@ManyToOne(fetch=FetchType.LAZY)
	@Caption(value="Object Departemen")
	@JoinColumn(name="ObjectDepartemenFk")
	private Departemen departemen;
	
	@Column(name="ObjectDepartemenFk", nullable=true, insertable=false, updatable=false)
	private Integer departemenId;
	
	@Caption(value="Deskripsi Status Pegawai Plan")
	@Column(name="DeskripsiStatusPegawaiPlan", length=1000, nullable=true)
	private String deskripsiStatusPegawaiPlan;
	
	@Caption(value="Keterangan Lainya Plan")
	@Column(name="KeteranganLainyaPlan", length=1000, nullable=true)
	private String keteranganLainyaPlan;
	
	@ManyToOne(fetch=FetchType.LAZY)
	@Caption(value="Object No SK")
	@JoinColumn(name="ObjectNoSkFk")
	private SuratKeputusan noSk;
	
	@Column(name="ObjectNoSkFk", nullable=true, insertable=false, updatable=false)
	private Integer noSkId;
	
	@ManyToOne(fetch=FetchType.LAZY)
	@Caption(value="Object Status Pegawai Exec")
	@JoinColumn(name="ObjectStatusPegawaiExecFk")
	private StatusPegawai statusPegawaiExec;
	
	@Column(name="ObjectStatusPegawaiExecFk", nullable=true, insertable=false, updatable=false)
	private Integer statusPegawaiExecId;	
	
	@Caption(value="Deskripsi Status Pegawai Exec")
	@Column(name="DeskripsiStatusPegawaiExec", length=1000, nullable=true)
	private String deskripsiStatusPegawaiExec;
	
	@Caption(value="Keterangan Lainya Exec")
	@Column(name="KeteranganLainyaExec", length=1000, nullable=true)
	private String keteranganLainyaExec;

	@Caption(value="Tgl Pengajuan")
	@Column(name="TglPengajuan", nullable=true)
	private Date tglPengajuan;
	
	@Caption(value="Tgl Keputusan")
	@Column(name="TglKeputusan", nullable=true)
	private Date tglKeputusan;
	
	@Caption(value="Approval Status")
	@Column(name="ApprovalStatus", nullable=true)
	private Integer approvalStatus;
	
	@Caption(value="jumlahHari")
	@Column(name="jumlahHari", nullable=true)
	private Integer jumlahHari;
	
	@Caption(value="keterangan")
	@Column(name="keterangan", nullable=true)
	private String keterangan;
	
	@Caption(value="Jenis Perawatan")
	@Column(name="jenisPerawatan", nullable=true)
	private Integer jenisPerawatan; //Add field untuk permohonan perubahan kehadiran karena sakit
	
	@Caption(value="Alamat Selama Cuti")
	@Column(name="alamatCuti", nullable=true)
	private String alamatCuti; //Add field untuk input alamat selama cuti di menu pengajuan Cuti
	
	@Caption(value="Nomor Telepon")
	@Column(name="nomorTelepon", nullable=true)
	private String nomorTelepon;
	
	@Caption(value="Nomor Surat Tugas")
	@Column(name="noSuratTugas", nullable=true)
	private String noSuratTugas;
	
	@Caption(value="Nomor Nota Dinas")
	@Column(name="noNotaDinas", nullable=true)
	private String noNotaDinas;
	
	@Caption(value="Tgl Nota Dinas")
	@Column(name="TglNotaDinas", nullable=true)
	private Date tglNotaDinas;
	
	@Caption(value="Alamat Tugas Dinas")
	@Column(name="alamatTugas", nullable=true)
	private String alamatTugas; 
	
	@ManyToOne(optional=true,fetch=FetchType.LAZY)
	@Caption(value="Object Jabatan Pemberi Nota Dinas")
	@JoinColumn(name="ObjectJabatanPemberiNotaDinasFk", nullable=true)
	private Jabatan jabatanPemberiNotaDinas;
	
	@Column(name="ObjectJabatanPemberiNotaDinasFk", nullable=true, insertable=false, updatable=false)
	private Integer jabatanIdPemberiNotaDinas;
	
	@Caption(value="is Cuti Luar Negeri")
	@Column(name="isCutiLuarNegeri", nullable=true)
	private Boolean isCutiLuarNegeri;
	
	@Caption(value="is Cuti Luar Kota")
	@Column(name="isCutiLuarKota", nullable=true)
	private Boolean isCutiLuarKota;
	
	public String getNoPlanning() {
		return noPlanning;
	}

	public void setNoPlanning(String noPlanning) {
		this.noPlanning = noPlanning;
	}

	public Pegawai getPegawai() {
		return pegawai;
	}

	public void setPegawai(Pegawai pegawai) {
		this.pegawai = pegawai;
	}

	public Integer getPegawaiId() {
		return pegawaiId;
	}

	public void setPegawaiId(Integer pegawaiId) {
		this.pegawaiId = pegawaiId;
	}

	public StatusPegawai getStatusPegawaiPlan() {
		return statusPegawaiPlan;
	}

	public void setStatusPegawaiPlan(StatusPegawai statusPegawaiPlan) {
		this.statusPegawaiPlan = statusPegawaiPlan;
	}

	public Integer getStatusPegawaiPlanId() {
		return statusPegawaiPlanId;
	}

	public void setStatusPegawaiPlanId(Integer statusPegawaiPlanId) {
		this.statusPegawaiPlanId = statusPegawaiPlanId;
	}

	public Departemen getDepartemen() {
		return departemen;
	}

	public void setDepartemen(Departemen departemen) {
		this.departemen = departemen;
	}

	public Integer getDepartemenId() {
		return departemenId;
	}

	public void setDepartemenId(Integer departemenId) {
		this.departemenId = departemenId;
	}

	public String getDeskripsiStatusPegawaiPlan() {
		return deskripsiStatusPegawaiPlan;
	}

	public void setDeskripsiStatusPegawaiPlan(String deskripsiStatusPegawaiPlan) {
		this.deskripsiStatusPegawaiPlan = deskripsiStatusPegawaiPlan;
	}

	public String getKeteranganLainyaPlan() {
		return keteranganLainyaPlan;
	}

	public void setKeteranganLainyaPlan(String keteranganLainyaPlan) {
		this.keteranganLainyaPlan = keteranganLainyaPlan;
	}

	public SuratKeputusan getNoSk() {
		return noSk;
	}

	public void setNoSk(SuratKeputusan noSk) {
		this.noSk = noSk;
	}

	public Integer getNoSkId() {
		return noSkId;
	}

	public void setNoSkId(Integer noSkId) {
		this.noSkId = noSkId;
	}

	public StatusPegawai getStatusPegawaiExec() {
		return statusPegawaiExec;
	}

	public void setStatusPegawaiExec(StatusPegawai statusPegawaiExec) {
		this.statusPegawaiExec = statusPegawaiExec;
	}

	public Integer getStatusPegawaiExecId() {
		return statusPegawaiExecId;
	}

	public void setStatusPegawaiExecId(Integer statusPegawaiExecId) {
		this.statusPegawaiExecId = statusPegawaiExecId;
	}
	public String getDeskripsiStatusPegawaiExec() {
		return deskripsiStatusPegawaiExec;
	}

	public void setDeskripsiStatusPegawaiExec(String deskripsiStatusPegawaiExec) {
		this.deskripsiStatusPegawaiExec = deskripsiStatusPegawaiExec;
	}

	public String getKeteranganLainyaExec() {
		return keteranganLainyaExec;
	}

	public void setKeteranganLainyaExec(String keteranganLainyaExec) {
		this.keteranganLainyaExec = keteranganLainyaExec;
	}

	public Date getTglPengajuan() {
		return tglPengajuan;
	}

	public void setTglPengajuan(Date tglPengajuan) {
		this.tglPengajuan = tglPengajuan;
	}

	public Date getTglKeputusan() {
		return tglKeputusan;
	}

	public void setTglKeputusan(Date tglKeputusan) {
		this.tglKeputusan = tglKeputusan;
	}

	public Integer getApprovalStatus() {
		return approvalStatus;
	}

	public void setApprovalStatus(Integer approvalStatus) {
		this.approvalStatus = approvalStatus;
	}

	public Integer getJumlahHari() {
		return jumlahHari;
	}

	public void setJumlahHari(Integer jumlahHari) {
		this.jumlahHari = jumlahHari;
	}

	public Set<ListTanggalCuti> getListTanggal() {
		return listTanggal;
	}

	public void setListTanggal(Set<ListTanggalCuti> listTanggal) {
		this.listTanggal = listTanggal;
	}

	public String getKeterangan() {
		return keterangan;
	}

	public void setKeterangan(String keterangan) {
		this.keterangan = keterangan;
	}

	public Integer getJenisPerawatan() {
		return jenisPerawatan;
	}

	public void setJenisPerawatan(Integer jenisPerawatan) {
		this.jenisPerawatan = jenisPerawatan;
	}

	public String getAlamatCuti() {
		return alamatCuti;
	}

	public void setAlamatCuti(String alamatCuti) {
		this.alamatCuti = alamatCuti;
	}

	public String getNomorTelepon() {
		return nomorTelepon;
	}

	public void setNomorTelepon(String nomorTelepon) {
		this.nomorTelepon = nomorTelepon;
	}

	public String getNoSuratTugas() {
		return noSuratTugas;
	}

	public void setNoSuratTugas(String noSuratTugas) {
		this.noSuratTugas = noSuratTugas;
	}

	public String getNoNotaDinas() {
		return noNotaDinas;
	}

	public void setNoNotaDinas(String noNotaDinas) {
		this.noNotaDinas = noNotaDinas;
	}

	public Date getTglNotaDinas() {
		return tglNotaDinas;
	}

	public void setTglNotaDinas(Date tglNotaDinas) {
		this.tglNotaDinas = tglNotaDinas;
	}

	public String getAlamatTugas() {
		return alamatTugas;
	}

	public void setAlamatTugas(String alamatTugas) {
		this.alamatTugas = alamatTugas;
	}

	public Jabatan getJabatanPemberiNotaDinas() {
		return jabatanPemberiNotaDinas;
	}

	public void setJabatanPemberiNotaDinas(Jabatan jabatanPemberiNotaDinas) {
		this.jabatanPemberiNotaDinas = jabatanPemberiNotaDinas;
	}

	public Integer getJabatanIdPemberiNotaDinas() {
		return jabatanIdPemberiNotaDinas;
	}

	public void setJabatanIdPemberiNotaDinas(Integer jabatanIdPemberiNotaDinas) {
		this.jabatanIdPemberiNotaDinas = jabatanIdPemberiNotaDinas;
	}

	public Boolean getIsCutiLuarNegeri() {
		return isCutiLuarNegeri;
	}

	public void setIsCutiLuarNegeri(Boolean isCutiLuarNegeri) {
		this.isCutiLuarNegeri = isCutiLuarNegeri;
	}
	
	public void addListTanggal(ListTanggalCuti listTgl) {
		listTanggal.add(listTgl);
		listTgl.setPlanningPegawaiStatus(this);
	}
	
	public void removeListTanggal(ListTanggalCuti listTgl) {
		listTanggal.remove(listTgl);
		listTgl.setPlanningPegawaiStatus(null);
	}

	public Boolean getIsCutiLuarKota() {
		return isCutiLuarKota;
	}

	public void setIsCutiLuarKota(Boolean isCutiLuarKota) {
		this.isCutiLuarKota = isCutiLuarKota;
	}
	
}
