Persona.java

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.licensis.notaire.negocio;

import com.licensis.notaire.dto.DtoGestionDeEscritura;
import com.licensis.notaire.dto.DtoPersona;
import com.licensis.notaire.dto.DtoTipoIdentificacion;
import com.licensis.notaire.negocio.TipoIdentificacion;
import com.licensis.notaire.dto.DtoTramite;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import jakarta.persistence.Basic;
import jakarta.persistence.CascadeType;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.FetchType;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.ManyToMany;
import jakarta.persistence.ManyToOne;
import jakarta.persistence.NamedQueries;
import jakarta.persistence.NamedQuery;
import jakarta.persistence.OneToMany;
import jakarta.persistence.Table;
import jakarta.persistence.Temporal;
import jakarta.persistence.TemporalType;
import jakarta.persistence.Version;
import jakarta.xml.bind.annotation.XmlRootElement;
import jakarta.xml.bind.annotation.XmlTransient;
import org.hibernate.LazyInitializationException;
import com.fasterxml.jackson.annotation.JsonAlias;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;

/**
 * Clase que representa a la entidad persona (general).
 * <p>
 * DISEÑO DEL SISTEMA
 * <p>
 * + Tanto los
 * usuarios del sistema, como los escribanos y los clientes, son "personas".
 * Esta clase representa,
 * mendiante el valor de derminados atributos, cada una de estas entidades.
 * <p>
 * REGLA DE NEGOCIO
 * <p>
 * + Si una instancia de personas, solo tiene asignado los siguientes valores:
 * nombre, apellido,
 * telefono, domicilio, tipo y numero de identificado e e-mail, la instancia
 * representa a una
 * persona que tiene presupuestos asociados (No es un cliente).
 * <p>
 * + Si una instancia de persona,
 * tiene ademas de los atributos de personas, los demas atributos (a excepcion
 * del numero de
 * registro) asignado, entonces se trata de un "cliente" y por lo tanto, debe
 * tener gestiones
 * asociadas.
 * <p>
 * + Si una instancia de personas, tiene todos los atributos asignados, pero
 * ademas
 * posee un numero de registro, entonces se trata de un "escribano".
 * <p>
 *
 * @author juanca
 */
@Entity
@Table(name = "personas")
@XmlRootElement
@JsonIgnoreProperties({
        "hibernateLazyInitializer", "handler",
        "tramiteList", "tramitesPersonasList", "presupuestoList",
        "GestionDeEscrituraList", "folioList", "suplenciaList", "suplenciaList1",
        "usuariosList", "copiaList"
})
@NamedQueries({
        @NamedQuery(name = "Persona.findAll", query = "SELECT p FROM Persona p"),
        @NamedQuery(name = "Persona.findByIdPersona", query = "SELECT p FROM Persona p WHERE p.idPersona = :idPersona"),
        @NamedQuery(name = "Persona.findByNumeroIdentificacion", query = "SELECT p FROM Persona p WHERE p.numeroIdentificacion = :numeroIdentificacion"),
        @NamedQuery(name = "Persona.findBySexo", query = "SELECT p FROM Persona p WHERE p.sexo = :sexo"),
        @NamedQuery(name = "Persona.findByFechaNacimiento", query = "SELECT p FROM Persona p WHERE p.fechaNacimiento = :fechaNacimiento"),
        @NamedQuery(name = "Persona.findByNumeroNupcias", query = "SELECT p FROM Persona p WHERE p.numeroNupcias = :numeroNupcias"),
        @NamedQuery(name = "Persona.findByRegistroEscribano", query = "SELECT p FROM Persona p WHERE p.registroEscribano = :registroEscribano"),
        @NamedQuery(name = "Persona.findByEsCliente", query = "SELECT p FROM Persona p WHERE p.esCliente = :esCliente"),
        @NamedQuery(name = "Persona.findByPersonaNombreApellido", query = "SELECT p FROM Persona p WHERE p.nombre LIKE :nombre and p.apellido LIKE :apellido"),
})
public class Persona implements Serializable {

    @Column(name = "fecha_nacimiento")
    @Temporal(TemporalType.DATE)
    private Date fechaNacimiento;
    @Basic(optional = false)
    @Column(name = "version")
    @Version
    private int version;
    @XmlTransient
    @JsonIgnore
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "persona", fetch = FetchType.LAZY)
    private List<TramitesPersonas> tramitesPersonasList;
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "id_persona")
    private Integer idPersona;
    @Basic(optional = false)
    @Column(name = "nombre")
    private String nombre;
    @Basic(optional = false)
    @Column(name = "apellido")
    private String apellido;
    @Column(name = "nacionalidad")
    private String nacionalidad;
    @Basic(optional = false)
    @Column(name = "numero_identificacion")
    private String numeroIdentificacion;
    @Column(name = "cuit")
    private String cuit;
    @Column(name = "sexo")
    private String sexo;
    @Column(name = "estado_civil")
    private String estadoCivil;
    @Column(name = "numero_nupcias")
    private Integer numeroNupcias;
    @Column(name = "ocupacion")
    private String ocupacion;
    @Column(name = "domicilio")
    private String domicilio;
    @Column(name = "telefono")
    private String telefono;
    @Column(name = "e_mail")
    private String eMail;
    @Column(name = "registro_escribano")
    private Integer registroEscribano;
    @Basic(optional = false)
    @Column(name = "es_cliente")
    private boolean esCliente;
    @XmlTransient
    @JsonIgnore
    @ManyToMany(mappedBy = "personaList", fetch = FetchType.LAZY)
    private List<Tramite> tramiteList;
    @JoinColumn(name = "fk_id_tipo_identificacion", referencedColumnName = "id_tipo_identificacion")
    @ManyToOne(optional = false, fetch = FetchType.EAGER)
    private TipoIdentificacion fkIdTipoIdentificacion;
    @XmlTransient
    @JsonIgnore
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "fkIdPersona", fetch = FetchType.LAZY)
    private List<Presupuesto> presupuestoList;
    @XmlTransient
    @JsonIgnore
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "fkIdPersonaEscribano", fetch = FetchType.LAZY)
    private List<GestionDeEscritura> GestionDeEscrituraList;
    @XmlTransient
    @JsonIgnore
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "fkIdPersonaEscribano", fetch = FetchType.LAZY)
    private List<Folio> folioList;
    @XmlTransient
    @JsonIgnore
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "fkIdSuplente", fetch = FetchType.LAZY)
    private List<Suplencia> suplenciaList;
    @XmlTransient
    @JsonIgnore
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "fkIdSuplantado", fetch = FetchType.LAZY)
    private List<Suplencia> suplenciaList1;
    @XmlTransient
    @JsonIgnore
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "fkIdPersona", fetch = FetchType.LAZY)
    private List<Usuario> usuariosList;
    @XmlTransient
    @JsonIgnore
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "fkIdPersona", fetch = FetchType.LAZY)
    private List<Copia> copiaList;

    public Persona() {
    }

    public Persona(Integer idPersona) {
        this.idPersona = idPersona;
    }

    public Persona(Integer idPersona, String nombre, String apellido, String numeroIdentificacion, boolean esCliente) {
        this.idPersona = idPersona;
        this.nombre = nombre;
        this.apellido = apellido;
        this.numeroIdentificacion = numeroIdentificacion;
        this.esCliente = esCliente;
    }

    public Integer getIdPersona() {
        return idPersona;
    }

    public void setIdPersona(Integer idPersona) {
        this.idPersona = idPersona;
    }

    public String getNombre() {
        return nombre;
    }

    public void setNombre(String nombre) {
        this.nombre = nombre;
    }

    public String getApellido() {
        return apellido;
    }

    public void setApellido(String apellido) {
        this.apellido = apellido;
    }

    public String getNacionalidad() {
        return nacionalidad;
    }

    public void setNacionalidad(String nacionalidad) {
        this.nacionalidad = nacionalidad;
    }

    public String getNumeroIdentificacion() {
        return numeroIdentificacion;
    }

    @JsonAlias("dni")
    public void setNumeroIdentificacion(String numeroIdentificacion) {
        this.numeroIdentificacion = numeroIdentificacion;
    }

    public String getCuit() {
        return cuit;
    }

    @JsonAlias("cuil")
    public void setCuit(String cuit) {
        this.cuit = cuit;
    }

    public String getSexo() {
        return sexo;
    }

    public void setSexo(String sexo) {
        this.sexo = sexo;
    }

    public Date getFechaNacimiento() {
        return fechaNacimiento;
    }

    public void setFechaNacimiento(Date fechaNacimiento) {
        this.fechaNacimiento = fechaNacimiento;
    }

    public String getEstadoCivil() {
        return estadoCivil;
    }

    public void setEstadoCivil(String estadoCivil) {
        this.estadoCivil = estadoCivil;
    }

    public Integer getNumeroNupcias() {
        return numeroNupcias;
    }

    public void setNumeroNupcias(Integer numeroNupcias) {
        this.numeroNupcias = numeroNupcias;
    }

    public String getOcupacion() {
        return ocupacion;
    }

    public void setOcupacion(String ocupacion) {
        this.ocupacion = ocupacion;
    }

    public String getDomicilio() {
        return domicilio;
    }

    public void setDomicilio(String domicilio) {
        this.domicilio = domicilio;
    }

    public String getTelefono() {
        return telefono;
    }

    public void setTelefono(String telefono) {
        this.telefono = telefono;
    }

    public String getEMail() {
        return eMail;
    }

    public void setEMail(String eMail) {
        this.eMail = eMail;
    }

    public Integer getRegistroEscribano() {
        return registroEscribano;
    }

    public void setRegistroEscribano(Integer registroEscribano) {
        this.registroEscribano = registroEscribano;
    }

    public boolean getEsCliente() {
        return esCliente;
    }

    public void setEsCliente(boolean esCliente) {
        this.esCliente = esCliente;
    }

    @XmlTransient
    @JsonIgnore
    public List<Tramite> getTramiteList() {
        return tramiteList;
    }

    public void setTramiteList(List<Tramite> tramiteList) {
        this.tramiteList = tramiteList;
    }

    public TipoIdentificacion getFkIdTipoIdentificacion() {
        return fkIdTipoIdentificacion;
    }

    public void setFkIdTipoIdentificacion(TipoIdentificacion fkIdTipoIdentificacion) {
        this.fkIdTipoIdentificacion = fkIdTipoIdentificacion;
    }

    @XmlTransient
    @JsonIgnore
    public List<Presupuesto> getPresupuestoList() {
        return presupuestoList;
    }

    @XmlTransient
    @JsonIgnore
    public List<GestionDeEscritura> getGestionDeEscrituraList() {
        return GestionDeEscrituraList;
    }

    @XmlTransient
    @JsonIgnore
    public List<Folio> getFolioList() {
        return folioList;
    }

    @XmlTransient
    @JsonIgnore
    public List<Suplencia> getSuplenciaList() {
        return suplenciaList;
    }

    @XmlTransient
    @JsonIgnore
    public List<Suplencia> getSuplenciaList1() {
        return suplenciaList1;
    }

    @XmlTransient
    @JsonIgnore
    public List<Usuario> getUsuariosList() {
        return usuariosList;
    }

    @XmlTransient
    @JsonIgnore
    public List<Copia> getCopiaList() {
        return copiaList;
    }

    public void setPresupuestoList(List<Presupuesto> presupuestoList) {
        this.presupuestoList = presupuestoList;
    }

    public void setGestionDeEscrituraList(List<GestionDeEscritura> GestionDeEscrituraList) {
        this.GestionDeEscrituraList = GestionDeEscrituraList;
    }

    public void setFolioList(List<Folio> folioList) {
        this.folioList = folioList;
    }

    public void setSuplenciaList(List<Suplencia> suplenciaList) {
        this.suplenciaList = suplenciaList;
    }

    public void setSuplenciaList1(List<Suplencia> suplenciaList1) {
        this.suplenciaList1 = suplenciaList1;
    }

    public void setUsuariosList(List<Usuario> usuariosList) {
        this.usuariosList = usuariosList;
    }

    public void setCopiaList(List<Copia> copiaList) {
        this.copiaList = copiaList;
    }

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (idPersona != null ? idPersona.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 Persona)) {
            return false;
        }
        Persona other = (Persona) object;
        if ((this.idPersona == null && other.idPersona != null)
                || (this.idPersona != null && !this.idPersona.equals(other.idPersona))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "Persona[ idPersona=" + idPersona + " ]"
                + "[ nombre=" + nombre + " ]"
                + "[ apellido=" + apellido + " ]";
    }

    @JsonIgnore
    public DtoPersona getDto() {

        DtoPersona dtoPersona = new DtoPersona();

        // Version del objeto
        dtoPersona.setVersion(this.version);
        dtoPersona.setIdPersona(this.idPersona);
        dtoPersona.setNombre(this.nombre);
        dtoPersona.setApellido(this.apellido);
        dtoPersona.setCuit(this.cuit);
        dtoPersona.setEmail(this.eMail);
        dtoPersona.setEsCliente(this.esCliente);
        dtoPersona.setEstadoCivil(this.estadoCivil);
        dtoPersona.setFechaNacimiento(this.fechaNacimiento);
        dtoPersona.setNacionalidad(this.nacionalidad);
        dtoPersona.setNumeroIdentificacion(this.getNumeroIdentificacion());
        dtoPersona.setNumeroNupcias(this.numeroNupcias);
        dtoPersona.setOcupacion(this.ocupacion);
        dtoPersona.setDomicilio(this.domicilio);
        dtoPersona.setRegistroEscribano(this.registroEscribano);
        dtoPersona.setSexo(this.sexo);
        dtoPersona.setTelefono(this.telefono);

        DtoTipoIdentificacion dtoTipoIdentificacion = new DtoTipoIdentificacion();
        dtoTipoIdentificacion.setIdTipoIdentificacion(getFkIdTipoIdentificacion().getIdTipoIdentificacion());

        dtoPersona.setDtoTipoIdentificacion(dtoTipoIdentificacion);

        // Asocio el id_Fk_TipoIdentificacion con el nombre tipo de identificacion
        dtoTipoIdentificacion.setNombre(ControllerNegocio.getInstancia().asociarNombreTipoIdentificacion(dtoPersona));

        // Asocio la lista de gestiones que tiene la persona si es Escribano
        if (this.getRegistroEscribano() != null) {
            ArrayList<DtoGestionDeEscritura> miListaDtoGestionEscribano = new ArrayList<>();

            if (!this.GestionDeEscrituraList.isEmpty()) {
                for (int i = 0; i < this.GestionDeEscrituraList.size(); i++) {
                    DtoGestionDeEscritura dtoGestionDeEscritura = this.GestionDeEscrituraList.get(i).getDto();
                    miListaDtoGestionEscribano.add(dtoGestionDeEscritura);
                }
                dtoPersona.setListDtoGestionDeEscriturasDeEscribano(miListaDtoGestionEscribano);
            }
        }

        // Asocio la lista de tramites que pertenece a la persona
        ArrayList<DtoTramite> miListaDtoTramites = new ArrayList<>();
        if (this.tramiteList != null && !this.tramiteList.isEmpty()) {
            for (int i = 0; i < this.tramiteList.size(); i++) {
                DtoTramite dtoTramite = this.tramiteList.get(i).getDto();
                miListaDtoTramites.add(dtoTramite);
            }
            dtoPersona.setListaTramitesPersona(miListaDtoTramites);
        }

        // Asocio la lista de gestiones que tiene la persona
        ArrayList<DtoGestionDeEscritura> miListaDtoGestionPersona = new ArrayList<>();
        ArrayList<Integer> listaIdGestiones = new ArrayList<>();

        try {
            if (tramiteList != null && !tramiteList.isEmpty()) {
                for (int i = 0; i < this.tramiteList.size(); i++) {
                    // esto retorna tantas gestiones como tramites tenga la persona, si hay una
                    // tramite con una persona, esa persona tiene gestion
                    // si es otro tramite pero de la misma pgestion con la misma persona, repite la
                    // gestion
                    DtoGestionDeEscritura dtoGestionDeEscritura = this.tramiteList.get(i).getFkIdGestion().getDto();

                    // Elimino Gestiones duplicadas, a causa de los tramites
                    // Si retorna entero positivo esta, sino no.
                    if (!listaIdGestiones.contains(dtoGestionDeEscritura.getIdGestion())) {
                        listaIdGestiones.add(dtoGestionDeEscritura.getIdGestion());
                        miListaDtoGestionPersona.add(dtoGestionDeEscritura);
                    }
                }
                dtoPersona.setListaDtoGestionDeEscriturasPersona(miListaDtoGestionPersona);
            }
        } catch (LazyInitializationException ex) {
            dtoPersona.setListaDtoGestionDeEscriturasPersona(miListaDtoGestionPersona);
        }
        return dtoPersona;
    }

    public ArrayList<DtoGestionDeEscritura> elimimarDuplicados(ArrayList<DtoGestionDeEscritura> listaDtoEscritura) {

        // Creamos un objeto HashSet
        HashSet hs = new HashSet();

        // Lo cargamos con los valores del array, esto hace quite los repetidos
        hs.addAll(listaDtoEscritura);

        // Limpiamos el array
        listaDtoEscritura.clear();
        listaDtoEscritura.addAll(hs);

        return listaDtoEscritura;

    }

    public void setAtributos(DtoPersona dtoPersona) {

        // Version del objeto
        this.setVersion(dtoPersona.getVersion());

        this.setNombre(dtoPersona.getNombre());
        this.setApellido(dtoPersona.getApellido());
        this.setTelefono(dtoPersona.getTelefono());
        this.setEMail(dtoPersona.getEmail());
        this.setIdPersona(dtoPersona.getIdPersona());
        this.setNumeroIdentificacion(dtoPersona.getNumeroIdentificacion());

        TipoIdentificacion tipoIdentificacion = new TipoIdentificacion();
        tipoIdentificacion.setIdTipoIdentificacion(dtoPersona.getDtoTipoIdentificacion().getIdTipoIdentificacion());
        tipoIdentificacion.setNombre(dtoPersona.getDtoTipoIdentificacion().getNombre());
        this.setFkIdTipoIdentificacion(tipoIdentificacion);

        // Set atributos Cliente
        if (dtoPersona.getEsCliente()) {
            this.setNacionalidad(dtoPersona.getNacionalidad());
            this.setFechaNacimiento(dtoPersona.getFechaNacimiento());
            this.setCuit(dtoPersona.getCuit());
            this.setEstadoCivil(dtoPersona.getEstadoCivil());
            this.setNumeroNupcias(dtoPersona.getNumeroNupcias());
            this.setSexo(dtoPersona.getSexo());
            this.setOcupacion(dtoPersona.getOcupacion());
            this.setDomicilio(dtoPersona.getDomicilio());
            this.setEsCliente(dtoPersona.getEsCliente());
        }

    }

    @XmlTransient
    @JsonIgnore
    public List<TramitesPersonas> getTramitesPersonasList() {
        return tramitesPersonasList;
    }

    public void setTramitesPersonasList(List<TramitesPersonas> tramitesPersonasList) {
        this.tramitesPersonasList = tramitesPersonasList;
    }

    public int getVersion() {
        return version;
    }

    public void setVersion(int version) {
        this.version = version;
    }
}