package br.gov.al.saude.scs.model;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import javax.persistence.Transient;
import javax.validation.constraints.NotNull;
import org.hibernate.validator.constraints.NotEmpty;
import br.gov.al.saude.framework.core.generic.identidade.Identidade;
import br.gov.al.saude.framework.core.interfaces.Alterar;
import br.gov.al.saude.framework.core.interfaces.Cadastrar;
import br.gov.al.saude.framework.core.util.DataUtils;
import br.gov.al.saude.framework.core.util.VerificadorUtil;
import br.gov.al.saude.scg.model.view.MunicipioView;
import br.gov.al.saude.scg.model.view.PessoaFisicaView;
import br.gov.al.saude.scg.model.view.UfView;
import br.gov.al.saude.scs.model.view.UnidadeView;
import br.gov.al.saude.scs.tipo.TipoSituacaoTurma;
@
Entity
@Table
(name =
"scs_turma", schema =
"sc_scs")
public class Turma
implements Serializable, Identidade
{
private static final long serialVersionUID = 1L
;
private Long sequencial
;
private Integer anoExercicio
;
private Capacitacao capacitacao
;
private UnidadeView unidadeSolicitante
;
private Integer cargaHoraria
;
private UfView uf
;
private MunicipioView municipio
;
private String observacao
;
private String ementa
;
private Boolean indicadorAtivo
;
private Set<PessoaFisicaView
> representantes =
new HashSet<PessoaFisicaView
>();
private Set<TurmaParticipante
> participantes =
new HashSet<TurmaParticipante
>();
private Set<TurmaPeriodo
> periodos =
new HashSet<TurmaPeriodo
>();
private Set<TurmaProcesso
> processos =
new HashSet<TurmaProcesso
>();
private Set<Frequencia
> frequencias =
new HashSet<Frequencia
>();
@Id
@GeneratedValue
(generator=
"turma_generator", strategy=GenerationType.
SEQUENCE)
@SequenceGenerator
(name=
"turma_generator", sequenceName=
"sq_turma", initialValue =
1, allocationSize =
1, schema=
"sc_scs")
@Column
(name=
"seq_turma", nullable=
false)
public Long getSequencial
() {
return sequencial
;
}
public void setSequencial
(Long sequencial
) {
this.
sequencial = sequencial
;
}
@Column
(name=
"num_ano", nullable=
false, length=
4)
@NotNull
(message=
"Obrigatório informar o ano de exercício.", groups=
{Cadastrar.
class, Alterar.
class})
public Integer getAnoExercicio
() {
return anoExercicio
;
}
public void setAnoExercicio
(Integer anoExercicio
) {
this.
anoExercicio = anoExercicio
;
}
@ManyToOne
@JoinColumn
(name=
"seq_capacitacao", referencedColumnName=
"seq_capacitacao", nullable=
false)
@NotNull
(message=
"Obrigatório informar a capacitação.", groups=
{Cadastrar.
class, Alterar.
class})
public Capacitacao getCapacitacao
() {
return capacitacao
;
}
public void setCapacitacao
(Capacitacao capacitacao
) {
this.
capacitacao = capacitacao
;
}
@ManyToOne
@JoinColumn
(name=
"cod_unidade_solicitante", referencedColumnName=
"cod_unidade", nullable=
false)
@NotNull
(message=
"Obrigatório informar a unidade solicitante.", groups=
{Cadastrar.
class, Alterar.
class})
public UnidadeView getUnidadeSolicitante
() {
return unidadeSolicitante
;
}
public void setUnidadeSolicitante
(UnidadeView unidadeSolicitante
) {
this.
unidadeSolicitante = unidadeSolicitante
;
}
@Column
(name=
"num_carga_horaria")
public Integer getCargaHoraria
() {
return cargaHoraria
;
}
public void setCargaHoraria
(Integer cargaHoraria
) {
this.
cargaHoraria = cargaHoraria
;
}
@ManyToOne
@JoinColumn
(name=
"cod_uf", referencedColumnName=
"cod_uf")
public UfView getUf
() {
return uf
;
}
public void setUf
(UfView uf
) {
this.
uf = uf
;
}
@ManyToOne
@JoinColumn
(name=
"seq_municipio", referencedColumnName=
"seq_municipio")
public MunicipioView getMunicipio
() {
return municipio
;
}
public void setMunicipio
(MunicipioView municipio
) {
this.
municipio = municipio
;
}
@Column
(name=
"dsc_observacao")
public String getObservacao
() {
return observacao
;
}
public void setObservacao
(String observacao
) {
this.
observacao = observacao
;
}
@Column
(name=
"dsc_ementa")
public String getEmenta
() {
return ementa
;
}
public void setEmenta
(String ementa
) {
this.
ementa = ementa
;
}
@Column
(name=
"ind_ativo", nullable=
false)
public Boolean getIndicadorAtivo
() {
return indicadorAtivo
;
}
public void setIndicadorAtivo
(Boolean indicadorAtivo
) {
this.
indicadorAtivo = indicadorAtivo
;
}
// @Valid
@ManyToMany
@JoinTable
(name=
"scs_turma_representante",
joinColumns=@JoinColumn
(name=
"seq_turma", referencedColumnName=
"seq_turma"),
inverseJoinColumns=@JoinColumn
(name=
"seq_pessoa", referencedColumnName=
"seq_pessoa")
)
public Set<PessoaFisicaView
> getRepresentantes
() {
return representantes
;
}
public void setRepresentantes
(Set<PessoaFisicaView
> representantes
) {
this.
representantes = representantes
;
}
@Transient
public List<PessoaFisicaView
> getRepresentantesAsList
() {
if(VerificadorUtil.
estaNulo(representantes
)) {
return new ArrayList<PessoaFisicaView
>();
}
return new ArrayList<PessoaFisicaView
>(representantes
);
}
@OneToMany
(mappedBy=
"turma", cascade=CascadeType.
ALL, orphanRemoval =
true)
public Set<TurmaParticipante
> getParticipantes
() {
return participantes
;
}
public void setParticipantes
(Set<TurmaParticipante
> participantes
) {
this.
participantes = participantes
;
}
@Transient
public List<TurmaParticipante
> getParticipantesAsList
() {
if(VerificadorUtil.
estaNulo(participantes
)) {
return new ArrayList<TurmaParticipante
>();
}
return new ArrayList<TurmaParticipante
>(participantes
);
}
@OneToMany
(mappedBy=
"turma", cascade=CascadeType.
ALL, orphanRemoval =
true)
public Set<TurmaProcesso
> getProcessos
() {
return processos
;
}
public void setProcessos
(Set<TurmaProcesso
> processos
) {
this.
processos = processos
;
}
@Transient
public List<TurmaProcesso
> getProcessosAsList
() {
if(VerificadorUtil.
estaNulo(processos
)) {
return new ArrayList<TurmaProcesso
>();
}
return new ArrayList<TurmaProcesso
>(processos
);
}
@OneToMany
(mappedBy=
"turma", cascade=CascadeType.
ALL, orphanRemoval =
true)
@
NotEmpty(message=
"Obrigatório informar um período.", groups=
{Cadastrar.
class, Alterar.
class})
public Set<TurmaPeriodo
> getPeriodos
() {
return periodos
;
}
public void setPeriodos
(Set<TurmaPeriodo
> periodos
) {
this.
periodos = periodos
;
}
@Transient
public List<TurmaPeriodo
> getPeriodosAsList
() {
if(periodos ==
null) {
return new ArrayList<TurmaPeriodo
>();
}
return new ArrayList<TurmaPeriodo
>(periodos
);
}
@OneToMany
(mappedBy=
"turma")
public Set<Frequencia
> getFrequencias
() {
return frequencias
;
}
public void setFrequencias
(Set<Frequencia
> frequencias
) {
this.
frequencias = frequencias
;
}
@Transient
public String getSituacaoTurma
(){
return TipoSituacaoTurma.
recuperarTipoSituacao(this, DataUtils.
getDataAtual());
}
public void adicionarRepresentante
(PessoaFisicaView representante
) {
if(representantes ==
null) {
representantes =
new HashSet<PessoaFisicaView
>();
}
representantes.
add(representante
);
}
public void removerRepresentante
(PessoaFisicaView representante
) {
representantes.
remove(representante
);
}
public void adicionarProcesso
(TurmaProcesso turmaProcesso
) {
if(processos ==
null) {
processos =
new HashSet<TurmaProcesso
>();
}
processos.
add(turmaProcesso
);
}
public void removerProcesso
(TurmaProcesso turmaProcesso
) {
processos.
remove(turmaProcesso
);
}
public void adicionarParticipante
(TurmaParticipante turmaParticipante
) {
if(participantes ==
null) {
participantes =
new HashSet<TurmaParticipante
>();
}
participantes.
add(turmaParticipante
);
}
public void removerParticipante
(TurmaParticipante turmaParticipante
) {
participantes.
remove(turmaParticipante
);
}
public void adicionarTurmaPeriodo
(TurmaPeriodo turmaPeriodo
) {
if(periodos ==
null) {
periodos =
new HashSet<TurmaPeriodo
>();
}
periodos.
add(turmaPeriodo
);
}
public void removerTurmaPeriodo
(TurmaPeriodo turmaPeriodo
) {
periodos.
remove(turmaPeriodo
);
}
@
Override
@Transient
public Object getId
() {
return sequencial
;
}
@
Override
public void setId
(Object id
) {
this.
sequencial =
(Long) id
;
}
@
Override
public int hashCode
() {
final int prime =
31;
int result =
1;
result = prime
* result +
((sequencial ==
null) ? 0 : sequencial.
hashCode());
return result
;
}
@
Override
public boolean equals
(Object obj
) {
if (this == obj
)
return true;
if (obj ==
null)
return false;
if (getClass
() != obj.
getClass())
return false;
Turma other =
(Turma
) obj
;
if (sequencial ==
null) {
if (other.
sequencial !=
null)
return false;
} else if (!sequencial.
equals(other.
sequencial))
return false;
return true;
}
}