Irei mostrar como fazer uma página que é um pequeno sistema de PDV, estou utilizando PHP e Zend Framework, estaremos utilizando AJAX para evitar o post a cada novo produto. Quem não conhece o framework é bom conferir um post do felipe tonello que é uma ótima explicação. Confira aqui http://felipetonello.com/blog/2007/02/28/zend-framework-para-um-php-mais-poderoso/

Resposta:

Começamos com a classe que faz a conexão com banco e busca um registro, no caso, um produto e retorna o mesmo para a camada de controle.

PHP:

<?php  
 
class ProdutoDAO extends Zend_Db_Table {  
 
        protected $_name     = "produto";
        protected $_primary     = "codBarras";
   
   
    public function recuperaProduto($codBarra){  
        $retorno['erro'] = false;  
        try{  
 
            $where   = $this->getAdapter()->quoteInto("codBarras = ?",$codBarra);  
            $produto     = $this->fetchRow($where);  
            // Verifica se o produto foi encontrado  
            if ($produto != null){  
                // Foi Encontrado  
                $retorno['produto'] = $produto;  
 
            } else {  
                // Não foi Encontrado  
                $retorno['erro']    = true;  
                $retorno['msgErro'] = 2;  
            }  
 
        }catch ( Zend_Db_Exception $e ){  
            // Excecao  
            $retorno['erro']    = true;  
            $retorno['msgErro'] = 1;  
        }  
 
        return $retorno;  
    }//recuperaProduto
}//ProdutoDAO

Agora vamos a camada de controle, que é responsável pela comunicação entre a visão e o modelo.

PHP:

function buscaprodutoAction(){
            // LOADER  
            Zend_loader::loadClass("Zend_Json");  
            Zend_Loader::loadClass('ProdutoDAO');  
 
            $this->_helper->viewRenderer->setNoRender();
                       
            $barraString = $this->_request->getParam("codBarra",-1);  
 
            // Instanciando o objeto de acesso a dados  
            $produtoDAO  = new ProdutoDAO();
 
            $retorno = $produtoDAO->recuperaProduto($barraString);  
 
            // Verificando se ocorreu erro  
            if($retorno['erro'] == true){  
                @$obj->msgErro = "Produto não encontrado.";  
                $obj->erro = true;  
 
            }else {  
 
                $produto = $retorno['produto'];  
 
                @$obj->erro       = false;  
                $obj->nome = $produto->nome;  
                $obj->estoque = $produto->estoque;  
                $obj->valor = $produto->valor;  
 
            }  
            // envia o objeto default para o encode  
            $objJson = Zend_Json::encode( $obj );  
            // coloca na camada de visao  
           $this->_response->appendBody($objJson);               
      }

Agora a parte principal, a camada de visão.

HTML:

CSS:

.boleta{
 border: 1px solid;
 width: 300px;
 height:450px;
 position:absolute;
 top: 50px;
 left:30px;
}

#corpoBoleta{
text-align:right;
width: 275px;
height:380px;
margin:10px;
padding-right:5px;
border: 1px solid;
overflow:auto;

}

#valorTotal{
text-align:right;
padding-right:35px;
}
#formEntrada{
position:absolute;
top:100px;
left:400px;
}

HTML:

</style>
<script type="text/javascript" src='http://ajax.googleapis.com/ajax/libs/mootools/1.11/mootools.js' ></script>
</head>
<script type="text/javascript">

Javascript:

// Função que escreve o item comprado na boleta
       function escreverItem(palavra){
             $("corpoBoleta").innerHTML = $("corpoBoleta").innerHTML + '' + palavra;
       }
        // Função que arredonda um número ( peguei na internet )
        function roundNumber(param) {
                var rnum = param;
                var rlength = 2; // The number of decimal places to round to
                if (rnum > 8191 && rnum < 10485) {
                        rnum = rnum -5000;
                        var newnumber = Math.round(rnum*Math.pow(10,rlength))/Math.pow(10,rlength);
                        newnumber = newnumber+5000;
                } else {
                        var newnumber = Math.round(rnum*Math.pow(10,rlength))/Math.pow(10,rlength);
                }
                return newnumber.toFixed(2);
        }
       
        // Função responsável por criar o objeto "AJAX"
        function buscaProduto(){  
 
    var codBarras = $('codBarras').value;  
    var queryString = {"codBarra": codBarras };  
    var opcoes =  
    {  
        "method":"get",  
        "data": queryString,  
        "onComplete": completouSolicitacao  
    };    
 
    var ajaxObj = new Ajax("<?php echo $this->baseUrl ?>/Index/buscaproduto", opcoes).request();  
        }

        // Função que trata o retorno da função "AJAX"
        function completouSolicitacao( info ){  
        var obj = Json.evaluate( info );  
 
        if(obj.erro == true){  
            alert("Produto nao encontrado");  
            return;  
        }  
                     
                $('estqProduto').value = obj.estoque;                                  
                $('nomeProduto').value = obj.nome;                                     
                $('valorProduto').value = obj.valor;
                $('qtdItem').select();
    }  
        // Função que valida o estoque e calcula o total da compra
        function adicionaProduto(){
                        if ( ($("estqProduto").value - $("qtdItem").value ) > -1 ){
                               escreverItem($("nomeProduto").value);
                               escreverItem($("qtdItem").value + " x " + $("valorProduto").value);
                               calculaTotal();
                               limpaCampos();
                        }
                        else
                        {
                                alert('Quantidade nao disponivel');
                                limpaCampos();
                        }
        }
       
        // Função que calcula o total da compra
        function calculaTotal(){
               
                var conta;
                var atual;
                atual  = parseFloat($('valorTotal').innerHTML);        
                conta = $('qtdItem').value * $('valorProduto').value;          
               
                $('valorTotal').innerHTML = (parseFloat(atual)+parseFloat(conta)).toFixed(2);
        }
       
        function limpaCampos(){
                $('codBarras').value = "";
                $('estqProduto').value = "";
                $('nomeProduto').value = "";
                $('valorProduto').value = "";
                $('qtdItem').value = 1;
                $('codBarras').focus();
        }
       
        //Função que adiciona os eventos ao form para o operador poder navegar no form
        //utilizando apenas a tecla ENTER e o leitor de código de barras
        function init(){
       
                        $('qtdItem').addEvent('keydown', function( event ) {
                                                                                                                event = new Event( event );
                                                                                                                if( event.key == "enter" )
                                                                                                                        adicionaProduto();
                                                                                                                });
                        $('codBarras').addEvent('keydown', function( event ) {
                                                                                                                event = new Event( event );
                                                                                                                if( event.key == "enter" )
                                                                                                                        buscaProduto();
                                                                                                                });                                                                                                            
                limpaCampos();
                $('valorTotal').innerHTML = parseFloat(0).toFixed(2);
        }
       
        window.addEvent("domready",init);

HTML:

</script>

<body>

<form>

<div class="boleta">
<center>Lojinha Tem Tudo</center>
<div id="corpoBoleta">
</div>
<div id="valorTotal">
</div>
</div>

<div id="formEntrada">
<table>
<tr>
        <td>C&amp;oacute;digo de Barras</td>
        <td>Nome do Produto</td>
        <td>Valor do Produto</td>
        <td>Estoque Disponivel</td>
        <td>Quantidade</td>
</tr>
<tr>
        <td><input type="text" id="codBarras" /></td>
        <td><input type="text" id="nomeProduto" readonly /></td>
        <td><input type="text" id="valorProduto" readonly /></td>
        <td><input type="text" id="estqProduto" readonly /></td>
        <td><input type="text" id="qtdItem" /></td>
</tr>
</table>
<div>

</form>
<script>

</script>
</body>
</html>

Página de teste: clique aqui

Existem três produtos cadastrados, eles possuem o código de barra 1a, 2b e 3c.

Endereço de trackback para este post

Trackback URL (clique direito e copie atalho/localização do link)

4 comentários

Comentário de: Wesley Mendonça [Visitante]
Olá, gostei muito do seu exemplo de explicação sobre pdv, estou fazendo um sistemas de vendas mais nem tinha ideia de como começar, já com seu exemplo me ajudou bastante.

Se caso eu precisar de alguma ajuda tem como vc da uma força?

Obrigado.
15.01.09 @ 04:09
Comentário de: mrxrsd [Membro] Email
Qualquer coisa se precisar só postar a dúvida ai no post que eu ou até mesmo outro usuário tentaremos ajudar =)
15.01.09 @ 08:35
Comentário de: dicuri [Visitante]
Muito bom, mas como faço para excluir um item da lista ?
22.07.09 @ 05:26
Comentário de: dicuri [Visitante]
muito bom, ficaria melhor ainda 100% se ele exluise um item. Que tal ?
22.07.09 @ 06:34

Esse post tem 2 feedbacks esperando moderação...

Deixe seu comentário


Seu endereço de e-mail não será revelado nesse site.

Sua URL será exibida.
(Quebras de linha se tornam <br />)
(Nome, e-mail & website)
(Permitir que usuários o contatem através de um formulário eletrônico (seu e-mail não será exibido.))