/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package empresa.negocio;

import com.tecgraf.dao.IEntityDAOJPA;
import java.io.Serializable;
import java.util.Collection;
import java.util.Date;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

/**
 *
 * @author s092
 */
@Entity
@Table(name = "empregado")
@NamedQueries({@NamedQuery(name = "Empregado.findById", query = "SELECT e FROM Empregado e WHERE e.id = :id"), 
@NamedQuery(name = "Empregado.findByMatricula", query = "SELECT e FROM Empregado e WHERE e.matricula = :matricula"), 
@NamedQuery(name = "Empregado.findByNome", query = "SELECT e FROM Empregado e WHERE e.nome = :nome"), 
@NamedQuery(name = "Empregado.findBySalario", query = "SELECT e FROM Empregado e WHERE e.salario = :salario"), 
@NamedQuery(name = "Empregado.findByFuncao", query = "SELECT e FROM Empregado e WHERE e.funcao = :funcao"), 
@NamedQuery(name = "Empregado.findByDataadmissao", query = "SELECT e FROM Empregado e WHERE e.dataadmissao = :dataadmissao"), 
@NamedQuery(name = "Empregado.findByQuantidadehorastrabalhadas", query = "SELECT e FROM Empregado e WHERE e.quantidadehorastrabalhadas = :quantidadehorastrabalhadas")})

public class Empregado implements IEntityDAOJPA<Integer>, Serializable {
  private static final long serialVersionUID = 1L;
  @Id
  @Column(name = "id", nullable = false)
  private Integer id;
  
  @Column(name = "matricula", nullable = false)
  private String matricula;
  
  @Column(name = "nome")
  private String nome;
  
  @Column(name = "salario")
  private Double salario;
  
  @Column(name = "funcao")
  private String funcao;
  
  @Column(name = "dataadmissao")
  @Temporal(TemporalType.TIMESTAMP)
  private Date dataadmissao;
  
  @Column(name = "quantidadehorastrabalhadas")
  private Integer quantidadehorastrabalhadas;
  
  @JoinTable(name = "projetoempregado", 
             joinColumns = {@JoinColumn(name = "idempregado", referencedColumnName = "id")}, 
             inverseJoinColumns = {@JoinColumn(name = "idprojeto", referencedColumnName = "id")})
  @ManyToMany
  private Collection<Projeto> idprojetoCollection;
  
  @OneToMany(cascade = CascadeType.ALL, mappedBy = "idempregado")
  private Collection<Dependente> dependenteCollection;
  
  @JoinColumn(name = "iddepartamento", referencedColumnName = "id")
  @ManyToOne
  private Departamento iddepartamento;
  
  @OneToMany(mappedBy = "gerente")
  private Collection<Empregado> empregadoCollection;
  
  @JoinColumn(name = "gerente", referencedColumnName = "id")
  @ManyToOne
  private Empregado gerente;

  public Empregado() {
  }

  public Empregado( Integer id ) {
    this.id = id;
  }

  public Empregado( Integer id, String matricula ) {
    this.id = id;
    this.matricula = matricula;
  }

  public Integer getId() {
    return id;
  }

  public void setId( Integer id ) {
    this.id = id;
  }

  public String getMatricula() {
    return matricula;
  }

  public void setMatricula( String matricula ) {
    this.matricula = matricula;
  }

  public String getNome() {
    return nome;
  }

  public void setNome( String nome ) {
    this.nome = nome;
  }

  public Double getSalario() {
    return salario;
  }

  public void setSalario( Double salario ) {
    this.salario = salario;
  }

  public String getFuncao() {
    return funcao;
  }

  public void setFuncao( String funcao ) {
    this.funcao = funcao;
  }

  public Date getDataadmissao() {
    return dataadmissao;
  }

  public void setDataadmissao( Date dataadmissao ) {
    this.dataadmissao = dataadmissao;
  }

  public Integer getQuantidadehorastrabalhadas() {
    return quantidadehorastrabalhadas;
  }

  public void setQuantidadehorastrabalhadas( Integer quantidadehorastrabalhadas ) {
    this.quantidadehorastrabalhadas = quantidadehorastrabalhadas;
  }

  public Collection<Projeto> getIdprojetoCollection() {
    return idprojetoCollection;
  }

  public void setIdprojetoCollection( Collection<Projeto> idprojetoCollection ) {
    this.idprojetoCollection = idprojetoCollection;
  }

  public Collection<Dependente> getDependenteCollection() {
    return dependenteCollection;
  }

  public void setDependenteCollection( Collection<Dependente> dependenteCollection ) {
    this.dependenteCollection = dependenteCollection;
  }

  public Departamento getIddepartamento() {
    return iddepartamento;
  }

  public void setIddepartamento( Departamento iddepartamento ) {
    this.iddepartamento = iddepartamento;
  }

  public Collection<Empregado> getEmpregadoCollection() {
    return empregadoCollection;
  }

  public void setEmpregadoCollection( Collection<Empregado> empregadoCollection ) {
    this.empregadoCollection = empregadoCollection;
  }

  public Empregado getGerente() {
    return gerente;
  }

  public void setGerente( Empregado gerente ) {
    this.gerente = gerente;
  }

  @Override
  public int hashCode() {
    int hash = 0;
    hash += (id != null ? id.hashCode() : 0);
    return hash;
  }

  @Override
  public boolean equals( Object object ) {
    // TODO: Warning - this method won't work in the case the id fields are not set
    if( !(object instanceof Empregado) ) {
      return false;
    }
    Empregado other = (Empregado)object;
    if( (this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id)) ) {
      return false;
    }
    return true;
  }

  @Override
  public String toString() {
    return "empresa.negocio.Empregado["+ id + " " + nome.trim() + "]: " +
           " admissao: " + dataadmissao + " numero: " + matricula + " " +
           " func: " + funcao + " " + " sal: " + salario + " " + 
           " gerente: " + gerente + " " +
           " - dependentes: " + dependenteCollection; 
  }

}
