package gcom.cadastro.atualizacaocadastral.command;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.NoSuchElementException;
import org.apache.commons.lang.StringUtils;
import gcom.atualizacaocadastral.ControladorAtualizacaoCadastralLocal;
import gcom.atualizacaocadastral.ImovelControleAtualizacaoCadastral;
import gcom.atualizacaocadastral.ImovelTipoOcupanteQuantidadeRetorno;
import gcom.cadastro.IRepositorioCadastro;
import gcom.cadastro.SituacaoAtualizacaoCadastral;
import gcom.cadastro.cliente.ClienteAtualizacaoCadastral;
import gcom.cadastro.cliente.ClienteBuilder;
import gcom.cadastro.cliente.ClienteFoneAtualizacaoCadastral;
import gcom.cadastro.cliente.ClienteProprietarioBuilder;
import gcom.cadastro.cliente.ClienteRelacaoTipo;
import gcom.cadastro.cliente.ClienteResponsavelBuilder;
import gcom.cadastro.cliente.ClienteUsuarioBuilder;
import gcom.cadastro.cliente.ControladorClienteLocal;
import gcom.cadastro.cliente.FoneTipo;
import gcom.cadastro.cliente.IClienteAtualizacaoCadastral;
import gcom.cadastro.cliente.IClienteFone;
import gcom.cadastro.cliente.IRepositorioClienteImovel;
import gcom.cadastro.cliente.RamoAtividade;
import gcom.cadastro.endereco.ControladorEnderecoLocal;
import gcom.cadastro.imovel.CadastroOcorrencia;
import gcom.cadastro.imovel.Categoria;
import gcom.cadastro.imovel.IRepositorioImovel;
import gcom.cadastro.imovel.Imovel;
import gcom.cadastro.imovel.ImovelAtualizacaoCadastral;
import gcom.cadastro.imovel.ImovelAtualizacaoCadastralBuilder;
import gcom.cadastro.imovel.ImovelRamoAtividadeAtualizacaoCadastral;
import gcom.cadastro.imovel.ImovelSubcategoriaAtualizacaoCadastral;
import gcom.cadastro.imovel.ImovelTipoOcupante;
import gcom.cadastro.imovel.ImovelTipoOcupanteQuantidadeAtualizacaoCadastral;
import gcom.cadastro.imovel.Subcategoria;
import gcom.seguranca.transacao.AlteracaoTipo;
import gcom.seguranca.transacao.ControladorTransacaoLocal;
import gcom.util.ControladorException;
import gcom.util.ControladorUtilLocal;
import gcom.util.ParserUtil;
public class MontarObjetosAtualizacaoCadastralCommand extends AbstractAtualizacaoCadastralCommand {
private AtualizacaoCadastral atualizacaoCadastral;
private AtualizacaoCadastralImovel atualizacaoCadastralImovel;
private int matriculaImovel;
private int matriculaUsuario;
private int matriculaResponsavel;
private int matriculaProprietario;
private int tipoOperacao;
private IRepositorioClienteImovel repositorioClienteImovel;
private final String USUARIO_IGUAL_PROPRIETARIO = "1";
private final String RESPONSAVEL_IGUAL_USUARIO = "0";
private final String RESPONSAVEL_IGUAL_PROPRIETARIO = "1";
public MontarObjetosAtualizacaoCadastralCommand(ParserUtil parser, IRepositorioCadastro repositorioCadastro, ControladorUtilLocal controladorUtil,
ControladorTransacaoLocal controladorTransacao, IRepositorioImovel repositorioImovel, ControladorEnderecoLocal controladorEndereco,
ControladorAtualizacaoCadastralLocal controladorAtualizacaoCadastral, ControladorClienteLocal controladorCliente, IRepositorioClienteImovel repositorioClienteImovel) {
super(parser, repositorioCadastro, controladorUtil, controladorTransacao, repositorioImovel, controladorEndereco, controladorAtualizacaoCadastral, controladorCliente);
this.repositorioClienteImovel = repositorioClienteImovel;
}
public void execute(AtualizacaoCadastral atualizacaoCadastral) throws Exception {
this.atualizacaoCadastral = atualizacaoCadastral;
this.atualizacaoCadastralImovel = atualizacaoCadastral.getImovelAtual();
this.matriculaImovel = Integer.parseInt(atualizacaoCadastralImovel.getLinhaImovel("matricula"));
this.matriculaUsuario = Integer.parseInt(atualizacaoCadastralImovel.getLinhaCliente("matriculaUsuario"));
this.matriculaResponsavel = Integer.parseInt(atualizacaoCadastralImovel.getLinhaCliente("matriculaResponsavel"));
this.matriculaProprietario = Integer.parseInt(atualizacaoCadastralImovel.getLinhaCliente("matriculaProprietario"));
this.tipoOperacao = Integer.parseInt(atualizacaoCadastralImovel.getLinhaImovel("tipoOperacao"));
salvarObjetosAtualizacaoCadastral();
}
public void salvarObjetosAtualizacaoCadastral() throws Exception {
salvarImovel();
salvarClienteUsuario();
salvarClienteProprietario();
salvarClienteResponsavel();
atualizarSituacaoControleImovelAtualizacaoCadastral(SituacaoAtualizacaoCadastral.TRANSMITIDO);
}
private void salvarImovel() throws Exception {
ImovelAtualizacaoCadastralBuilder builder = new ImovelAtualizacaoCadastralBuilder(matriculaImovel, atualizacaoCadastral, atualizacaoCadastralImovel, tipoOperacao);
ImovelAtualizacaoCadastral imovelTxt = builder.getImovelAtualizacaoCadastral();
ImovelAtualizacaoCadastral imovelAtualizacaoCadastralBase = controladorAtualizacaoCadastral.pesquisarImovelAtualizacaoCadastral(matriculaImovel);
if (imovelAtualizacaoCadastralBase == null){
imovelAtualizacaoCadastralBase = new ImovelAtualizacaoCadastral(matriculaImovel);
tipoOperacao = AlteracaoTipo.INCLUSAO;
}
salvarTabelaColunaAtualizacaoCadastral(atualizacaoCadastral, imovelAtualizacaoCadastralBase, imovelTxt, matriculaImovel, tipoOperacao);
salvarRamoAtividade();
salvarImovelSubcategoria();
salvarImovelQuantidadesOcupantes();
}
private void salvarRamoAtividade() throws Exception {
for (DadoAtualizacaoRamoAtividade ramo: atualizacaoCadastralImovel.getDadosRamoAtividade()){
boolean existeRamoAtividadeAtualizacao = repositorioCadastro.existeImovelRamoAtividadeAtualizacaoCadastral(matriculaImovel, ramo.getId());
if (!existeRamoAtividadeAtualizacao) {
ImovelRamoAtividadeAtualizacaoCadastral ramoAtividadeTxt = new ImovelRamoAtividadeAtualizacaoCadastral();
ramoAtividadeTxt.setImovel(new Imovel(matriculaImovel));
ramoAtividadeTxt.setRamoAtividade(new RamoAtividade(ramo.getId()));
int tipoOperacao = Integer.parseInt(atualizacaoCadastralImovel.getLinhaImovel("tipoOperacao"));
salvarTabelaColunaAtualizacaoCadastral(atualizacaoCadastral, new ImovelRamoAtividadeAtualizacaoCadastral(),
ramoAtividadeTxt, matriculaImovel, tipoOperacao);
}
}
}
@SuppressWarnings("rawtypes")
private void salvarImovelSubcategoria() throws ControladorException {
List<ImovelSubcategoriaAtualizacaoCadastral> subcategorias = getImovelSubcategorias();
for (ImovelSubcategoriaAtualizacaoCadastral subcategoria : subcategorias) {
Collection imovelSubcategorias = controladorAtualizacaoCadastral.pesquisarImovelSubcategoriaAtualizacaoCadastral(matriculaImovel, subcategoria.getSubcategoria().getId(), null);
ImovelSubcategoriaAtualizacaoCadastral imovelSubcategoriaAtualizacaoCadastral = null;
if (imovelSubcategorias.isEmpty()) {
imovelSubcategoriaAtualizacaoCadastral = new ImovelSubcategoriaAtualizacaoCadastral();
} else {
imovelSubcategoriaAtualizacaoCadastral = (ImovelSubcategoriaAtualizacaoCadastral) imovelSubcategorias.iterator().next();
}
salvarTabelaColunaAtualizacaoCadastral(atualizacaoCadastral, imovelSubcategoriaAtualizacaoCadastral, subcategoria, matriculaImovel, tipoOperacao);
}
}
private void salvarImovelQuantidadesOcupantes() throws ControladorException {
Collection<ImovelTipoOcupanteQuantidadeAtualizacaoCadastral> tiposImovel = controladorAtualizacaoCadastral.pesquisarOcupantesAtualizacaoCadastral(matriculaImovel);
Map<Integer, ImovelTipoOcupanteQuantidadeAtualizacaoCadastral> mapTiposImovel = new HashMap<Integer, ImovelTipoOcupanteQuantidadeAtualizacaoCadastral>();
for(ImovelTipoOcupanteQuantidadeAtualizacaoCadastral tipo : tiposImovel){
mapTiposImovel.put(tipo.getTipoOcupante().getId(), tipo);
}
Collection<ImovelTipoOcupante> todosTipos = controladorUtil.listar(ImovelTipoOcupante.class);
for (ImovelTipoOcupante tipo : todosTipos) {
Integer qtd = Integer.parseInt(atualizacaoCadastralImovel.getLinhaImovel("tipoOcupante" + tipo.getDescricaoSemCaracteresEspeciais()));
ImovelTipoOcupanteQuantidadeAtualizacaoCadastral valorBase = mapTiposImovel.get(tipo.getId());
if (valorBase == null){
valorBase = new ImovelTipoOcupanteQuantidadeAtualizacaoCadastral(0);
}
ImovelTipoOcupanteQuantidadeAtualizacaoCadastral valorTxt = new ImovelTipoOcupanteQuantidadeAtualizacaoCadastral();
valorTxt.setQuantidade(qtd);
valorTxt.setTipoOcupante(tipo);
salvarTabelaColunaAtualizacaoCadastral(atualizacaoCadastral, valorBase, valorTxt, matriculaImovel, tipoOperacao);
}
}
private List<ImovelSubcategoriaAtualizacaoCadastral> getImovelSubcategorias() {
List<ImovelSubcategoriaAtualizacaoCadastral> subcategorias = new ArrayList<ImovelSubcategoriaAtualizacaoCadastral>();
subcategorias.addAll(buildImovelSubcategorias(TipoEconomia.RESIDENCIAL));
subcategorias.addAll(buildImovelSubcategorias(TipoEconomia.COMERCIAL));
subcategorias.addAll(buildImovelSubcategorias(TipoEconomia.INDUSTRIAL));
subcategorias.addAll(buildImovelSubcategorias(TipoEconomia.PUBLICO));
return subcategorias;
}
private List<ImovelSubcategoriaAtualizacaoCadastral> buildImovelSubcategorias(TipoEconomia tipoEconomia) {
List<ImovelSubcategoriaAtualizacaoCadastral> subcategorias = new ArrayList<ImovelSubcategoriaAtualizacaoCadastral>();
String descricaoSubcategoria = String.valueOf(tipoEconomia.getCodigo());
String codigoSubcategoria = "";
for (int j = 1; j < 5; j++) {
codigoSubcategoria = descricaoSubcategoria + j;
short qtdEconomias = Short.parseShort(atualizacaoCadastralImovel.getLinhaImovel("subcategoria" + codigoSubcategoria));
ImovelSubcategoriaAtualizacaoCadastral subcategoria = new ImovelSubcategoriaAtualizacaoCadastral();
subcategoria.setImovel(new Imovel(matriculaImovel));
subcategoria.setQuantidadeEconomias(qtdEconomias);
subcategoria.setDescricaoSubcategoria(codigoSubcategoria);
subcategoria.setDescricaoCategoria(tipoEconomia.getDescricao());
TipoSubcategoria tipoSubcategoria = TipoSubcategoria.getByCodigo(codigoSubcategoria);
subcategoria.setCategoria(new Categoria(tipoSubcategoria.getIdCategoria()));
subcategoria.setSubcategoria(new Subcategoria(tipoSubcategoria.getIdSubcategoria()));
subcategorias.add(subcategoria);
}
return subcategorias;
}
private void salvarClienteUsuario() throws Exception {
IClienteAtualizacaoCadastral clienteTxt = new ClienteUsuarioBuilder(atualizacaoCadastralImovel).buildCliente(ClienteRelacaoTipo.USUARIO);
if (matriculaUsuario != 0 || StringUtils.isNotEmpty(atualizacaoCadastralImovel.getLinhaCliente("nomeUsuario"))) {
salvarCliente(matriculaUsuario, clienteTxt, ClienteRelacaoTipo.USUARIO, ClienteBuilder.USUARIO);
}
}
private void salvarClienteProprietario() throws Exception {
IClienteAtualizacaoCadastral clienteTxt;
if(atualizacaoCadastralImovel.getLinhaCliente("usuarioProprietario").equals(USUARIO_IGUAL_PROPRIETARIO)){
clienteTxt = new ClienteUsuarioBuilder(atualizacaoCadastralImovel).buildCliente(ClienteRelacaoTipo.PROPRIETARIO);
}else{
clienteTxt = new ClienteProprietarioBuilder(atualizacaoCadastralImovel).buildCliente(ClienteRelacaoTipo.PROPRIETARIO);
}
if (StringUtils.isNotEmpty(atualizacaoCadastralImovel.getLinhaCliente("nomeProprietario"))) {
salvarCliente(matriculaProprietario, clienteTxt, ClienteRelacaoTipo.PROPRIETARIO, ClienteBuilder.PROPRIETARIO);
}
}
private void salvarClienteResponsavel() throws Exception {
IClienteAtualizacaoCadastral clienteTxt;
if(atualizacaoCadastralImovel.getLinhaCliente("tipoResponsavel").equals(RESPONSAVEL_IGUAL_USUARIO)){
clienteTxt = new ClienteUsuarioBuilder(atualizacaoCadastralImovel).buildCliente(ClienteRelacaoTipo.RESPONSAVEL);
}else if(atualizacaoCadastralImovel.getLinhaCliente("tipoResponsavel").equals(RESPONSAVEL_IGUAL_PROPRIETARIO)){
clienteTxt = new ClienteProprietarioBuilder(atualizacaoCadastralImovel).buildCliente(ClienteRelacaoTipo.RESPONSAVEL);
}else{
clienteTxt = new ClienteResponsavelBuilder(atualizacaoCadastralImovel).buildCliente(ClienteRelacaoTipo.RESPONSAVEL);
}
if (StringUtils.isNotEmpty(atualizacaoCadastralImovel.getLinhaCliente("nomeResponsavel"))) {
salvarCliente(matriculaResponsavel, clienteTxt, ClienteRelacaoTipo.RESPONSAVEL, ClienteBuilder.RESPONSAVEL);
}
}
private void salvarCliente(int matricula, IClienteAtualizacaoCadastral clienteTxt, Short clienteRelacaoTipo, String tipoCliente) throws Exception{
Integer tipoOperacaoCliente = getTipoOperacaoCliente(matricula, matriculaImovel, clienteTxt.getCpf(), clienteRelacaoTipo, repositorioClienteImovel);
clienteTxt.setTipoOperacao(tipoOperacaoCliente);
String telefone = atualizacaoCadastralImovel.getLinhaCliente("telefone" + tipoCliente);
String celular = atualizacaoCadastralImovel.getLinhaCliente("celular" + tipoCliente);
salvarClienteAtualizacaoCadastral(matricula, clienteRelacaoTipo, clienteTxt, telefone, celular);
}
private void salvarClienteAtualizacaoCadastral(int matricula, Short clienteRelacaoTipo, IClienteAtualizacaoCadastral clienteTxt, String telefone, String celular) throws ControladorException {
salvarClienteFoneAtualizacaoCadastral(telefone, clienteRelacaoTipo, FoneTipo.RESIDENCIAL, matricula);
salvarClienteFoneAtualizacaoCadastral(celular, clienteRelacaoTipo, FoneTipo.CELULAR, matricula);
IClienteAtualizacaoCadastral clienteAtualizacaoCadastralBase = null;
if (clienteTxt.getTipoOperacao() != AlteracaoTipo.INCLUSAO) {
clienteAtualizacaoCadastralBase = controladorCliente.pesquisarClienteAtualizacaoCadastral(
matricula, matriculaImovel, new Integer(clienteRelacaoTipo));
}else{
clienteAtualizacaoCadastralBase = new ClienteAtualizacaoCadastral();
}
salvarTabelaColunaAtualizacaoCadastral(atualizacaoCadastral, clienteAtualizacaoCadastralBase, clienteTxt, matriculaImovel, tipoOperacao);
}
private void salvarClienteFoneAtualizacaoCadastral(String telefone, Short clienteRelacaoTipo, Integer foneTipo, int matriculaCliente) {
if (!telefone.trim().equals("")) {
ClienteFoneAtualizacaoCadastral clienteFone = getClienteFoneAtualizacaoCadastral(telefone, foneTipo, matriculaCliente);
try {
ClienteFoneAtualizacaoCadastral clienteFoneAtualizacaoCadastral = controladorCliente
.pesquisarClienteFoneAtualizacaoCadastral(Integer.valueOf(matriculaCliente), Integer.valueOf(matriculaImovel), foneTipo,
Integer.valueOf(clienteRelacaoTipo), null).iterator().next();
salvarTabelaColunaAtualizacaoCadastral(atualizacaoCadastral, clienteFoneAtualizacaoCadastral, clienteFone, matriculaImovel, tipoOperacao);
} catch (NoSuchElementException e) {
ClienteFoneAtualizacaoCadastral clienteFoneAtualizacaoCadastral = new ClienteFoneAtualizacaoCadastral();
try {
salvarTabelaColunaAtualizacaoCadastral(atualizacaoCadastral, clienteFoneAtualizacaoCadastral, clienteFone, matriculaImovel, tipoOperacao);
} catch (ControladorException e1) {
e1.printStackTrace();
}
} catch (ControladorException e) {
e.printStackTrace();
}
}
}
private ClienteFoneAtualizacaoCadastral getClienteFoneAtualizacaoCadastral(String tipoClientFone, Integer foneTipo, int matriculaCliente) {
ClienteFoneAtualizacaoCadastral clienteFone = new ClienteFoneAtualizacaoCadastral();
if (tipoClientFone.length() == IClienteFone.TAMANHO_TELEFONE) {
clienteFone.setDdd(tipoClientFone.substring(0, 2));
clienteFone.setTelefone(tipoClientFone.substring(2));
} else {
clienteFone.setTelefone(tipoClientFone);
}
clienteFone.setIdFoneTipo(foneTipo);
clienteFone.setIdCliente(matriculaCliente);
return clienteFone;
}
private void atualizarSituacaoControleImovelAtualizacaoCadastral(Integer situacao) throws Exception {
ImovelControleAtualizacaoCadastral controle = repositorioImovel.pesquisarImovelControleAtualizacaoCadastral(matriculaImovel);
if (controle == null){
controle = new ImovelControleAtualizacaoCadastral();
controle.setImovel(new Imovel(matriculaImovel));
}
controle.setSituacaoAtualizacaoCadastral(new SituacaoAtualizacaoCadastral(situacao));
controle.setDataRetorno(new Date());
controle.setCadastroOcorrencia(new CadastroOcorrencia(atualizacaoCadastralImovel.getCadastroOcorrencia().getId()));
Integer idImovelControle = (Integer) controladorUtil.inserirOuAtualizar(controle);
if (controle != null) {
idImovelControle = controle.getId();
}
controle = controladorAtualizacaoCadastral.obterImovelControle(idImovelControle);
atualizacaoCadastralImovel.setImovelControle(controle);
}
}