package com.fp.armas.portal.service; import java.sql.Timestamp; import java.text.MessageFormat; import java.util.Calendar; import java.util.Collection; import java.util.Date; import java.util.List; import java.util.UUID; import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; import javax.ejb.EJB; import javax.ejb.Stateless; import javax.ejb.TransactionAttribute; import javax.ejb.TransactionAttributeType; import javax.inject.Inject; import javax.persistence.Query; import org.apache.commons.codec.digest.DigestUtils; import org.apache.commons.lang3.SerializationUtils; import com.fp.armas.portal.dao.registro.ActividadEconomicaDao; import com.fp.armas.portal.dao.registro.ArchivoDao; import com.fp.armas.portal.dao.registro.ArchivoDetalleDao; import com.fp.armas.portal.dao.registro.CantonDao; import com.fp.armas.portal.dao.registro.CatalogoDao; import com.fp.armas.portal.dao.registro.CiudadDao; import com.fp.armas.portal.dao.registro.CompaniaDao; import com.fp.armas.portal.dao.registro.DireccionPersonaDao; import com.fp.armas.portal.dao.registro.PaisDao; import com.fp.armas.portal.dao.registro.ParroquiaDao; import com.fp.armas.portal.dao.registro.PersonaDao; import com.fp.armas.portal.dao.registro.PersonaDetalleDao; import com.fp.armas.portal.dao.registro.PersonaNaturalDao; import com.fp.armas.portal.dao.registro.ProvinciaDao; import com.fp.armas.portal.dao.registro.TelefonoPersonaDao; import com.fp.armas.portal.dao.registro.UsuarioDao; import com.fp.armas.portal.dao.registro.UsuarioDetalleDao; import com.fp.armas.portal.dao.registro.UsuarioPerfilDao; import com.fp.armas.portal.model.Tcustcompany; import com.fp.armas.portal.model.TcustcompanyPK; import com.fp.armas.portal.model.Tcustpeople; import com.fp.armas.portal.model.TcustpeoplePK; import com.fp.armas.portal.model.Tcustperson; import com.fp.armas.portal.model.Tcustpersonaddress; import com.fp.armas.portal.model.TcustpersonaddressPK; import com.fp.armas.portal.model.Tcustpersondetail; import com.fp.armas.portal.model.TcustpersondetailPK; import com.fp.armas.portal.model.Tcustpersonphone; import com.fp.armas.portal.model.TcustpersonphonePK; import com.fp.armas.portal.model.Tgeneactivity; import com.fp.armas.portal.model.Tgenecanton; import com.fp.armas.portal.model.Tgenecatalogdetail; import com.fp.armas.portal.model.Tgenecity; import com.fp.armas.portal.model.Tgenecountry; import com.fp.armas.portal.model.Tgenefile; import com.fp.armas.portal.model.Tgenefilesdetail; import com.fp.armas.portal.model.TgenefilesdetailPK; import com.fp.armas.portal.model.Tgeneparroquia; import com.fp.armas.portal.model.Tgeneprovince; import com.fp.armas.portal.model.Tsafeuser; import com.fp.armas.portal.model.Tsafeuserdetail; import com.fp.armas.portal.model.TsafeuserdetailPK; import com.fp.armas.portal.model.Tsafeuserprofile; import com.fp.armas.portal.model.TsafeuserprofilePK; import com.fp.armas.portal.util.FechaUtil; import com.fp.armas.portal.util.PortalMessages; import com.fp.armas.portal.util.RegistroException; import com.fp.general.mail.EnvioMail; import com.fp.general.mail.dto.EnvioCorreoDTO; import com.fp.general.mail.exception.EnvioMailException; import com.fp.general.mail.factory.EnvioMailFactory; /** * Servicio que maneja la lógica del registro de usuarios * @author dcruz * */ @Stateless @TransactionAttribute(TransactionAttributeType.MANDATORY) public class RegistroBean { /** * Bean que maneja las secuencias */ @EJB private SequenceBean sequenceBean; /** * Referencia al {@link CatalogoDao} */ @Inject private CatalogoDao catalogoDao; /** * Referencia al {@link ActividadEconomicaDao} */ @Inject private ActividadEconomicaDao actividadEconomicaDao; /** * Referencia al {@link PaisDao} */ @Inject private PaisDao paisDao; /** * Referencia al DAO {@link ProvinciaDao} */ @Inject private ProvinciaDao provinciaDao; /** * Referencia al {@link CantonDao} */ @Inject private CantonDao cantonDao; /** * Referencia al DAO {@link ParroquiaDao} */ @Inject private ParroquiaDao parroquiaDao; /** * Referencia al DAO {@link CiudadDao} */ @Inject private CiudadDao ciudadDao; /** * Referencia al DAO {@link PersonaDao} */ @Inject private PersonaDao personaDao; /** * Referencia al DAO {@link PersonaDetalleDao} */ @Inject private PersonaDetalleDao personaDetalleDao; /** * Referencia al DAO {@link DireccionPersonaDao} */ @Inject private DireccionPersonaDao direccionPersonaDao; /** * Referencia al DAO {@link TelefonoPersonaDao} */ @Inject private TelefonoPersonaDao telefonoPersonaDao; /** * Referencia al DAO {@link PersonaNaturalDao} */ @Inject private PersonaNaturalDao personaNaturalDao; /** * Referencia al DAO {@link CompaniaDao} */ @Inject private CompaniaDao companiaDao; /** * Referencia al DAO {@link UsuarioDao} */ @Inject private UsuarioDao usuarioDao; /** * Referencia al DAO {@link UsuarioDetalleDao} */ @Inject private UsuarioDetalleDao usuarioDetalleDao; /** * Referencia al DAO {@link UsuarioPerfilDao} */ @Inject private UsuarioPerfilDao usuarioPerfilDao; /** * Referencia al DAO {@link ArchivoDao} */ @Inject private ArchivoDao archivoDao; /** * Referencia al DAO {@link ArchivoDetalleDao} */ @Inject private ArchivoDetalleDao archivoDetalleDao; /** * Retorna una colección de catálogos en base al codigo de catálogo ingresado * @param codigoTipo * @return * @throws RegistroException */ public Collection obtenerCatalogo(String codigoTipo) throws RegistroException{ try{ return catalogoDao.buscarCatalogo(codigoTipo); }catch (Throwable e){ throw new RegistroException(e); } } /** * Retorna las actividades económicas disponibles * @return * @throws RegistroException */ public Collection obtenerActividades() throws RegistroException{ try { return actividadEconomicaDao.buscarActividadEconomicas(); } catch (Throwable e) { throw new RegistroException(e); } } /** * Retorna un catálogo por código y legalcode * @param codigoTipo * @param legalCode * @return */ public Collection obtenerCalogo(String codigoTipo, String legalCode) { try { return catalogoDao.buscarCatalogo(codigoTipo, legalCode); } catch (Throwable e) { throw new RegistroException(e); } } /** * Retorna los países disponibles en el sistema * @return */ public Collection obtenerPaises() { try { return paisDao.buscarPaises(); } catch (Throwable e) { throw new RegistroException(e); } } /** * Retorna las provincias de un país * @param countryCode * @return */ public Collection obtenerProvincias(String countryCode) { try { return provinciaDao.buscarProvinciasxPais(countryCode); } catch (Throwable e) { throw new RegistroException(e); } } /** * Retorna los cantones de una provincia * @param countryCode * @param provinceCode * @return */ public Collection obtenerCantones(String countryCode, String provinceCode) { try { return cantonDao.buscarCantonesxPaisyProvincia(countryCode, provinceCode); } catch (Throwable e) { throw new RegistroException(e); } } /** * Retorna las parroquias de un cantón * @param countryCode * @param provinceCode * @param cantonCode * @return */ public Collection obtenerParroquias(String countryCode, String provinceCode, String cantonCode) { try { return parroquiaDao.buscarParroquias(countryCode, provinceCode, cantonCode); } catch (Throwable e) { throw new RegistroException(e); } } /** * Retorna las ciudades de un cantón * @param countryCode * @param provinceCode * @param cantonCode * @return */ public Collection obtenerCiudades(String countryCode, String provinceCode, String cantonCode) { try { return ciudadDao.buscarCiudad(countryCode, provinceCode, cantonCode); } catch (Throwable e) { throw new RegistroException(e); } } /** * Genera un nuevo usuario con todas sus características * @param persona * @param direccionPersona * @param correoPersona * @param telefonoPersona * @param telefonoCelular * @param adicionalPersona * @param compania * @param foto * @throws RegistroException */ public void guardarUsuario(Tcustpersondetail persona, Tcustpersonaddress direccionPersona, Tcustpersonaddress correoPersona, Tcustpersonphone telefonoPersona, Tcustpersonphone telefonoCelular, Tcustpeople adicionalPersona, Tcustcompany compania, Tgenefilesdetail foto) throws RegistroException { try { Tcustperson personaExistente = null; if(persona.getId() != null && persona.getId().getPersoncode() != 0){ personaExistente = personaDao.buscarPorId(persona.getId().getPersoncode()); } if(personaExistente == null){ Future personCode = sequenceBean.retornaSecuencia("PERSONCODE"); //busco la secuencia en otro hilo de ejecucion Tcustperson personaRaiz = new Tcustperson(); Long codigoPersona = personCode.get(); personaRaiz.setPersoncode(codigoPersona); personaDao.create(personaRaiz);//creo persona y preparo datos para generar personadetail persona.setId(new TcustpersondetailPK()); persona.getId().setPersoncode(personaRaiz.getPersoncode()); } switch(persona.getIdentificationcatalog()){ case "CED": case "PAS":{//firstname StringBuilder nombre = new StringBuilder(adicionalPersona.getFirstname() != null ? adicionalPersona.getFirstname():""); // nombre.append(" "); // nombre.append(adicionalPersona.getMiddlename() != null ? adicionalPersona.getMiddlename():""); // nombre.append(" "); // nombre.append(adicionalPersona.getLastname() != null ? adicionalPersona.getLastname():""); // nombre.append(" "); // nombre.append(adicionalPersona.getSurename() != null ? adicionalPersona.getSurename():""); persona.setName(nombre.toString()); persona.setPersontypecatalog("1"); persona.setPersontypecatalogcode("PERSONTYPE"); } break; default: { persona.setPersontypecatalog("2"); persona.setPersontypecatalogcode("PERSONTYPE"); } break; } this.guardaPersonaDetalle(persona); this.guardarDireccionesPersona(persona, direccionPersona, correoPersona); this.guardarTelefonosPersona(persona, direccionPersona, telefonoPersona, telefonoCelular); this.guardaDetallesPersonaNatural(persona, adicionalPersona); this.guardaCompania(persona, compania, foto); this.guardarUsuario(persona, correoPersona); } catch (Throwable e) { throw new RegistroException(e); } } /** * Obtiene persona por identificación * @param codigoIdentificacion * @return * @throws RegistroException */ public Tcustpersondetail obtenerPersonaPorIdentificacion(String codigoIdentificacion) throws RegistroException{ try{ return personaDetalleDao.buscarPorIdentificacion(codigoIdentificacion); }catch(Throwable e){ throw new RegistroException(e); } } /** * Obtener companía en base al id * @param personcode * @return * @throws RegistroException */ public Tcustcompany obtenerCompania(Integer personcode) throws RegistroException{ try { TcustcompanyPK pk = new TcustcompanyPK(); pk.setPersoncode(personcode); pk.setDateto(FechaUtil.obtenerFecha(2999, 11, 31)); return companiaDao.buscarPorId(pk); } catch (Throwable e) { throw new RegistroException(e); } } /** * Obtener información de la persona natural en base al id * @param personcode * @return */ public Tcustpeople obtenerPersonaNaturalId(Integer personcode) { try { TcustpeoplePK pk = new TcustpeoplePK(); pk.setPersoncode(personcode); pk.setDateto(FechaUtil.obtenerFecha(2999, 11, 31)); return personaNaturalDao.buscarPorId(pk); } catch (Throwable e) { throw new RegistroException(e); } } /** * Busca y devuelve la dirección principal de la persona * @param personcode * @return */ public Tcustpersonaddress obtenerDireccionPrincipal(Integer personcode) { try { return direccionPersonaDao.buscaDireccionPrincipal(personcode); } catch (Throwable e) { throw new RegistroException(e); } } /** * Busca y devuelve la dirección de correo de la persona * @param personcode * @return */ public Tcustpersonaddress obtenerDireccionCorreo(Integer personcode) { try { return direccionPersonaDao.buscaDireccionPorTipo(personcode, PortalMessages.getInstancia().getString("catalogo.valor.direccion.correo")); } catch (Throwable e) { throw new RegistroException(e); } } /** * Busca y devuelve el teléfono fijo de la persona * @param personcode * @return */ public Tcustpersonphone obtenerTelefonoFijo(Integer personcode) { try { return telefonoPersonaDao.obtenerTelefonoTipo(personcode, PortalMessages.getInstancia().getString("catalogo.valor.telefono.fijo")); } catch (Throwable e) { throw new RegistroException(e); } } /** * Busca y devuelve el teléfono celular de la persona * @param personcode * @return */ public Tcustpersonphone obtenerTelefonoCelular(Integer personcode) { try { return telefonoPersonaDao.obtenerTelefonoTipo(personcode, PortalMessages.getInstancia().getString("catalogo.valor.telefono.celular")); } catch (Throwable e) { throw new RegistroException(e); } } /** * Método en donde almaceno los detalles del usuario, datos adicionales * @param persona * @param direccionPersona * @param correoPersona * @param telefonoPersona * @param telefonoCelular * @param adicionalPersona */ private void guardaPersonaDetalle(Tcustpersondetail persona){ try { Tcustpersondetail personaAnterior = personaDetalleDao.buscarPorId(new TcustpersondetailPK(persona.getId().getPersoncode(), persona.getId().getDateto())); if(personaAnterior == null){ persona.getId().setDateto(FechaUtil.obtenerFecha(2999, 11, 31)); persona.setDatefrom(new Timestamp(System.currentTimeMillis())); persona.setRecordversion(0L); persona.setIngressuser(PortalMessages.getInstancia().getString("usuario.registro")); persona.setLanguagecode(PortalMessages.getInstancia().getString("codigo.general.lenguaje")); persona.setCompanycode(1L); persona.setBranchcode(1L); persona.setOfficecode(1L); persona.setIdentificationcatalogcode("IDENTIFICATION"); persona.setRegisterdate(Calendar.getInstance().getTime()); personaDetalleDao.create(persona); } else{//actualizacion personaDetalleDao.detach(personaAnterior); personaAnterior.getId().setDateto(new Date()); personaAnterior.setIdentificationcatalogcode("IDENTIFICATION"); personaDetalleDao.create(personaAnterior); persona.setIdentificationcatalogcode("IDENTIFICATION"); personaDetalleDao.update(persona); } } catch (Throwable e) { throw new RegistroException(e); } } /** * Almaceno la información de las direcciones de las personas * @param persona * @param direccionPersona * @param correoPersona */ private void guardarDireccionesPersona(Tcustpersondetail persona, Tcustpersonaddress direccionPersona, Tcustpersonaddress correoPersona){ try { // Limpiar las direcciones domicilio previas existentes en caso de existir ListdireccionesDomPreviasLst = direccionPersonaDao.buscaDireccionesPorTipo(persona.getId().getPersoncode(), "2"); if(direccionesDomPreviasLst!=null){ for(Tcustpersonaddress direccionTmp:direccionesDomPreviasLst){ direccionTmp.getId().setDateto(new Date()); direccionPersonaDao.update(direccionTmp); direccionPersonaDao.getEntityManager().flush(); } } // Limpiar las direcciones correo previas existentes en caso de existir ListdireccionesCorreoPreviasLst = direccionPersonaDao.buscaDireccionesPorTipo(persona.getId().getPersoncode(), "3"); if(direccionesCorreoPreviasLst!=null){ for(Tcustpersonaddress direccionTmp:direccionesCorreoPreviasLst){ direccionTmp.getId().setDateto(new Date()); direccionPersonaDao.update(direccionTmp); direccionPersonaDao.getEntityManager().flush(); } } if(direccionPersona.getId() == null || direccionPersona.getId().getPersoncode() == 0){ //Ingreso la direccion de residencia de la persona direccionPersona.setId(new TcustpersonaddressPK()); direccionPersona.getId().setPersoncode(persona.getId().getPersoncode()); direccionPersona.getId().setAddressnumber(1L); direccionPersona.getId().setDateto(FechaUtil.obtenerFecha(2999, 11, 31)); direccionPersona.setDatefrom(new Timestamp(System.currentTimeMillis())); direccionPersona.setPrincipal(PortalMessages.getInstancia().getString("valor.general.si")); direccionPersona.setRecordversion(0L); direccionPersona.setIngressusercode(PortalMessages.getInstancia().getString("usuario.registro")); Tcustpersonaddress direccionAnterior = direccionPersonaDao.buscarPorId(new TcustpersonaddressPK(direccionPersona.getId().getPersoncode(), direccionPersona.getId().getAddressnumber(), direccionPersona.getId().getDateto())); if(direccionAnterior==null){ direccionPersonaDao.create(direccionPersona); } else{ direccionAnterior.setPrincipal(PortalMessages.getInstancia().getString("valor.general.si")); direccionAnterior.setAddress(direccionPersona.getAddress()); direccionAnterior.setDatefrom(new Timestamp(System.currentTimeMillis())); direccionAnterior.getId().setDateto(FechaUtil.obtenerFecha(2999, 11, 31)); direccionPersonaDao.update(direccionAnterior); } } else{ // Tcustpersonaddress direccionAnterior = direccionPersonaDao.buscarPorId(new TcustpersonaddressPK(direccionPersona.getId().getPersoncode(), direccionPersona.getId().getAddressnumber(), direccionPersona.getId().getDateto())); // if(direccionAnterior != null){ // direccionPersonaDao.detach(direccionAnterior); // direccionAnterior.getId().setDateto(new Date()); // direccionPersonaDao.create(direccionAnterior); // } direccionPersona.setDatefrom(new Timestamp(System.currentTimeMillis())); direccionPersona.setPrincipal(PortalMessages.getInstancia().getString("valor.general.si")); direccionPersonaDao.update(direccionPersona); } if(correoPersona.getId() == null || correoPersona.getId().getPersoncode() == 0){ //Ingreso la direccion de correo de la persona correoPersona.setId(new TcustpersonaddressPK()); correoPersona.getId().setPersoncode(persona.getId().getPersoncode()); correoPersona.getId().setAddressnumber(2L); correoPersona.getId().setDateto(FechaUtil.obtenerFecha(2999, 11, 31)); correoPersona.setDatefrom(new Timestamp(System.currentTimeMillis())); correoPersona.setRecordversion(0L); correoPersona.setIngressusercode(PortalMessages.getInstancia().getString("usuario.registro")); Tcustpersonaddress correoAnterior = direccionPersonaDao.buscarPorId(new TcustpersonaddressPK(correoPersona.getId().getPersoncode(), correoPersona.getId().getAddressnumber(), correoPersona.getId().getDateto())); if(correoAnterior==null){ direccionPersonaDao.create(correoPersona); } else{ correoAnterior.getId().setAddressnumber(2L); correoAnterior.setAddress(correoPersona.getAddress()); correoAnterior.setAddresstypecatalog("3"); correoAnterior.setCountryCode(null); correoAnterior.setProvinceCode(null); correoAnterior.setCantonCode(null); correoAnterior.setCityCode(null); correoAnterior.setParroquiaCode(null); correoAnterior.setPrincipal(null); correoAnterior.setDatefrom(new Timestamp(System.currentTimeMillis())); correoAnterior.getId().setDateto(FechaUtil.obtenerFecha(2999, 11, 31)); direccionPersonaDao.update(correoAnterior); } } else{ // Tcustpersonaddress correoAnterior = direccionPersonaDao.buscarPorId(new TcustpersonaddressPK(correoPersona.getId().getPersoncode(), correoPersona.getId().getAddressnumber(), correoPersona.getId().getDateto())); // if(correoAnterior != null){ // direccionPersonaDao.detach(correoAnterior); // correoAnterior.getId().setDateto(new Date()); // direccionPersonaDao.create(correoAnterior); // } direccionPersonaDao.update(correoPersona); } } catch (Throwable e) { throw new RegistroException(e); } } /** * Almaceno la información correspondientes a los teléfonos de la persona * @param persona * @param telefonoPersona * @param telefonoCelular */ private void guardarTelefonosPersona(Tcustpersondetail persona, Tcustpersonaddress direccionPersona, Tcustpersonphone telefonoPersona, Tcustpersonphone telefonoCelular){ try { // Limpiar los telefonos previos convencionales existentes en caso de existir ListtelefonoConvPreviosLst = telefonoPersonaDao.obtenerTelefonosPorTipo(persona.getId().getPersoncode(), "1"); if(telefonoConvPreviosLst!=null){ for(Tcustpersonphone telefonoTmp:telefonoConvPreviosLst){ telefonoTmp.getId().setDateto(new Date()); telefonoPersonaDao.update(telefonoTmp); } } // Limpiar los telefonos previos celulares existentes en caso de existir ListtelefonoCelularPreviosLst = telefonoPersonaDao.obtenerTelefonosPorTipo(persona.getId().getPersoncode(), "2"); if(telefonoCelularPreviosLst!=null){ for(Tcustpersonphone telefonoTmp:telefonoCelularPreviosLst){ telefonoTmp.getId().setDateto(new Date()); telefonoPersonaDao.update(telefonoTmp); } } if(telefonoPersona.getId() == null || telefonoPersona.getId().getPersoncode() == 0){ Long sec=telefonoPersonaDao.maxSecuencia(persona.getId().getPersoncode()); //El telefono corresponde a la direccion de la persona telefonoPersona.setId(new TcustpersonphonePK()); telefonoPersona.getId().setDateto(FechaUtil.obtenerFecha(2999, 11, 31)); if(sec==null || sec==0){ telefonoPersona.getId().setPhonesequence(1L); }else{ telefonoPersona.getId().setPhonesequence(sec+1L); } telefonoPersona.getId().setPersoncode(persona.getId().getPersoncode()); telefonoPersona.setDatefrom(new Timestamp(System.currentTimeMillis())); telefonoPersona.setAddressnumber(direccionPersona.getId().getAddressnumber()); telefonoPersona.setIngressusercode(PortalMessages.getInstancia().getString("usuario.registro")); telefonoPersonaDao.create(telefonoPersona); } else{ // Tcustpersonphone telefonoPersonaAnterior = telefonoPersonaDao.buscarPorId(new TcustpersonphonePK(telefonoPersona.getId().getPersoncode(), telefonoPersona.getId().getDateto(),telefonoPersona.getId().getPhonesequence())); // if(telefonoPersonaAnterior != null){ // telefonoPersonaDao.detach(telefonoPersonaAnterior); // telefonoPersonaAnterior.getId().setDateto(new Date()); // telefonoPersonaDao.update(telefonoPersonaAnterior); // } telefonoPersonaDao.update(telefonoPersona); } if(telefonoCelular.getId() == null || telefonoCelular.getId().getPersoncode() == 0){ //Almaceno el telefono celular telefonoCelular.setId(new TcustpersonphonePK()); telefonoCelular.getId().setDateto(FechaUtil.obtenerFecha(2999, 11, 31)); Long sec=telefonoPersonaDao.maxSecuencia(persona.getId().getPersoncode()); if(sec==null || sec==0){ telefonoCelular.getId().setPhonesequence(1L); }else{ telefonoCelular.getId().setPhonesequence(sec+1L); } //telefonoCelular.getId().setPhonesequence(2L); telefonoCelular.getId().setPersoncode(persona.getId().getPersoncode()); telefonoCelular.setDatefrom(new Timestamp(System.currentTimeMillis())); telefonoCelular.setAddressnumber(direccionPersona.getId().getAddressnumber()); telefonoCelular.setIngressusercode(PortalMessages.getInstancia().getString("usuario.registro")); telefonoPersonaDao.create(telefonoCelular); } else{ // Tcustpersonphone telefonoCelularAnterior = telefonoPersonaDao.buscarPorId(new TcustpersonphonePK(telefonoCelular.getId().getPersoncode(), telefonoCelular.getId().getDateto(), telefonoCelular.getId().getPhonesequence())); // if(telefonoCelularAnterior != null){ // telefonoPersonaDao.detach(telefonoCelularAnterior); // telefonoCelularAnterior.getId().setDateto(new Date()); // telefonoPersonaDao.update(telefonoCelularAnterior); // } telefonoPersonaDao.update(telefonoCelular); } } catch (Throwable e) { throw new RegistroException(e); } } /** * Almaceno información adicional siempre y cuando la persona sea de tipo natural * @param persona */ private void guardaDetallesPersonaNatural(Tcustpersondetail persona, Tcustpeople adicionalPersona){ // Actualizar dateto de registros previos vigentes ListpersonasNaturalesPreviasLst = personaNaturalDao.buscaPersonaNatural(persona.getId().getPersoncode()); if(personasNaturalesPreviasLst!=null){ for(Tcustpeople peopleTmp:personasNaturalesPreviasLst){ peopleTmp.getId().setDateto(new Date()); personaNaturalDao.update(peopleTmp); } } //Si no es natural no se debe anadir detalles if(!persona.getIdentificationcatalog().equals(PortalMessages.getInstancia().getString("catalogo.codigo.detalle.id.cedula")) && !persona.getIdentificationcatalog().equals(PortalMessages.getInstancia().getString("catalogo.codigo.detalle.id.pas"))){ return; } if(adicionalPersona.getId() == null || adicionalPersona.getId().getPersoncode() == 0){ adicionalPersona.setId(new TcustpeoplePK()); adicionalPersona.getId().setDateto(FechaUtil.obtenerFecha(2999, 11, 31)); adicionalPersona.getId().setPersoncode(persona.getId().getPersoncode()); adicionalPersona.setDatefrom(new Timestamp(System.currentTimeMillis())); adicionalPersona.setRecordversion(0L); adicionalPersona.setIngressusercode(PortalMessages.getInstancia().getString("usuario.registro")); personaNaturalDao.create(adicionalPersona); } else{ // Tcustpeople adicionalAnterior = personaNaturalDao.buscarPorId(new TcustpeoplePK(adicionalPersona.getId().getPersoncode(), adicionalPersona.getId().getDateto())); // if(adicionalAnterior != null){ // personaNaturalDao.detach(adicionalAnterior); // adicionalAnterior.getId().setDateto(new Date()); // personaNaturalDao.update(adicionalAnterior); // } personaNaturalDao.update(adicionalPersona); } } /** * Guarda la companía si es que es persona jurídica * @param persona * @param compania * @param foto * @throws InterruptedException * @throws ExecutionException */ private void guardaCompania(Tcustpersondetail persona, Tcustcompany compania, Tgenefilesdetail foto) throws InterruptedException, ExecutionException { if(!persona.getIdentificationcatalog().equals(PortalMessages.getInstancia().getString("catalogo.codigo.detalle.id.ruc"))){ return; } if(compania.getId() == null || compania.getId().getPersoncode() == 0){ compania.setId(new TcustcompanyPK()); compania.getId().setDateto(FechaUtil.obtenerFecha(2999, 11, 31)); compania.getId().setPersoncode(persona.getId().getPersoncode()); compania.setDatefrom(new Timestamp(System.currentTimeMillis())); compania.setLogo(guardaFoto(foto)); compania.setRecordversion(0L); compania.setIngressuser(PortalMessages.getInstancia().getString("usuario.registro")); companiaDao.create(compania); } else{ Tcustcompany companiaAnterior = companiaDao.buscarPorId(new TcustcompanyPK(compania.getId().getPersoncode(), compania.getId().getDateto())); if(companiaAnterior != null){ companiaDao.detach(companiaAnterior); companiaAnterior.getId().setDateto(new Date()); companiaDao.create(companiaAnterior); } Tgenefilesdetail fotoBase = archivoDetalleDao.buscarPorId(new TgenefilesdetailPK(compania.getLogo() != null ? compania.getLogo() : -1, FechaUtil.obtenerFecha(2999, 11, 31))); if(fotoBase != null){ fotoBase.setImage(foto.getImage()); archivoDetalleDao.update(fotoBase); } else{ compania.setLogo(guardaFoto(foto)); } companiaDao.update(compania); } } /** * Almacena la foto o logo de la persona natural o jurídica * @param fotoDetalle * @return * @throws InterruptedException * @throws ExecutionException */ private Integer guardaFoto(Tgenefilesdetail fotoDetalle) throws InterruptedException, ExecutionException{ Long idFoto = null; if(fotoDetalle != null && fotoDetalle.getImage() != null){ Future code = sequenceBean.retornaSecuencia("CODE"); Tgenefile foto = new Tgenefile(); fotoDetalle.setId(new TgenefilesdetailPK()); fotoDetalle.getId().setDateto(FechaUtil.obtenerFecha(2999, 11, 31)); fotoDetalle.setDatefrom(new Timestamp(System.currentTimeMillis())); fotoDetalle.setIngressuser(PortalMessages.getInstancia().getString("usuario.registro")); idFoto = code.get(); foto.setCode(idFoto); fotoDetalle.getId().setCode(foto.getCode()); archivoDao.create(foto); archivoDetalleDao.create(fotoDetalle); } return idFoto != null ? idFoto.intValue() : null; } /** * Guardo el usuario y el detalles de dicho usuario asociado a una persona y perfil default * @throws ExecutionException * @throws InterruptedException */ @SuppressWarnings("unchecked") private void guardarUsuario(Tcustpersondetail persona, Tcustpersonaddress correoPersona) throws InterruptedException, ExecutionException{ String claveAleatoria = generarClaveAleatoria(); Tsafeuserdetail usuarioDetalle = new Tsafeuserdetail(); List userDetailList = usuarioDetalleDao.buscaUserDetail(persona.getId().getPersoncode()); // if(persona.getId() == null || persona.getId().getPersoncode() == 0){ if(userDetailList==null){ crearUsuario(usuarioDetalle, persona, claveAleatoria); crearUsuarioPerfil(usuarioDetalle); } else{ Query query = usuarioDetalleDao.getEntityManager().createQuery("SELECT o FROM Tsafeuserdetail o WHERE o.id.personcode=:personcode and o.id.dateto=:dateto"); query.setParameter("personcode", persona.getId().getPersoncode()); query.setParameter("dateto", FechaUtil.obtenerFecha(2999, 11, 31)); List lusers = query.getResultList(); if(lusers != null && !lusers.isEmpty()){//existe actualizamos usuarioDetalle = lusers.iterator().next(); Tsafeuserdetail usuarioAnterior = SerializationUtils.clone(usuarioDetalle); usuarioDetalleDao.detach(usuarioAnterior); usuarioAnterior.getId().setDateto(new Date()); usuarioDetalleDao.create(usuarioAnterior); usuarioDetalle.setPassword(SerializationUtils.clone(DigestUtils.sha1Hex(claveAleatoria))); usuarioDetalleDao.update(usuarioDetalle); } else{//no existe creamos con todo y perfil crearUsuario(usuarioDetalle, persona, claveAleatoria); crearUsuarioPerfil(usuarioDetalle); } } this.enviarMailAcceso(persona, usuarioDetalle, correoPersona, claveAleatoria); } private void crearUsuario(Tsafeuserdetail usuarioDetalle, Tcustpersondetail persona, String claveAleatoria) throws InterruptedException, ExecutionException{ Tsafeuser usuario = new Tsafeuser(); Future internalCode = sequenceBean.retornaSecuencia("INTERNALCODE"); usuario.setCompanycode(Long.parseLong(PortalMessages.getInstancia().getString("compania.general"))); usuario.setTcustperson(persona.getTcustperson()); usuario.setUsercode(persona.getIdentification()); usuario.setPersonCode(persona.getId().getPersoncode()); usuario.setInternalcode(internalCode.get()); List usuariosList= usuarioDao.buscaUsers(persona.getIdentification()); if(usuariosList==null){ usuarioDao.create(usuario); } usuarioDetalle.setId(new TsafeuserdetailPK()); usuarioDetalle.getId().setUsercode(usuario.getUsercode()); usuarioDetalle.getId().setDateto(FechaUtil.obtenerFecha(2999, 11, 31)); usuarioDetalle.getId().setPersoncode(persona.getId().getPersoncode()); usuarioDetalle.setDatefrom(new Timestamp(System.currentTimeMillis())); usuarioDetalle.setLanguagecode(PortalMessages.getInstancia().getString("codigo.general.lenguaje")); usuarioDetalle.setCompanycode(Long.parseLong(PortalMessages.getInstancia().getString("compania.general"))); usuarioDetalle.setChannelcode(PortalMessages.getInstancia().getString("codigo.canal.validacion.usuario")); usuarioDetalle.setAreacode(Long.parseLong(PortalMessages.getInstancia().getString("area.general"))); usuarioDetalle.setBranchcode(Long.parseLong(PortalMessages.getInstancia().getString("codigo.sucursal.usuario"))); usuarioDetalle.setOfficecode(Long.parseLong(PortalMessages.getInstancia().getString("codigo.oficina.usuario"))); usuarioDetalle.setUserstatuscatalogcode(PortalMessages.getInstancia().getString("catalogo.codigo.estado.usuario")); usuarioDetalle.setUserstatuscatalog(PortalMessages.getInstancia().getString("valor.general.activo")); usuarioDetalle.setIngressuser(PortalMessages.getInstancia().getString("usuario.registro")); usuarioDetalle.setIsuserbpm(PortalMessages.getInstancia().getString("valor.general.si")); usuarioDetalle.setChangepassword(PortalMessages.getInstancia().getString("valor.general.si")); usuarioDetalle.setActivateuser(PortalMessages.getInstancia().getString("usuario.registro")); usuarioDetalle.setPassword(DigestUtils.sha1Hex(SerializationUtils.clone(claveAleatoria))); usuarioDetalle.setNickname(persona.getIdentification()); usuarioDetalle.setRecordversion(0L); usuarioDetalleDao.create(usuarioDetalle); } private void crearUsuarioPerfil(Tsafeuserdetail usuarioDetalle){ Tsafeuserprofile perfilUsuario = new Tsafeuserprofile(); perfilUsuario.setId(new TsafeuserprofilePK()); perfilUsuario.getId().setProfilecode(PortalMessages.getInstancia().getString("codigo.perfil.usuario.registro")); perfilUsuario.getId().setUsercode(usuarioDetalle.getId().getUsercode()); perfilUsuario.getId().setDateto(FechaUtil.obtenerFecha(2999, 11, 31)); perfilUsuario.setDatefrom(new Timestamp(System.currentTimeMillis())); perfilUsuario.setIngressuser(PortalMessages.getInstancia().getString("usuario.registro")); usuarioPerfilDao.create(perfilUsuario); } /** * Método que genera el cuerpo del mensaje a enviar a los nuevos usuarios registrados y activación del mismos */ private void enviarMailAcceso(Tcustpersondetail detallePersona, Tsafeuserdetail detalleUsuario, Tcustpersonaddress correoPersona, String digest){ try { String asunto = PortalMessages.getInstancia().getString("asunto.mensaje.envio.correo"); String cuerpo = MessageFormat.format(PortalMessages.getInstancia().getString("cuerpo.mensaje.envio.correo"), detallePersona.getName(), detalleUsuario.getId().getUsercode(), digest); EnvioCorreoDTO envioCorreo = new EnvioCorreoDTO(); envioCorreo.setCorreoDesde(PortalMessages.getInstancia().getString("correo.envio.default.notificiacion")); envioCorreo.setCorreoPara(new String[]{correoPersona.getAddress()}); envioCorreo.setAsunto(asunto); envioCorreo.setMensajeHTML(cuerpo); EnvioMail envioMail = EnvioMailFactory.getInstancia(); envioMail.envioMail(envioCorreo); } catch(EnvioMailException e){ throw new RegistroException("Se produjo un error al enviar el correo"); } catch (Throwable e) { throw new RegistroException(e); } } private String generarClaveAleatoria(){ return UUID.randomUUID().toString().substring(0, 8); } /** * Obtener información de las imagenes * @param personcode * @return */ public Tgenefilesdetail obtenerImagen(long code) { try { TgenefilesdetailPK pk = new TgenefilesdetailPK(); pk.setCode(code); pk.setDateto(FechaUtil.obtenerFecha(2999, 11, 31)); return archivoDetalleDao.buscarPorId(pk); } catch (Throwable e) { throw new RegistroException(e); } } }