package gcom.gui.cobranca.cobrancaporresultado;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import gcom.atendimentopublico.ordemservico.FiltroServicoTipo;
import gcom.atendimentopublico.ordemservico.OrdemServico;
import gcom.atendimentopublico.ordemservico.ServicoTipo;
import gcom.cadastro.empresa.Empresa;
import gcom.cadastro.empresa.FiltroEmpresa;
import gcom.cadastro.imovel.FiltroImovel;
import gcom.cadastro.imovel.Imovel;
import gcom.cadastro.unidade.FiltroUnidadeOrganizacional;
import gcom.cadastro.unidade.UnidadeOrganizacional;
import gcom.cobranca.EmpresaCobrancaConta;
import gcom.cobranca.FiltroEmpresaCobrancaConta;
import gcom.fachada.Fachada;
import gcom.gui.ActionServletException;
import gcom.gui.GcomAction;
import gcom.seguranca.acesso.Funcionalidade;
import gcom.seguranca.acesso.usuario.Usuario;
import gcom.util.ConstantesSistema;
import gcom.util.Util;
import gcom.util.filtro.ParametroSimples;
import gcom.util.filtro.ParametroSimplesIn;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
/**
* Action respons�vel por validar os dados informados na p�gina de Gerar OS do processo
* de movimentar ordem de servi�o de cobran�a por resultado.
*
* @author Mariana Victor
* @date 10/05/2011
*/
public class MovimentarOrdemServicoGerarOSAction extends GcomAction {
/**
* @param actionMapping
* @param actionForm
* @param httpServletRequest
* @param httpServletResponse
* @return
*/
public ActionForward execute(ActionMapping actionMapping,
ActionForm actionForm,
HttpServletRequest httpServletRequest,
HttpServletResponse httpServletResponse) {
//Seta o mapeamento de retorno para a p�gina de definir acesso do grupo
ActionForward retorno = actionMapping.findForward("movimentarOrdemServicoAction");
//Cria uma inst�ncia da sess�o
HttpSession sessao = httpServletRequest.getSession(false);
MovimentarOrdemServicoActionForm form = (MovimentarOrdemServicoActionForm) actionForm;
Usuario usuarioLogado = (Usuario) sessao.getAttribute("usuarioLogado");
if ((httpServletRequest.getAttribute("confirmacao") != null
&& (httpServletRequest.getAttribute("confirmacao")).toString().equalsIgnoreCase("true"))
|| (httpServletRequest.getAttribute("confirmado") != null
&& (httpServletRequest.getAttribute("confirmado")).toString().equalsIgnoreCase("ok"))) {
Iterator iterator = form.getColecaoImovel().iterator();
while(iterator.hasNext()) {
Imovel imovel = (Imovel) iterator.next();
this.geraOrdemServico(new Integer(form.getIdTipoServico()),
new Integer(form.getIdEmpresa()),
imovel.getId(),
usuarioLogado);
}
httpServletRequest.setAttribute("tipoMovimentacao", "Gerada(s)");
httpServletRequest.removeAttribute("confirmacao");
httpServletRequest.setAttribute("concluir", "true");
} else if (httpServletRequest.getParameter("concluir") != null
&& (httpServletRequest.getParameter("concluir")).toString().equalsIgnoreCase("true")) {
String mensagem = validarForm(form, sessao);
if (mensagem != null && !mensagem.equals("")) {
throw new ActionServletException(
mensagem);
}
httpServletRequest.setAttribute("destino", "2");
sessao.setAttribute("destino", "2");
// Monta a p�gina de confirma��o do wizard para perguntar se
// o usu�rio quer confirmar o encerramento do comando
// mesmo sem ter sido enviado para a empresa contratada
return montarPaginaConfirmacaoWizard(
"atencao.serao.geradas.ordens.servico",
httpServletRequest, actionMapping, ((Integer) form.getColecaoImovel().size()).toString());
}
//Retorna o mapemaneto na vari�vel "retorno"
return retorno;
}
public String validarForm(MovimentarOrdemServicoActionForm form, HttpSession sessao) {
boolean algumParametroInformado = false;
if (form.getIdTipoServico() == null
|| form.getIdTipoServico().equals("")
|| form.getIdTipoServico().equals("-1")) {
return "atencao.informe.servico_tipo";
}
if (form.getIdsCategoria() != null
&& form.getIdsCategoria().length != 0
&& !(form.getIdsCategoria().length == 1
&& form.getIdsCategoria()[0].equals("-1"))) {
algumParametroInformado = true;
}
if (form.getIdsImovelPerfil() != null
&& form.getIdsImovelPerfil().length != 0
&& !(form.getIdsImovelPerfil().length == 1
&& form.getIdsImovelPerfil()[0].equals("-1"))) {
algumParametroInformado = true;
}
if (form.getIdsLigacaoAguaSituacao() != null
&& form.getIdsLigacaoAguaSituacao().length != 0
&& !(form.getIdsLigacaoAguaSituacao().length == 1
&& form.getIdsLigacaoAguaSituacao()[0].equals("-1"))) {
algumParametroInformado = true;
}
if (form.getValorMinimo() != null
&& !form.getValorMinimo().equals("")
&& !(Util.formatarMoedaRealparaBigDecimal(form.getValorMinimo())).equals(BigDecimal.ZERO)) {
if (form.getValorMaximo() == null
|| form.getValorMaximo().equals("")
|| (Util.formatarMoedaRealparaBigDecimal(form.getValorMaximo())).equals(BigDecimal.ZERO)) {
return "atencao.informe.valor_minimo";
} else if ((Util.formatarMoedaRealparaBigDecimal(form.getValorMinimo()))
.compareTo(Util.formatarMoedaRealparaBigDecimal(form.getValorMaximo())) == 1){
return "atencao.gerar_os.valor_minimo.menor.valor_maximo";
}
algumParametroInformado = true;
}
List<Integer> numerosImoveisPesquisar = new ArrayList();
for (int i = 0; i < form.getMatriculasImoveis().length; i++) {
if (form.getMatriculasImoveis()[i] != null && !form.getMatriculasImoveis()[i].equals("")) {
numerosImoveisPesquisar.add(new Integer(form.getMatriculasImoveis()[i]));
}
}
if (numerosImoveisPesquisar == null || numerosImoveisPesquisar.isEmpty()) {
MovimentarOrdemServicoGerarOSHelper helper = this.montarHelper(form);
Collection<Integer> colecaoIdsImoveis = Fachada.getInstancia().pesquisarIdsImoveis(helper);
if (colecaoIdsImoveis != null && !colecaoIdsImoveis.isEmpty()) {
Iterator iterator = colecaoIdsImoveis.iterator();
Collection colecaoImovel = new ArrayList();
while(iterator.hasNext()) {
Integer idImovel = (Integer) iterator.next();
Imovel imovel = new Imovel();
imovel.setId(idImovel);
colecaoImovel.add(imovel);
}
form.setColecaoImovel(colecaoImovel);
algumParametroInformado = true;
} else {
return "atencao.imoveis.filtro.nao_relacionados.ao_comando";
}
}
if (numerosImoveisPesquisar != null && !numerosImoveisPesquisar.isEmpty()) {
FiltroImovel filtroImovel = new FiltroImovel();
filtroImovel.adicionarParametro(new ParametroSimplesIn(
FiltroImovel.ID, numerosImoveisPesquisar));
Collection colecaoImovel = Fachada.getInstancia().pesquisar(filtroImovel, Imovel.class.getName());
if (colecaoImovel != null && !colecaoImovel.isEmpty()) {
FiltroEmpresaCobrancaConta filtroEmpresaCobrancaConta = new FiltroEmpresaCobrancaConta();
filtroEmpresaCobrancaConta.adicionarParametro(new ParametroSimplesIn(
FiltroEmpresaCobrancaConta.IMOVEL_ID, numerosImoveisPesquisar));
filtroEmpresaCobrancaConta.adicionarParametro(new ParametroSimples(
FiltroEmpresaCobrancaConta.COMANDO_EMPRESA_COBRANCA_CONTA_ID, form.getIdComandoContaCobranca()));
Collection colecaoEmpresaCobrancaConta = Fachada.getInstancia().pesquisar(filtroEmpresaCobrancaConta, EmpresaCobrancaConta.class.getName());
if (colecaoEmpresaCobrancaConta != null && !colecaoEmpresaCobrancaConta.isEmpty()) {
form.setColecaoImovel(colecaoImovel);
algumParametroInformado = true;
} else {
return "atencao.imoveis.nao_relacionados.ao_comando";
}
} else {
return "atencao.imoveis.inexistentes";
}
}
if (!algumParametroInformado) {
return "atencao.filtro.nenhum_parametro_informado";
}
return null;
}
private MovimentarOrdemServicoGerarOSHelper montarHelper(MovimentarOrdemServicoActionForm form){
MovimentarOrdemServicoGerarOSHelper helper = new MovimentarOrdemServicoGerarOSHelper();
helper.setIdComandoContaCobranca(new Integer(form.getIdComandoContaCobranca()));
helper.setIdsCategoria(form.getIdsCategoria());
helper.setIdsImovelPerfil(form.getIdsImovelPerfil());
helper.setIdsLigacaoAguaSituacao(form.getIdsLigacaoAguaSituacao());
if (form.getValorMinimo() != null && !form.getValorMinimo().equals("")) {
helper.setValorMinimo(Util.formatarMoedaRealparaBigDecimal(form.getValorMinimo()));
}
if (form.getValorMaximo() != null && !form.getValorMaximo().equals("")) {
helper.setValorMaximo(Util.formatarMoedaRealparaBigDecimal(form.getValorMaximo()));
}
return helper;
}
private Integer geraOrdemServico(Integer idTipoServico, Integer idEmpresa, Integer idImovel, Usuario usuarioLogado) {
OrdemServico ordemServico = null;
ServicoTipo servicoTipo = null;
Empresa empresa = null;
Integer retorno = null;
Fachada fachada = Fachada.getInstancia();
// [UC0430] - Gerar Ordem de Servico
servicoTipo = new ServicoTipo();
FiltroServicoTipo filtroServicoTipo = new FiltroServicoTipo();
filtroServicoTipo.adicionarParametro(new ParametroSimples(
FiltroServicoTipo.ID,idTipoServico ));
filtroServicoTipo.adicionarCaminhoParaCarregamentoEntidade(
FiltroServicoTipo.SERVICO_TIPO_REFERENCIA);
Collection colecaoServTipo = Fachada.getInstancia().pesquisar(filtroServicoTipo, ServicoTipo.class.getName());
servicoTipo = (ServicoTipo) Util.retonarObjetoDeColecao(colecaoServTipo);
ordemServico = new OrdemServico();
ordemServico.setServicoTipo(servicoTipo);
Imovel imovel = new Imovel();
imovel.setId(idImovel);
ordemServico.setImovel(imovel);
FiltroEmpresa filtroEmpresa = new FiltroEmpresa();
filtroEmpresa.adicionarParametro(new ParametroSimples(FiltroEmpresa.ID, idEmpresa));
Collection<Empresa> colecaoEmpresa = fachada.pesquisar(filtroEmpresa, Empresa.class.getName());
if (colecaoEmpresa == null || colecaoEmpresa.isEmpty()) {
throw new ActionServletException("atencao.empresa_nao_encontra", null, idEmpresa.toString());
}
empresa = (Empresa) Util.retonarObjetoDeColecao(colecaoEmpresa);
UnidadeOrganizacional unidadeOrganizacional = new UnidadeOrganizacional();
// Recupera a Unidade Organizacional da Empresa
unidadeOrganizacional.setEmpresa(empresa);
FiltroUnidadeOrganizacional filtroUnidadeOrganizacional = new FiltroUnidadeOrganizacional();
filtroUnidadeOrganizacional.adicionarParametro(new ParametroSimples(
FiltroUnidadeOrganizacional.EMPRESA, empresa));
filtroUnidadeOrganizacional.adicionarParametro(new ParametroSimples(
FiltroUnidadeOrganizacional.INDICADOR_USO, ConstantesSistema.INDICADOR_USO_ATIVO));
Collection<UnidadeOrganizacional> colecaoUnidadeOrganizacional =
fachada.pesquisar(filtroUnidadeOrganizacional, UnidadeOrganizacional.class.getName());
if (colecaoUnidadeOrganizacional != null && !colecaoUnidadeOrganizacional.isEmpty()) {
//[FS0011]-Verificar exist�ncia de mais de uma unidade correspondente � empresa
if(colecaoUnidadeOrganizacional.size() > 1){
throw new ActionServletException("atencao.unidade_organizacional_dupla_correspondente_empresa");
}
unidadeOrganizacional = colecaoUnidadeOrganizacional.iterator().next();
}else {
throw new ActionServletException("atencao.unidade_organizacional_nao_encontrada_empresa", null, empresa.getDescricao());
}
ordemServico.setUnidadeAtual(unidadeOrganizacional);
retorno = fachada.gerarOrdemServico(
ordemServico, usuarioLogado, Funcionalidade.MOVIMENTAR_ORDENS_DE_SERVICO_DE_COBRANCA_POR_RESULTADO);
return retorno;
}
}