sexta-feira, 25 de maio de 2012

Quero vender! Quer comprar?


Recentemente assisti uma série americana muito interessante onde as principais capitais do país foram destruidas por terroristas e algumas pequenas cidades começaram a se reerguer após a crise, a luta consistia em redefinir os elementos essenciais para a sobrevivência em comunidade: (1) o reestabelecimento da politica (liderança forte para conter os mais exaltados), (2) da segurança (armada para evitar o roubo e saques entre as cidades sobreviventes) e finalmente (3) o comércio, este último foi bastante interessante porque com o fim do valor da moeda impressa as pessoas trocavam coisas, o chamado escambo. Então deixando a politica de lado nesses tempos de muitas Cachoeiras, vamos tratar de um assunto que acredito ser do interesse de todos, vender! e não precisa esperar o fim do mundo para isso.

A internet é o canal necessário para se vender coisas, e além de bons produtos, precisamos também de recursos que facilitem a compra das pessoas, GeneXus permite o desenvolvimento de interfaces bem interessantes para fazer isso, e aqui vai minha pequena contribuição para seu sucesso comercial, um carrinho de compras.  Vou tentar fazer isso o mais simples possível, mas com recursos muito avançados como Drag&Drop, Websessions, Blob's, e por ai vai.

Planejando o Carrinho
Um sistema de compras deve possuir alguns itens essenciais:
  1. Uma lista de produtos
  2. Uma cesta de compras onde a pessoa coloca os produtos desejados
  3. Uma lista de compras para que a pessoa possa incluir ou remover itens
  4. A finalização da compra com o pagamento, ..., mas isso deixemos para outra ocasião
Lista de Produtos

Uma simples transação de Produtos é suficiente para simular uma lista de produtos, se tiver uma (ou mais) fotos, também é um bom recurso para se vender.



Precisamos também de um painel para o cliente realizar a operação de escolha dos produtos que deseja, e um detalhe que podemos incluir nessa lista é a possibilidade de executar operações Drag&Drop (já explorada aqui no POST: http://www.genexando.com/2011/01/drag-drops.html)


E também um botão para realizar a compra, caso não seja possível realizar o Drag.

Finalmente, ao pressionar a cesta de compras, uma interface para finalizar a compra, no qual o cliente pode determinar a quantidade de produtos, e também realizar o login no sistema, para que a compra seja finalizada. Algo similar a imagem apresentada a seguir.

Cesta de Compras
Uma cesta de compras pode ser representada por uma imagem com aparência de cesta, ou mesmo por botões que executem a operação de incluir um item na lista.  As duas opções sáo importantes, para reforçar o conceito das paginas Drag & Drop, vamos implementar o recurso com uma imagem, e também um botão, caso esta não esteja visivel.

Utilizamos uma imagem para representar a cesta (ver acima), cujo nome ficou o padrão (Image1), e programamos o evento Drop no seguinte modelo.

Event Image1.Drop(&ProdutoId, &ProdutoPrecoValor)
    do 'comprar'
EndEvent

As variáveis &ProdutoId e &ProdutoPrecoValor devem ambas estarem no grid de produtos, e serão transportadas no evento Drag para a imagem do carrinho.  Portanto no grid de produtos é necessário marcar a opção Allow Drag = true, e carregar essas variáveis com valores.

O botão Comprar que aparece na interface pode executar a mesma subrotina 'comprar' que estaremos programando logo a seguir.

Event 'Comprar'
    do 'comprar'
EndEvent

A Operação de Compra

A operação de compra consiste em incluir o item selecionado a uma lista de produtos. O diferencial aqui foi que criamos um SDT para armazenar a coleção de itens comprados.

Bem simples, com três itens, o código do produto, a quantidade e o valor unitário.

A operação de compra então acrescenta na coleção ListaCompras um item, com uma operação Add.

    &Item = new()
    &Item.ProdutoId         = &ProdutoId
    &Item.ProdutoValor      = &ProdutoPrecoValor
    &Item.ProdutoQuantidade = 1
    &ListaCompras.Add(&Item)
   
O esquema interessante desse exemplo,  é onde escolhemos armazenar essa lista, que poderia ser em uma tabela num formato mais tradicional, mas optamos por guardar essa lista na própria sessão web criada para o usuário.
    &websession.Set("CARRINHO", &ListaCompras.ToXml() )   
Somente devemos transformá-la em texto para que possa ser armazenada, tendo em vista que variáveis de sessão somente são do tipo String.

Desta forma, toda vez que necessitamos acrescentar um item na lista devemos lê-la da websession, acrescentar o item e salvá-la novamente. A operação abaixo realiza a leitura da lista de compras na sessão e a converte novamente em uma coleção na memória.

    &ListaCompras.FromXMl(&websession.Get("CARRINHO"))
Portanto nossa operação de compra completa ficou assim.

Sub  'comprar'
    &ListaCompras.FromXMl(&websession.Get("CARRINHO")) 
    &Item = new()
    &Item.ProdutoId         = &ProdutoId
    &Item.ProdutoValor      = &ProdutoPrecoValor
    &Item.ProdutoQuantidade = 1
    &ListaCompras.Add(&Item)
   
    total.Caption = &ListaCompras.Count.ToString()+' itens'
    &websession.Set("CARRINHO", &ListaCompras.ToXml() )   
EndSub

Muito interessante isso hein!

Carregando a Lista de Produtos
Agora fica mais simples entender o funcionamento do Grid de produtos, que inicialmente faz a leitura da lista na sessão web, no evento Refresh.

Event Refresh
    &ListaCompras.FromXMl(&websession.Get("CARRINHO"))
    total.Caption = &ListaCompras.Count.ToString()+' itens'   
EndEvent
E em seguida, para cada produto, obtém seu preço, e o apresenta na interface. Uma observação apenas, para dar um ar de requinte ao processo, fizemos uma operação que somente apresenta os itens que ainda não foram comprados na lista, ou seja, comprou some da lista.  Isso é o que está implementado através da variável &flag.

Event Load
    for each
        &ProdutoPrecoValor=ProdutoPrecoValor
    endfor
    &flag=0
    for &item in &ListaCompras
        if &Item.ProdutoId=ProdutoId
            &flag=1
        endif
    endfor   
    if &flag =0
        &ProdutoId = ProdutoId
        load
    endif
EndEvent

Claro que você vai ser inteligente e tratar a questão do preço de forma mais profissional, lembre-se que aqui o objetivo é ser didático e não preciso.

Finalizando a Compra
Muito simples também, um click sobre a imagem da cesta de compras, chama o painel de finalização.

Event Image1.Click
    FinalizaCompra.Call()
EndEvent

Esse novo painel recupera a lista da sessão Web, e permite que o usuário determine a quantidade de itens comprados.  Programamos a carga no próprio Evento Load do Grid

Event Load
    &ListaCompras.FromXMl(&websession.Get("CARRINHO"))
    total.Caption = &ListaCompras.Count.ToString()+' itens'   
    for &item in &ListaCompras
        &ProdutoId             = &item.ProdutoId
        &ProdutoQuantidade     = &item.ProdutoQuantidade
        &ProdutoPrecoValor     = &item.ProdutoValor

        for each
            where ProdutoId     = &ProdutoId
            &ProdutoDescricao     = ProdutoDescricao
            &ProdutoFoto         = ProdutoFoto
        endfor

        &ProdutoPrecoTotal = &ProdutoQuantidade * &ProdutoPrecoValor
        &Total += &ProdutoPrecoTotal
        load
    endfor
EndEvent


Para tratar do login da pessoa no sistema antes da finalização, optamos por um webcomp que faz o tratamento do username e senha.

    // usuario ta logado?
    &UsuarioId = &websession.Get("USUARIO")
    if &UsuarioId.IsEmpty()
        WebComp1.Object = Login.Create()
    else
        WebComp1.Visible= 0
        // finaliza o pedido
        // inclui os produtos na nota fiscal   
        msg('finalizar o pedido do usuario '+&UsuarioId)
    endif


Esse código pode ser posicionado no evento Refresh do segundo painel.

O botão Finalizar nessa interface apenas mostra os produtos comprados, mas poderia muito bem continuar o processo de cobrança e em seguida emissão da nota fiscal eletrônica. Vou deixar essa parte para você.

Event 'Finalizar'
    for each line in Grid1
        msg('comprando'+&ProdutoDescricao)
    endfor
EndEvent

Conclusão

Esse exemplo eu sempre quis publicar no Genexando, mas sempre relutei devido à sua complexidade.  Acho que chegamos a um modelo bem simples e que possibilita a aprendizagem de muitas coisas interessantes como a manipulação de coleções, sessões web, além do recurso de Drag & Drop.

Espero que você faça um bom uso desse modelo, só peço uma coisa, por favor não desenvolva nenhum sistema de Compra de Votos para instalar nas assembléias, câmara de vereadores, prefeituras, governos, e por ai vai, hein...


(fonte: http://1ipbresplendor.blogspot.com.br/2010/08/igreja-e-compra-de-votos.html)