package gcom.gui.atendimentopublico.ordemservico;
import gcom.atendimentopublico.ordemservico.FiltroOrdemServico;
import gcom.atendimentopublico.ordemservico.OrdemServico;
import gcom.atendimentopublico.ordemservico.OrdemServicoPavimento;
import gcom.cadastro.imovel.FiltroPavimentoRua;
import gcom.cadastro.imovel.PavimentoRua;
import gcom.cadastro.sistemaparametro.SistemaParametro;
import gcom.cadastro.unidade.FiltroUnidadeOrganizacional;
import gcom.cadastro.unidade.UnidadeOrganizacional;
import gcom.cadastro.unidade.UnidadeTipo;
import gcom.fachada.Fachada;
import gcom.gui.ActionServletException;
import gcom.gui.GcomAction;
import gcom.seguranca.acesso.usuario.Usuario;
import gcom.util.ConstantesSistema;
import gcom.util.Util;
import gcom.util.filtro.ParametroSimples;
import java.math.BigDecimal;
import java.util.Collection;
import java.util.Date;
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 de Exibir Atualizar Negativador Exclusao Motivo
*
* @author Yara Taciane
* @created 04/01/2008
*/
public class AtualizarOrdemProcessoRepavimentacaoPopUpAction extends GcomAction {
public ActionForward execute(ActionMapping actionMapping,
ActionForm actionForm, HttpServletRequest httpServletRequest,
HttpServletResponse httpServletResponse) {
// Inicializando Variaveis
ActionForward retorno = actionMapping.findForward("atualizarOrdemProcessoRepavimentacaoPopUp");
AtualizarOrdemProcessoRepavimentacaoPopUpActionForm form = (AtualizarOrdemProcessoRepavimentacaoPopUpActionForm) actionForm;
//Obt�m a sess�o
HttpSession sessao = httpServletRequest.getSession(false);
Fachada fachada = Fachada.getInstancia();
Usuario usuario = (Usuario) sessao.getAttribute("usuarioLogado");
boolean temPermissao = verificaUnidadeUsuario(usuario, fachada);
if (!temPermissao) {
throw new ActionServletException("atencao.nao_possui_permissao_para_atualizar");
}
String dataExecucao = null;
String idPavimentoRuaRet = null;
String areaPavimentoRuaRet = null;
if(form.getIdPavimentoRuaRet()!= null && !"".equals(form.getIdPavimentoRuaRet())){
idPavimentoRuaRet = form.getIdPavimentoRuaRet();
}
if(form.getAreaPavimentoRuaRet()!= null && !"".equals(form.getAreaPavimentoRuaRet())){
areaPavimentoRuaRet = form.getAreaPavimentoRuaRet();
}
OrdemServicoPavimento ordemServicoPavimento = null;
if (httpServletRequest.getAttribute("ordemServicoPavimento") != null) {
ordemServicoPavimento = (OrdemServicoPavimento) httpServletRequest.getAttribute("ordemServicoPavimento");
}else if(sessao.getAttribute("ordemServicoPavimento")!= null ){
ordemServicoPavimento = (OrdemServicoPavimento) sessao.getAttribute("ordemServicoPavimento");
}
FiltroPavimentoRua filtroPavimentoRua = new FiltroPavimentoRua();
filtroPavimentoRua.adicionarParametro(new ParametroSimples(FiltroPavimentoRua.INDICADOR_USO,ConstantesSistema.INDICADOR_USO_ATIVO));
if ( idPavimentoRuaRet != null && !idPavimentoRuaRet.equals("")) {
filtroPavimentoRua.adicionarParametro(new ParametroSimples(FiltroPavimentoRua.ID,idPavimentoRuaRet));
}
Collection colecaoPavimentoRua = fachada.pesquisar(filtroPavimentoRua, PavimentoRua.class.getName());
PavimentoRua pavimentoRuaRetorno = (PavimentoRua) Util.retonarObjetoDeColecao(colecaoPavimentoRua);
if(form.getDataExecucao()!= null && !"".equals(form.getDataExecucao())){
dataExecucao = this.validarDataExecucao( form.getDataExecucao(), ordemServicoPavimento);
}
ordemServicoPavimento.setPavimentoRuaRetorno(pavimentoRuaRetorno);
ordemServicoPavimento.setDataExecucao(Util.converteStringParaDate(dataExecucao));
ordemServicoPavimento.setAreaPavimentoRuaRetorno(Util.formatarMoedaRealparaBigDecimal(areaPavimentoRuaRet));
//
Integer validacaoAceite = calculaPercentualMetragemEValidaRetorno( ordemServicoPavimento.getAreaPavimentoRua(),
ordemServicoPavimento.getAreaPavimentoRuaRetorno() ) ;
//1.3.4.2.2.2. Caso haja converg�ncia entre e o tipo de pavimento
// informado no retorno e o tipo de pavimento de mandado
if ( (ordemServicoPavimento.getPavimentoRua().getId().toString().equals(
ordemServicoPavimento.getPavimentoRuaRetorno().getId().toString()) &&
validacaoAceite != null && validacaoAceite.toString().equals("1")) ||
(ordemServicoPavimento.getPavimentoRua().getId().toString().equals(
ordemServicoPavimento.getPavimentoRuaRetorno().getId().toString()) &&
(ordemServicoPavimento.getAreaPavimentoRua().compareTo(ordemServicoPavimento.getAreaPavimentoRuaRetorno()) == 0) )) {
//[SB0002] ? Efetuar Aceite Autom�tico
ordemServicoPavimento.setIndicadorAceite(ConstantesSistema.SIM);
ordemServicoPavimento.setDataAceite(Util.converteStringParaDate(dataExecucao));
ordemServicoPavimento.setUsuarioAceite(Usuario.USUARIO_BATCH);
if ( ordemServicoPavimento.getDescricaoMotivoAceite() != null &&
!ordemServicoPavimento.getDescricaoMotivoAceite().equals("") ) {
String descricaoJaCadastrada = ordemServicoPavimento.getDescricaoMotivoAceite();
ordemServicoPavimento.setDescricaoMotivoAceite( descricaoJaCadastrada + " ACEITE AUTOMATICO");
} else {
ordemServicoPavimento.setDescricaoMotivoAceite("ACEITE AUTOMATICO");
}
}
if(form.getObservacao()!= null && !form.getObservacao().equals("")){
ordemServicoPavimento.setObservacao(form.getObservacao());
}
fachada.atualizar(ordemServicoPavimento);
httpServletRequest.setAttribute("fecharPopup", "OK");
return retorno;
}
/**
* Verifica se usuario em Permissao para atualizar o
* retorno das ordens de Servi�o atraves do bot�o confirmar demandas.
*
* @author Arthur Carvalho
*
* @date 26/04/2010
* @param usuario
* @param fachada
* @return boolean
*/
private boolean verificaUnidadeUsuario( Usuario usuario, Fachada fachada) {
boolean temPermissao = false;
Collection colecaoUnidadesResponsaveis = null;
FiltroUnidadeOrganizacional filtroUnidadeOrganizacional = new FiltroUnidadeOrganizacional();
if ( usuario != null && usuario.getUnidadeOrganizacional() != null &&
usuario.getUnidadeOrganizacional().getUnidadeTipo() != null &&
usuario.getUnidadeOrganizacional().getUnidadeTipo().getId() != null &&
(usuario.getUnidadeOrganizacional().getUnidadeTipo().getId().intValue() ==
UnidadeTipo.UNIDADE_TIPO_REPAVIMENTADORA_ID.intValue()) ) {
filtroUnidadeOrganizacional.adicionarParametro(new ParametroSimples(
FiltroUnidadeOrganizacional.ID, usuario.getUnidadeOrganizacional().getId()));
filtroUnidadeOrganizacional.adicionarParametro(new ParametroSimples(
FiltroUnidadeOrganizacional.ID_UNIDADE_TIPO,UnidadeTipo.UNIDADE_TIPO_REPAVIMENTADORA_ID));
colecaoUnidadesResponsaveis = fachada.pesquisar(filtroUnidadeOrganizacional, UnidadeOrganizacional.class.getName());
if ( colecaoUnidadesResponsaveis != null && !colecaoUnidadesResponsaveis.isEmpty() ) {
temPermissao = true;
}
}
return temPermissao;
}
/**
* [SB0003] - Imprimir rela��o das ordens
* 1.331
* Metodo responsavel por verificar se a metragem informada no retorno esta compreendida
* entre o percentual de varia��o permitido.
*
* @author Arthur Carvalho
* @date 26/07/2010
* @param metragem
* @param metragemRetono
* @return
*/
public Integer calculaPercentualMetragemEValidaRetorno(BigDecimal metragem, BigDecimal metragemRetono ) {
Integer indicadorAceiteComCalculoPercentualConvergencia = null;
BigDecimal percentualConvergenciaRepavimentacao = new BigDecimal(0);
SistemaParametro sistemaParametro = Fachada.getInstancia().pesquisarParametrosDoSistema();
percentualConvergenciaRepavimentacao = sistemaParametro.getPercentualConvergenciaRepavimentacao();
//1.3.3. Total Ordens Aceitas
if ( percentualConvergenciaRepavimentacao != null ) {
if ( metragem.add(metragem.multiply(percentualConvergenciaRepavimentacao).divide(
new BigDecimal(100))).compareTo(metragemRetono) >= 0 &&
metragem.subtract(metragem.multiply(
percentualConvergenciaRepavimentacao).divide(
new BigDecimal(100))).compareTo(metragemRetono) <= 0 ) {
indicadorAceiteComCalculoPercentualConvergencia = 1;
} else {
indicadorAceiteComCalculoPercentualConvergencia = 2;
}
}
return indicadorAceiteComCalculoPercentualConvergencia;
}
/**
* [FS0003] ? Validar da Data de Execu��o.
* @param dataExecucao
* @return
*/
public String validarDataExecucao(String dataExecucao , OrdemServicoPavimento ordemServicoPavimento){
Date dtExecucao = Util.converteStringParaDate(dataExecucao);
Date dataAtualSemHora = Util.formatarDataSemHora(new Date());
if ( ordemServicoPavimento.getPavimentoRuaRetorno() == null ) {
FiltroOrdemServico filtroOrdemServico = new FiltroOrdemServico();
filtroOrdemServico.adicionarParametro( new ParametroSimples(FiltroOrdemServico.ID,
ordemServicoPavimento.getOrdemServico().getId()));
Collection colecaoOrdemServico = Fachada.getInstancia().pesquisar(
filtroOrdemServico, OrdemServico.class.getName());
if ( colecaoOrdemServico != null ) {
OrdemServico ordemServico = (OrdemServico) Util.retonarObjetoDeColecao(colecaoOrdemServico);
if ( dtExecucao.before(ordemServico.getDataEncerramento()) ){
throw new ActionServletException(
"atencao.data.execucao.menor.data.encerramento", null,
Util.formatarData(ordemServico.getDataEncerramento()) );
}
}
} else {
if ( ordemServicoPavimento.getIndicadorAceite() == null ) {
if ( dtExecucao.before(ordemServicoPavimento.getDataExecucao()) ){
throw new ActionServletException(
"atencao.data.execucao.menor.data.retorno", null,
ordemServicoPavimento.getDataExecucao().toString() );
}
} else if ( ordemServicoPavimento.getIndicadorAceite().toString().equals("2") &&
dtExecucao.before(ordemServicoPavimento.getDataAceite() ) ) {
throw new ActionServletException(
"atencao.data.execucao.menor.data.aceite", null,
ordemServicoPavimento.getDataAceite().toString() );
}
}
if(Util.compararData(dtExecucao, dataAtualSemHora) == 1){
String dataAtual = Util.formatarData(new Date());
throw new ActionServletException(
"atencao.data.superior.data.corrente", null,
dataAtual);
}
return dataExecucao;
}
}