Problemas com RichFaces e JSTL

Amigos,

Feliz Ano Novo a todos!!!

Estou com uma bucha animal… já pesquisei igual louco sobre o assunto, mas nada que encontrei esclarece o que está errado (exatamente)… pelo que pude concluir o problema está na “mistura” de componentes h:commandButton, a4j:commandButton, h:form e a4j:form. Vou “tentar” detalhar melhor o impasse.

Tenho um MB que faz a gestão de um XHTML.

O XHTML possui um formulário simples que funciona bem, é basicamente uma lista de produtos com campos de quantidade para cada uma. Porém, cada item da lista tem um ‘link’ que exibe uma rich:modalPanel com um OUTRO formulario, este mais aprofundado (exemplo: se o cliente quizer escolher a cor do produto, voltagem e etc.), em tese tanto o dataTable quanto o form do modal tratam o mesmo array de objetos contidos no meu MB, MASSSSS… o meu xhtml se perde completamente nas ações dos botões de submissão que estão no MODAL, pois, para ‘postar’ os dados do form do modal, estes precisam estar num form (dentro do modal), por sua vez, o modal em si também precisa estar dentro de um form, do contrário o a4j:commandButton nao o encontra e não carrega a modal. E pra piorar tem o form externo dos dados “sem detalhamento”.

Alguém tem idéia ou mesmo material de a4j e richfaces para me apoiar nesse problema? Abaixo segue um “rascunho” sobre o problema:

Qualquer ajuda é válida.

Paz e Bem!

Charles Seberino

<h:form id=“formLista”>
<rich:dataTable value="#{MB.itens}" var=“categoria”>
<rich:column>
<a4j:commandButton image="/images/detail.jpg" action="#{MB.setaShowModalTrue_Action}" reRender=“formModal, formModal:modalPanel, formModal:modalPanel:formDetalhe”/>
</rich:column>
<rich:column>
<h:inputText value="#{categoria.quantidade}"/>
</rich:column>
</rich:dataTable>
</h:form>

<h:form id=“formModal”>
<rich:modalPanel id=“modalPanel” render=“MB.mostraDetalhe”>
<a4j:form id=“formDetalhe”>
<h:inputText value="#{MB.categoriaSelecionada.cor.codigo}/>
<a4j:commandButton
id=“botaoReservarPorSelecao"
styleClass=“reserva"
image=”/images/bts/btsReservar.gif"
action=”#{MB.atualizaDetalhe_Action}“
oncomplete=”#{rich:component(‘formModal:modalPanel’)}.hide(); return true;"
reRender=“formLista,formModal,formModal:modalPanel,formModal:modalPanel:formDetalhe />
</a4j:form>
</rich:modalPanel>
</h:form>
”>

nossa cara… que confusão…
1º coloca o seu código entre a tag Code, pra ficar melhor de ver…
outra coisa… vc chega a coseguir visualizar os dados quando abre o modal?


Na verdade,o modal deve estar FORA de um form e DENTRO do modal ter um form.

Na verdade,o modal deve estar FORA de um form e DENTRO do modal ter um form.

Opa turma… desculpe nao ter feito o post com as tags corretas.

Vamos lá, eu fiz inúmeros testes como já comentei.

PS: Antes de mais nada, o código original não é meu! Estou dando manutenção nesse lixo e estou quase chegando à conclusão de que o melhor é o REDO

Como não sou expert em RichFaces e a4j estou me baseando no código lixo do resto do site… mas como vêem to tomando de 100 a 0!

As questões são:
1 - O modalMapa está dentro do h:form porque não encontrei outra forma pra fazer o reRender do modal funcionar sem que ele estivesse dentro do form
2 - O formulario que está dentro do modal está dentro de um a4j:form para que os dados sejam ‘postados’ no MB, do contrário eu nao consigo setar os valores pois o request não os enxerga.
3 - Os botões de ‘fechar’ e ‘reservar’ do modal é quem deve fazer o show acontecer, ou seja, nestes é que preciso ‘conseguir’ postar os dados no form… todavia, apesar de chamar a ACTION do MB, eles nao estão fazendo o reRender do Modal para HIDE ou mesmo aceitando o javascript RichFaces.hideModalPanel(’’)

Meu XHTML

        <ui:define name="conteudo">

            <h:form id="form">
                <div>
                    <table width="100%" border="0">
                        <tr>
                            <td colspan="2" align="left" class="textoHistorico"><b>Venda ></b> Venda de ingressos</td>
                        </tr>
                    </table>
                </div>

                <div id="IDCabecalho">
                    <table width="100%" border="0" class="tabelaCampos" cellspacing="0" cellpadding="0">
                        <tr align="left" class="classeGrid">
                            <td width="100px">Evento:</td>
                            <td align="right">
                                <h:inputText
                                    value="#{vendaDeIngressoOnLineMB.venda.evento.nome}"
                                    style="width:98%"
                                    styleClass="inputType"
                                    disabled="true" />
                            </td>
                        </tr>
                    </table>
                </div>

                <hr class="classeGrid"/>

                <table width="100%" class="tabelaCampos" cellspacing="0" cellpadding="0">
                    <tr align="left" class="classeGrid">
                        <td width="100px">Ingressos</td>
                        <td align="right">
                            <img
                                class="abrirFechar"
                                id="btsIngresso"
                                src="../../../images/bts/btsDivAberto.gif"
                                onclick="abrirDiv('IDIngresso','btsIngresso');" />
                        </td>
                    </tr>
                </table>

                <div id="IDIngresso">
                    <table width="100%">
                        <tr>
                            <td colspan="2"/>
                        </tr>
                        <tr>
                            <td width="100%">
                                <rich:dataTable
                                    width="100%"
                                    id="tabelaSetores"
                                    styleClass="classeGridTitle"
                                    columnClasses="col"
                                    value="#{vendaDeIngressoOnLineMB.listSetorEvento}"
                                    var="setor">
                                    <f:facet name="header">
                                        <rich:columnGroup>
                                            <h:column width="3%" styleClass="classeGridTitle"> Mapa </h:column>
                                            <h:column width="22%" styleClass="classeGridTitle"> Setor </h:column>
                                            <h:column width="15%" styleClass="classeGridTitle"> Disponibilidade </h:column>
                                            <h:column width="5%" styleClass="classeGridTitle"> Inteira </h:column>
                                            <h:column width="10%" styleClass="classeGridTitle"> Valor Unitário </h:column>
                                            <h:column width="5%" styleClass="classeGridTitle"> Meia Entrada</h:column>
                                            <h:column width="10%" styleClass="classeGridTitle"> Valor Meia  </h:column>
                                        </rich:columnGroup>
                                    </f:facet>
                                    <f:facet name="footer" id="totaisFooter">
                                        <rich:columnGroup styleClass="classeGrid">
                                            <rich:column
                                                colspan="3"
                                                styleClass="classeGrid"
                                                style="background-color:#EAF3FC;text-align:center;"
                                                width="20%">
                                                <h:outputText
                                                    value="Total" />
                                            </rich:column>
                                            <rich:column
                                                styleClass="classeGrid"
                                                style="background-color:#FAFCFE;text-align:center;"
                                                width="10%">
                                                <h:outputText
                                                    id="totalQuantidadeInteiraColumn"
                                                    value="#{vendaDeIngressoOnLineMB.quantidadeDeSetoresInteiraIngresso}" />
                                            </rich:column>
                                            <rich:column
                                                styleClass="classeGrid"
                                                style="background-color:#FAFCFE;"
                                                width="10%"/>
                                            <rich:column
                                                styleClass="classeGrid"
                                                style="background-color:#FAFCFE;text-align:center;"
                                                width="10%">
                                                <h:outputText
                                                    id="totalQuantidadeMeiaColumn"
                                                    value="#{vendaDeIngressoOnLineMB.quantidadeDeSetoresMeiaIngresso}" />
                                            </rich:column>
                                            <rich:column
                                                colspan="2"
                                                styleClass="classeGrid"
                                                style="background-color:#FAFCFE;"
                                                width="10%"/>
                                        </rich:columnGroup>
                                    </f:facet>
                                    <rich:column styleClass="classeGrid">
                                        <a4j:commandButton
                                            image="/images/BntEditar.gif"
                                            alt="Escolha de lugares"
                                            value="Escolha de lugares"
                                            action="#{vendaDeIngressoOnLineMB.visualizarMapaSetor}"
                                            reRender="form,formMapa,formMapa:modalMapa"/>
                                    </rich:column>
                                    <rich:column styleClass="classeGrid">
                                        #{setor.nome}
                                    </rich:column>
                                    <rich:column
                                        style="text-align:center;"
                                        styleClass="classeGrid">
                                        <h:inputText
                                            value="#{setor.disponibilidadePorSetor}"
                                            disabled="true"
                                            style="width:68px;"
                                            styleClass="inputType" />
                                    </rich:column>
                                    <rich:column
                                        style="text-align:center;"
                                        styleClass="classeGrid">
                                        <h:inputText
                                            value="#{setor.quantidadeVendaIngressoInteira}"
                                            styleClass="inputType"
                                            disabled="#{vendaDeIngressoOnLineMB.habilitaCancelarReserva}"
                                            style=" width : 33px;">
                                            <a4j:support
                                                event="onkeyup"
                                                reRender="form:tabelaSetores:totalQuantidadeInteiraColumn,form:totalPreco" />
                                        </h:inputText>
                                    </rich:column>
                                    <rich:column
                                        style="text-align:center;"
                                        styleClass="classeGrid">
                                        <h:outputText value="#{setor.valorDeInteira}">
                                            <f:convertNumber type="currency" />
                                        </h:outputText>
                                    </rich:column>
                                    <rich:column style="text-align:center;" styleClass="classeGrid">
                                        <h:inputText
                                            value="#{setor.quantidadeVendaIngressoMeia}"
                                            disabled="#{vendaDeIngressoOnLineMB.habilitaCancelarReserva}"
                                            style=" width : 35px;"
                                            styleClass="inputType">
                                            <a4j:support
                                                event="onkeyup"
                                                reRender="form:tabelaSetores:totalQuantidadeMeiaColumn,form:totalPreco" />
                                        </h:inputText>
                                    </rich:column>
                                    <rich:column style="text-align:center;" styleClass="classeGrid">
                                        <h:outputText value="#{setor.valorDeMeia}">
                                            <f:convertNumber type="currency" />
                                        </h:outputText>
                                    </rich:column>
                                </rich:dataTable>
                            </td>
                        </tr>
                        <tr>
                            <td align="right">
                                <h:outputText
                                    value="Valor Total:" />
                                <h:inputText
                                    id="totalPreco"
                                    styleClass="inputType"
                                    value="#{vendaDeIngressoOnLineMB.totalPrecoIngresso}"
                                    disabled="true"
                                    style="text-align:right;width:80px">
                                    <f:convertNumber type="currency" />
                                </h:inputText>
                            </td>
                        </tr>
                        <tr>
                            <td align="left">
                                <a4j:commandButton
                                    value="Cancelar"
                                    alt="Cancelar"
                                    image="/images/bts/btsCancelar.gif"
                                    action="#{vendaDeIngressoOnLineMB.cancelaReservaIngresso_Action}"
                                    disabled="#{!vendaDeIngressoOnLineMB.habilitaCancelarReserva}"
                                    reRender="form,modal" />
                                <a4j:commandButton
                                    styleClass="reserva"
                                    value="Reservar ingressos"
                                    image="/images/bts/btsReservarIngressos.gif"
                                    alt="Reservar Ingressos"
                                    action="#{vendaDeIngressoOnLineMB.reservaIngresso_Action}"
                                    disabled="#{!vendaDeIngressoOnLineMB.habilitaPreReserva}"
                                    reRender="form,modal,habilitaAba" />
                            </td>
                        </tr>
                    </table>
                </div>

                <hr class="classeGrid"/>

                <table width="100%" class="tabelaCampos" cellspacing="0" cellpadding="0">
                    <tr align="left" class="classeGrid">
                        <td>Identificação do Comprador</td>
                        <td align="right">
                            <img
                                class="abrirFechar"
                                id="btsComprador"
                                src="../../../images/bts/btsDivFechado.gif"
                                onclick="abrirDiv('IDComprador','btsComprador');" />
                        </td>
                    </tr>
                </table>

                <div id="IDComprador" style="display: none;">
                    <table width="100%" class="tabelaCampos" cellspacing="0" cellpadding="0">
                        <tr align="left" class="classeGrid">
                            <td width="100%">
                                <rich:dataTable
                                    width="100%"
                                    id="Table1"
                                    columnClasses="col"
                                    styleClass="classeGridTitle"
                                    value="#{vendaDeIngressoOnLineMB.venda.ingressosVendidosAsList}"
                                    var="ingressos">
                                    <f:facet name="header">
                                        <rich:columnGroup>
                                            <h:column width="10%" styleClass="classeGridTitle"> Setor </h:column>
                                            <h:column width="20%" styleClass="classeGridTitle"> Nome </h:column>
                                            <h:column width="10%" styleClass="classeGridTitle"> RG</h:column>
                                            <h:column width="10%" styleClass="classeGridTitle"> Meia Entrada</h:column>
                                        </rich:columnGroup>
                                    </f:facet>
                                    <rich:column styleClass="classeGrid">
                                        <h:outputText value="#{ingressos.ingresso.fileira.setor.nome}" />
                                    </rich:column>
                                    <rich:column styleClass="classeGrid" style="text-align:center;">
                                        <h:inputText value="#{ingressos.nomeDoComprador}" />
                                    </rich:column>
                                    <rich:column style="text-align:center;" styleClass="classeGrid">
                                        <h:inputText value="#{ingressos.rgDoComprador}" />
                                    </rich:column>
                                    <rich:column style="text-align:center;" styleClass="classeGrid">
                                        <h:selectBooleanCheckbox value="#{ingressos.meiaEntrada==1}" disabled="true" />
                                    </rich:column>
                                </rich:dataTable>
                            </td>
                        </tr>
                    </table>
                </div>

                <hr class="classeGrid"/>

                <table width="100%" class="tabelaCampos" cellspacing="0" cellpadding="0">
                    <tr align="left" class="classeGrid">
                        <td>Pagamento</td>
                        <td align="right">
                            <img
                                class="abrirFechar"
                                id="btsPagamento"
                                src="../../../images/bts/btsDivFechado.gif"
                                onclick="abrirDiv('IDPagamento','btsPagamento');" />
                        </td>
                    </tr>
                </table>

                <div id="IDPagamento" style="display: none;">
                    <table width="100%" class="tabelaCampos" cellspacing="0" cellpadding="0">
                        <tr align="left" class="classeGrid">
                            <td>
                            </td>
                        </tr>
                    </table>
                </div>

                <hr class="classeGrid"/>

                <table width="100%" class="tabelaCampos" cellspacing="0" cellpadding="0">
                    <tr align="left" class="classeGrid">
                        <td>Confirmação</td>
                        <td align="right">
                            <img
                                class="abrirFechar"
                                id="btsConfirmacao"
                                src="../../../images/bts/btsDivFechado.gif"
                                onclick="abrirDiv('IDConfirmacao','btsConfirmacao');" />
                        </td>
                    </tr>
                </table>

                <div id="IDConfirmacao" style="display: none;">
                    <table width="100%" class="tabelaCampos" cellspacing="0" cellpadding="0">
                        <tr align="left" class="classeGrid">
                            <td width="100px">
                                <a4j:commandButton
                                    image="/images/bts/btsConfirmarPedido.gif"
                                    value="Confirmar Pedido"
                                    action="#{vendaDeIngressoOnLineMB.confirmarPedido}"
                                    reRender="form,modal" />
                            </td>
                            <td width="100px">Pedido Número:</td>
                            <td>
                                <h:inputText
                                    disabled="true"
                                    styleClass="inputType"
                                    value="#{vendaDeIngressoOnLineMB.pedidoVenda.id}" />
                            </td>
                            <td align="right"/>
                        </tr>
                    </table>
                </div>

                <hr class="classeGrid"/>

                <div id="IDAcao">
                    <script language="JavaScript">
                        function nxtVenda() {
                            alert('chamou a funcao nxtVenda()');
                            var obj = document.getElementById('form:nxtSale');
                            alert('obj = ' + obj);
                            obj.disabled = 'false';
                            alert('setou false no disable');
                            document.getElementById('form:nxtSale').click();
                            alert('deu click no botao');
                            alert('finalizou a funcao nxtVenda()');
                            return true;
                        }
                    </script>

                    <table width="100%" border="0">
                        <tr>
                            <td align="right">
                                <h:commandButton
                                    id="btnVoltar"
                                    image="/images/bts/btsVoltar.gif"
                                    alt="Voltar"
                                    value="Voltar"
                                    action="voltarParaPaginaDeListagem_Case" />
                                <h:commandButton
                                    value="Próxima Venda"
                                    image="/images/bts/btsProximaVenda.gif"
                                    alt="Proxima Venda"
                                    id="nxtSale"
                                    disabled="#{vendaDeIngressoOnLineMB.habilitaProximaVenda == false}"
                                    action="#{vendaDeIngressoOnLineMB.proximaVenda_Action}" />
                            </td>
                        </tr>
                    </table>
                </div>

                <div id="IDRodape">
                    <table width="100%">
                        <tr>
                            <td align="right"/>
                        </tr>
                    </table>
                </div>

                <div id="habilitaAba">
                    <c:if test="#{vendaDeIngressoOnLineMB.habilitaAbas == true}">
                        <script>
                            abreAbasVendas('IDComprador','btsComprador');
                            abreAbasVendas('IDConfirmacao','btsConfirmacao');
                            abreAbasVendas('IDPagamento','btsPagamento');
                        </script>
                    </c:if>
                    <c:if test="#{vendaDeIngressoOnLineMB.habilitaAbas == false}">
                        <script>
                            fechaAbasVendas('IDComprador','btsComprador');
                            fechaAbasVendas('IDConfirmacao','btsConfirmacao');
                            fechaAbasVendas('IDPagamento','btsPagamento');
                        </script>
                    </c:if>
                </div>

                <rich:modalPanel
                    id="modalErro"
                    rendered="#{vendaDeIngressoOnLineMB.erro == true}"
                    showWhenRendered="true"
                    styleClass="classeGrid"
                    height="220"
                    width="400">
                    <h:messages />
                    <h:outputText value="#{errosDeValidacao}" escape="false" />
                    <a4j:commandButton
                        id="fecharErro"
                        value="Fechar"
                        image="/images/bts/btsContinuar.gif"
                        alt="Fechar"
                        action="#{vendaDeIngressoOnLineMB.fechaModalErro_Action}"
                        ajaxSingle="true"
                        oncomplete="#{rich:component('modalErro')}.hide(); return false;" />
                </rich:modalPanel>

                <rich:modalPanel
                    id="modalSucesso"
                    rendered="#{vendaDeIngressoOnLineMB.sucess == true}"
                    showWhenRendered="true"
                    styleClass="classeGrid"
                    height="220"
                    width="400">
                    <h:messages />
                    <h:outputText value="#{errosDeValidacao}" escape="false" />
                    <a4j:commandButton
                        id="fecharSucesso1"
                        value="Proxima Venda"
                        image="/images/bts/btsProximaVenda.gif"
                        alt="Proxima Venda"
                        action="#{vendaDeIngressoOnLineMB.fechaModalSucesso_Action}"
                        ajaxSingle="true"
                        oncomplete="#{rich:component('modalSucesso')}.hide(); fechaAbasVendas('IDComprador','btsComprador'); fechaAbasVendas('IDConfirmacao','btsConfirmacao'); fechaAbasVendas('IDPagamento','btsPagamento');  nxtVenda(); return false;" />
                </rich:modalPanel>

                <rich:modalPanel id="modalFechar" onbeforeshow="return false"  >
                    <h:inputHidden id="fechar" value="0" />
                    <a4j:commandButton
                        id="btnFechar"
                        value="Fechar"
                        onclick="#{rich:component('modalFechar')}.hide(); return false;"/>
                </rich:modalPanel>
</h:form>
            <h:form id="formMapa">
                <rich:modalPanel
                    id="modalMapa"
                    rendered="#{vendaDeIngressoOnLineMB.showMapa == true}"
                    showWhenRendered="true"
                    style="overflow:auto"
                    height="400"
                    width="1100">
                    <a4j:form id="formMapa2">
                    <table cellpadding="0" cellspacing="0">
                        <a4j:repeat value="#{vendaDeIngressoOnLineMB.listaFileirasDoSetor}" var="fileira">
                            <tr>
                                <td><h:outputText value="#{fileira.nome}"/></td>
                                <td>
                                    <table cellpadding="0" cellspacing="1">
                                        <tr>
                                            <a4j:repeat value="#{fileira.ingressos}" var="ingresso">
                                                <td>
                                                    <h:panelGrid bgcolor="black" rendered="#{ingresso.vendido == true}" width="5">
                                                        <h:outputLabel style="width:5px; color: white" value=" #{ingresso.ingresso.assento} "/>
                                                    </h:panelGrid>

                                                    <h:panelGrid bgcolor="yellow" rendered="#{ingresso.reservado == true}" width="100%">
                                                        <h:outputLabel style="width:5px; color: black" value=" #{ingresso.ingresso.assento} "/>
                                                    </h:panelGrid>

                                                    <h:panelGrid style="vertical-align: middle; text-align: center;" bgcolor="green" rendered="#{ingresso.disponivel == true}" width="100%">
                                                        <h:outputLabel style="width:5px; color: white" value=" #{ingresso.ingresso.assento} "/>
                                                        <h:selectBooleanCheckbox title="ingressoId"/>
                                                    </h:panelGrid>
                                                </td>
                                            </a4j:repeat>
                                        </tr>
                                    </table>
                                </td>
                            </tr>
                        </a4j:repeat>
                    </table>
                    <table border="0" cellpadding="0" cellspacing="0">
                        <tr>
                            <td>
                                <span align="right">
                                    <a4j:commandButton
                                        value="Fechar"
                                        alt="Fechar"
                                        title="Fechar"
                                        image="/images/bts/btsFechar.gif"
                                        onclick="javascript:RichFaces.hideModalPanel('formMapa:modalMapa')"
                                        action="#{vendaDeIngressoOnLineMB.fecharModalMapa_Action}"
                                        reRender="form,formMapa,formMapa:modalMapa" />
                                    <a4j:commandButton
                                        id="botaoReservarPorSelecao"
                                        styleClass="reserva"
                                        value="Reservar ingressos"
                                        image="/images/bts/btsReservarIngressos.gif"
                                        alt="Reservar Ingressos"
                                        action="#{vendaDeIngressoOnLineMB.reservaPorSelecao_Action}"
                                        oncomplete="#{rich:component('modalMapa')}.hide(); return true;"
                                        reRender="form,formMapa,formMapa2,formMapa:modalMapa" />
                                </span>
                            </td>
                        </tr>
                    </table>
                    </a4j:form>
                </rich:modalPanel>
            </h:form>
            
        </ui:define>

Meu MB

public class VendaDeIngressoOnLineMB {
   
    private PedidoDeVenda pedidoVenda;  
    private boolean vendaIsValid;
    private List<SelectItem> listTipoDePagamento;
    private Usuario vendedor;
    private Evento evento;
    private boolean habilitaCancelarReserva;
    private boolean habilitaPreReserva;
    private List<Setor> listSetorEvento;
    private String bilheteria;
    private String maquina;
    private String guiche;
    private boolean erro;
    private boolean sucess;
    private boolean showMapa;
    private List<FileiraPojo> listaFileirasDoSetor;
    private List<Integer> listaIngressosSelecionados;
    
    public VendaDeIngressoOnLineMB() {
        this.showMapa = false;
    }
    
    public boolean inicializaPedidoVenda(Evento e){
        sucess = false;
	
	Expediente exp =  new ExpedienteDAO().buscarExpedienteAtualDoOperadorDoEvento(DescoleiViewUtil.getLoginMB().getUsuario(), e);

	if (exp == null){
	    return false;
	}
	
	this.evento = e;
	
	if (!e.getStatus().equals(StatusDoEvento.LIBERADO_PARA_VENDA)){
	    return false;
	}
	
	pedidoVenda = new PedidoDeVenda();
	pedidoVenda.setVendedor(exp.getOperadorPV());
	pedidoVenda.setPontoDeVendaDeUmEvento(exp.getPontoVendaEvento());
	pedidoVenda.setEvento(e);
	pedidoVenda.setTipoDePagamento(TipoDePagamento.DINHEIRO);
        pedidoVenda.setQuantidadeDeEntradaInteira(0);
        pedidoVenda.setQuantidadeDeMeiaEntrada(0);
	
	listTipoDePagamento = new ArrayList<SelectItem>();
	listTipoDePagamento.add(new SelectItem(TipoDePagamento.DINHEIRO, TipoDePagamento.DINHEIRO.getNome()));
	listTipoDePagamento.add(new SelectItem(TipoDePagamento.CARTAO_CREDITO, TipoDePagamento.CARTAO_CREDITO.getNome()));
	listTipoDePagamento.add(new SelectItem(TipoDePagamento.CARTAO_DEBITO, TipoDePagamento.CARTAO_DEBITO.getNome()));
	
	listSetorEvento = new ArrayList<Setor>();
        List<Setor> listSetorEventoTemp = new SetorDAO().buscarSetoresDeUmMapaOrdenandoPorNome(pedidoVenda.getEvento().getMapaDeSetores());

        // considera apenas os setores com quantidade disponivel maior que zero
        for (Setor setor : listSetorEventoTemp) {
            if ((setor.getCapacidadeLiberada() - setor.getCapacidadeVendida()) > 0) {
                listSetorEvento.add(setor);
            }
        }
	
	habilitaCancelarReserva = false;
	habilitaPreReserva = true;

	return true;
	
    }

    public void reservaPorSelecao_Action() {
        System.out.println("chamou o reserva por selecao");
        for (FileiraPojo fileira : listaFileirasDoSetor) {
            for (IngressoPojo ingresso : fileira.getIngressos()) {
                if (ingresso.isSelecionado()) {
                    System.out.println("Ingresso = " + ingresso.getIngresso().getId() + " selectionado para reserva");
                }
            }
        }
        this.showMapa = false;
        //fecharModalMapa_Action();
    }

    /**
     * Esse m�todo realiza reservas de assentos em setores de acordo
     * com a quantidade passada pelo jsf (view).
     */
    public void reservaIngresso_Action(){
    
        List<InvalidValueJSF> listErros = new ArrayList<InvalidValueJSF>();
	
        for (Setor setor : listSetorEvento){
	    int quantidadePedida = setor.getQuantidadeVendaIngressoInteira() + setor.getQuantidadeVendaIngressoMeia();
    
	    if (quantidadePedida > setor.getLimitePorComprador()){
                listErros.add(new InvalidValueJSF("Atenção:","Limite de ingressos por comprador foi excedida!"));
        	JSFUtil.getRequest().setAttribute("errosDeValidacao", DescoleiViewUtil.montarMsgDeErro(listErros));
                erro = true;
		return;
	    }
	    
	    if (quantidadePedida == 0)
                continue;
	    	
	    // busca todos os ingressos disponíveis
	    List<Ingresso> ingressosDisponiveis = new IngressoDAO().getProximosIngressosDisponiveisPorSetorPorQuantidade(setor, quantidadePedida); 
    	
	    if (ingressosDisponiveis.size() <= 0){
                listErros.add(new InvalidValueJSF("Atenção:","Não há ingressos disponíveis para o setor " + setor.getNome()));
		JSFUtil.getRequest().setAttribute("errosDeValidacao", DescoleiViewUtil.montarMsgDeErro(listErros));
                erro = true;
		return;
	    }
	    
	    // reserva ingressos
	    int count = new IngressoDAO().reservarIngressoSetor(ingressosDisponiveis, quantidadePedida);
	    quantidadePedida = (setor.getQuantidadeVendaIngressoInteira() + setor.getQuantidadeVendaIngressoMeia())  - count;
	
	    // caso não tenha conseguido reservar todos
	    while (quantidadePedida != 0){
		ingressosDisponiveis.add(new IngressoDAO().getProximoIngressoDisponivelPorSetor(setor));
		count = new IngressoDAO().reservarIngressoSetor(ingressosDisponiveis, quantidadePedida);
		quantidadePedida = setor.getQuantidadeVendaIngressoInteira() + setor.getQuantidadeVendaIngressoMeia() - count;

		// verifica quantos ingressos para este setor existe
		int totalIngressosVendidosSetor = new IngressoDAO().getTotalDeIngressosVendidosOuReservadosPorSetor(setor);
		
		// Caso não haja mais ingressos
		if (ingressosDisponiveis.isEmpty()){
                    listErros.add(new InvalidValueJSF("Atenção:","Ingressos para " + setor.getNome() + " esgotados!"));
                    JSFUtil.getRequest().setAttribute("errosDeValidacao", DescoleiViewUtil.montarMsgDeErro(listErros));
                    erro = true;
		    return;   
		}
	    
		// Caso a capacidade tenha excedido 		
		if (setor.getCapacidadeLiberada() < totalIngressosVendidosSetor){
                    listErros.add(new InvalidValueJSF("Atenção:","Capacidade " + setor.getNome() + " esgotada!"));
                    JSFUtil.getRequest().setAttribute("errosDeValidacao", DescoleiViewUtil.montarMsgDeErro(listErros));
                    erro = true;
		    return;
		}
	    }
	    
	    // verifica quantos ingressos para este setor existe
	    // TODO: DESABILITEI A LINHA PORQUE NINGUÉM ESTAVA UTILIZANDO OS DADOS EXTRAIDOS PELA CONSULTA
            //int totalIngressosVendidosSetor = new IngressoDAO().getTotalDeIngressosVendidosOuReservadosPorSetor(setor);
	    
	    // busca os ingressos reservados
	    ingressosDisponiveis = new IngressoDAO().buscarIngressosReservadosParaSetor(ingressosDisponiveis);
    	
	    if (pedidoVenda.getIngressosVendidos() == null){
    	    	pedidoVenda.setIngressosVendidos(new HashSet<IngressoVendido>());
	    }
	    
	    int totalMeiaEntrada = 0;
	    for (Ingresso ingresso : ingressosDisponiveis){
		IngressoVendido ingressoVendido = new IngressoVendido();
        	ingressoVendido.setIngresso(ingresso);
        	ingressoVendido.setVenda(pedidoVenda);
        	ingressoVendido.setLoginDaUltimaAtualizacao(DescoleiViewUtil.getLoginMB().getUsuario().getLogin());
                ingressoVendido.setOperadorQueRecebeu(new OperadorPvDAO().buscaUsuarioOperador(DescoleiViewUtil.getLoginMB().getUsuario()));
        	if (totalMeiaEntrada < setor.getQuantidadeVendaIngressoMeia()){
        	    ingressoVendido.setMeiaEntrada(1);
        	    totalMeiaEntrada++;
        	} else {
        	    ingressoVendido.setMeiaEntrada(0);
        	}
        	pedidoVenda.getIngressosVendidos().add(ingressoVendido);
	    }
	    
	    atualizaCapacidadeDoSetor(setor, setor.getQuantidadeVendaIngressoInteira() + setor.getQuantidadeVendaIngressoMeia());
	    setor.setCapacidadeVendida(setor.getQuantidadeVendaIngressoInteira() + setor.getQuantidadeVendaIngressoMeia());
	    habilitaCancelarReserva = true;
	    habilitaPreReserva = false;
            erro = false;
	}

    }

    public void fechaModalErro_Action() {
        erro = false;
    }

    public void fechaModalSucesso_Action() {
        erro = false;
        sucess = false;
        proximaVenda_Action();
    }

    public void atualizaCapacidadeDoSetor(Setor setor, int quantidade){
	
	if (quantidade == 0)
	    return;

	int reservado = new IngressoDAO().atualizaIngressosVendidosPorSetor(setor, quantidade);
    	    	
    }
    
    public void cancelaReservaIngresso_Action(){
	
	List<Ingresso> listIngressos = new ArrayList<Ingresso>();
	
	if (pedidoVenda.getIngressosVendidos() == null){
	    habilitaCancelarReserva = false;
	    habilitaPreReserva = true;
	    return;
	}
	
	for (IngressoVendido ingressoVendido : pedidoVenda.getIngressosVendidos()){
	    listIngressos.add(ingressoVendido.getIngresso());
	}
	
	new IngressoDAO().cancelarReservaIngressoSetor(listIngressos);
	
	List<Setor> setores = new ArrayList<Setor>();

	for (Ingresso ingresso : listIngressos){
	
	    for (Setor setor : listSetorEvento){
		
		if (setor.getId().equals(ingresso.getFileira().getSetor().getId())){
		    
		    if (setores.contains(setor)){
			break;
		    }
		    
		    atualizaCapacidadeDoSetor(setor, - setor.getCapacidadeVendida());
		    
		    setores.add(setor);
		    
		}
	    }
	}
	   
	inicializaPedidoVenda(evento);
	
    }
    
    public void confirmarPedido(){

	pedidoVenda.setData(new Timestamp(System.currentTimeMillis()));
	
	pedidoVenda.setTipoDeVenda(TipoDeVenda.ON_LINE);
	
	pedidoVenda.setValorTotalInteira(calculaValorTotalInteira());
	
	pedidoVenda.setValorTotalMeia(calculaValorTotalMeia());
	
	setVendedorNaVenda_Action();
	
	if (JSFUtil.getValidationErros(pedidoVenda).size() > 0) {
	    List<InvalidValueJSF> listErros = new ArrayList<InvalidValueJSF>();
	    listErros.addAll(JSFUtil.getValidationErros(pedidoVenda));
	    JSFUtil.getRequest().setAttribute("errosDeValidacao", DescoleiViewUtil.montarMsgDeErro(listErros));
            erro = true;
	    return;
	}
	List<InvalidValueJSF> listErros = new ArrayList<InvalidValueJSF>();
	for (IngressoVendido ingressoVendido : pedidoVenda.getIngressosVendidos()) {
	    if (JSFUtil.getValidationErros(ingressoVendido).size() > 0) {	
		
		listErros.addAll(JSFUtil.getValidationErros(ingressoVendido));
		JSFUtil.getRequest().setAttribute("errosDeValidacao", DescoleiViewUtil.montarMsgDeErro(listErros));
                erro = true;
		return;
	    }

            List<IngressoVendido> ingressos = null;
            if (ingressoVendido.getMeiaEntrada()==1)
            {
                ingressos = new IngressoVendidoDAO().buscarIngressoParaConsulta(evento.getId(), "", "", ingressoVendido.getRgDoComprador());
            }
	    
	    if (ingressoVendido.getMeiaEntrada()==1 && !ingressos.isEmpty()){
                IngressoVendido ingRG = ingressos.get(0);
	    	
                listErros.add(new InvalidValueJSF("Atenção:","O RG " + ingressoVendido.getRgDoComprador() + " Já foi utilizado neste evento!"));
                listErros.add(new InvalidValueJSF("", "Nome Comprador = " + ingRG.getNomeDoComprador()));
                listErros.add(new InvalidValueJSF("", "Data/Hora Compra = " + ingRG.getPedidoDeVenda().getData()));
                listErros.add(new InvalidValueJSF("", "Nome Bilheteira = " + ingRG.getOperadorQueRecebeu().getNome()));
                listErros.add(new InvalidValueJSF("", "Ingresso = " + ingRG.getId() + " Pedido = " + ingRG.getPedidoDeVenda().getId()));
                listErros.add(new InvalidValueJSF("", "Setor = " + ingRG.getIngresso().getFileira().getSetor().getNome() + " Fileira = " + ingRG.getIngresso().getFileira().getNome() + " Assento = " + ingRG.getIngresso().getAssento()));
		JSFUtil.getRequest().setAttribute("errosDeValidacao", DescoleiViewUtil.montarMsgDeErro(listErros));
                erro = true;
		//JSFUtil.getRequest().setAttribute("errosGeral", "Atenção: O RG " + ingressoVendido.getRgDoComprador() + " Já foi utilizado neste evento!");
		return;
	    }
	    
	}
	
	if (isConfirmacaoValidaDePedido()){
	
	    new VendaDAO().gerarPedidoVendaOnLine(pedidoVenda);
	    
	    listErros.add(new InvalidValueJSF("Atenção:","Venda realizada com sucesso! Pedido nr " + pedidoVenda.getId()));
            JSFUtil.getRequest().setAttribute("errosDeValidacao", DescoleiViewUtil.montarMsgDeErro(listErros));
            erro = true;
            sucess = false;
	    //JSFUtil.getRequest().setAttribute("errosGeral", "Venda realizada com sucesso! Pedido nr " + pedidoVenda.getId());
        	
	}
	
    }

    public void visualizarMapaSetor() {
        this.showMapa = true;
        List<Ingresso> ingressosSetor = new IngressoDAO().getTodosIngressosDoSetor(getSetorSelecionado().getId());
        Integer idFileiraAnterior = 0;
        FileiraPojo fileira = new FileiraPojo();
        listaFileirasDoSetor = new ArrayList<FileiraPojo>();
        for (Ingresso ingresso : ingressosSetor) {
            if (ingresso.getFileira().getId() != idFileiraAnterior) {
                if (idFileiraAnterior != 0) {
                    listaFileirasDoSetor.add(fileira);
                }
                fileira = new FileiraPojo();
                fileira.setId(ingresso.getFileira().getId());
                fileira.setNome(ingresso.getFileira().getNome());
                fileira.setIngressos(new ArrayList<IngressoPojo>());
            }
            IngressoPojo ingressoPojo = new IngressoPojo();
            ingressoPojo.setIngresso(ingresso);
            fileira.getIngressos().add(ingressoPojo);
            idFileiraAnterior = fileira.getId();
        }
        listaFileirasDoSetor.add(fileira);
    }

    public void fecharModalMapa_Action() {
        System.out.println("chamou o fecha modal mapa");
        this.showMapa = false;
    }

    private double calculaValorTotalInteira() {
	double total = 0;
	if (pedidoVenda.getEvento() == null)
	    return 0;
	for (Setor setor : this.listSetorEvento) {
	    if (setor.getTaxa() != 0){
		total += setor.getQuantidadeVendaIngressoInteira() * (setor.getValorDeInteira() * setor.getTaxa());
	    } else {
		total += setor.getQuantidadeVendaIngressoInteira() * (setor.getValorDeInteira());
	    }
	 }
	return 0;
    }

    private double calculaValorTotalMeia() {
	double total = 0;
	if (pedidoVenda.getEvento() == null)
	    return 0;
	for (Setor setor : this.listSetorEvento) {
	    if (setor.getTaxa() != 0){
		total += setor.getQuantidadeVendaIngressoMeia() * (setor.getValorDeMeia() * setor.getTaxa());
	    } else {
		total += setor.getQuantidadeVendaIngressoMeia() * (setor.getValorDeMeia());
	    }
	 }
	return 0;
    }

    public void proximaVenda_Action(){
        sucess = false;
	inicializaPedidoVenda(evento);
	setVendedorNaVenda_Action();
    }

    public boolean isConfirmacaoValidaDePedido(){
	
	List<InvalidValueJSF> listErros = new ArrayList<InvalidValueJSF>();
	    
	for (IngressoVendido ingressoVendido : pedidoVenda.getIngressosVendidos()) {
	    
	    if (ingressoVendido.getMeiaEntrada()==1){
		if (ingressoVendido.getNomeDoComprador().isEmpty()){
		    listErros.add(new InvalidValueJSF("Identificação do Comprador:","Nome é obrigatório para meia entrada"));
		    JSFUtil.getRequest().setAttribute("errosDeValidacao", DescoleiViewUtil.montarMsgDeErro(listErros));
		    return false;
		}
		if (ingressoVendido.getRgDoComprador().isEmpty()){
		    listErros.add(new InvalidValueJSF("Identificação do Comprador:","Docto de Identificação e obrigatório para meia entrada"));
		    JSFUtil.getRequest().setAttribute("errosDeValidacao", DescoleiViewUtil.montarMsgDeErro(listErros));
		    return false;
		}
/*		
		if (ingressoVendido.getCpfDoComprador().isEmpty()){
		    listErros.add(new InvalidValueJSF("Identificação do Comprador:","Docto de Identificação � obrigat�rio para meia entrada"));
		    JSFUtil.getRequest().setAttribute("errosDeValidacao", DescoleiViewUtil.montarMsgDeErro(listErros));
		    return false;
		}*/
	    }
	    
	}
	
	return true;
	
    }

    public void validaModalOperador_Action(){
	if (getBilheteria() == null){
	    vendaIsValid = false;
	    return;
	}
	if (getGuiche() == null){
	    vendaIsValid = false;
	    return;
	}
	if (getMaquina() == null){
	    vendaIsValid = false;
	    return;
	}
	if (getBilheteria().isEmpty()){
	    vendaIsValid = false;
	    return;
	}	
	if (getGuiche().isEmpty()){
	    vendaIsValid = false;
	    return;
	}
	if (getMaquina().isEmpty()){
	    vendaIsValid = false;
	    return;
	}
	 
	vendaIsValid = true;
	
    }
    
    public int getQuantidadeDeSetoresInteiraIngresso() {
	int total = 0;
	if (pedidoVenda.getEvento() == null)
	    return 0;
	for (Setor setor : this.listSetorEvento) {
	    total += setor.getQuantidadeVendaIngressoInteira();
	}
	pedidoVenda.setQuantidadeDeEntradaInteira(total);
	getTotalPrecoIngresso();
	return total;
    }
    
    public int getQuantidadeDeSetoresMeiaIngresso() {
	int total = 0;
	if (pedidoVenda.getEvento() == null)
	    return 0;
	for (Setor setor : this.listSetorEvento) {
	    total += setor.getQuantidadeVendaIngressoMeia();
	}
	pedidoVenda.setQuantidadeDeMeiaEntrada(total);
	getTotalPrecoIngresso();
	return total;
    }
    
    public double getTotalPrecoIngresso() {
	double total = 0;
	if (pedidoVenda.getEvento() == null)
	    return 0;
	for (Setor setor : this.listSetorEvento) {
	    if (setor.getTaxa() != 0){
		total += setor.getQuantidadeVendaIngressoInteira() * (setor.getValorDeInteira() * setor.getTaxa());
	    } else {
		total += setor.getQuantidadeVendaIngressoInteira() * (setor.getValorDeInteira());
	    }
	    if (setor.getTaxa() != 0){
		total += setor.getQuantidadeVendaIngressoMeia() * (setor.getValorDeMeia() * setor.getTaxa());
	    } else {
		total += setor.getQuantidadeVendaIngressoMeia() * (setor.getValorDeMeia());
	    }
	}
	return total;
    }
    
    public String voltar_Action(){
	return "listarEventos_Case";
    }
    
    public boolean getHabilitaAbas(){
	if (pedidoVenda == null) {
	    return false;
        }
	if (pedidoVenda.getIngressosVendidos() == null) {
	    return false;
        }
	if (pedidoVenda.getIngressosVendidos().size() == 0) {
            return false;
        }
	return true;
    }
    
    public boolean getHabilitaProximaVenda(){
	if (pedidoVenda == null) {
	    return false;
        }
	if (pedidoVenda.getId() == null) {
	    return false;
        }
	return true;
    }
    
    public void setVendedorNaVenda_Action(){
	this.pedidoVenda.setBilheteria("b1");
	this.pedidoVenda.setGuiche("g1");
	this.pedidoVenda.setMaquina("m1");
    }

    @Override
    protected void finalize() throws Throwable {
	System.out.println("VendaDeIngressosOnLineMB.finalize()");
    }
    
    public PedidoDeVenda getVenda() {
        return pedidoVenda;
    }

    public void setVenda(PedidoDeVenda venda) {
        this.pedidoVenda = venda;
    }
    
   public Setor getIngressoSetorSelecionado(){
	return (Setor) FacesContext.getCurrentInstance().getExternalContext().getRequestMap().get("setor");
    }

    public boolean isVendaIsValid() {
        return vendaIsValid;
    }

    public void setVendaIsValid(boolean vendaIsValid) {
        this.vendaIsValid = vendaIsValid;
    }

    public List<SelectItem> getListTipoDePagamento() {
        return listTipoDePagamento;
    }

    public void setListTipoDePagamento(List<SelectItem> listTipoDePagamento) {
        this.listTipoDePagamento = listTipoDePagamento;
    }

    public Usuario getVendedor() {
        return vendedor;
    }

    public void setVendedor(Usuario vendedor) {
        this.vendedor = vendedor;
    }

    public PedidoDeVenda getPedidoVenda() {
        return pedidoVenda;
    }

    public void setPedidoVenda(PedidoDeVenda pedidoVenda) {
        this.pedidoVenda = pedidoVenda;
    }

    public Evento getEvento() {
        return evento;
    }

    public void setEvento(Evento evento) {
        this.evento = evento;
    }

    public boolean isHabilitaCancelarReserva() {
        return habilitaCancelarReserva;
    }

    public void setHabilitaCancelarReserva(boolean habilitaCancelarReserva) {
        this.habilitaCancelarReserva = habilitaCancelarReserva;
    }

    public boolean isHabilitaPreReserva() {
        return habilitaPreReserva;
    }

    public void setHabilitaPreReserva(boolean habilitaPreReserva) {
        this.habilitaPreReserva = habilitaPreReserva;
    }

    public List<Setor> getListSetorEvento() {
        return listSetorEvento;
    }

    public void setListSetorEvento(List<Setor> listSetorEvento) {
        this.listSetorEvento = listSetorEvento;
    }

    public String getBilheteria() {
        return bilheteria;
    }

    public void setBilheteria(String bilheteria) {
        this.bilheteria = bilheteria;
    }

    public String getMaquina() {
        return maquina;
    }

    public void setMaquina(String maquina) {
        this.maquina = maquina;
    }

    public String getGuiche() {
        return guiche;
    }

    public void setGuiche(String guiche) {
        this.guiche = guiche;
    }

    /**
     * @return the erro
     */
    public boolean isErro() {
        return erro;
    }

    /**
     * @param erro the erro to set
     */
    public void setErro(boolean erro) {
        this.erro = erro;
    }

    /**
     * @return the sucess
     */
    public boolean isSucess() {
        return sucess;
    }

    /**
     * @param sucess the sucess to set
     */
    public void setSucess(boolean sucess) {
        this.sucess = sucess;
    }

    /**
     * @return the setorSelecionado
     */
    public Setor getSetorSelecionado() {
        return (Setor) FacesContext.getCurrentInstance().getExternalContext().getRequestMap().get("setor");
    }

    /**
     * @return the showMapa
     */
    public boolean isShowMapa() {
        return showMapa;
    }

    /**
     * @param showMapa the showMapa to set
     */
    public void setShowMapa(boolean showMapa) {
        this.showMapa = showMapa;
    }

    /**
     * @return the listaIngressosDoSetor
     */
    public List<FileiraPojo> getListaFileirasDoSetor() {
        return listaFileirasDoSetor;
    }

    /**
     * @param listaIngressosDoSetor the listaIngressosDoSetor to set
     */
    public void setListaFileirasDoSetor(List<FileiraPojo> listaFileirasDoSetor) {
        this.listaFileirasDoSetor = listaFileirasDoSetor;
    }

    /**
     * @return the listaIngressosSelecionados
     */
    public List<Integer> getListaIngressosSelecionados() {
        return listaIngressosSelecionados;
    }

    /**
     * @param listaIngressosSelecionados the listaIngressosSelecionados to set
     */
    public void setListaIngressosSelecionados(List<Integer> listaIngressosSelecionados) {
        this.listaIngressosSelecionados = listaIngressosSelecionados;
    }

}