Jump to content
Fivewin Brasil

Wellington Vieira

Membros
  • Posts

    424
  • Joined

  • Last visited

  • Days Won

    10

Posts posted by Wellington Vieira

  1. Bom dia,

    Adobe Fireworks CS6  é um editor de imagens de bitmap e desenho vetorial desenvolvido pela Macromedia, posteriormente adquirido pela Adobe. Suas funcionalidades focam a publicação gráfica na Internet, por isso inclui suporte a GIF animado, PNG e imagens fatiadas, além de possuir ótima compressão de imagens.

    Ele é pago, mas pode se usar/baixar "Fireworks portable", que é a versão portátil  que não necessita instalação para rodar. Assim, tu podes colocar em um pen drive e ligar em qualquer outro computador. ... São programas completos que não necessitam de instalação, basta baixar, descompactar, clicar no executável e pronto. Se precisar envio o "portable" em PASTA COMPACTADA.

    No https://www.youtube.com/ há inúmero vídeos sobre o assunto, ensinando como utilizar o Fireworks.

    Eu, crio 02 arquivos do mesmo gráfico, um salvo no formato .png e outro no formato .bmp que utilizo como "BRUSH" na dialogs para tela e o outro no formato .png para ser alterado quando for preciso.

    Alguns exemplos de tela

    tela_apresenta_1.jpg

    tela_apresenta_2.jpg

    tela_apresenta_4.jpg

    tela_apresenta_3.jpg

    manu_produto.jpg

  2. Obrigado Kapiaba,

    A partir do link que me informou, eu alterei

    Na classe "CONTROL"

    No método HandleEvent, acrescentei:

    #define WM_UPDATEUISTATE 296 // 0x0128
    
    
    	  case nMsg == WM_UPDATEUISTATE  // buttons, radios and checkboxes were erased when pressing ALT
               if ::IsKindOf( "TRADIO" ) .or. ::IsKindOf( "TCHECKBOX" )
                  ::oWnd:Refresh( .F. )
               endif  
               return ::Super:HandleEvent( nMsg, nWParam, nLParam )

    que foi corrigido nas versões posteriores, como a minha versão do fivewin ainda é muita antiga, consegui resolver assim.

    Obrigado a todos.

  3. Bom dia,

    Este é o código.

    				   @ 17,244 RADIO oPtipopreco VAR mPtipopreco OF pedido color corfrtsay,corfdosay PIXEL
                       oradioPreco1 := TRadio():New( 17,244, "ECO-TROCA",         ;
                                               .T.,                          ; // sempre o primeiro elemento recebe .t.
                                               .T.,                          ; // .t. = selecionado (Checked)
                                               1, pedido, oPtipopreco, , , , , .F., , ;
                                               50, 8, , .F., .T. )
                       oPtipopreco:AddRadio( oradioPreco1 )
                       oradioPreco2 := TRadio():New( 17,295, "A PRAZO",       ;
                                              .F.               ,           ;
                                              .F.               ,           ;
                                              2, pedido, oPtipopreco, , , , , .F., , ;
                                              50, 8, , .F., .T. )
                       oPtipopreco:AddRadio( oradioPreco2 )

     

    Quando chamo a DIALOG e assim que pressiono a TECLA "ALT", tudo que é RADIO, CHECKBOX some, se eu passar o MOUSE em cima destes componentes ai eles voltam na DIALOG e não somem mais.

    Se eu não usar qualquer MANIFEST, fica tudo normal. Essa anormalidade acontece somente usando o MANIFEST.

    Já tirei o Transparent da dialog e acontece a mesma coisa.

    Abaixo o código completo.

    #include "FiveWin.ch"
    #include "common.ch"
    #include "postgres.ch"
    #include "Folder.ch"
    #include "dtpicker.ch"
    #include "report.ch"
    #include "Image.ch"
    
    #define btn_width  12
    #define btn_height 10
    
    #define SRCPAINT   15597702   // 0xEE0086
    #define SRCAND      8913094
    
    //*****************************************************************************
    // OBS. EM idformapagamento ESTA GRAVANDO OS MEIOS DE PAGAMENTO quando a venda
    // for A VISTA
    
    // OBS. EM idmeiospagamento ESTA GRAVANDO OS MEIOS DE PAGAMENTO quando a venda
    // FOR A PRAZO e tiver o valor de ENTRADA
    //*****************************************************************************
    
    function pedido(objetpedido,objetipodetela)
             if ver_senha("000550") = .f.
                return .t.
             endif
    
             // Quando for T e de venda e P ‚ de pedidod...........................
             objettela = objetipodetela
    
             // Quando objetpedido = "S" -> Saida
             // Quando objetpedido = "E" -> Entrada...
    
             if objetpedido = "S"
                oTitlePedido = "Emissão de pedidos"
             elseif objetpedido = "E"
                oTitlePedido = "Entrada de pedidos"
             endif
             
    		 define dialog pedido title oTitlePedido from 000,000 to 650,1020 Pixel brush iif(objetpedido = "S",iif( objettela = "T",obrushpedidoPDV,iif(objettela = "P",obrushpedidoTela,)),) transparent
                    // variaveis do pedido.........................................
    					  
                    nlivraget = 1
    				mTcaminhodaimagem = ""
    				mtotalpedido = 0
                    if objetpedido = "S"
                       mPnumerodopedido = 0
                    elseif objetpedido = "E"
                       mPnumerodopedido = 0
                    endif
                    mPidpedido = 0
                    mPsituacaopedido = 1
                    mPnomedasituacao = "Digitação"
                    mPnumeronotafiscal = 0
                    mPnumerocupomfiscal = 0
                    mPtipopreco = zadmprecopadrao
    		        mXtipopreco = zadmprecopadrao
                    mPtipovenda = 1
                    //tadmnomepreco1 = alltrim(zadmnomepreco1)
                    //tadmnomepreco2 = alltrim(zadmnomepreco2)
                    tadmnomepreco1 = iif(!empty(zadmnomepreco1),alltrim(zadmnomepreco1),"Preco_1")
                    tadmnomepreco2 = iif(!empty(zadmnomepreco2),alltrim(zadmnomepreco2),"Preco_2")
    				
    
                    mPidcliente = 0
                    mPnomedocliente = space(60)
    
                    rproc_procura_consumidor(1)
    
                    mPcnpjcpf = space(14)
                    mPdatapedido  = ldate
                    mPdataemissao = ctod("")
                    asamplzPEDpedido  = {""}
                    arecPEDpedido     = {}
    
                    // variaveis para o produto....................................
                    mAcodigoproduto = space(20)  // c¢digo do produto
                    mAnomedoproduto = space(100) // descri‡Æo do produto
                    mAtotalvenda    = 0          // total do item
                    mAqtdpedida     = 1          // quantidade
    
                    mPseqproduto = 0
                    mPcodigoproduto = space(20)
                    mPestoquedisponivel = 0
                    mPnomedoproduto = space(100)
                    
                    mPtamanho = 0
                    mPcor = 0
                    mPtamanhocor    = space(30)
                    mPqtdpedida = 0
                    mPqtdunidade = 0
                    mPvalorvendaunitario = 0
                    mPcustounitariocontabil = 0
                    mPcustounitarionf = 0
                    mPtotaldoproduto = 0
                    mPestoque            =  0
                    mPreserva            =  0
                    mPconsignado         =  0
                    mPprecovenda1        =  0
                    mPprecovenda2        =  0
                    mPdescontomaximoitem =  0
                    mPtermovimentacao    =  .f.
                    mfracaoqtd           = .f.
                    mqtddecimais         =  0
                    mvlrdecimais         =  0
                    asamplzcontroleproduto = {""}
                    areccontroleproduto = {}
    
    
                    // variaveis do pedido.........................................
                    mPtotaldeitens = 0
                    mPsubotaldositens = 0
                    mPdescontoacrescimo = 1
                    mPvaloroupercentualdesconto = 0
                    mPtotaldopedido = 0
                    mptotaladividir := mptotalareceber :=  0
    				msairESC := "N"
    
                    mPdescontototalpermitido = 0
                    mPdescontototaldado = 0
    				
    				mAchaProcuraPedido = "N"
    
                    // plano de contas.............................................
                    maad = 0
                    pega_grau()
                    mPdescricaoplanodecontas = space(150)
                    mPadescricaoplanodecontas = {}
                    aadd(mPadescricaoplanodecontas,space(150))
                    cQuery := "select seqcontas,descricao,contacontabil from fnplanoconta "+;
                              " order by descricao asc;"
                    oQuery := oServer:Query(cQuery)
                    DO WHILE ! oQuery:Eof()
                       a = oQuery:Fieldget(oQuery:Fieldpos('descricao'))
                       b = oQuery:Fieldget(oQuery:Fieldpos('seqcontas'))
                       c = oQuery:Fieldget(oQuery:Fieldpos('contacontabil'))
                       if val(substr(c,1,1)) = 2
                          oQuery:Skip()
                          loop
                       endif
                       if val(right(alltrim(c),len(maad))) <= 0
                          oQuery:Skip()
                          loop
                       endif
                       if !empty(a)
                          aadd(mPadescricaoplanodecontas,a)
                       endif
                       oQuery:Skip()
                    END
                    oQuery:destroy()
    				
                    // variaveis para o tipo de movimento..........................
                    if ztipodeempresa = "Bateria"
    				   mPtipomovimento = 9
    				   cwQuery := "select * from estipomovimento where "+;
                                  "seqtpmov = " + alltrim(str(mPtipomovimento))
                       cwQuery += " order by seqtpmov asc;"
                       owQuery := oServer:Query(cwQuery)
                       mPdescricaotipodemovimento = owQuery:Fieldget(owQuery:Fieldpos('descricao'))
                       owQuery:destroy()
    				   
    				   mPdescricaoplanodecontas = "VENDAS A PRAZO" + space(136)
    				else
    				   mPtipomovimento = 0
                       mPdescricaotipodemovimento = space(50)
    				endif
                    tmovimentaestoque       = .f. // se movimenta o estoque
                    tgeracontas             = .f. // se gera cts a pagar ou receber
                    tmovimentocompravenda   = .f. // se movimento de compra ou venda
                    tabatemovimento         = .f. // se abate no valor do movimento
                    tcomporcustomedio       = .f. // se compoe custo medio
                    tcomporcustocontabil    = .f. // se compoe custo contabil
                    texigirmargemlucro      = .f. // se exige margem de lucro
                    tmovimentoconsignado    = .f. // se o movimento e consignado
                    tprazoacertoconsignado  = 0   // se tem prazo ou acerto consignado
                    tcodigocancelamento     = 0   // codigo para o cancelamento
    				
    				// se não estiver vazio o tipo de saída para venda.............................
    				if !empty(zfintiposaidapdv)
    				   mPtipomovimento = zfintiposaidapdv
    		           cwquery := "select * from estipomovimento where seqtpmov = " +;
    			                  alltrim(str(mPtipomovimento))+ " order by seqtpmov asc;"
                       owquery := oserver:query(cwquery)
    			       mPdescricaotipodemovimento = owQuery:Fieldget(owQuery:Fieldpos('descricao'))
    			       tmovimentaestoque          = owQuery:Fieldget(owQuery:Fieldpos('movimentaestoque'))
    			       tgeracontas                = owQuery:Fieldget(owQuery:Fieldpos('geracontas'))
    			       tmovimentocompravenda      = owQuery:Fieldget(owQuery:Fieldpos('movimentocompravenda'))
    			       tabatemovimento            = owQuery:Fieldget(owQuery:Fieldpos('abatemovimento'))
    			       tcomporcustomedio          = owQuery:Fieldget(owQuery:Fieldpos('comporcustomedio'))
    			       tcomporcustocontabil       = owQuery:Fieldget(owQuery:Fieldpos('comporcustocontabil'))
    			       texigirmargemlucro         = owQuery:Fieldget(owQuery:Fieldpos('exigirmargemlucro'))
    			       tmovimentoconsignado       = owQuery:Fieldget(owQuery:Fieldpos('movimentoconsignado'))
    			       tprazoacertoconsignado     = owQuery:Fieldget(owQuery:Fieldpos('prazoacertoconsignado'))
    			       tcodigocancelamento        = owQuery:Fieldget(owQuery:Fieldpos('codigocancelamento'))
                       owquery:destroy()
    				endif
    				
    				// se não tiver vazio o tipo de conta para a venda.......
    				if !empty(zfincontavendasvista)
    				   cwQuery := "select * from fnplanoconta where "+;
                                  "seqcontas = " + alltrim(str(zfincontavendasvista))
                       cwQuery += " order by seqcontas asc;"
                       owQuery := oServer:Query(cwQuery)
                       mPdescricaoplanodecontas = owQuery:Fieldget(owQuery:Fieldpos('descricao'))
                       owQuery:destroy()
    				endif
    				
                    // pega o tipo de caixa........................................
                    mPidtipodecaixa = 1
                    mPdescricaotipodecaixa = space(50)  // descricao do tipo de caixa quando o pedido for a vista.
                    mRdescricaotipodecaixa = space(50)  // descricao do tipo de caixa na entrada do recebimento
                    mPadescricaotipodecaixa = {}
                    cquery := "select * from fncaixas"+;
                              " order by descricaocaixa asc;"
                    oquery := oServer:Query(cquery)
                    aadd(mPadescricaotipodecaixa,space(50))
                    nncaixa = 0
                    do while ! oquery:eof()
                       b  = oquery:Fieldget(oquery:Fieldpos('descricaocaixa'))
                       if !empty(b)
                          aadd(mPadescricaotipodecaixa,b)
                       endif
                       ++nncaixa
                       oquery:skip()
                    end
                    oquery:destroy()
                    if nncaixa = 1
                       for ttcaixa = 1 to len(mPadescricaotipodecaixa)
                           mPdescricaotipodecaixa = mPadescricaotipodecaixa[ttcaixa]
                       next
                    else
    				   if ztipodeempresa = "Bateria"
                          for ttcaixa = 1 to len(mPadescricaotipodecaixa)
                              if upper(alltrim(mPadescricaotipodecaixa[ttcaixa])) = "FINANCEIRO"
    						     mPdescricaotipodecaixa = mPadescricaotipodecaixa[ttcaixa]
    						  endif
                          next
    				   endif
    				endif
    
                    nPassa_a_liberar_na_tela_venda = "N"
    
                    // meio de pagamento quando for a vista...............................
                    mPdescricaoformapagamento = space(50)
                    mPadescricaoformapagamento = {}
                    aadd(mPadescricaoformapagamento,space(50))
                    cquery := "select * from fnmeiospagamento where"+;
    				          " loja = " + alltrim(str(zseqloja))+;
                              " and avistaaprazo = 1"+;
                              " order by descricaomeiospagamento asc;"
                    oquery := oServer:Query(cquery)
                    do while ! oquery:eof()
                       b  = oquery:Fieldget(oquery:Fieldpos('descricaomeiospagamento'))
                       if !empty(b)
                          aadd(mPadescricaoformapagamento,b)
                       endif
                       oquery:skip()
                    end
                    oquery:destroy()
    
                    // Variaveis somente para a saida..............................
                    mPidvendedor = 0
                    mPvendedor = space(50)
                    mPavendedor := {}
                    mPrecvendedor := {}
                    mPidvendedoratendeu = 0
                    mPvendedoratendeu = space(50)
                    mPavendedoratendeu := {}
                    mPrecvendedoratendeu := {}
                    mPlocalentrega = space(100)
                    mPidtabeladeprecos = 0
                    mPtabeladeprecos = space(50)
                    mPatabeladeprecos := {}
                    mPobservacao = ""
    				
    		        mlimitedecreditoCliente = 0  // Retorna o valor do limite de crédito do cliente.
    		        mlimitesaldo = 0             // Retorno o valor que o cliente ainda tem de saldo para comprar.
    		        mlimiteLiberou = "N"         // Se já foi liberado pelo menos uma vez o restante da compra do cliente.
    
                    msairESCconta = "N"
    
    
                    // Joga os representantes em um array..........................
                    cQuery := "select * from fnrepresentante where"+;
                              " ativo = 'y'"
                    cQuery += " order by razaosocial asc;"
                    oquery := oServer:Query(cquery)
                    
    				aadd( mPavendedor,space(50) )
                    aadd( mPavendedoratendeu,space(50) )
                    aadd( mPrecvendedor,0)
                    aadd( mPrecvendedoratendeu,0)
    				
                    DO WHILE ! oquery:Eof()
                       a = oquery:Fieldget(oquery:Fieldpos('seqrepresentante'))
                       b = oquery:Fieldget(oquery:Fieldpos('razaosocial'))
                       aadd( mPavendedor,b )
                       aadd( mPavendedoratendeu,b )
    
                       aadd( mPrecvendedor,a)
                       aadd( mPrecvendedoratendeu,a)
    
                       oquery:Skip()
                    END
                    oquery:destroy()
    				
    				if objettela = "T"
    				
                       @ 270,020 get oPnumerodopedido var mPnumerodopedido picture "@e 999999999" valid ( pega_dados_pedido(objetpedido) ) font mtahomagrande size 63,15 of pedido color corfrtsayds,corfdogetnotafiscal pixel right noborder
                       @ 270,105 say oPnomedasituacao var mPnomedasituacao font mtahomagrandeletra size 65,15 of pedido color RGB(255,255,255),RGB(007,102,148) pixel
                       
    				   if objetpedido = "S"
                          @ 305,018 say oPnumeronotafiscal var mPnumeronotafiscal font mtahomagrandeletra size 65,15 of pedido color RGB(255,255,255),RGB(007,102,148) pixel right
                          @ 305,112 say oPnumerocupomfiscal var mPnumerocupomfiscal font mtahomagrandeletra size 65,15 of pedido color RGB(255,255,255),RGB(007,102,148) pixel right
                       endif
    				   
    				   @ 003.5,198 say "Tipo de preço" of pedido font mtahomabold size 65,8.5 color corfrtsay,corfdosay pixel
    				   @ 003,244 RADIO oPtipopreco VAR mPtipopreco OF pedido color corfrtsay,corfdosay PIXEL SIZE 40,8
                       oradioPreco1 := TRadio():New( 003,244, tadmnomepreco1,         ;
                                               .T.,                          ; // sempre o primeiro elemento recebe .t.
                                               .T.,                          ; // .t. = selecionado (Checked)
                                               1, pedido, oPtipopreco, , , , , .F., , ;
                                               50, 8, , .F., .T. )
                       oPtipopreco:AddRadio( oradioPreco1 )
                       oradioPreco2 := TRadio():New( 003,295, tadmnomepreco2,       ;
                                              .F.               ,           ;
                                              .F.               ,           ;
                                              2, pedido, oPtipopreco, , , , , .F., , ;
                                              50, 8, , .F., .T. )
                       oPtipopreco:AddRadio( oradioPreco2 )
    				   
                       @ 021,005 get oPidcliente var mPidcliente valid ( procura_cliente_fornecedor(objetpedido) ) font mtahoma size 44,10 of pedido color corfrtsayds,corfdosay pixel right noborder when .f.
    				   if objetpedido = "S"
                          @ 022,052 btnbmp opedidobut01 size btn_width, btn_height name "search" noborder of pedido action ( rproc_fornecedor(2,"C",mPnumerodopedido,"S")) 
    					  opedidobut01:lTransparent := .t.
                       elseif objetpedido = "E"
                          @ 022,052 btnbmp opedidobut01 size btn_width, btn_height name "search" noborder of pedido action ( rproc_fornecedor(2,"F") )
    					  opedidobut01:lTransparent := .t.
                       endif
                       //@ 021,065 say oPnomedocliente var mPnomedocliente picture "@!" font mtahomapequena size 225,15 of pedido color RGB(255,255,255),RGB(007,102,148) pixel
                       @ 021,065 say oPnomedocliente var mPnomedocliente picture "@!" font mtahomapequena size 225,15 of pedido color corfrtsayds,corfdosay pixel
                       //@ 021,378 say oPcnpjcpf var mPcnpjcpf;
                       //          picture "@!" font mtahomapequena size 070,15 of pedido color RGB(255,255,255),RGB(007,102,148);
                       //          pixel
                       @ 021,378 say oPcnpjcpf var mPcnpjcpf;
                                 picture "@!" font mtahomapequena size 070,15 of pedido color corfrtsayds,corfdosay;
                                 pixel
                       @ 022,465 get oPdatapedido  var mPdatapedido  font mtahoma size 30,09 of pedido color corfrtget,corfdogetnotafiscal pixel noborder
                       //@ 022,465 dtpicker oPdatapedido var mPdatapedido font mtahoma size 50,10 of pedido color corfrtget,corfdoget pixel 
                      
    				   if objetpedido = "S"
                          @ 046,005 btnbmp opedidobut02 size btn_width, btn_height name "search" noborder of pedido action ( rproc_tipodemovimento(4,"S",mPnumerodopedido) )
    					  opedidobut02:lTransparent := .t.
                          @ 046,018 get oPdescricaotipodemovimento var mPdescricaotipodemovimento picture "@!" font mtahoma size 105,10 of pedido color corfrtget,corfdogetnotafiscal pixel noborder
                       elseif objetpedido = "E"
                          @ 046,005 btnbmp opedidobut02 size btn_width, btn_height name "search" noborder of pedido action ( rproc_tipodemovimento(4,"E",mPnumerodopedido) )
    					  opedidobut02:lTransparent := .t.
                          //@ 055,018 get oPdescricaotipodemovimento var mPdescricaotipodemovimento picture "@!" font mtahoma size 425,10 of pedido color corfrtget,corfdogetnotafiscal pixel 
                          @ 046,018 get oPdescricaotipodemovimento var mPdescricaotipodemovimento picture "@!" font mtahoma size 425,10 of pedido color corfrtget,corfdoget pixel noborder
                       endif
    				   
                       if objetpedido = "S"
                          @ 046,131 combobox oPvendedor        var mPvendedor items mPavendedor valid( compoe_vendedor_atendeu() ) font mtahoma size 155,100 of pedido color corfrtget,corfdogetnotafiscal pixel 
                          @ 046,292 combobox oPvendedoratendeu var mPvendedoratendeu items mPavendedoratendeu font mtahoma size 155,100 of pedido color corfrtget,corfdogetnotafiscal pixel 
                          //@ 046,465 say oPdataemissao var mPdataemissao font mtahomapequena size 30,15 of pedido color RGB(255,255,255),RGB(007,102,148) pixel
                          @ 046,465 say oPdataemissao var mPdataemissao font mtahomapequena size 30,15 of pedido color corfrtsayds,corfdosay pixel
                          
    				      @ 110,005 get oPlocalentrega var mPlocalentrega picture "@!" valid( local_entrega_atualiza() ) font mtahoma size 280,10 of pedido color corfrtget,corfdogetnotafiscal pixel noborder
                          @ 110,292 combobox oPtabeladeprecos var mPtabeladeprecos items mPatabeladeprecos font mtahoma size 211,100 of pedido color corfrtget,corfdogetnotafiscal pixel
    				      oPlocalentrega:disable()
    				      oPtabeladeprecos:disable()
                       endif
    				   
                       @ 081,005 get oPcodigoproduto var mPcodigoproduto picture "@!" valid ( rproc_produto_entradasaida(objetpedido,"") ) font mtahomagrande size 120,19 of pedido color corfrtget,corfdogetnotafiscal pixel noborder
                       //@ 083,135 say oPnomedoproduto var mPnomedoproduto picture "@!" font mtahomagrande size 400,19 of pedido color RGB(255,255,255),RGB(007,102,148) pixel
                       @ 083,135 say oPnomedoproduto var mPnomedoproduto picture "@!" font mtahomagrande size 400,19 of pedido color corfrtsayds,corfdosay pixel
    				   
                       @ 105,005 listbox obrzPEDpedido fields asamplzPEDpedido[obrzPEDpedido:nat,1],asamplzPEDpedido[obrzPEDpedido:nat,2],;
                                 asamplzPEDpedido[obrzPEDpedido:nat,3],asamplzPEDpedido[obrzPEDpedido:nat,4],asamplzPEDpedido[obrzPEDpedido:nat,5],;
                                 asamplzPEDpedido[obrzPEDpedido:nat,6];
                                 headers "Código","Produto","Und","Quantidade","Unitário","Total";
                                 FIELDSIZES 130,350,50,155,160,135 on dblclick escolha_opcao_exc_alt(objetpedido);
                                 size 500,85 font mcourierGra;
                                 pixel of pedido color rgb(000,000,000),rgb(245,235,223)
                       obrzPEDpedido:nClrPane      := {|| iif((obrzPEDpedido:nat/2) = int(obrzPEDpedido:nat/2),corfdogetnotafiscal,corlstbxnormal) }
    				   obrzPEDpedido:aJustify  := { .F.,.F.,.F.,.T.,.T.,.T. }
                       obrzPEDpedido:nLineStyle := 3
                       obrzPEDpedido:lCellStyle = .f.
                       obrzPEDpedido:lAutoSkip  = .t.
                       obrzPEDpedido:SetArray(asamplzPEDpedido)
                       obrzPEDpedido:bGoTop = { || obrzPEDpedido:nat := 1 }
                       obrzPEDpedido:bGoBottom = { || obrzPEDpedido:nat := Eval( obrzPEDpedido:bLogicLen ) }
                       obrzPEDpedido:bSkip = { | nWant, nOld | nOld := obrzPEDpedido:nat, obrzPEDpedido:nat += nWant,;
                       obrzPEDpedido:nat := Max( 1, Min( obrzPEDpedido:nat, Eval( obrzPEDpedido:bLogicLen ) ) ),;
                       obrzPEDpedido:nat - nOld }
                       obrzPEDpedido:bLogicLen = { || Len( asamplzPEDpedido ) }
                       obrzPEDpedido:cAlias = "Array"
                       obrzPEDpedido:nColAct       := 1
                       obrzPEDpedido:lMChange      := .F.
                       obrzPEDpedido:SetFocus()
                       obrzPEDpedido:Refresh()
                       obrzPEDpedido:bgotfocus    = { || oPcodigoproduto:setfocus() }
    				   
    				   
                       //@ 209,010 say oPtotaldeitens var mPtotaldeitens picture zmascqtdinteiro font mtahomagrande of pedido size 085,15 color RGB(255,255,255),RGB(007,102,148) pixel right
                       @ 209,010 say oPtotaldeitens var mPtotaldeitens picture zmascqtdinteiro font mtahomagrande of pedido size 085,15 color corfrtsayds,corfdosay pixel right
                       //@ 209,122 say oPsubotaldositens var mPsubotaldositens picture "@e 999,999,999,999.99" font mtahomagrande of pedido size 108,15 color RGB(255,255,255),RGB(007,102,148) pixel right
                       @ 209,122 say oPsubotaldositens var mPsubotaldositens picture "@e 999,999,999,999.99" font mtahomagrande of pedido size 108,15 color corfrtsayds,corfdosay pixel right
    				   
                       @ 207,233 radio oPdescontoacrescimo var mPdescontoacrescimo of pedido color corfrtsay,corfdosay pixel size 35,10
                       oRadio1 := TRadio():New( 207,233, '',            ;
                                              .T.,                         ;
                                              .T.,                         ;
                                              1, pedido, oPdescontoacrescimo, , , , , .F., , ;
                                              35, 10, , .F., .T. )
                       oPdescontoacrescimo:AddRadio( oRadio1 )
                       oRadio2 := TRadio():New( 207,275, '',        ;
                                              .F.               ,          ;
                                              .F.               ,          ;
                                              2, pedido, oPdescontoacrescimo, , , , , .F., , ;
                                              25, 10, , .F., .T. )
                       oPdescontoacrescimo:AddRadio( oRadio2 )
                       @ 209,317 get oPvaloroupercentualdesconto var mPvaloroupercentualdesconto picture zmascvalor valid( calcula_desconto_pedido() ) font mtahoma size 55,10 of pedido color corfrtget,corfdogetnotafiscal pixel right noborder
                       
                       //@ 209,398 say oPtotaldopedido var mPtotaldopedido picture "@e 999,999,999,999.99" font mtahomagrande of pedido size 108,15 color RGB(255,255,255),RGB(007,102,148) pixel right
                       @ 209,398 say oPtotaldopedido var mPtotaldopedido picture "@e 999,999,999,999.99" font mtahomagrande of pedido size 108,15 color corfrtsayds,corfdosay pixel right
    				   
                       @ 236,005 combobox oPdescricaoplanodecontas var mPdescricaoplanodecontas items mPadescricaoplanodecontas valid( grava_planocontas() ) font mtahoma size 090,100 of pedido color corfrtget,corfdogetnotafiscal pixel
    				   
    				   @ 239,120 RADIO oPtipovenda VAR mPtipovenda OF pedido color corfrtsayds,corfdosay PIXEL SIZE 40,8 on change( altera_tipo_venda("PEDIDO") )
                       oradio_1 := TRadio():New( 239,099, "",         ;
                                               .T.,                          ; // sempre o primeiro elemento recebe .t.
                                               .T.,                          ; // .t. = selecionado (Checked)
                                               1, pedido, oPtipovenda, , , , , .F., , ;
                                               20, 8, , .F., .T. )
                       oPtipovenda:AddRadio( oradio_1 )
                       oradio_2 := TRadio():New( 239,130, "",       ;
                                              .F.               ,           ;
                                              .F.               ,           ;
                                              2, pedido, oPtipovenda, , , , , .F., , ;
                                              20, 8, , .F., .T. )
                       oPtipovenda:AddRadio( oradio_2 )
                       oradio_3 := TRadio():New( 239,164, "",       ;
                                              .F.               ,           ;
                                              .F.               ,           ;
                                              3, pedido, oPtipovenda, , , , , .F., , ;
                                              20, 8, , .F., .T. )
                       oPtipovenda:AddRadio( oradio_3 )
                       oradio_4 := TRadio():New( 239,190, "",       ;
                                              .F.               ,           ;
                                              .F.               ,           ;
                                              4, pedido, oPtipovenda, , , , , .F., , ;
                                              20, 8, , .F., .T. )
                       oPtipovenda:AddRadio( oradio_4 )
                        
                       @ 236,246 combobox oPdescricaoformapagamento var mPdescricaoformapagamento items mPadescricaoformapagamento valid( grava_meio_a_vista() ) font mtahoma size 120,100 of pedido color corfrtget,corfdogetnotafiscal pixel
                       @ 236,385 combobox oPdescricaotipodecaixa var mPdescricaotipodecaixa items mPadescricaotipodecaixa valid( grava_caixa_a_vista() ) font mtahoma size 120,100 of pedido color corfrtget,corfdogetnotafiscal pixel
    				   
                       @ 254,201 buttonbmp onota01 bitmap  "pdv_nfe.bmp"       left size 045,19 font obotaof of pedido pixel action ( iif(ver_senha("000553") = .t.,notafiscal("pedido","eletronica",objetpedido,"S","N"),"") )
                       @ 254,252 buttonbmp onot01a bitmap  "pdv_nfce.bmp"      left size 045,19 font obotaof of pedido pixel action ( iif(ver_senha("000553") = .t.,notafiscal("pedido","eletronica",objetpedido,"S","C"),"") )
    			       if zfatnotapapeleoueletronica = 1
    				      onota01:disable()
    				      onot01a:disable()
    				   elseif zfatnotapapeleoueletronica = 2
    				      onota01:enable()
    				      onot01a:disable()
    				   elseif zfatnotapapeleoueletronica = 3
    				      onota01:disable()
    				      onot01a:enable()
    				   elseif zfatnotapapeleoueletronica = 4
    				      onota01:enable()
    				      onot01a:enable()
    				   endif
                       @ 254,302 buttonbmp onota02 bitmap  "pdv_cupom.bmp"     left size 045,19 font obotaof of pedido pixel action ( cupom_fiscal("pedido") )
                       @ 254,353 buttonbmp onota03 bitmap  "pdv_obs.bmp"       left size 045,19 font obotaof of pedido pixel action ( nfpedido_obs() )
                       @ 254,403 buttonbmp onota04 bitmap  "pdv_importar.bmp"  left size 045,19 font obotaof of pedido pixel action ( importa_produto_pedido_orcamento(objetpedido) )
                       @ 254,454 buttonbmp onota05 bitmap  "pdv_corrente.bmp"  left size 045,19 font obotaof of pedido pixel action ( junta_conta_corrente() ) 
                       
                       @ 278,201 buttonbmp opedido01 bitmap "pdv_procurar.bmp" left size 045,19 font obotaof of pedido pixel action( iif(objetpedido = "E",rproc_pedido_entrada(),rproc_pedido_saida(objetpedido)) ) 
                       @ 278,252 buttonbmp opedido00 bitmap "pdv_clientes.bmp" left size 045,19 font obotaof of pedido pixel action( tablet_listbox_clientes() )
                       @ 278,302 buttonbmp opedido02 bitmap "pdv_produtos.bmp" left size 045,19 font obotaof of pedido pixel action( listbox_produto()  )
                       @ 278,353 buttonbmp opedido03 bitmap "pdv_novo.bmp"     left size 045,19 font obotaof of pedido pixel action( novo_pedido(objetpedido) )
                       @ 278,403 buttonbmp opedido04 bitmap "pdv_excluir.bmp"  left size 045,19 font obotaof of pedido pixel action( iif(ver_senha("000552") = .t.,exclui_pedido(objetpedido),"") )
                       @ 278,454 buttonbmp opedido06 bitmap "pdv_troco.bmp"    left size 045,19 font obotaof of pedido pixel action( gera_boleto_nf_pedido("Ped") )
    				   
                       @ 302,201 buttonbmp opedido05 bitmap "pdv_liberar.bmp"  left size 045,19 font obotaof of pedido pixel action( iif(ver_senha("000551") = .t.,libera_pedido_entrada_venda(objetpedido,"PEDIDO"),"") )
                       @ 302,252 buttonbmp opedido07 bitmap "pdv_imprimir.bmp" left size 045,19 font obotaof of pedido pixel action( rel_pedido(objetpedido,"S") )
                       @ 302,302 buttonbmp opedido08 bitmap "pdv_cancelar.bmp" left size 045,19 font obotaof of pedido pixel action( iif(ver_senha("000549") = .t.,cancela_pedido(objetpedido,mPnumerodopedido,"Pedido"),"") )
                       @ 302,353 buttonbmp opedido09 bitmap "pdv_receber.bmp"  left size 045,19 font obotaof of pedido pixel action( lanca_pedido_cts_receber(objetpedido,1) )
                       @ 302,403 buttonbmp opedido10 bitmap "pdv_manual.bmp"   left size 045,19 font obotaof of pedido pixel action( notafiscal("pedido","manual",objetpedido) )
                       @ 302,454 buttonbmp opedido11 bitmap "pdv_sair.bmp"     left size 045,19 font obotaof of pedido pixel action( pedido:end() )
    				   
    				else
    
                       @ 001,090 get oPnumerodopedido var mPnumerodopedido picture "@e 999999999" valid ( pega_dados_pedido(objetpedido) ) font mtahomagrande size 63,15 of pedido color corfrtsayds,corfdogetnotafiscal pixel right noborder
                       @ 2,226 say oPnomedasituacao var mPnomedasituacao font mtahomagrandeletra size 65,15 of pedido color corfrtsayds,corfdosay pixel
                       
                       if objetpedido = "S"
                          @ 2,393 say oPnumeronotafiscal var mPnumeronotafiscal font mtahomagrandeletra size 65,15 of pedido color corfrtsayds,corfdosay pixel
                          @ 2,464 say oPnumerocupomfiscal var mPnumerocupomfiscal font mtahomagrandeletra size 65,15 of pedido color corfrtsayds,corfdosay pixel
                       endif
                       
    				   @ 017.5,198 say "Tipo de preço" of pedido font mtahomabold size 65,8.5 color corfrtsay,corfdosay pixel
    				   //@ 17,244 RADIO oPtipopreco VAR mPtipopreco OF pedido color corfrtsay,corfdosay PIXEL SIZE 40,8
    				   @ 17,244 RADIO oPtipopreco VAR mPtipopreco OF pedido color corfrtsay,corfdosay PIXEL
                       oradioPreco1 := TRadio():New( 17,244, tadmnomepreco1,         ;
                                               .T.,                          ; // sempre o primeiro elemento recebe .t.
                                               .T.,                          ; // .t. = selecionado (Checked)
                                               1, pedido, oPtipopreco, , , , , .F., , ;
                                               50, 8, , .F., .T. )
                       oPtipopreco:AddRadio( oradioPreco1 )
                       oradioPreco2 := TRadio():New( 17,295, tadmnomepreco2,       ;
                                              .F.               ,           ;
                                              .F.               ,           ;
                                              2, pedido, oPtipopreco, , , , , .F., , ;
                                              50, 8, , .F., .T. )
                       oPtipopreco:AddRadio( oradioPreco2 )
    				   
                       @ 035,005 get oPidcliente var mPidcliente valid ( procura_cliente_fornecedor(objetpedido) ) font mtahoma size 44,10 of pedido color corfrtget,corfdogetnotafiscal pixel right when .f. noborder
                       if objetpedido = "S"
                          @ 035,052 btnbmp opedidobut01 size btn_width, btn_height name "search" noborder of pedido action ( rproc_fornecedor(2,"C",mPnumerodopedido,"S"))
    					  opedidobut01:lTransparent := .t.
                       elseif objetpedido = "E"
                          @ 035,052 btnbmp opedidobut01 size btn_width, btn_height name "search" noborder of pedido action ( rproc_fornecedor(2,"F") )
    					  opedidobut01:lTransparent := .t.
                       endif
                       @ 034,065 say oPnomedocliente var mPnomedocliente picture "@!" font mtahomapequena size 225,15 of pedido color corfrtsayds,corfdosay pixel
                       @ 035,378 say oPcnpjcpf var mPcnpjcpf;
                                 picture "@!" font mtahomapequena size 070,15 of pedido color corfrtsayds,corfdosay;
                                 pixel
                       @ 035,465 get oPdatapedido  var mPdatapedido  font mtahoma size 30,10 of pedido color corfrtget,corfdogetnotafiscal pixel noborder
                       //@ 035,453 dtpicker oPdatapedido var mPdatapedido font mtahoma size 50,10 of pedido color corfrtget,corfdoget pixel 
                       
                       if objetpedido = "S"
                          @ 055,005 btnbmp opedidobut02 size btn_width, btn_height name "search" noborder of pedido action ( rproc_tipodemovimento(4,"S",mPnumerodopedido) )
    					  opedidobut02:lTransparent := .t.
                          @ 055,018 get oPdescricaotipodemovimento var mPdescricaotipodemovimento picture "@!" font mtahoma size 105,10 of pedido color corfrtget,corfdogetnotafiscal pixel noborder
                       elseif objetpedido = "E"
                          @ 055,005 btnbmp opedidobut02 size btn_width, btn_height name "search" noborder of pedido action ( rproc_tipodemovimento(4,"E",mPnumerodopedido) )
    					  opedidobut02:lTransparent := .t.
                          //@ 055,018 get oPdescricaotipodemovimento var mPdescricaotipodemovimento picture "@!" font mtahoma size 425,10 of pedido color corfrtget,corfdogetnotafiscal pixel 
                          @ 055,018 get oPdescricaotipodemovimento var mPdescricaotipodemovimento picture "@!" font mtahoma size 425,10 of pedido color corfrtget,corfdoget pixel noborder
                       endif
                       
                       if objetpedido = "S"
                          @ 055,131 combobox oPvendedor        var mPvendedor items mPavendedor valid( compoe_vendedor_atendeu() ) font mtahoma size 155,100 of pedido color corfrtget,corfdogetnotafiscal pixel
                          @ 055,292 combobox oPvendedoratendeu var mPvendedoratendeu items mPavendedoratendeu font mtahoma size 155,100 of pedido color corfrtget,corfdogetnotafiscal pixel
                          @ 056,465 say oPdataemissao var mPdataemissao font mtahomapequena size 30,15 of pedido color corfrtsayds,corfdosay pixel
                          @ 076,005 get oPlocalentrega var mPlocalentrega picture "@!" valid( local_entrega_atualiza() ) font mtahoma size 280,10 of pedido color corfrtget,corfdogetnotafiscal pixel noborder
                          @ 076,292 combobox oPtabeladeprecos var mPtabeladeprecos items mPatabeladeprecos font mtahoma size 211,100 of pedido color corfrtget,corfdogetnotafiscal pixel
                       endif
                       
                       if objettela = "T"
                          @ 111,005 get oPcodigoproduto var mPcodigoproduto picture "@!" valid ( rproc_produto_entradasaida(objetpedido,"") ) font mtahomagrande size 120,19 of pedido color corfrtget,corfdogetnotafiscal pixel noborder
                          @ 114,130 say oPnomedoproduto var mPnomedoproduto picture "@!" font mtahomagrande size 400,19 of pedido color corfrtsayds,corfdosay pixel
                       else
                          @ 104,005 btnbmp opedidobut03 size btn_width, btn_height name "search" noborder of pedido action ( rproc_produto("Pedido") )
    				      opedidobut03:lTransparent := .t.
                          @ 104,018 get oPcodigoproduto var mPcodigoproduto picture "@!" valid ( rproc_produto_entradasaida(objetpedido,"") ) font mtahoma size 75,10 of pedido color corfrtget,corfdogetnotafiscal pixel noborder
                          @ 104,098 say oPtamanhocor var mPtamanhocor picture "@!" font mtahoma size 105,10 of pedido color corfrtsayds,corfdosay pixel
                       
                          @ 104,209 get oPestoquedisponivel var mPestoquedisponivel picture zmascqtdinteiro font mtahomameiogrande size 46,11 of pedido color corfrtsayds,RGB(007,102,148) pixel right noborder when .f. 
                          @ 101,263 say oPnomedoproduto var mPnomedoproduto picture "@!" font mtahomagrande size 400,19 of pedido color corfrtsayds,corfdosay pixel
    					  //@ 103,401 combobox oPdetalhe var mPdetalhe items mPadetalhe font mtahomapequenaMinb size 105,100 of pedido color corfrtget,corfdogetnotafiscal pixel when iif(!empty(nnttdetalhe),.t.,.f.)
                          @ 128,038 get oPqtdpedida var mPqtdpedida valid( pega_qtdvalor_analisa(1,objetpedido) ) picture zmascqtdinteiro font mtahoma size 55,10 of pedido color corfrtget,corfdogetnotafiscal pixel right noborder
                       
                          if objetpedido = "S"
                             @ 128,121 get oPvalorvendaunitario var mPvalorvendaunitario valid( pega_qtdvalor_analisa(2,objetpedido) ) picture zmascvalor font mtahoma size 75,10 of pedido color corfrtget,corfdogetnotafiscal pixel right noborder
                             @ 128,239 say oPtotaldoproduto var mPtotaldoproduto picture zmascvalor font mtahoma size 55,10 of pedido color corfrtsayds,corfdosay pixel right
                          elseif objetpedido = "E"
                             @ 128,121 get oPvalorvendaunitario var mPvalorvendaunitario picture zmascvalor font mtahoma size 75,10 of pedido color corfrtget,corfdogetnotafiscal pixel right noborder when .f. 
                             @ 128,219 get oPtotaldoproduto var mPtotaldoproduto  valid( pega_qtdvalor_analisa(2,objetpedido) ) picture zmascvalor font mtahoma size 75,10 of pedido color corfrtsayds,corfdosay pixel right noborder
                          endif
                          @ 121,300 buttonbmp opedidobut05 bitmap "pedido_lancar.bmp" left size 045,17 font obotaof of pedido pixel action( lanca_itens_saida_entrada(objetpedido) )
                       endif
    				   
                       @ 145,005 listbox obrzPEDpedido fields asamplzPEDpedido[obrzPEDpedido:nat,1],asamplzPEDpedido[obrzPEDpedido:nat,2],;
                                 asamplzPEDpedido[obrzPEDpedido:nat,3],asamplzPEDpedido[obrzPEDpedido:nat,4],asamplzPEDpedido[obrzPEDpedido:nat,5],;
                                 asamplzPEDpedido[obrzPEDpedido:nat,6];
                                 headers "Código","Produto","Und","Quantidade","Unitário","Total";
                                 FIELDSIZES 130,350,50,155,160,135 on dblclick escolha_opcao_exc_alt(objetpedido);
                                 size 500,85 font mcourierGra color rgb(000,000,000),rgb(245,235,223);
                                 pixel of pedido
                       obrzPEDpedido:nClrPane      := {|| iif((obrzPEDpedido:nat/2) = int(obrzPEDpedido:nat/2),corfdogetnotafiscal,corlstbxnormal) }
    				   obrzPEDpedido:aJustify  := { .F.,.F.,.F.,.T.,.T.,.T. }
                       obrzPEDpedido:nLineStyle := 3
                       obrzPEDpedido:lCellStyle = .f.
                       obrzPEDpedido:lAutoSkip  = .t.
                       obrzPEDpedido:SetArray(asamplzPEDpedido)
                       obrzPEDpedido:bGoTop = { || obrzPEDpedido:nat := 1 }
                       obrzPEDpedido:bGoBottom = { || obrzPEDpedido:nat := Eval( obrzPEDpedido:bLogicLen ) }
                       obrzPEDpedido:bSkip = { | nWant, nOld | nOld := obrzPEDpedido:nat, obrzPEDpedido:nat += nWant,;
                       obrzPEDpedido:nat := Max( 1, Min( obrzPEDpedido:nat, Eval( obrzPEDpedido:bLogicLen ) ) ),;
                       obrzPEDpedido:nat - nOld }
                       obrzPEDpedido:bLogicLen = { || Len( asamplzPEDpedido ) }
                       obrzPEDpedido:cAlias = "Array"
                       obrzPEDpedido:nColAct       := 1
                       obrzPEDpedido:lMChange      := .F.
                       obrzPEDpedido:SetFocus()
                       obrzPEDpedido:Refresh()
                       obrzPEDpedido:bgotfocus    = { || oPcodigoproduto:setfocus() }
                       
                       //@ 120,370 buttonbmp opedidobut06 bitmap "" left prompt "Importa produtos" textright size 060,20 font obotaof of pedido pixel
                       
                       @ 254,010 say oPtotaldeitens var mPtotaldeitens picture zmascqtdinteiro font mtahomagrande of pedido size 085,15 color corfrtsayds,corfdosay pixel right
                       @ 254,122 say oPsubotaldositens var mPsubotaldositens picture "@e 999,999,999,999.99" font mtahomagrande of pedido size 108,15 color corfrtsayds,corfdosay pixel right
                       
                       @ 251,233 radio oPdescontoacrescimo var mPdescontoacrescimo of pedido color corfrtsay,corfdosay pixel size 35,10
                       oRadio1 := TRadio():New( 251,233, '',            ;
                                              .T.,                         ;
                                              .T.,                         ;
                                              1, pedido, oPdescontoacrescimo, , , , , .F., , ;
                                              35, 10, , .F., .T. )
                       oPdescontoacrescimo:AddRadio( oRadio1 )
                       oRadio2 := TRadio():New( 251,275, '',        ;
                                              .F.               ,          ;
                                              .F.               ,          ;
                                              2, pedido, oPdescontoacrescimo, , , , , .F., , ;
                                              25, 10, , .F., .T. )
                       oPdescontoacrescimo:AddRadio( oRadio2 )
                       
                       @ 255,317 get oPvaloroupercentualdesconto var mPvaloroupercentualdesconto picture zmascvalor valid( calcula_desconto_pedido() ) font mtahoma size 55,10 of pedido color corfrtget,corfdogetnotafiscal pixel right noborder
                       @ 254,398 say oPtotaldopedido var mPtotaldopedido picture "@e 999,999,999,999.99" font mtahomagrande of pedido size 108,15 color corfrtsayds,corfdosay pixel right
    				   
                       @ 277,005 combobox oPdescricaoplanodecontas var mPdescricaoplanodecontas items mPadescricaoplanodecontas valid( grava_planocontas() ) font mtahoma size 090,100 of pedido color corfrtget,corfdogetnotafiscal pixel
                       
    				   @ 279,120 RADIO oPtipovenda VAR mPtipovenda OF pedido color corfrtsayds,corfdosay PIXEL SIZE 40,8 on change( altera_tipo_venda("PEDIDO") )
                       oradio_1 := TRadio():New( 279,099, "",         ;
                                               .T.,                          ; // sempre o primeiro elemento recebe .t.
                                               .T.,                          ; // .t. = selecionado (Checked)
                                               1, pedido, oPtipovenda, , , , , .F., , ;
                                               20, 8, , .F., .T. )
                       oPtipovenda:AddRadio( oradio_1 )
                       oradio_2 := TRadio():New( 279,130, "",       ;
                                              .F.               ,           ;
                                              .F.               ,           ;
                                              2, pedido, oPtipovenda, , , , , .F., , ;
                                              20, 8, , .F., .T. )
                       oPtipovenda:AddRadio( oradio_2 )
                       oradio_3 := TRadio():New( 279,164, "",       ;
                                              .F.               ,           ;
                                              .F.               ,           ;
                                              3, pedido, oPtipovenda, , , , , .F., , ;
                                              20, 8, , .F., .T. )
                       oPtipovenda:AddRadio( oradio_3 )
                       oradio_4 := TRadio():New( 279,190, "",       ;
                                              .F.               ,           ;
                                              .F.               ,           ;
                                              4, pedido, oPtipovenda, , , , , .F., , ;
                                              20, 8, , .F., .T. )
                       oPtipovenda:AddRadio( oradio_4 )
                       
                       
                       @ 277,246 combobox oPdescricaoformapagamento var mPdescricaoformapagamento items mPadescricaoformapagamento valid( grava_meio_a_vista() ) font mtahoma size 120,100 of pedido color corfrtget,corfdogetnotafiscal pixel
                       @ 277,385 combobox oPdescricaotipodecaixa var mPdescricaotipodecaixa items mPadescricaotipodecaixa valid( grava_caixa_a_vista() ) font mtahoma size 120,100 of pedido color corfrtget,corfdogetnotafiscal pixel
                       
    		   		   @ 293,007 BTNBMP onota01 center size 045,010 font obotaof noborder of pedido pixel action ( iif(ver_senha("000553") = .t.,notafiscal("pedido","eletronica",objetpedido,"S","N"),"") )
    				   onota01:SetFile("pedido_nfe.bmp")
    		   		   onota01:lTransparent = .t.
                       //@ 293,007 buttonbmp onota01 bitmap "pedido_nfe.bmp"        left size 045,10 font obotaof of pedido pixel action ( iif(ver_senha("000553") = .t.,notafiscal("pedido","eletronica",objetpedido,"S","N"),"") )
    					   
    		   		   @ 293,057 BTNBMP onota01a center size 045,010 font obotaof noborder of pedido pixel action ( iif(ver_senha("000553") = .t.,notafiscal("pedido","eletronica",objetpedido,"S","C"),"") )
    				   onota01a:SetFile("pedido_nfce.bmp")
    		   		   onota01a:lTransparent = .t.
                       //@ 293,057 buttonbmp onot01a bitmap "pedido_nfce.bmp"       left size 045,10 font obotaof of pedido pixel action ( iif(ver_senha("000553") = .t.,notafiscal("pedido","eletronica",objetpedido,"S","C"),"") )
    					   
    			       //if zfatnotapapeleoueletronica = 1
    				   //   onota01:disable()
    				   //   onot01a:disable()
    				   //elseif zfatnotapapeleoueletronica = 2
    				   //   onota01:enable()
    				   //   onot01a:disable()
    				   //elseif zfatnotapapeleoueletronica = 3
    				   //   onota01:disable()
    				   //   onot01a:enable()
    				   //elseif zfatnotapapeleoueletronica = 4
    				   //   onota01:enable()
    				   //   onot01a:enable()
    				   //endif
    				   
    		   		   @ 293,107 BTNBMP onota02 center size 095,010 font obotaof noborder of pedido pixel action ( cupom_fiscal("pedido") )
    				   onota02:SetFile("pedido_cupom.bmp")
    		   		   onota02:lTransparent = .t.
                       //@ 293,107 buttonbmp onota02 bitmap "pedido_cupom.bmp"      left size 095,10 font obotaof of pedido pixel action ( cupom_fiscal("pedido") )
                       
    		   		   @ 293,207 BTNBMP onota03 center size 095,010 font obotaof noborder of pedido pixel action ( nfpedido_obs() )
    				   onota03:SetFile("pedido_observacao.bmp")
    		   		   onota03:lTransparent = .t.
    				   //@ 293,207 buttonbmp onota03 bitmap "pedido_observacao.bmp" left size 095,10 font obotaof of pedido pixel action ( nfpedido_obs() )
    				   
    		   		   @ 293,307 BTNBMP onota04 center size 095,010 font obotaof noborder of pedido pixel action ( importa_produto_pedido_orcamento(objetpedido) )
    				   onota04:SetFile("pedido_importar.bmp")
    		   		   onota04:lTransparent = .t.
                       //@ 293,307 buttonbmp onota04 bitmap "pedido_importar.bmp"   left size 095,10 font obotaof of pedido pixel action ( importa_produto_pedido_orcamento(objetpedido) )
    				   
    		   		   @ 293,407 BTNBMP onota05 center size 095,010 font obotaof noborder of pedido pixel action ( junta_conta_corrente() ) 
    				   onota05:SetFile("pedido_conta.bmp")
    		   		   onota05:lTransparent = .t.
                       //@ 293,407 buttonbmp onota05 bitmap "pedido_conta.bmp"      left size 095,10 font obotaof of pedido pixel action ( junta_conta_corrente() ) 
                       
    		   		   @ 310,005 BTNBMP opedido01 center size 037,010 font obotaof noborder of pedido pixel action( iif(objetpedido = "E",rproc_pedido_entrada(),rproc_pedido_saida(objetpedido)) )
    				   opedido01:SetFile("pedido_procurar.bmp")
    		   		   opedido01:lTransparent = .t.
                       //@ 310,005 buttonbmp opedido01 bitmap "pedido_procurar.bmp" left size 037,10 font obotaof of pedido pixel      action( iif(objetpedido = "E",rproc_pedido_entrada(),rproc_pedido_saida(objetpedido)) )
    					   
                       if objetpedido = "S"
    		   		      @ 310,047 BTNBMP opedido00 center size 037,010 font obotaof noborder of pedido pixel action( listbox_clientes() )
    				      opedido00:SetFile("pedido_clientes.bmp")
    		   		      opedido00:lTransparent = .t.
                          //@ 310,047 buttonbmp opedido00 bitmap "pedido_clientes.bmp" left size 037,10 font obotaof of pedido pixel   action( listbox_clientes() )
                       elseif objetpedido = "E"
    		   		      @ 310,047 BTNBMP opedido00 center size 037,010 font obotaof noborder of pedido pixel action ( listbox_fornecedores() )
    				      opedido00:SetFile("pedido_fornecedor.bmp")
    		   		      opedido00:lTransparent = .t.
                          //@ 310,047 buttonbmp opedido00 bitmap "" left prompt "pedido_fornecedor.bmp" textright size 037,10 font obotaof of pedido pixel action ( listbox_fornecedores() )
                       endif
                       
    		   		   @ 310,089 BTNBMP opedido02 center size 037,010 font obotaof noborder of pedido pixel action( listbox_produto()  )
    				   opedido02:SetFile("pedido_produtos.bmp")
    		   		   opedido02:lTransparent = .t.
                       //@ 310,089 buttonbmp opedido02 bitmap "pedido_produtos.bmp" left size 037,10 font obotaof of pedido pixel action( listbox_produto()  )
    				   
    		   		   @ 310,131 BTNBMP opedido03 center size 037,010 font obotaof noborder of pedido pixel action( novo_pedido(objetpedido) )
    				   opedido03:SetFile("pedido_novo.bmp")
    		   		   opedido03:lTransparent = .t.
                       //@ 310,131 buttonbmp opedido03 bitmap "pedido_novo.bmp"     left size 037,10 font obotaof of pedido pixel action( novo_pedido(objetpedido) )
    				   
    		   		   @ 310,173 BTNBMP opedido04 center size 037,010 font obotaof noborder of pedido pixel action( iif(ver_senha("000552") = .t.,exclui_pedido(objetpedido),"") )
    				   opedido04:SetFile("pedido_excluir.bmp")
    		   		   opedido04:lTransparent = .t.
                       //@ 310,173 buttonbmp opedido04 bitmap "pedido_excluir.bmp"  left size 037,10 font obotaof of pedido pixel action( iif(ver_senha("000552") = .t.,exclui_pedido(objetpedido),"") )
    					   
    		   		   @ 310,215 BTNBMP opedido06 center size 037,010 font obotaof noborder of pedido pixel action( gera_boleto_nf_pedido("Ped") )
    				   opedido06:SetFile("pedido_troco.bmp")
    		   		   opedido06:lTransparent = .t.
                       //@ 310,215 buttonbmp opedido06 bitmap "pedido_troco.bmp"    left size 037,10 font obotaof of pedido pixel action( gera_boleto_nf_pedido("Ped") )
    
    		   		   @ 310,257 BTNBMP opedido05 center size 037,010 font obotaof noborder of pedido pixel action( iif(ver_senha("000551") = .t.,libera_pedido_entrada_venda(objetpedido,"PEDIDO"),"") )
    				   opedido05:SetFile("pedido_liberar.bmp")
    		   		   opedido05:lTransparent = .t.
                       //@ 310,257 buttonbmp opedido05 bitmap "pedido_liberar.bmp"  left size 037,10 font obotaof of pedido pixel action( iif(ver_senha("000551") = .t.,libera_pedido_entrada_venda(objetpedido,"PEDIDO"),"") )
    					   
    		   		   @ 310,299 BTNBMP opedido07 center size 037,010 font obotaof noborder of pedido pixel action( rel_pedido(objetpedido,"S") )
    				   opedido07:SetFile("pedido_imprimir.bmp")
    		   		   opedido07:lTransparent = .t.
                       //@ 310,299 buttonbmp opedido07 bitmap "pedido_imprimir.bmp" left size 037,10 font obotaof of pedido pixel action( rel_pedido(objetpedido,"S") )
    				   
    		   		   @ 310,341 BTNBMP opedido08 center size 037,010 font obotaof noborder of pedido pixel action( iif(ver_senha("000549") = .t.,cancela_pedido(objetpedido,mPnumerodopedido,"Pedido"),"") )
    				   opedido08:SetFile("pedido_cancelar.bmp")
    		   		   opedido08:lTransparent = .t.
                       //@ 310,341 buttonbmp opedido08 bitmap "pedido_cancelar.bmp" left size 037,10 font obotaof of pedido pixel action( iif(ver_senha("000549") = .t.,cancela_pedido(objetpedido,mPnumerodopedido,"Pedido"),"") )
    					   
    		   		   @ 310,381 BTNBMP opedido09 center size 037,010 font obotaof noborder of pedido pixel action( lanca_pedido_cts_receber(objetpedido,1) )
    				   opedido09:SetFile("pedido_receber.bmp")
    		   		   opedido09:lTransparent = .t.
                       //@ 310,381 buttonbmp opedido09 bitmap "pedido_receber.bmp"  left size 037,10 font obotaof of pedido pixel action( lanca_pedido_cts_receber(objetpedido,1) )
    				   
    		   		   @ 310,422 BTNBMP opedido10 center size 037,010 font obotaof noborder of pedido pixel action( notafiscal("pedido","manual",objetpedido) )
    				   opedido10:SetFile("pedido_manual.bmp")
    		   		   opedido10:lTransparent = .t.
                       //@ 310,422 buttonbmp opedido10 bitmap "pedido_manual.bmp"   left size 037,10 font obotaof of pedido pixel action( notafiscal("pedido","manual",objetpedido) )
    				   
    		   		   @ 310,463 BTNBMP opedido11 center size 037,010 font obotaof noborder of pedido pixel action( pedido:end() )
    				   opedido11:SetFile("pedido_sair.bmp")
    		   		   opedido11:lTransparent = .t.
                       //@ 310,463 buttonbmp opedido11 bitmap "pedido_sair.bmp"     left size 037,10 font obotaof of pedido pixel action( pedido:end() )
    				   
    				endif
    
                    pedido:bRClicked = { | nRow, nCol, nFlags | ProdObjet( nRow, nCol ) }
    
    				if objettela = "T"
    				   oPcodigoproduto:bKeyDown := {|nKey| IIf( nKey == VK_F2,rproc_produto("Touch_1"),0),;
    				   						               IIf( nKey == VK_F3,consulta_produto_aleatorio(1),0),;
                                                           IIf( nKey == VK_F4,consulta_produto_aleatorio(2),0),;
                                                           IIf( nKey == VK_F5,Calend(),0),;
    				   						               IIf( nKey == VK_F6,lanca_avulso(objetpedido),0),;
    				   						               IIf( nKey == VK_F7,tablet_listbox_clientes(),0),;
    				   						               IIf( nKey == VK_F8,lanca_produto_detalhado(),0) }
                    else
    				   oPcodigoproduto:bKeyDown := {|nKey| IIf( nKey == VK_F2,rproc_produto("Ped"),0),;
    				   						               IIf( nKey == VK_F3,consulta_produto_aleatorio(1),0),;
                                                           IIf( nKey == VK_F4,consulta_produto_aleatorio(2),0),;
                                                           IIf( nKey == VK_F5,Calend(),0),;
    				   						               IIf( nKey == VK_F6,lanca_avulso(objetpedido),0),;
    				   						               IIf( nKey == VK_F7,tablet_listbox_clientes(),0),;
    				   						               IIf( nKey == VK_F8,lanca_produto_detalhado(),0) }
                    endif					
    
                    pedido:bKeyDown          := {|nKey| IIf( nKey == VK_F3,consulta_produto_aleatorio(1),0),;
                                                        IIf( nKey == VK_F4,consulta_produto_aleatorio(2),0),;
                                                        IIf( nKey == VK_F5,Calend(),0),;
    								         		    IIf( nKey == VK_F6,lanca_avulso(objetpedido),0),;
    								         		    IIf( nKey == VK_F7,tablet_listbox_clientes(),0),;
    								         		    IIf( nKey == VK_F8,lanca_produto_detalhado(),0) }
    
    		 // no init colocar RoundRect( pedido:hWnd, 6 ), para cantos arredondados.
    		 
    		 activate dialog pedido valid sairpedido() center on init ( livra_get(10),status_radio_preco(),iif(zfatverpedidosdigitacao = .t.,mostra_digitacao_pedido(objetpedido,"E"),),novo_pedido(objetpedido) )
    	     if zfatverpedidosdigitacao = .t.
    	        mostra_digitacao_pedido(objetpedido,"S")   
    	     endif
             zwindowstelapedido = .f.
             zwindowstelabarras = .f.
    return nil

     

  4. function data_brasilia()
             LOCAL xdia_atu , xhora_atu
    		 
    		 ldate = date()
    		 
    		 //return .t.
    		 
    		 nresp = fWait(".....Processando Data.....")
    		 
    	     if IsInternet() == .f.
    		    odlgwait:end()
                return .t.
             endif
    		 
             try
               oHttp := CreateObject( "winhttp.winhttprequest.5.1" )
               oHttp:Open( "GET", "http://24timezones.com/pt_horamundial/brasilia_hora_local.php" , .F. )
               oHttp:Send()
               cHtml := oHttp:ResponseText()
             catch
    		   odlgwait:end()
               return .t.
             end
             
    		 cHora := alltrim( StrExtract( cHtml, '<span id="currentTime">', '</span>' ) )
             cHora1 := TRANSF( cHora, "99:99:99" )
                
             x_am_pm  := alltrim( substr( cHora , 10 , 2 ) )
             ntamtot  := len( cHora )
             nposmesi := rat( ',' , cHora ) + 1
             nposmesf := ( ntamtot - nposmesi ) - 4
             nposanoi := ntamtot - 3
                
             nposdiaf := rat( ',' , cHora ) - 1
             nposdiai := nposdiaf - 1
             nposdiaf := nposdiaf - nposdiai
                
             dia := alltrim( substr( cHora , nposdiai , 2        ) )
             mes := alltrim( substr( cHora , nposmesi , nposmesf ) )
             ano := alltrim( substr( cHora , nposanoi , 4        ) )
    		 
             IF x_am_pm = 'PM' .AND. ( val( substr( cHora1 , 1 , 2 ) ) < 12 )
                xhora1 := zeracod( str( val(substr( cHora1 , 1 , 2 ) ) + 12 ,2 ) )
                cHora1 := xhora1 + substr( cHora1 , 3 )
             ENDIF
          
    		 // verfica se o site trouxe o dia correto.
    		 if dia = "01" .or. dia = "02" .or. dia = "03" .or. dia = "04" .or.;
    		    dia = "05" .or. dia = "06" .or. dia = "07" .or. dia = "08" .or.;
    		    dia = "09" .or. dia = "10" .or. dia = "11" .or. dia = "12" .or.;
    		    dia = "13" .or. dia = "14" .or. dia = "15" .or. dia = "16" .or.;
    		    dia = "17" .or. dia = "18" .or. dia = "19" .or. dia = "20" .or.;
    		    dia = "21" .or. dia = "22" .or. dia = "23" .or. dia = "24" .or.;
    		    dia = "25" .or. dia = "26" .or. dia = "27" .or. dia = "28" .or.;
    		    dia = "29" .or. dia = "30" .or. dia = "31"
    		 else	
    		    odlgwait:end()
    		    return .t.
    		 endif
    		 
    		 // verifica se o site trouxe o mês correto.
    		 nqmesnum =  qmesnum( mes )
    		 if nqmesnum = "01" .or. nqmesnum = "02" .or. nqmesnum = "03" .or.;
    		    nqmesnum = "04" .or. nqmesnum = "05" .or. nqmesnum = "06" .or.;
    			nqmesnum = "07" .or. nqmesnum = "08" .or. nqmesnum = "09" .or.;
    			nqmesnum = "10" .or. nqmesnum = "11" .or. nqmesnum = "12"
    		 else   
    			odlgwait:end()
    		    return .t.
    		 endif
    			
    		 // verifica se o site trouxe o ano correto.
    		 if substr(dtos(ldate),1,4) = substr(ano,1,4)
    		 else
    		   odlgwait:end()	
    		   return .t.
    		 endif
    		 
    		 data_atual_site := dia + '.' + qmesnum( mes ) + '.' + substr(ano,3,2)
    		 
    		 xdia_atu  := date()
             xhora_atu := time()
    		 
             if data_atual_site # dtoc( xdia_atu )
    	        //xdate := "Date " + data_atual_site
                //try
                //   winexec( xdate )
                //catch
                //end
    		    odlgwait:end()
    	        msginfo( "Favor corrigir a data do seu Equipamento." + CRLF + CRLF + ;
                         "Data na Internet: " + data_atual_site + CRLF + ;
                         "Data do Equipamento: " + dtoc( xdia_atu ) , "WSISCOM SOFTWARE." )
                return .f.
             endif
    		 
             // Aqui verifica a HORA..........................
    		 
    		 //if substr( cHora1 , 1 , 4 ) # substr( xhora_atu , 1 , 4 )
    	     //   //try
             //   //   winexec( cHora1 )
             //   //catch
             //   //end
    		 //   odlgwait:end()
    	     //   msginfo( "Favor corrigir a hora do seu Equipamento." + CRLF + CRLF + ;
             //            "Hora na Internet: " + cHora1 + CRLF + ;
             //            "Hora do Equipamento: " + xhora_atu , "WSISCOM SOFTWARE." )
             //   return .f.
             //endif
    	     
    		 odlgwait:end()
    return .t.
    // -------------------------------------------------------------------------- //
    FUNCTION StrExtract( cText, cAfter, cBefore )
             LOCAL cRet := SUBSTR( cText, AT( cAfter,cText ) + LEN( cAfter ) )
             LOCAL n
             IF ( n := AT( cBefore,cRet ) ) > 0
                cRet := LEFT( cRet, n - 1 )
             ENDIF */
    RETURN ( cRet )
    // -------------------------------------------------------------------------- //
    FUNCTION ZeraCod( Cod )
    RETURN Padl( AllTrim( Cod ), Len( cod ), [0] )
    //----------------------------------------------------------------------------//
    FUNCTION qmesnum( pmes )
             LOCAL nmesnum
             IF len( alltrim( pmes ) ) < 1
                pmes := 'Janeiro'
             ENDIF
             PRIVATE Tmes := { "JANEIRO", "FEVEREIRO", "MARÇO", "ABRIL", "MAIO", "JUNHO", "JULHO", "AGOSTO", "SETEMBRO", "OUTUBRO", "NOVEMBRO", "DEZEMBRO" }
             nmesnum := ascan( tmes, Alltrim( upper(pmes ) ) )
    RETURN zeracod( str( nmesnum,2 ) )

     

  5. function BuildMenu()
    		 MENU oMenu
                  MENUITEM "&Manutenções"
                     MENU
                       //MENUITEM "teste wait"                                        action ( testewait(),ShowMenu() )
                       ///separator
    				   MENUITEM "Loja(s)"                                           action ( manutencao_lojas(),ShowMenu() )
                       separator
                       //MENUITEM "Teste"                                           action ( teste_qualquer() )
                       //separator
                       MENUITEM "Usuario e senhas"                                  action ( cad_senhas(),ShowMenu() )
                       separator
                       MENUITEM "Status de inatividade"                             action ( fninativo(),ShowMenu() )
                       separator
                       MENUITEM "Representantes"                                    action ( listbox_representantes(),ShowMenu() )
                       separator
    				   MENUITEM "Região do Cliente"                                 action ( cadastro_de_regiao(),ShowMenu() )
                       separator
                       MENUITEM "Clientes"                                          action ( listbox_clientes(),ShowMenu() )
                       separator
                       MENUITEM "Fornecedores"                                      action ( listbox_fornecedores(),ShowMenu() )
                       MENUITEM "Transportadoras"                                   action ( listbox_transportadoras(),ShowMenu() )
                       separator
                       MENUITEM "Linha da fábrica"
                         MENU 
                           MENUITEM "Detalhes da produção"                          action ( detalhe(),ShowMenu() )
                         ENDMENU
    				   separator
                       MENUITEM "Unidades"                                          action ( listbox_unidade("sim"),ShowMenu() )
                       separator
                       MENUITEM "Marca(s)"                                          action ( esmarca(),ShowMenu() )
                       separator                                                         
                       MENUITEM "Grupo de Produtos"                                 action ( listbox_grupo("sim"),ShowMenu() )
                       MENUITEM "Subgrupo de Produtos"                              action ( listbox_subgrupo("sim"),ShowMenu() )
                       MENUITEM "Gênero de Produtos"                                action ( listbox_genero("sim"),ShowMenu() )
                       separator
                       MENUITEM "Produto"                                           action ( listbox_produto(),ShowMenu() )
                       separator
                       MENUITEM "Tipos de movimento"                                action ( listbox_tipomovimento("sim"),ShowMenu() )
                       separator
                       MENUITEM "CTRC"                                              action( ctrc(),ShowMenu() )
                       separator
                       //MENUITEM "Conta de energia"                                  action( energia(),ShowMenu() )
                       //separator
                       //MENUITEM "Conta de telefone"                                 action( contafone(),ShowMenu() )
                       //separator
                       MENUITEM "Sped Fiscal"                                       action ( spedfiscal(),ShowMenu() )
                       separator
                       MENUITEM "Sintegra"                                          action ( fazsintegra(),ShowMenu() )
                       separator
                       MENUITEM "Entrada Imediata"                                  action ( acertoen("E"),ShowMenu() )
                       separator
                       MENUITEM "Saída   Imediata"                                  action ( acertoen("S"),ShowMenu() )
                       separator
    				   MENUITEM "Transformação"                                     action ( transformacao("R"),ShowMenu() )
    				   separator
                       MENUITEM "Modelagem de produtos"                             action ( modelagem(),ShowMenu() )
                       separator
                       MENUITEM "Transferência de produtos"                         action ( transferencia("T"),ShowMenu() )
                       //separator
                       //MENUITEM "Titulo provisorio do menu"
                       separator
                       MENUITEM "Sair"                                              action (janela_principal:end())
                     ENDMENU
                  MENUITEM "M&ovimentações"
                     MENU
                       //MENUITEM "Envia E-mail com HTML"      name "bmpICON31"       action ( envia_email() )
                       //separator
                       MENUITEM "Lançamento de nota fiscal de entrada"              action ( entrada_nf(),ShowMenu() )
                       separator
                       MENUITEM "Entrada por pedido"                                action ( entrada_pd(),ShowMenu() )
                       separator
                       MENUITEM "Orçamentos"                                        action ( orcamento("S"),ShowMenu() )
                       separator
                       MENUITEM "Emissão de pedidos"                                action ( pedido("S","P"),ShowMenu() )
                       separator
                       MENUITEM "Venda expresso"                                    action ( pedido("S","T"),ShowMenu() )
                       separator
    				   MENUITEM "Acompanha produção"                                action ( acompanha_producao_isopor(),ShowMenu() )
    				   separator
                       MENUITEM "Emite nota fiscal de entrada"                      action ( emite_nf_pedido("S","P"),ShowMenu() )
                       separator
                       MENUITEM "Gera o inventário"                                 action ( inventario_fisico(1,1),ShowMenu() )
                       separator
                       MENUITEM "Inventário"                                        action ( inventario(),ShowMenu() )
                       separator
                       MENUITEM "Administração de compras"                          action ( adm_compras("S","P"),ShowMenu() )
                       //separator
                       //MENUITEM "Entrada de pedidos"                              action ( pedido("E"),ShowMenu() )
                       separator
                       MENUITEM "Venda consignado"                                  action ( venda_consignado(),ShowMenu() )
                       separator
                       MENUITEM "Manutenção de Agenda/Atendimento"                  action ( atendimento(),ShowMenu() )
    				   separator
                       MENUITEM "Lança credito/debito para clientes"                action ( ver_credito_debito(),ShowMenu() )
                       separator
                       MENUITEM "Acertos"                                           action ( acerto(),ShowMenu() )
                       separator
                       MENUITEM "Relatório para conferência de acertos"             action ( corrente(),ShowMenu() )
                       separator
                       MENUITEM "Movimentação de cheques"                           action ( cheques("P"),ShowMenu() )
                       separator
                       MENUITEM "Movimentação de cheques BAIXADOS"                  action ( cheques("B"),ShowMenu() )
                       separator
    				   MENUITEM "Reserva de produtos"                               action ( reservacli("S"),ShowMenu() )
                       separator
    				   MENUITEM "Lançamento de promoções"                           action ( promocao("E"),ShowMenu() )
                       separator
    				   MENUITEM "Cidades exclusivas para não vender"                action ( exclusivo_cid(),ShowMenu() )
                       //separator
                       //MENUITEM "Titulo provisorio do menu"
                       //separator
                       //MENUITEM "Titulo provisorio do menu"
                       //separator
                       //MENUITEM "Titulo provisorio do menu"
                       //separator
                       //MENUITEM "Titulo provisorio do menu"
                       //separator
                       //MENUITEM "Titulo provisorio do menu"
                       //separator
                       //MENUITEM "Titulo provisorio do menu"
                       //separator
                       //MENUITEM "Titulo provisorio do menu"
                       //separator
                       //MENUITEM "Titulo provisorio do menu"
                       //separator
                       //MENUITEM "Titulo provisorio do menu"
                       //separator
                       //MENUITEM "Titulo provisorio do menu"
                       //separator
                       //MENUITEM "Titulo provisorio do menu"
                       //separator
                       //MENUITEM "Titulo provisorio do menu"
                       //separator
                       //MENUITEM "Titulo provisorio do menu"
                       //separator
                       //MENUITEM "Titulo provisorio do menu"
                       //separator
                       //MENUITEM "Titulo provisorio do menu"
                       //separator
                       //MENUITEM "Titulo provisorio do menu"
                     ENDMENU
                  MENUITEM "&Faturamento"
                     MENU
                       MENUITEM "UF - Estados"                                           action ( listbox_uf(),ShowMenu()    )
                       separator
                       MENUITEM "CST/CSOSN - Código da situação tributária"              action ( listbox_cst(),ShowMenu()   )
                       separator
                       MENUITEM "NCM - Nomenclatura Comum ao Mercosul"                   action ( listbox_ncm(),ShowMenu()   )
                       separator
                       MENUITEM "CEST - Código Especificador da Substituição Tributária" action ( listbox_cest(),ShowMenu()   )
                       separator
                       //MENUITEM "CSOSN - Código de Operação no Simples Nacional"       action ( listbox_csosn(),ShowMenu() )
                       //separator
                       MENUITEM "CFOP - Código Fiscal de Operação"                       action ( listbox_cfop(),ShowMenu()  )
                       separator
    				   MENUITEM "Altera dados fiscais dos produtos"                      action ( altera_dados_fiscais(),ShowMenu()  )
    				   separator
                       MENUITEM "Tipos de operacões fiscais."                            action ( listbox_operacao(),ShowMenu() )
                       separator
                       MENUITEM "Contigência da NOTA FISCAL ELETRÔNICA"                  action (altera_emissao("N"),ShowMenu() )
                       separator
                       MENUITEM "Contigência da NOTA FISCAL CONSUMIDOR ELETRÔNICA"       action (altera_emissao("C"),ShowMenu() )
                       separator
                       MENUITEM "Gerencia Nota fiscal Eletronica (NF-e)"                 action ( gerenciador_notafiscal("","N","N",""),ShowMenu()  )
                       separator
                       MENUITEM "Gerencia Nota fiscal Eletronica (NFC-e)"                action ( gerenciador_notafiscal("","N","C",""),ShowMenu()  )
                     ENDMENU
                  MENUITEM "&Central de análise"                                         action ( analise_loja(),ShowMenu()  )
    			  //MENUITEM "&Integração aplicativos externos"
                  //   MENU
    			  //	   MENUITEM "Impressora fiscal SALC"
    			  //	      MENU
    			  //	         MENUITEM "SALC | Cadastro de ECF"                           action ( listbox_ecf(),ShowMenu() )
                  //           separator
                  //           MENUITEM "SALC | Aliquota impressora fiscal"                action ( listbox_aliq(),ShowMenu() )
                  //           separator
                  //           MENUITEM "SALC | Meios de pagamento"                        action ( listbox_meiospagamentos(),ShowMenu() )
                  //           separator
                  //           MENUITEM "SALC | Processa retorno de cupom fiscal"          action ( processa_retorno_cupom(1),ShowMenu() )
    			  //	      ENDMENU
    			  //	   //separator
    			  //	   //MENUITEM "Palmtops ACC Informática"
    			  //	   //   MENU
    			  //	   //      MENUITEM "ACC | Exporta arquivos para palmtop"             action ( exporta_palm_acc(),ShowMenu() )
                  //     //      separator
                  //     //      MENUITEM "ACC | Importa arquivos do palmtop"               action ( importa_palm_acc(),ShowMenu() )
    			  //	   //   ENDMENU
                  //   ENDMENU
                  MENUITEM "Fi&nanceiro"
                     MENU
                       MENUITEM "Moedas"                                            action ( listbox_moedas(),ShowMenu() )
                       separator
                       //MENUITEM "Cotação de moedas via Internet"                    action ( cotacao(),ShowMenu() )
                       //separator
                       MENUITEM "Plano de contas"                                   action ( listbox_plano_de_contas(),ShowMenu() )
                       separator
                       MENUITEM "Meios de pagamento"                                action ( listbox_meiospagamentos(),ShowMenu() )
                       separator
                       MENUITEM "Formas de pagamento"                               action ( listbox_condicoespagamentos(),ShowMenu() )
                       separator
                       MENUITEM "Contas a receber"                                  action ( receber("R"),ShowMenu() )
                       separator
                       MENUITEM "Boleto bancário"                                   action ( boletobc(),ShowMenu() )
                       separator
                       MENUITEM "Contas a pagar"                                    action ( receber("P"),ShowMenu() )
                       separator
                       MENUITEM "Cadastro de caixa"                                 action ( listbox_caixas(),ShowMenu() )
                       separator
                       MENUITEM "Movimento de caixa"                                action ( movcaixa(),ShowMenu() )
                       separator
                       MENUITEM "Fluxo de caixa"                                    action ( fluxodecaixa(),ShowMenu() )
    				   separator
                       MENUITEM "Movimentação de cheques"                           action ( cheques("P"),ShowMenu() )
                       separator
                       MENUITEM "Movimentação de cheques BAIXADOS"                  action ( cheques("B"),ShowMenu() )
                     ENDMENU
                  //MENUITEM "&Banco"
                  //MENUITEM "Converter sysaut para rw"                             action ( converte_sysaut_rw() )
                  //MENUITEM "Importa arquivo"                                      action ( teste() )   // arrasta arquivo para tela
                  MENUITEM "&Relatórios"
                     MENU
                       MENUITEM "Clientes"                                          action ( relato_clientes(),ShowMenu() )
                       separator
                       MENUITEM "Clientes que deixaram de comprar"                  action ( relato_clientes_que_nao_compram(),ShowMenu() )
                       separator
                       MENUITEM "Vendas no período"                                 action ( relato_vendas_periodo_scusto(),ShowMenu() )
                       separator
                       //MENUITEM "Vendas no período com custo"                     action ( relato_vendas_periodo_custo(),ShowMenu() )
                       //separator
                       //MENUITEM "Vendas por produto"                              action ( relato_vendas_por_produto(),ShowMenu() )
                       //separator
    				   MENUITEM "Vendas por Item"                                   action (relato_vendas_item(),ShowMenu())
    				   separator
                       MENUITEM "Estoque custo Unitario"                            action ( inventario_fisico(1,2),ShowMenu() )
                       separator
                       MENUITEM "Estoque custo Total"                               action ( inventario_fisico(2,2),ShowMenu() )
                       separator
    				   MENUITEM "Relatório de produtos com NCM em branco"           action ( ncm_em_branco(),ShowMenu() )
    				   separator
    				   MENUITEM "Relatório de produtos por NCM"                     action ( relato_ncm(),ShowMenu() )
    				   separator
    				   MENUITEM "Relatório de produtos por CST/CSOSN"               action ( relato_cst(),ShowMenu() )
    				   separator
    				   MENUITEM "Relatório de produtos por fornecedor"              action ( produto_fornecedor(),ShowMenu() )
    				   separator
                       MENUITEM "Listagem de preço"                                 action ( listagem_de_preco(),ShowMenu() )
                       separator
                       MENUITEM "Notas fiscais emitidas"                            action ( notas_emitidas(),ShowMenu() )
                       separator
                       MENUITEM "Notas fiscais entradas"                            action ( notas_entradas(),ShowMenu() )
                       separator
                       MENUITEM "Resumo fiscal"                                     action ( resumo_fiscal(),ShowMenu() )
                       separator
                       MENUITEM "DRE"                                               action ( dre(),ShowMenu() )
                       separator
                       MENUITEM "Vendas/Grupos de mercadorias"                      action ( vendasgrupos(),ShowMenu() )
                       separator
                       MENUITEM "Lucros e prejuizos no período"                     action ( lucrosprejuizos(),ShowMenu() )
                       separator
                       MENUITEM "Curva ABC"                                         action ( curvaabc(),ShowMenu() )
                       separator
                       MENUITEM "Relatório de sugestão de compra"                   action ( sugestao_de_compra(),ShowMenu() )
                       separator
                       MENUITEM "Contas a pagar"
                          MENU
                            menuitem "Títulos em aberto"                         action ( relaberto("B"),ShowMenu() )
                            separator
                            menuitem "Títulos Pagos"                             action ( relaberto("Q"),ShowMenu() )
                            separator
                            menuitem "Lista plano de contas"                     action ( relplanoc("P"),ShowMenu() )
                          ENDMENU
                       separator
                       MENUITEM "Contas a receber"
                          MENU
                            menuitem "Títulos em aberto"                         action ( relabertoReceber("B"),ShowMenu() )
                            separator
                            menuitem "Títulos recebidos"                         action ( relabertoReceber("Q"),ShowMenu() )
                            separator
                            menuitem "Lista plano de contas"                     action ( relplanoc("R"),ShowMenu() )
                          ENDMENU
                       separator
                       MENUITEM "Relatório para conferência de acertos"          action ( corrente(),ShowMenu() )
                     ENDMENU
                 // MENUITEM "Rádio e TV"
                 //    MENU
                 //     MENUITEM "Rádio (Jovempan Campinas)"   ACTION MostrarWMP( "http://www.dnip.com.br/link/jovempancampinas.wmx", "Radio Jovem Pan (Campinas)" )
                 //     MENUITEM "Rádio (Globo Gov.Valadares)" ACTION MostrarWMP( "http://www.dnip.com.br/link/globogv64k.wmx", "Radio Globo (Gov.Valadares)" )
                 //     MENUITEM "Rádio (Tempo FM)"            ACTION MostrarWMP( "http://www.tempofm.com.br/tempofm3.asx", "Radio Tempo FM" )
                 //     MENUITEM "Rádio (O Povo AM)"           ACTION MostrarWMP( "mms://srv2.zoeweb.tv/zoenet-14", "Radio O Povo AM" )
                 //     MENUITEM "Rádio (Calypso FM)"          ACTION MostrarWMP( "mms://zoeweb.tv/zoenet-15", "Radio Calypso FM" )
                 //     MENUITEM "Rádio (Canção Nova)"         ACTION MostrarWMP( "http://www.cancaonova.com/radiofm.asx", "Radio Canção Nova" )
                 //     SEPARATOR
                 //     MENUITEM "Tv Canção Nova"  ACTION MostrarWMP( "http://www.cancaonova.com/tvcn.asx", "TV Canção Nova" )
                 //     MENUITEM "Tv Rede Vida"    ACTION MostrarWMP( "mms://wmedia.telium.com.br/redevida", "TV Rede Vida" )
                 //     MENUITEM "Tv Novo Tempo"   ACTION MostrarWMP( "http://ntmc.novotempo.org.br/tvnovotempo-vivo.asx", "TV Novo Tempo" )
                 //     MENUITEM "Tv Rede Brasil"  ACTION MostrarWMP( "mms://rbtv.interrogacaodigital.net/rbtv", "TV Rede Brasil" )
                 //     MENUITEM "Tv Cultura"      ACTION MostrarWMP( "mms://streaming.net2.com.br/tvcultura", "TV Cultura" )
                 //     MENUITEM "Tv Escola"       ACTION MostrarWMP( "mms://refletor.mec.gov.br/tvescola", "TV Escola" )
                 //     MENUITEM "Tv Jangadeiro (SBT)"  ACTION MostrarWMP( "mms://201.12.119.29/tvjangadeiro", "TV Jangadeiro (SBT)" )
                 //    ENDMENU
                  MENUITEM "Administração do site"
    			  MENUITEM "&Troca de empresa"                                       action ( listbox_lojas(),testsenha() )
                  MENUITEM "&Alterna a senha "                                       action ( testsenha() )
             ENDMENU
    return oMenu
    
    
    #define KEYEVENTF_KEYUP 2
    //----------------------------------------------------------------------------//
    Function ShowMenu( oM, nNiv )
                            
        Local cMv
        Local nChr
        Local nItem
        Local oLItM
        Local cMov := ""
        
        Default oM   := WndMain():oMenu
        Default nNiv :=0
        oLItM := oM : LastItem()
        For nItem := 1 to Len( oM : aItems )
            If( ValType( oM : aItems[ nItem ] : bAction ) == 'O' )
                cMv := ShowMenu( oM : aItems[ nItem ] : bAction, nNiv + 1 )
                If( Right( cMv, 1 ) == "x" )
                    cMov += Chr( If( nNiv =0, VK_DOWN, VK_RIGHT ) ) + cMv
                    If( nNiv == 0 )
                        cMov := Left( cMov, Len( cMov ) - 1 )
                        keybd_event( VK_MENU, 0, 0, 0 )
                        keybd_event( VK_MENU, 0, KEYEVENTF_KEYUP, 0 )
                        For nChr := 1 to Len( cMov )
                            keybd_event( Asc( SubStr( cMov, nChr, 1 ) ), 0, 0, 0 )
                            keybd_event( Asc( SubStr( cMov, nChr, 1 ) ), 0, KEYEVENTF_KEYUP, 0 )
                        Next i
                        Return( .t. )
                    End
                    Return cMov
                End
            Else
                If( oM : aItems[ nItem ] : nId == oLItM : nId )
                    Return cMov + "x"
                End
            End
            If( !Empt( oM : aItems[ nItem ] : cPrompt ) ) // se não for um separador
                cMov +=Chr( If( nNiv == 0, VK_RIGHT, VK_DOWN ) )
            End
        Next nItem
     
    Return if( nNiv ==0, .f., "" )
        
    DLL32 FUNCTION keybd_event ( bVk as _INT,bScan as _INT, dwFlags as LONG, dwExtraInfo as LONG ) AS LONG ;
          PASCAL LIB "user32.dll"

     

  6. Bom dia,

    Eu uso assim para POSTGRESQL e LISTBOX, se servir de consulta para ajudar. 

    #include "FiveWin.ch"
    #include "common.ch"
    #include "postgres.ch"
    
    #define btn_width  12
    #define btn_height 10
    
    function listbox_clientes()
             local lobjet
             private salvavarPesCli := "A"
             private opimcli
    		 
             corfrtsay      = rgb(000,000,000)   // cor de frente para o say
    		 corfdosay      = rgb(245,235,223)   // cor de fundo para o say
             corfrtget      = rgb(064,078,089)   // cor de frente para a edi‡Æo dos campos
             corfdoget      = rgb(255,255,255)   // cor de fundo para a edi‡Æo dos campos
             corfdojan      = rgb(245,235,223)
             corlstbxnormal = rgb(255,255,255)
             corlstbxdifere = rgb(228,218,191)
             define brush obrush COLOR corfdojan
             define font mtahomapesquisaproduto name 'Tahoma' size 07,19/
    		 
             define dialog listbox_clientes title "Clientes" from 000,000 to 620,1020 pixel brush obrush //transparent //STYLE nOr( WS_BORDER, WS_POPUP, WS_VISIBLE )
    
                    @ 0.1,0.3 to 1.5,72.7  label "" of listbox_clientes color corfrtsay,corfdosay
                    @ 1.7,0.3 to 19.9,72.7 label "" of listbox_clientes color corfrtsay,corfdosay
                    @ 20,0.3  to 22,72.7   label "" of listbox_clientes color corfrtsay,corfdosay
    				
                    asamplzclientes  = {""}
                    arecclientes     = {}
                    atipoclientes    = {"Nome","Codigo","Fantasia","Parte do nome","CNPJ","CPF","Cidade","Estado","E-mail"}
                    mtipoclientes    = "Nome"
                    mpesquisacliente = space(50)
    				
                    @ 007,101 get opesquisacliente var mpesquisacliente picture "@!" font mtahoma size 405,12 of listbox_clientes color corfrtget,corfdoget pixel
                    @ 009,005 say "Pesquisar por: " of listbox_clientes font mtahoma size 050,9 color corfrtsay,corfdosay pixel
                    @ 029.5,005 listbox obrzclientes fields asamplzclientes[obrzclientes:nat,1],asamplzclientes[obrzclientes:nat,2],;
                                asamplzclientes[obrzclientes:nat,3],asamplzclientes[obrzclientes:nat,4],asamplzclientes[obrzclientes:nat,5],;
                                asamplzclientes[obrzclientes:nat,6],asamplzclientes[obrzclientes:nat,7];
                                headers "Codigo","Cliente","Fantasia","CNPJ/CPF","Cidade","Estado","Estado" FIELDSIZES 050,305,210,150,160,050,045;
                                size 500,247 on dblclick( manutencao_clientes() ) ;
                                pixel of listbox_clientes font mtahomapesquisaproduto
    
                    obrzclientes:nClrPane      := {|| iif(asamplzclientes[obrzclientes:nat,7] = 'Ativo',corlstbxnormal,iif(empty(asamplzclientes[obrzclientes:nat,7]),corlstbxnormal,corlstbxdifere)) }
                    obrzclientes:nLineStyle := 2
                    obrzclientes:lCellStyle = .f.
                    obrzclientes:lAutoSkip  = .t.
                    obrzclientes:SetArray(asamplzclientes)
                    obrzclientes:bGoTop = { || obrzclientes:nat := 1 }
                    obrzclientes:bGoBottom = { || obrzclientes:nat := Eval( obrzclientes:bLogicLen ) }
                    obrzclientes:bSkip = { | nWant, nOld | nOld := obrzclientes:nat, obrzclientes:nat += nWant,;
                    obrzclientes:nat := Max( 1, Min( obrzclientes:nat, Eval( obrzclientes:bLogicLen ) ) ),;
                    obrzclientes:nat - nOld }
                    obrzclientes:bLogicLen = { || Len( asamplzclientes ) }
                    obrzclientes:cAlias = "Array"
                    obrzclientes:nColAct       := 1
                    obrzclientes:lMChange      := .F.
                    obrzclientes:SetFocus()
                    obrzclientes:Refresh()
                    @ 007,050 combobox otipoclientes var mtipoclientes items atipoclientes font mtahoma size 050,90 of listbox_clientes color corfrtget,corfdoget pixel
    
    
                    @ 287,012 BTNBMP olisclibut00 left size 045,19 font obotaof noborder resource "geral_novo"    of listbox_clientes pixel
    				@ 287,060 BTNBMP olisclibut01 left size 045,19 font obotaof noborder resource "geral_alterar" of listbox_clientes pixel
    				@ 287,460 BTNBMP olisclibut10 left size 045,19 font obotaof noborder resource "geral_sair"    of listbox_clientes pixel action ( listbox_clientes:end() )
    
             activate dialog listbox_clientes center on init pesquisa_cliente()
             salvavarPesCli := "A"
             opimcli:end()
    return nil
    function pesquisa_cliente()
             define timer opimcli interval 70 action psq_cliente()
             activate timer opimcli
    return nil
    function psq_cliente()
             if salvavarPesCli <> opesquisacliente:cText
                salvavarPesCli := opesquisacliente:cText
                enche_cliente()
             endif
    return nil
    function enche_cliente()
             if empty(opesquisacliente:cText)
                 asamplzclientes  = {""}
                 arecclientes     = {}
                 obrzclientes:SetArray(asamplzclientes)
                 obrzclientes:refresh()
                return .t.
             endif
             asamplzclientes  = {}
             arecclientes     = {}
             if mtipoclientes = "Nome"
                    cquery := "select * from fncliente where " +;
                              "substr(razaosocial,1"+","+alltrim(str(len(alltrim(opesquisacliente:cText))))+")"+;
                              " = " + "'"+alltrim(opesquisacliente:cText)+"'" +;
                              " order by razaosocial asc;"
             elseif mtipoclientes = "Codigo"
                    cquery := "select * from fncliente where " +;
                              "seqcliente = " + alltrim(opesquisacliente:cText) +;
                              " order by seqcliente asc;"
             elseif mtipoclientes = "Fantasia"
                    cquery := "select * from fncliente where " +;
                              "substr(fantasia,1"+","+alltrim(str(len(alltrim(opesquisacliente:cText))))+")"+;
                              " = " + "'"+alltrim(opesquisacliente:cText)+"'" +;
                              " order by fantasia asc;"
             elseif mtipoclientes = "Parte do nome"
                    cquery := "select * from fncliente where " +;
                              "razaosocial like " + "'%"+alltrim(opesquisacliente:cText)+"%'"+;
                              " order by razaosocial asc;"
             elseif mtipoclientes = "CNPJ"
                    cquery := "select * from fncliente where " +;
                              "substr(numerodocumentonacional,1"+","+alltrim(str(len(alltrim(opesquisacliente:cText))))+")"+;
                              " = " + "'"+alltrim(opesquisacliente:cText)+"'" +;
                              " and pessoafisicajuridica = 'J'"+;
                              " order by numerodocumentonacional asc;"
             elseif mtipoclientes = "CPF"
                    cquery := "select * from fncliente where " +;
                              "substr(numerodocumentonacional,1"+","+alltrim(str(len(alltrim(opesquisacliente:cText))))+")"+;
                              " = " + "'"+alltrim(opesquisacliente:cText)+"'" +;
                              " and pessoafisicajuridica = 'F'"+;
                              " order by numerodocumentonacional asc;"
             elseif mtipoclientes = "Cidade"
                    cquery := "select * from fncliente where " +;
                              "substr(cidadeibge,1"+","+alltrim(str(len(alltrim(opesquisacliente:cText))))+")"+;
                              " = " + "'"+alltrim(opesquisacliente:cText)+"'" +;
                              " order by cidadeibge asc, razaosocial asc;"
             elseif mtipoclientes = "Estado"
                    cquery := "select * from fncliente where " +;
                              "substr(uf,1"+","+alltrim(str(len(alltrim(opesquisacliente:cText))))+")"+;
                              " = " + "'"+alltrim(opesquisacliente:cText)+"'" +;
                              " order by uf asc, razaosocial asc;"
             elseif mtipoclientes = "E-mail"
                    cquery := "select * from fncliente where " +;
                              "email like " + "'%"+alltrim(opesquisacliente:cText)+"%'"+;
                              " order by razaosocial asc;"
             endif
             oquery := oServer:Query(cquery)
             DO WHILE ! oquery:Eof()
                a = oquery:Fieldget(oquery:Fieldpos('seqcliente'))
                b = oquery:Fieldget(oquery:Fieldpos('razaosocial'))
                fantasia = oquery:Fieldget(oquery:Fieldpos('fantasia'))
                c = oquery:Fieldget(oquery:Fieldpos('pessoafisicajuridica'))
                d = oquery:Fieldget(oquery:Fieldpos('numerodocumentonacional'))
                e = oquery:Fieldget(oquery:Fieldpos('cidadeibge'))
                f = oquery:Fieldget(oquery:Fieldpos('uf'))
                ativo = oquery:Fieldget(oquery:Fieldpos('ativo'))
                g = oquery:Fieldget(oquery:Fieldpos('email'))
                if !empty(a)
                   aadd( asamplzclientes,{alltrim(str(a)),b,fantasia,iif(c = "J",transform(d,"@r 99.999.999/9999-99"),transform(d,"@r 999.999.999-99")),;
                                          e,f,iif( ativo = .t.,"Ativo","Inativo" ) } )
                   aadd( arecclientes,a )
                   if !empty(g)		   
                      aadd( asamplzclientes,{"",g,"","",;
                                             "","","" } )
                      aadd( arecclientes,a )
    			   endif
    		   
                endif
                oquery:Skip()
             END
             oquery:destroy()
             if empty( asamplzclientes )
                 asamplzclientes  = {""}
                 arecclientes     = {}
             endif
             obrzclientes:SetArray(asamplzclientes)
             obrzclientes:refresh()
    return nil
    
    function manutencao_clientes()
             if empty(arecclientes)
                msgStop("Escolha um cliente.","ATENÇÃO")
                return nil
             endif
             mseqcliente = arecclientes[obrzclientes:nat]
    
             cquery := "select * from fncliente where "+;
                       "seqcliente = " + alltrim(str(mseqcliente)) + " order by seqcliente asc;"
             oquery := oServer:Query(cquery)
             mpessoafisicajuridica      = oquery:Fieldget(oquery:Fieldpos('pessoafisicajuridica'))
    		 
    		 // restante dos dados...
    		 
    		 oquery:destroy()
    return nil

     

  7. #include "fivewin.ch"
    #include "xbrowse.ch"
    
    
    #require "hbpgsql"
    
    #include "DbStruct.ch"
    
    REQUEST DBFNTX
    REQUEST DBFCDX
    REQUEST DBFFPT
    REQUEST DBFDBT
    
    
    static aData,oBrwData
    
    
    PROCEDURE Main( cHost, cDatabase, cUser, cPass )
    
       LOCAL oServer, oQuery, oRow, i, x, aTables, aStruct
    
       LOCAL cQuery, lAppend, cFileOrig, cFileDEST
       
       cHost     := "localhost"
       cDatabase := "mydata"
       cUser     := "postgres"
       cPass     := "mypass"
       
       
       oServer := TPQServer():New( cHost, cDatabase, cUser, cPass )
    
       IF oServer:NetErr()
          ?"Query 1 : "+oServer:ErrorMsg()
          QUIT
       ENDIF
    
       oServer:SetVerbosity( 2 )
       oServer:traceon( "simple.log" )
       
       
       cFileORIG := "customer.dbf"
       cFileDEST := "mst_customer"  
       lAppend := .t.
       if !oServer:TableExists( cFileDEST )
       
                 ConvertToSQL(cFileORIG,cFileDEST,lAppend,oServer)
                 
                 CreateIndexSQL('mst_customer', 'recno_key', 'recno_key',oServer)
                 
                 CreateIndexSQL('mst_customer', 'first', 'first',oServer)
                 
                 CreateIndexSQL('mst_customer', 'city', 'city',oServer)
                 
                 CreateIndexSQL('mst_customer', 'first_city', 'first, city',oServer)
         
         endif
           
         BrowseData(oServer)
       
       oServer:Destroy()
       
    return nil  
       
       
    
    static function ConvertToSQL(cFileORIG,cFileDEST,lAppend,oServer)
    
       local cComm, apCode, cOut
       local nErr, nPos
       LOCAL vEmp := {}
       Local nCnn, s,oSql
       local aReturn := {}
       local aReturnX := {}
       cFileORIG  := lower(alltrim(cFileORIG))
       cFileDEST  := lower(alltrim(cFileDEST))
    
       define dialog oDlgStock from 1,1 to 40,400 pixel style nOR( WS_CAPTION ) title "Tunggu Sebentar"
       activate dialog oDlgStock centered nowait
       
       oDlgStock:cTitle := cFileDEST
       SysRefresh()
    
       dbCloseAll()
       cSql := "DROP TABLE IF EXISTS "+cFileDEST
       oQuery := oServer:Execute( cSql )
         
          IF oQuery:NetErr()
                  ? "Query 2 : "+oQuery:ErrorMsg()
                  QUIT
               ENDIF
               
           oQuery:Destroy()
         
       
    
       dbCloseAll()
       use (cFileORIG) new shared alias orig
    
     
     
      aStruct := orig->(DbStruct())
     
      cField := ""
     
      for i := 1 to len(aStruct)
         cFieldName := alltrim(aStruct[i][DBS_NAME])
         if lower(cFieldName) == "index"
             cFieldName := "XINDEX"
         endif
         cType      := aStruct[i][DBS_TYPE]
         cLen       := alltrim(Str( aStruct[i][DBS_LEN ],  3 ))
         cDec       := alltrim(Str( aStruct[i][DBS_DEC ],  3 ))
         cOke := ""
         
         
         if cType == "C"
            cOke := "  "+cFieldName+" CHAR ("+cLen+") , "
         endif
         
         if cType == "M"
            cOke := "  "+cFieldName+" CHAR (150) , "
         endif
         
         if cType == "N"
            if val(cDec) == 0
               cOke := "  "+cFieldName+" NUMERIC ( "+cLen+", 0) , "
            else
               cOke := "  "+cFieldName+" NUMERIC ( "+cLen+", 2) , "
            endif
         endif
         
         if cType == "D"
            cOke := "  "+cFieldName+" DATE, "
         endif
         
         if cType == "L"
            cOke := "  "+cFieldName+" BOOLEAN, "
         endif
         cField += cOke
      next
     
      cField := upper(cField)
    
       cSql := "CREATE TABLE "+cFileDEST+" ( recno_key    serial primary key, "
       
       
       cSQL += cField
       cSQL += " edited_date DATE, edited_time CHAR(8) "
       
       
         cSQL += " );"
       
       
       
            ?cSql
       
       
       
            oQuery := oServer:Execute( cSql )
           
         
          IF oQuery:NetErr()
                  ? "Query 3 : "+oQuery:ErrorMsg()
                  QUIT
               ENDIF
               
           oQuery:Destroy()
            
       
       
    
    if lAppend
       dbCloseAll()
       use (cFileORIG) new shared alias orig
       
               nMulai  := 0
               nPersen := 0
               nRecord := orig->(lastrec())
               
               
               orig->(dbGotop())  
               do while !orig->(eof())
               
                  ++nMulai
                  nPersen := ( nMulai / nRecord ) * 100
                  oDlgStock:cTitle := cFileDEST +" "+str(nMulai,12)+"/"+str(nRecord,12)+"="+str(nPersen,12)+"%"
                  SysRefresh()
                  cFieldJalan := alltrim(orig->(FieldName(1)))
                  cDatanya := orig->&cFieldJalan
                  if valtype(cDatanya) == "N"
                     cDatanya := alltrim(str(cDatanya,14,2))
                  else
                     cDatanya := "'"+upper(alltrim(cDatanya))+"'"
                  endif
                 
                  cSQL := "INSERT INTO "+alltrim(cFileDEST)+" ( "+cFieldJalan+" ) VALUES (  "+cDatanya+"  )"
                 
                  oQuery := oServer:Execute( cSql )
         
                  IF oQuery:NetErr()
                     ? "Query 4 : "+oQuery:ErrorMsg()
                     QUIT
                  ENDIF
               
             oQuery:Destroy()
             
             for x := 2 to orig->(fcount())
                         cFieldJalan := alltrim(orig->(FieldName(x)))
                         cDatanya := orig->&cFieldJalan
                         
                              if valtype(cDatanya) == "N"
                             cDatanya := alltrim(str(cDatanya,14,2))
                          endif
                         
                          if valtype(cDatanya) == "D"
                             cTahun   := strzero(year(cDatanya),4)
                             cBulan   := strzero(month(cDatanya),2)
                             cTgl     := strzero(day(cDatanya),2)
                             cDatanya := cTahun+"-"+cBulan+"-"+cTgl
                          endif
                         
                          if valtype(cDatanya) == "L"
                             if cDatanya
                                cDatanya := "1"
                             else
                                cDatanya := "0"  
                             endif
                          endif
                             
                          if valtype(cDatanya) == "C"
                             cChar := ""
                             for xx := 1 to len(cDatanya)
                                cOke := subs(cDatanya,xx,1)
                                if cOke == "'"
                                   cOke := ""
                                endif
                                cChar += cOke
                             next
                             cDatanya := "'"+upper(alltrim(cChar))+"'"
                          endif
                         
                          if valtype(cDatanya) == "M"
                             cDatanya := "'"+upper(alltrim(cDatanya))+"'"
                          endif
                         
                            cSql :=  "UPDATE "+alltrim(cFileDEST)+" SET "+cFieldJalan+" = "+cDatanya+" WHERE recno_key = "+alltrim(str(nMulai,12))
                           
                                  oQuery := oServer:Execute( cSql )
                     
                          IF oQuery:NetErr()
                                 ? "Query 4a : "+oQuery:ErrorMsg()
                                 QUIT
                              ENDIF
                 
                    oQuery:Destroy()
                     
                     next            
               
                 orig->(dbSkip())
                 
               enddo
             
           dbCloseAll()
       
    
    endif
    **********************
    
           
    oDlgStock:End()
    
    return nil   
    
    
    static function BrowseData(oServer)
    
    local oDlgRekening,lAmbil := .f.
    
    oQuery := oServer:Query( "SELECT * from mst_customer order by recno_key" )
    
    aData := {}
    
    DO WHILE ! oQuery:Eof()
       aField := {}
       for nField := 1 to oQuery:FCount()
          cData := oQuery:FieldGet( nField )
          if valtype(cData) == "C"
             if len(cData) == 0
                cData := spac(oQuery:FieldLen( nField ))
             endif
          endif
         
          aadd(aField,cData  )
       next
       
       aadd(aData,aField )
       
       oQuery:Skip()
       
    enddo
    
    oQuery:Destroy()
    
    
       define dialog oDlgRekening from 1,1 to 500,900 TITLE "My Data" pixel
       
       @ 4,1 XBROWSE oBrwData size 440,200 pixel of oDlgRekening ARRAY aData ON DBLCLICK ( lAmbil := .t. ,oDlgRekening:End() )
       
       
       oBrwData:nMarqueeStyle       := MARQSTYLE_HIGHLCELL
       oBrwData:nColDividerStyle    := LINESTYLE_BLACK
       oBrwData:nRowDividerStyle    := LINESTYLE_BLACK
       oBrwData:lColDividerComplete := .t.
       
       
    
       oCol := oBrwData:AddCol()
       oCol:cHeader       := "Record"
       oCol:bEditValue    := { || aData[oBrwData:nArrayAt][1] }
       oCol:cEditPicture  := "@!"
       oCol:nWidth        := 100
       oCol:nHeadStrAlign := 2        
       oCol:bClrStd       := {|| { CLR_BLACK,nRGB(194,233,235) } }        
       
       
       oCol := oBrwData:AddCol()
       oCol:cHeader       := "First Name"
       oCol:bEditValue    := { || aData[oBrwData:nArrayAt][2] }
       oCol:cEditPicture  := "@!"
       oCol:nWidth        := 150
       oCol:nHeadStrAlign := 2        
       oCol:bClrStd       := {|| { CLR_BLACK,nRGB(194,233,235) } }        
       oCol:nEditType      := 1
       oCol:bOnPostEdit   := { |o, varInput, nLastKey  | iif( nLastKey == 13, ;
          ( aData[oBrwData:nArrayAt][2] := varInput                                                                  , ;
            SimpanData( "first","'"+alltrim(varInput)+"'",oServer),oBrwData:goRight() ) ;
            , .t. ) }
       
       
       
       
       oCol := oBrwData:AddCol()
       oCol:cHeader       := "Last Name"
       oCol:bEditValue    := { || aData[oBrwData:nArrayAt][3] }
       oCol:cEditPicture  := "@!"
       oCol:nWidth        := 150
       oCol:nHeadStrAlign := 2        
       oCol:bClrStd       := {|| { CLR_BLACK,nRGB(194,233,235) } }        
       oCol:bOnPostEdit   := {|o, v, n| iif( n != VK_ESCAPE, ( aData[oBrwData:nArrayAt][3] := v , SimpanData( aData[oBrwData:nArrayAt][1] ,"last","'"+alltrim(v)+"'",oServer)   ), ),oBrwData:Refresh() }  
       oCol:nEditType      := 1
       
       
       oCol := oBrwData:AddCol()
       oCol:cHeader       := "Street"
       oCol:bEditValue    := { || aData[oBrwData:nArrayAt][4] }
       oCol:cEditPicture  := "@!"
       oCol:nWidth        := 300
       oCol:nHeadStrAlign := 2        
       oCol:bClrStd       := {|| { CLR_BLACK,nRGB(194,233,235) } }        
       oCol:bOnPostEdit   := {|o, v, n| iif( n != VK_ESCAPE, ( aData[oBrwData:nArrayAt][4] := v , SimpanData( aData[oBrwData:nArrayAt][1] ,"street","'"+alltrim(v)+"'",oServer)   ), ),oBrwData:Refresh() }  
       oCol:nEditType      := 1
       
       
       
       oBrwData:nHeaderHeight := 45
         
       oBrwData:nRowHeight := 30
       
       oBrwData:l2007 := .t.
       
       oBrwData:nFreeze := 2
       
       oBrwData:nHeaderLines := 2
         
       oBrwData:CreateFromCode()
       
       nRow := 220
       nCol := 10
       
       @nRow,nCol button "Top" size 30,14 of oDlgRekening pixel action ( oBrwData:Gotop(),oBrwData:SetFocus(),oBrwData:Refresh() )
       nCol += 35
       @nRow,nCol button "Bottom" size 30,14 of oDlgRekening pixel action ( oBrwData:GoBottom(),oBrwData:SetFocus(),oBrwData:Refresh() )
       nCol += 35
       @nRow,nCol button "Find First Name" size 60,14 of oDlgRekening pixel action ( CariNamaDepan(oServer) )
       nCol += 65
       @nRow,nCol button "Sort by First Name" size 60,14 of oDlgRekening pixel action ( NamaDepan(oServer) )
       nCol += 65
       @nRow,nCol button "Add 1 Record" size 60,14 of oDlgRekening pixel action ( LastRecord(oServer) )
       nCol += 65
       @nRow,nCol button "Add 500 Record" size 60,14 of oDlgRekening pixel action ( AddData("customer.dbf","mst_customer" ,oServer) )
       nCol += 65
       @nRow,nCol button "Delete Record" size 60,14 of oDlgRekening pixel action ( HapusData(aData[oBrwData:nArrayAt][1],oServer) )
       nCol += 65
       @nRow,nCol button "Exit" size 30,14 of oDlgRekening pixel action ( oDlgRekening:End() )
    
    
       ACTIVATE DIALOG oDlgRekening ON INIT ( oBrwData:gotop(),oBrwData:SetFocus(), oBrwData:Refresh() )
       
    
    return lAmbil
    
    
    static function CariNamaDepan(oServer)
    
    local cCari := spac(20)
    
    if MsgGet("Find First name","First Name",@cCari)
       
        cCari := upper(alltrim(cCari))
       
            oQuery := oServer:Query( "SELECT * from mst_customer where first like '%"+cCari+"%' order by recno_key" )
           
                   
            aData := {}
           
            DO WHILE ! oQuery:Eof()
               aField := {}
               for nField := 1 to oQuery:FCount()
                  cData := oQuery:FieldGet( nField )
                  if valtype(cData) == "C"
                     if len(cData) == 0
                        cData := spac(oQuery:FieldLen( nField ))
                     endif
                  endif
                  aadd(aField,cData  )
               next
               
               aadd(aData,aField )
               
               oQuery:Skip()
               
            enddo
           
            oBrwData:SetArray(aData)
           
            oQuery:Refresh()
            oBrwData:Gotop()
            oBrwData:Refresh()
    
    endif
    
    return nil
    
    static function SimpanData(cField,cDatanya,oServer)
    
    nRecordSimpan := aData[oBrwData:nArrayAt][1]
    
    cFileDEST := "mst_customer"
    
    cSql :=  "UPDATE "+alltrim(cFileDEST)+" SET "+cField+" = "+cDatanya+" WHERE recno_key = "+alltrim(str(nRecordSimpan,12))
    
       
       oQuery := oServer:Execute( cSql )
         
          IF oQuery:NetErr()
                  ? "Query 22a : "+oQuery:ErrorMsg()
                  QUIT
               ENDIF
               
           oQuery:Destroy()
           
    
    return nil
    
    
    static function HapusData(nRecordSimpan,oServer)
    
    if !MsgYesNo("Are you sure ?")
       return nil
    endif
    
    cFileDEST := "mst_customer"
    
    cSql :=  "DELETE from "+alltrim(cFileDEST)+" WHERE recno_key = "+alltrim(str(nRecordSimpan,12))
       
           oQuery := oServer:Execute( cSql )
         
           IF oQuery:NetErr()
                  ? "Query 22a : "+oQuery:ErrorMsg()
                  QUIT
               ENDIF
               
           oQuery:Destroy()
           
           oQuery := oServer:Query( "SELECT * from mst_customer order by recno_key" )
    
           IF oQuery:NetErr()
                  ? "Query 22a : "+oQuery:ErrorMsg()
                  QUIT
               ENDIF
    
    aData := {}
    
    DO WHILE ! oQuery:Eof()
       aField := {}
       for nField := 1 to oQuery:FCount()
          cData := oQuery:FieldGet( nField )
          if valtype(cData) == "C"
             if len(cData) == 0
                cData := spac(oQuery:FieldLen( nField ))
             endif
          endif
          aadd(aField,cData  )
       next
       
       aadd(aData,aField )
       
       oQuery:Skip()
       
    enddo
    
    oQuery:Destroy()
    
    oBrwData:SetArray(aData)
    oBrwData:Gotop()
    oBrwData:Refresh()
    
    
    return nil
    
    
    static function NamaDepan(oServer)
    
    oQuery := oServer:Query( "SELECT * from mst_customer order by first" )
    
    aData := {}
    
    DO WHILE ! oQuery:Eof()
       aField := {}
       for nField := 1 to oQuery:FCount()
          cData := oQuery:FieldGet( nField )
          if valtype(cData) == "C"
             if len(cData) == 0
                cData := spac(oQuery:FieldLen( nField ))
             endif
          endif
          aadd(aField,cData  )
       next
       
       aadd(aData,aField )
       
       oQuery:Skip()
       
    enddo
    
    oBrwData:SetArray(aData)
    oBrwData:Gotop()
    oBrwData:Refresh()
    
    return nil
    
    
    
    
    static function LastRecord(oServer)
    local nRecord := 0
    cSql :=  "SELECT recno_key "
    cSql +=  " FROM mst_customer "
    cSql +=  " ORDER BY recno_key DESC "
    cSql +=  " LIMIT 1 "
    
           oQuery := oServer:Execute( cSql )
         
           IF oQuery:NetErr()
                  ? "Query 22a : "+oQuery:ErrorMsg()
                  QUIT
               ENDIF
       
        nRecord := oQuery:FieldGet( 1 )
    
    oQuery:Destroy()
    
    oQuery:Refresh()
       
    ++nRecord
    
    cFileDEST   := "mst_customer"
    cFieldJalan := "first"
    cDatanya    := "'ZZZZ'"
    
              cSQL := "INSERT INTO "+alltrim(cFileDEST)+" ( "+cFieldJalan+" ) VALUES (  "+cDatanya+"  )"
                 
                  oQuery := oServer:Execute( cSql )
         
              IF oQuery:NetErr()
                     ? "Query 4 : "+oQuery:ErrorMsg()
                     QUIT
                  ENDIF
               
             oQuery:Destroy()
             
             oServer:Commit()
    
    oQuery := oServer:Query( "SELECT * from mst_customer order by recno_key DESC LIMIT 1" )
    
    aData := {}
    
    DO WHILE ! oQuery:Eof()
       aField := {}
       for nField := 1 to oQuery:FCount()
          cData := oQuery:FieldGet( nField )
          if valtype(cData) == "C"
             if len(cData) == 0
                cData := spac(oQuery:FieldLen( nField ))
             endif
          endif
          aadd(aField,cData  )
       next
       
       aadd(aData,aField )
       
       oQuery:Skip()
       
    enddo
    
    oQuery:Destroy()
    
    oBrwData:SetArray(aData)
    
    oBrwData:GoBottom()
    oBrwData:Refresh()
       
    return nil
    
    
    
    /*
    
    CREATE OR REPLACE FUNCTION create_index(table_name text, index_name text, column_name text) RETURNS void AS $$
    declare
       l_count integer;
    begin
      select count(*)
         into l_count
      from pg_indexes
      where schemaname = 'public'
        and tablename = lower(table_name)
        and indexname = lower(index_name);
    
      if l_count = 0 then
         execute 'create index ' || index_name || ' on ' || table_name || '(' || column_name || ')';
      end if;
    end;
    $$ LANGUAGE plpgsql;
    
    usage: select create_index('my_table', 'my_index_name', 'id');
    
    */
    
    static function CreateIndexSQL(cTabelName,cIndexName,cFieldName,oServer)
           cQuery := "SELECT create_index('"+lower(cTabelName)+"', '"+lower(cTabelName)+"_"+lower(cIndexName)+"', '"+lower(cFieldName)+"');"
           oQuery := oServer:Query( cQuery )
               IF oQuery:NetErr()
                  ? "4"+oQuery:ErrorMsg()
               ENDIF
           oQuery:Destroy()
    return nil      
    
    
    ****
    static function AddData(cFileORIG,cFileDEST,oServer)
    
    if MsgYesNo("Add 500 Record ?")
    
                    cSql := "SELECT recno_key "+;
                    "FROM mst_customer "+;
                    "ORDER BY recno_key DESC "+;
                    "LIMIT 1"
                   
                      oQuery := oServer:Execute( cSql )
         
              IF oQuery:NetErr()
                     ? "Query 4 : "+oQuery:ErrorMsg()
                     QUIT
                  ENDIF
                 
                  nLastRecord := oQuery:FieldGet( 1 )
                 
                  //?str(cData,12)
                  oQuery:Destroy()
                 
                 
    
           dbCloseAll()
           
           define dialog oDlgStock from 1,1 to 40,400 pixel style nOR( WS_CAPTION ) title "Tunggu Sebentar"
           activate dialog oDlgStock centered nowait
       
       
           use (cFileORIG) new shared alias orig
    
               nMulai  := 0
               nPersen := 0
               nRecord := orig->(lastrec())
               
               
               orig->(dbGotop())  
               do while !orig->(eof())
               
                  ++nMulai
                  nPersen := ( nMulai / nRecord ) * 100
                  oDlgStock:cTitle := cFileDEST +" "+str(nMulai+nLastRecord,12)+"/"+str(nRecord+nLastRecord,12)+"="+str(nPersen,12)+"%"
                  SysRefresh()
                  cFieldJalan := alltrim(orig->(FieldName(1)))
                  cDatanya := orig->&cFieldJalan
                  if valtype(cDatanya) == "N"
                     cDatanya := alltrim(str(cDatanya,14,2))
                  else
                     cDatanya := "'"+upper(alltrim(cDatanya))+"'"
                  endif
                 
                  cSQL := "INSERT INTO "+alltrim(cFileDEST)+" ( "+cFieldJalan+" ) VALUES (  "+cDatanya+"  )"
                 
                  oQuery := oServer:Execute( cSql )
         
              IF oQuery:NetErr()
                     ? "Query 4 : "+oQuery:ErrorMsg()
                     QUIT
                  ENDIF
               
             oQuery:Destroy()
             
             for x := 2 to orig->(fcount())
                         cFieldJalan := alltrim(orig->(FieldName(x)))
                         cDatanya := orig->&cFieldJalan
                         
                              if valtype(cDatanya) == "N"
                             cDatanya := alltrim(str(cDatanya,14,2))
                          endif
                         
                          if valtype(cDatanya) == "D"
                             cTahun   := strzero(year(cDatanya),4)
                             cBulan   := strzero(month(cDatanya),2)
                             cTgl     := strzero(day(cDatanya),2)
                             cDatanya := cTahun+"-"+cBulan+"-"+cTgl
                          endif
                         
                          if valtype(cDatanya) == "L"
                             if cDatanya
                                cDatanya := "1"
                             else
                                cDatanya := "0"  
                             endif
                          endif
                             
                          if valtype(cDatanya) == "C"
                             cChar := ""
                             for xx := 1 to len(cDatanya)
                                cOke := subs(cDatanya,xx,1)
                                if cOke == "'"
                                   cOke := ""
                                endif
                                cChar += cOke
                             next
                             cDatanya := "'"+upper(alltrim(cChar))+"'"
                          endif
                         
                          if valtype(cDatanya) == "M"
                             cDatanya := "'"+upper(alltrim(cDatanya))+"'"
                          endif
                         
                            cSql :=  "UPDATE "+alltrim(cFileDEST)+" SET "+cFieldJalan+" = "+cDatanya+" WHERE recno_key = "+alltrim(str(nMulai+nLastRecord,12))
                           
                                  oQuery := oServer:Execute( cSql )
                     
                          IF oQuery:NetErr()
                                 ? "Query 4a : "+oQuery:ErrorMsg()
                                 QUIT
                              ENDIF
                 
                    oQuery:Destroy()
                     
                     next            
               
                 orig->(dbSkip())
                 
               enddo
             
           dbCloseAll()
           oDlgStock:End()
           
       
       
       
        oQuery := oServer:Query( "SELECT * from mst_customer order by recno_key" )
           
        aData := {}
           
            DO WHILE ! oQuery:Eof()
               aField := {}
               for nField := 1 to oQuery:FCount()
                  cData := oQuery:FieldGet( nField )
                  if valtype(cData) == "C"
                     if len(cData) == 0
                        cData := spac(oQuery:FieldLen( nField ))
                     endif
                  endif
                  aadd(aField,cData  )
               next
               
               aadd(aData,aField )
               
               oQuery:Skip()
               
            enddo
           
            oBrwData:SetArray(aData)
           
            oQuery:Refresh()
            oBrwData:Gotop()
            oBrwData:Refresh()
           
           
           
           
    endif
       
    return nil
    
    
    
    
    
    // O mesmo exemplo acima só que navegando na própria linha do postgresql.......................................................................................
    #include "fivewin.ch"
    
    REQUEST DBFCDX
    
    static cPassword := <yourpassword>
    
    //----------------------------------------------------------------------------//
    
    function Main()
    
       local oServer, cSql, oQry
       local aStates, n, a
    
       oServer   := TPQServer():New( "localhost", "fwh", "postgres", cPassword )
       if oServer:NetErr()
          ? oServer:ErrorMsg()
          QUIT
       endif
       ? "connected"
    
       ? "import customer"
       if oServer:TableExists( "customer" )
          PQExec( oserver:pdb, "DROP TABLE customer" )
       endif
       ? PG_ImportFromDBF( oServer, "c:\fwh\samples\customer.dbf" )
       ? oserver:tableexists( "customer" )
    
       oQry  := oServer:Query( "select * from customer order by recno" )
       oQry:SetKey()
       xbrowser oQry:aKeys
       ? oqry:nlastrec
       ? "Browse"
       BrowsePG( oQry )
    
       oServer:Destroy()
    
    return nil
    
    //----------------------------------------------------------------------------//
    
    static function BrowsePG( oQry )
    
       local oWnd, oBrw, oFont
    
       DEFINE FONT oFont NAME "TAHOMA" SIZE 0,-14
       DEFINE WINDOW oWnd
       oWnd:SetFont( oFont )
    
       @ 0,0 XBROWSE oBrw OF oWnd CELL LINES NOBORDER FASTEDIT
    
       SetXbrPG( oBrw, oQry )
    
       WITH OBJECT oBrw
          :nEditTypes    := EDIT_GET
          :CreateFromCode()
       END
    
       oWnd:oClient := oBrw
    
       oWnd:nWidth    := 800
       oWnd:nHeight   := 600
    
       ACTIVATE WINDOW oWnd CENTERED
       RELEASE FONT oFont
    
    return nil
    
    //----------------------------------------------------------------------------//
    
    static function SetXbrPG( oBrw, oQry )
    
       local oCol, n
    
       WITH OBJECT oBrw
          :oDbf          := oQry
          :bGoTop        := {|| oBrw:oDbf:GoTo( 1 ) }
          :bGoBottom     := {|| oBrw:oDbf:GoTo( oBrw:oDbf:nLastRec ) }
          :bSkip         := {| n | If( oBrw:oDbf:Skip( @n ), n, 0 ) }
          :bBof          := {|| oBrw:oDbf:Bof() }
          :bEof          := {|| oBrw:oDbf:Eof() }
          :bBookMark     := { |u| If( PCount() == 0, oBrw:oDbf:RecNo(), oBrw:oDbf:GoTo( u ) ) }
          :bKeyNo        := { |n| If( n == nil, oBrw:oDbf:RecNo(), oBrw:oDbf:GoTo( n ) ) }
          :bKeyCount     := { || oBrw:oDbf:nLastRec }
          :nDataType     := DATATYPE_ODBF
          :bOnRowLeave   := { || nil }
       END
    
       for n := 1 to oQry:FCount()
          WITH OBJECT oBrw:AddCol()
             :Cargo        := n
    
             :cHeader       := oQry:FieldName( n )
             :cExpr         := oQry:FieldName( n )
             :bOnPostEdit   := { |o,x,n| If( n == VK_ESCAPE,, PGSaveData( o, x ) ) }
             :cDataType     := oQry:FieldType( n )
             :nDataLen      := oQry:FieldLen( n )
             :nDataDec      := oQry:FieldDec( n )
             if :cDataType == 'C'
                :bEditValue    := { |x,o| PadR( oQry:FieldGet( o:Cargo ), o:nDataLen ) }
             else
                :bEditValue    := { |x,o| oQry:FieldGet( o:Cargo ) }
             endif
             :bClrEdit      := { || { CLR_BLACK, CLR_YELLOW } }
          END
       next
    
    return nil
    
    //----------------------------------------------------------------------------//
    
    static function PGSaveData( oCol, xValue )
    
       local oBrw     := oCol:oBrw
       local oQry     := oBrw:oDbf
       local cWhere, cSql, u, nRec
    
       if ValType( xValue ) == 'C'
          xValue   := RTrim( xValue )
       endif
    
       u           := oQry:FieldGet( oQry:FieldPos( oQry:aKeys[ 1 ] ) )
       cWhere      := oQry:aKeys[ 1 ] + " = " + FW_ValToSQL( u )
       cSql        := "UPDATE " + oQry:TableName + " SET " + oQry:FieldName( oCol:Cargo )
       cSql        += " = " + FW_ValToSQL( xValue )
       cSql        += " WHERE " + cWhere
    
       u           := PQExec( oQry:pDB, cSql )
       u           := nil
       nRec        := oQry:RecNo()
       oQry:Refresh()
       oQry:GoTo( nRec )
       oBrw:Refresh()
    
    return nil
    
    //----------------------------------------------------------------------------//
    
    function PG_ImportFromDBF( oCn, cDbf, cTable )
    
       local cSql, res
    
       DEFAULT cTable    := cFileNoExt( cDBF )
       cTable            := Lower( cTable )
    
       if oCn:TableExists( cTable )
          return .f.
       endif
    
       USE ( cDbf ) NEW SHARED READONLY ALIAS SRC
       if !USED()
          return .f.
       endif
    
       cSql     := PG_CreateTableSQL( cTable, SRC->( DBSTRUCT() ) )
       res      := PQExec( oCn:pDB, cSql )
       res      := nil
    
       SRC->( PG_AppendFromAlias( oCn, cTable ) )
       CLOSE SRC
    
    return .T.
    
    //----------------------------------------------------------------------------//
    
    function PG_CreateTableSQL( cTable, aStruct )
    
       local cSql, aCol
    
       if AScan( aStruct, { |a| a[ 2 ] == '+' } ) == 0
          AIns( aStruct, 1, { "recno", '+', 6, 0 }, .t. )
       endif
    
       cSql  := "CREATE TABLE " + Lower( cTable ) + " (" + CRLF
       for each aCol in aStruct
          cSql  += aCol[ 1 ] + " "
          cSql  += HB_DeCode( aCol[ 2 ], "+", "SERIAL PRIMARY KEY", "C", "VARCHAR(", "D", "DATE", "L", "BOOLEAN", "M", "TEXT", ;
                   "N", "NUMERIC(", "T", "TIMESTAMP", "=", "TIMESTAMP" )
          if aCol[ 2 ] $ "CN"
             cSql  += cValToChar( aCol[ 3 ] )
             if aCol[ 2 ] == "N" .and. aCol[ 4 ] > 0
                cSql  += "," + cValToChar( aCol[ 4 ] )
             endif
             cSql  += ")"
          endif
          cSql  += "," + CRLF
       next
       cSql  := Left( cSql, Len( cSql ) - 3 )
       cSql  += " )"
    
    return cSql
    
    //----------------------------------------------------------------------------//
    
    function PG_AppendFromAlias( oCn, cTable )
    
       local nBatchSize     := 100
       local aCols          := ArrTranspose( DBSTRUCT() )[ 1 ]
       local n, u, bLine, cLine, cCols
       local cSql
    
       bLine    := ""
       for n := 1 to Len( aCols )
          if n > 1
             bLine    += ","
          endif
          if FIELDTYPE( n ) == 'C'
             bLine    += "TRIM(" + aCols[ n ] + ")"
          else
             bLine    += aCols[ n ]
          endif
       next
       bLine    := &( "{ || { " + bLine + " } }" )
       cCols    := FW_ArrayAsList( aCols )
    
       n     := 0
       do while !Eof()
          cLine    := PG_ValToSQL( Eval( bLine ) )
          if Empty( cSql )
             cSql  := "INSERT INTO " + cTable + " (" + cCols + ") VALUES "
          else
             cSql  += ", "
          endif
          cSql     += cLine
          n++
          if n >= nBatchSize
             u  := PQExec( oCn:pDB, cSql )
             cSql  := nil
             n     := 0
          endif
          DBSKIP( 1 )
       enddo
       if ! Empty( cSql )
          u  := PQExec( oCn:pDB, cSql )
          cSql  := nil
       endif
    
    return nil
    
    //----------------------------------------------------------------------------//
    
    function PG_ValToSQL( uVal )
    
       local cVal
    
       if ValType( uVal ) == 'A'
          AEval( uVal, { |u,i| uVal[ i ] := PG_ValToSql( u ) } )
          cVal  := FW_ArrayAsList( uVal )
          cVal  := "( " + cVal + " )"
          return cVal
    
       elseif ValType( uVal ) == 'L'
          return If( uVal, "TRUE", "FALSE" )
       endif
    
    return FW_ValToSQL( uVal )
    
    //----------------------------------------------------------------------------//

     

  8. Fiz alterações para tornar prático o registro de boleto bancário on-line do Bradesco. Criei um script em PHP com o nome de bradesco.php e fiz um upload para o meu FTP em ( ex: www.xxxxxx.com.br), e fiz um upload do meu certificado digital no formato .pfx para uma pasta que criei de nome "certs" ( já que o banco não exige que seja o mesmo com CNPJ do cliente para gerar o arquivo codificado, podendo ser qualquer um no formato PKCS#7),  e coloquei lá na pasta "certs".

    Assim não precisa utilizar o certificado do cliente e sim atualizar somente o meu e servirá para qualquer cliente, que queira emitir boleto para o bradesco de forma on-line.

    Para acessar basta criar  o arquivo JSON, conforme manual técnico e passar para o ftp e tratar o retorno.

    " http://www.xxxxxx.com.br/bradesco.php?json_str=" + alltrim(narquivoJSON)

    O script em PHP, ira tratar o json assinando o mesmo e codificando em base64 e retornando para ser pego pelo software e encaminhado para o http do banco.

    SCRIPT PHP.

    <?php
    
        function ApagaDir($dir) {
          if($objs = glob($dir."/*")){
            foreach($objs as $obj) {
              is_dir($obj)? ApagaDir($obj) : unlink($obj);
            }
          }
        } 
        $nome_da_pasta="../public_html/data/tmp";
        ApagaDir($nome_da_pasta); 
    
    	$pfx = "certs/certificado.pfx";
    	$certPassword = "xxxxxxxxxxxx";
        $json_str = $_GET['json_str'];
        $certificado_pfx = file_get_contents($pfx);
    	
        if (!openssl_pkcs12_read($certificado_pfx, $result, $certPassword)) {
            throw new Exception('Não foi possível ler o certificado .pfx');
        }
    	
        $path = sprintf('%s%sdata%stmp%s', realpath('.'), DIRECTORY_SEPARATOR, DIRECTORY_SEPARATOR, DIRECTORY_SEPARATOR);
        if (@mkdir($path, 0777, true) && !is_dir($path)) {
            throw new Exception('Falha ao criar diretórios. Entre em contato com o administrador');
        }
    
    	$jsonFile   = $path . uniqid('jsonFile', true);
        $signedFile = $path . uniqid('signedFile', true);
    	
    	file_put_contents($jsonFile, $json_str);
    
        $certKey = openssl_x509_read($result['cert']);
        $privKey = openssl_pkey_get_private($result['pkey'], $certPassword);
    	
    	openssl_pkcs7_sign( $jsonFile, $signedFile, $certKey, $privKey, array(), PKCS7_BINARY | PKCS7_TEXT );
    	
    	$signature = file_get_contents($signedFile);
    	$parts = preg_split("#\n\s*\n#Uis", $signature);
        $mensagem_assinada_base64 = $parts[1];
    	
    	print_r($mensagem_assinada_base64);
    	
    ?>

    enviando para o script em PHP ,pegando e tratando  o retorno para ser enviado ao banco.

    cSignatureValue = ""
    _nArquivo_enviar = "http://www.xxxxxx.com.br/bradesco.php?json_str=" + alltrim(narquivoJSON)
    try
       _oserver := CreateObject( "MSXML2.XMLHTTP" )
       _oserver:Open( "GET",_nArquivo_enviar, .F. )
       _oserver:SetRequestHeader("Content-Type","text/xml")
       _oserver:Send(_nArquivo_enviar)
       WHILE _oserver:readyState != 4
             _oserver:WaitForResponse( 500 )
       end
    	cSignatureValue = _oserver:responseText
    catch
       msgstop("Erro na geração do arquivo para o bradeco. www.wsiscom.com.br/bradesco.php","Atenção")
    	exit
    end

    Enviando o retorno assinado e codificado base64 para o banco.

    xnurlbano = "https://cobranca.bradesconetempresa.b.br/ibpjregistrotitulows/registrotitulohomologacao"

     _cresposta := ""
     try
        _oserver := CreateObject( "MSXML2.XMLHTTP" )
        _oserver:Open( "POST", xnurlbanco, .F. )
        _oserver:SetRequestHeader("Content-Type","application/text/xml")
        _oserver:Send(cSignatureValue)
        WHILE _oserver:readyState != 4
              _oserver:WaitForResponse( 500 )
        end
    	_cresposta := _oserver:responseText
     catch
        msgstop("Erro no envio do arquivo json do boleto para o Bradesco.","Atenção")
    	exit
     end

     

    O registro é concluido no banco. 

    Obs. Tratar o retorno para ver se não houve erro e gravar na bases do seu software.

     

  9. Exemplo prático.

     

    #include "FiveWin.ch"
    #include "common.ch"
    #include "postgres.ch"
    #include "report.ch"
    #include "inkey.ch"
    #include "hbgtinfo.ch"
    #include "hbclass.ch"
    #include "tip.ch"
    #include "sefaz_capicom.ch"
    
    // Créditos José Quintas ( assinaturacapicom.prg ) // sefazclass...
    // Com alterações..
    
    function TesteCapicom
    
             LOCAL narquivoJSON, cSignatureValue, cDigestValue, cPublicKey
             
    		 narquivoJSON := '{"nuCPFCNPJ":"123456789","filialCPFCNPJ":"0001","ctrlCPFCNPJ":"39","cdTipoAcesso":"2","clubBanco":"0","cdTipoContrato":"0","nuSequenciaContrato":"0"'
             narquivoJSON += '"idProduto":"09","nuNegociacao":"123400000001234567","cdBanco":"237","eNuSequenciaContrato":"0","tpRegistro":"1","cdProduto":"0","nuTitulo":"0"'
             narquivoJSON += '"nuCliente":"123456","dtEmissaoTitulo":"25.05.2017","dtVencimentoTitulo":"20.06.2017","tpVencimento":"0","vlNominalTitulo":"100","cdEspecieTitulo":"04"'
             narquivoJSON += '"tpProtestoAutomaticoNegativacao":"0","prazoProtestoAutomaticoNegativacao":"0","controleParticipante":"","cdPagamentoParcial":"","qtdePagamentoParcial":"0"'
             narquivoJSON += '"percentualJuros":"0","vlJuros":"0","qtdeDiasJuros":"0","percentualMulta":"0","vlMulta":"0","qtdeDiasMulta":"0","percentualDesconto1":"0","vlDesconto1":"0"'
             narquivoJSON += '"dataLimiteDesconto1":"","percentualDesconto2":"0","vlDesconto2":"0","dataLimiteDesconto2":"","percentualDesconto3":"0","vlDesconto3":"0","dataLimiteDesconto3":""'
             narquivoJSON += '"prazoBonificacao":"0","percentualBonificacao":"0","vlBonificacao":"0","dtLimiteBonificacao":"","vlAbatimento":"0","vlIOF":"0","nomePagador":"Cliente Teste"'
             narquivoJSON += '"logradouroPagador":"rua Teste","nuLogradouroPagador":"90","complementoLogradouroPagador":"","cepPagador":"12345","complementoCepPagador":"500","bairroPagador":"bairro Teste"'
             narquivoJSON += '"municipioPagador":"Teste","ufPagador":"SP","cdIndCpfcnpjPagador":"1","nuCpfcnpjPagador":"12345648901234","endEletronicoPagador":"","nomeSacadorAvalista":""'
             narquivoJSON += '"logradouroSacadorAvalista":"","nuLogradouroSacadorAvalista":"0","complementoLogradouroSacadorAvalista":"","cepSacadorAvalista":"0","complementoCepSacadorAvalista":"0"'
             narquivoJSON += '"bairroSacadorAvalista":"","municipioSacadorAvalista":"","ufSacadorAvalista":"","cdIndCpfcnpjSacadorAvalista":"0","nuCpfcnpjSacadorAvalista":"0","endEletronicoSacadorAvalista":""}'
    		 
    		 xnurlbanco := "https://cobranca.bradesconetempresa.b.br/ibpjregistrotitulows/registrotitulohomologacao"
    		 
             xncertificado = ""     // Certificado instalado no store do WINDOWS......
                                    // ou
    		 xnpfxcertificado = ""  // Nome do arquivo .pfx
    		 xnpfxsenha = ""        // Certificado em arquivo PFX.
    
    		 //1-hb_SHA1(),224-hb_SHA224(),256-hb_SHA256(),384-hb_SHA384(),512-hb_SHA512()
    		 cDigestValue    := CapicomClass():HashData(narquivoJSON,256)
    		 cSignatureValue := CapicomClass():Sign( cDigestValue, , , @cPublicKey )
    		 cDigestValue     = CapicomClass():VerifySignature( cSignatureValue )
    		 if IsValidSignatureCapicom( cDigestValue, cSignatureValue ) = .f.
    		    return
    		 endif
    
             // Certificado.......
    		 //? cPublicKey
    		 
    		 // criptografia a ser enviado para o banco
    		 //? cSignatureValue
    		 
             _cresposta := ""
             try
    		   _oserver := CreateObject( "MSXML2.XMLHTTP" )
    		   _oserver:Open( "POST", xnurlbanco, .F. )
    		   _oserver:SetRequestHeader("Content-Type","application/json")
    	       _oserver:Send(cSignatureValue)
    	       WHILE _oserver:readyState != 4
    	             _oserver:WaitForResponse( 500 )
    	       end
    			_cresposta := _oserver:responseText
    			msginfo(_cresposta )
    	     catch
    	       msgstop("Erro no envio do arquivo json do boleto para o Bradesco.","Atenção")
    	     end
    return
    
    /*
    http://www.pctoledo.com.br/forum/viewtopic.php?f=43&t=18664
    */
    //Boleto operações com certificado digital e assinatura
    function boleto_CertificadoEscolhe()
             LOCAL dValidFrom, dValidTo
             try
    		   cCertificado := boleto_CapicomEscolheCertificado()
               dValidFrom   := boleto_CapicomCertificado( cCertificado ):ValidFromDate
               dValidTo     := boleto_CapicomCertificado( cCertificado ):ValidToDate
    		 catch
    	       msgstop("Certificado não selecionado.","Atenção")
    		 end
    return nil
    function boleto_CapicomEscolheCertificado( dValidFrom, dValidTo )
             local oCertificado, oCapicomStore, cNomeCertificado := "NENHUM", oColecao
             
    		 oCapicomStore        := CreateObject( "CAPICOM.Store" )
             oCapicomStore:Open( CAPICOM_CURRENT_USER_STORE, 'My', CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED )
    		 oColecao         := oCapicomStore:Certificates()
             do case
             case oColecao:Count() == 1
                  dValidFrom       := oColecao:item(1):ValidFromDate
                  dValidTo         := oColecao:item(1):ValidToDate
                  cNomeCertificado := oColecao:item(1):SubjectName
             case oColecao:Count() > 1
                  oCertificado     := oColecao:Select( "Selecione o certificado para uso nos boletos.","Selecione o certificado", .F. )
                  dValidFrom       := oCertificado:item(1):ValidFromDate
                  dValidTo         := oCertificado:item(1):ValidToDate
                  cNomeCertificado := oCertificado:item(1):SubjectName
             endcase
    		 if "CN=" $ cNomeCertificado
                cNomeCertificado := Substr( cNomeCertificado, At( "CN=", cNomeCertificado ) + 3 )
                if "," $ cNomeCertificado
                   cNomeCertificado := Substr( cNomeCertificado, 1, At( ",", cNomeCertificado ) - 1 )
    			endif
             endif
    return cNomeCertificado
    function boleto_CapicomCertificado( cNomeCertificado )
             local oCapicomStore, oColecao, oCertificado, nCont
             oCapicomStore := CreateObject( "CAPICOM.Store" )
             oCapicomStore:Open( CAPICOM_CURRENT_USER_STORE, "My", CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED )
             oColecao := oCapicomStore:Certificates()
             for nCont = 1 TO oColecao:Count()
    			 if cNomeCertificado $ oColecao:Item( nCont ):SubjectName
                    oCertificado := oColecao:Item( nCont )
                    exit
                 endif
             next
    return oCertificado
    function IsValidSignatureCapicom( cDigestValue, cSignatureValue )
             if cDigestValue = nil .OR. cSignatureValue = nil
                return .f.
             endif
    return CapicomClass():VerifySignature( cSignatureValue ) == cDigestValue
    
    CREATE CLASS CapicomClass
           METHOD SelectCertificate()
           METHOD VerifySignature( cSignedData )
           METHOD HashData( cData, nAlgorithm )
           METHOD Sign( cDigestValue, oCAPICOMcert, nEncode, cPublicKey )
    ENDCLASS
    
    METHOD SelectCertificate() CLASS CapicomClass
             local oCertificado, oCapicomStore, cNomeCertificado := "NENHUM", oColecao
             
    		 oCapicomStore        := CreateObject( "CAPICOM.Store" )
             oCapicomStore:Open( CAPICOM_CURRENT_USER_STORE, 'My', CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED )
    		 oColecao         := oCapicomStore:Certificates()
             do case
             case oColecao:Count() == 1
                  dValidFrom       := oColecao:item(1):ValidFromDate
                  dValidTo         := oColecao:item(1):ValidToDate
                  cNomeCertificado := oColecao:item(1):SubjectName
             case oColecao:Count() > 1
                  oCertificado     := oColecao:Select( "Selecione o certificado para uso nos boletos.","Selecione o certificado", .F. )
                  dValidFrom       := oCertificado:item(1):ValidFromDate
                  dValidTo         := oCertificado:item(1):ValidToDate
                  cNomeCertificado := oCertificado:item(1):SubjectName
             endcase
    		 if "CN=" $ cNomeCertificado
                cNomeCertificado := Substr( cNomeCertificado, At( "CN=", cNomeCertificado ) + 3 )
                if "," $ cNomeCertificado
                   cNomeCertificado := Substr( cNomeCertificado, 1, At( ",", cNomeCertificado ) - 1 )
    			endif
             endif
    		 onselecionado = boleto_CapicomCertificado( cNomeCertificado )
    return onselecionado
    	   
    return oCertificate:Item( 1 )
    
    METHOD VerifySignature( cSignedData ) CLASS CapicomClass
           local oCapicom
           if cSignedData == nil
              return nil
           endif
           oCapicom := CreateObject( "CAPICOM.SignedData.1" )
           oCapicom:Verify( cSignedData, .F., CAPICOM_VERIFY_SIGNATURE_ONLY )
    RETURN oCapicom:Content
    
    METHOD HashData( cData, nAlgorithm ) CLASS CapicomClass
           if cData = NIL
              cData := Dtos( Date() ) + Time()
           else
    		  cData = alltrim(cData)
    	   endif
    	   if nAlgorithm = 1
    	      _ShaAlg = StrToHex(hb_SHA1(cData))
    	   elseif nAlgorithm = 224
    	      _ShaAlg = StrToHex(hb_SHA224(cData))
    	   elseif nAlgorithm = 256
    	      _ShaAlg = StrToHex(hb_SHA256(cData))
    	   elseif nAlgorithm = 384
    	      _ShaAlg = StrToHex(hb_SHA384(cData))
    	   elseif nAlgorithm = 512
    	      _ShaAlg = StrToHex(hb_SHA512(cData))
    	   else
    	      _ShaAlg = StrToHex(hb_SHA1(cData))
    	   endif
    	   _ShaAlg = zHexToBinary(_ShaAlg)
    return(StrTran(HB_Base64Encode(_ShaAlg,len(_ShaAlg)),Chr(13) + Chr(10), "" ))
    
    function zHexToBinary(cHex)
             local nLenBin, nX, nPos, cBinNumber, cCharHex, cBinBase
             aHexBinary  := { {"0","0000"},{"1","0001"},{"2","0010"},{"3","0011"},{"4","0100"},{"5","0101"},;
                              {"6","0110"},{"7","0111"},{"8","1000"},{"9","1001"},{"A","1010"},{"B","1011"},;
                              {"C","1100"},{"D","1101"},{"E","1110"},{"F","1111"} }
             cBinNumber := ""
             cHex := alltrim(cHex)
             for nX := len(cHex)  to 1 step -1
                 cCharHex := substr(cHex, -nX, 1)
                 nPos := ascan(aHexBinary, { |a| a[1] == substr(cHex, -nX, 1)} )
                 cBinBase := aHexBinary[nPos,2]
                 cBinNumber := cBinNumber + cBinBase
             next
    return(cBinNumber)
    
    METHOD Sign( cDigestValue, oCAPICOMCert, nEncode, cPublicKey ) CLASS CapicomClass
           local oCAPICOMSignedData, oCAPICOMSigner, oCAPICOMTimeStamp, cSignature
           if cDigestValue = nil
              return nil
           endif
           if nEncode = nil
              nEncode := CAPICOM_ENCODE_BASE64
           endif
           oUtil := CreateObject( "CAPICOM.Utilities" )
           oCAPICOMSigner := CreateObject( "CAPICOM.Signer.2" ) // versao 2
           if oCAPICOMCert = nil
              if empty(xncertificado) // Certificado instalado no store do WINDOWS......
                 if !empty(xnpfxcertificado) .and. !empty(xnpfxsenha) // Certificado em arquivo PFX.
    				oCert := CreateObject( "CAPICOM.Certificate" )
                    oCert:Load( xnpfxcertificado, xnpfxsenha, 1, 0 )
    				oCapicomStore := CreateObject( "CAPICOM.Store" )
                    oCapicomStore:open(CAPICOM_MEMORY_STORE, 'Memoria',CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED )
                    oCapicomStore:Add( oCert )
    				if oCapicomStore:item(1):ValidToDate <= ldate
    				   msgstop("Certificado " + alltrim(xnpfxcertificado) + " VENCIDO!!!","Atenção")
    				   return nil
    				endif
    				oCAPICOMCert := oCapicomStore:item(1)
    			 else
    			    oCAPICOMCert := ::SelectCertificate() // Escolhe o certificado.
    			 endif
    		  else
    		     oCAPICOMCert := boleto_CapicomCertificado( alltrim(xncertificado) )
    	      endif
              if oCAPICOMCert = nil
                 return nil
              endif
              oCAPICOMSigner:Certificate := oCAPICOMcert
           else
              oCAPICOMSigner:Certificate := oCAPICOMcert:DefaultInterface
           endif
           if ! ( oCAPICOMSigner:Certificate:HasPrivateKey;
              .and. Dtos( oCAPICOMSigner:Certificate:ValidFromDate ) <= Dtos( Date() ) ;
              .and. Dtos( oCAPICOMSigner:Certificate:ValidToDate ) >= Dtos( Date() ) )
              return nil
           endif
    	   oCAPICOMSigner:Options   := CAPICOM_CERTIFICATE_INCLUDE_CHAIN_EXCEPT_ROOT
    	   cPublicKey               := StrTran( oCAPICOMSigner:Certificate:Export( CAPICOM_ENCODE_BASE64 ), Chr(13) + Chr(10), "" )
    	   
    	   oCAPICOMTimeStamp := CreateObject( "CAPICOM.Attribute" )
           oCAPICOMTimeStamp:Name  := CAPICOM_AUTHENTICATED_ATTRIBUTE_SIGNING_TIME
           oCAPICOMTimeStamp:Value := DateTime()
           oCAPICOMSigner:AuthenticatedAttributes:Add( oCAPICOMTimeStamp )
           
           oCAPICOMSignedData := CreateObject( "CAPICOM.SignedData.1" )
           oCAPICOMSignedData:Content := cDigestValue
    	   
    	   // segundo parametro falso, apenas retona assinatura do texto, não inclui no texto
    	   cSignature := StrTran( oCAPICOMSignedData:Sign( oCAPICOMSigner, .F., nEncode ), Chr(13) + Chr(10), "" )
    	   
    return cSignature

     

  10. Me esqueci de adicionar o arquivo sefaz_capicom.ch

    
    #define CAPICOM_AUTHENTICATED_ATTRIBUTE_SIGNING_TIME             0
    #define CAPICOM_AUTHENTICATED_ATTRIBUTE_DOCUMENT_NAME            1
    #define CAPICOM_AUTHENTICATED_ATTRIBUTE_DOCUMENT_DESCRIPTION     2
    
    #define CAPICOM_CERTIFICATE_FIND_SHA1_HASH                       0
    #define CAPICOM_CERTIFICATE_FIND_SUBJECT_NAME                    1
    #define CAPICOM_CERTIFICATE_FIND_ISSUER_NAME                     2
    #define CAPICOM_CERTIFICATE_FIND_ROOT_NAME                       3
    #define CAPICOM_CERTIFICATE_FIND_TEMPLATE_NAME                   4
    #define CAPICOM_CERTIFICATE_FIND_EXTENSION                       5
    #define CAPICOM_CERTIFICATE_FIND_EXTENDED_PROPERTY               6
    #define CAPICOM_CERTIFICATE_FIND_APPLICATION_POLICY              7
    #define CAPICOM_CERTIFICATE_FIND_CERTIFICATE_POLICY              8
    #define CAPICOM_CERTIFICATE_FIND_TIME_VALID                      9
    #define CAPICOM_CERTIFICATE_FIND_TIME_NOT_YET_VALID              10
    #define CAPICOM_CERTIFICATE_FIND_TIME_EXPIRED                    11
    #define CAPICOM_CERTIFICATE_FIND_KEY_USAGE                       12
    
    #define CAPICOM_CERTIFICATE_INCLUDE_CHAIN_EXCEPT_ROOT            0
    #define CAPICOM_CERTIFICATE_INCLUDE_WHOLE_CHAIN                  1
    #define CAPICOM_CERTIFICATE_INCLUDE_END_ENTITY_ONLY              2
    
    // CAPICOM Chain check flag
    #define CAPICOM_CHECK_NONE                                       &H00000000
    #define CAPICOM_CHECK_TRUSTED_ROOT                               &H00000001
    #define CAPICOM_CHECK_TIME_VALIDITY                              &H00000002
    #define CAPICOM_CHECK_SIGNATURE_VALIDITY                         &H00000004
    #define CAPICOM_CHECK_ONLINE_REVOCATION_STATUS                   &H00000008
    #define CAPICOM_CHECK_OFFLINE_REVOCATION_STATUS                  &H00000010
    #define CAPICOM_CHECK_COMPLETE_CHAIN                             &H00000020
    #define CAPICOM_CHECK_NAME_CONSTRAINTS                           &H00000040
    #define CAPICOM_CHECK_BASIC_CONSTRAINTS                          &H00000080
    #define CAPICOM_CHECK_NESTED_VALIDITY_PERIOD                     &H00000100
    #define CAPICOM_CHECK_ONLINE_ALL                                 &H000001EF
    #define CAPICOM_CHECK_OFFLINE_ALL                                &H000001F7
    
    #define CAPICOM_ENCRYPTION_ALGORITHM_RC2                         0
    #define CAPICOM_ENCRYPTION_ALGORITHM_RC4                         1
    #define CAPICOM_ENCRYPTION_ALGORITHM_DES                         2
    #define CAPICOM_ENCRYPTION_ALGORITHM_3DES                        3
    #define CAPICOM_ENCRYPTION_ALGORITHM_AES                         4 // v2.0
    
    #define CAPICOM_ENCRYPTION_KEY_LENGTH_MAXIMUM                    0
    #define CAPICOM_ENCRYPTION_KEY_LENGTH_40_BITS                    1
    #define CAPICOM_ENCRYPTION_KEY_LENGTH_56_BITS                    2
    #define CAPICOM_ENCRYPTION_KEY_LENGTH_128_BITS                   3
    #define CAPICOM_ENCRYPTION_KEY_LENGTH_192_BITS                   4 // AES v2.0
    #define CAPICOM_ENCRYPTION_KEY_LENGTH_256_BITS                   5 // AES v2.0
    
    #define CAPICOM_ENCODE_ANY                                       0xffffffff
    #define CAPICOM_ENCODE_BASE64                                    0
    #define CAPICOM_ENCODE_BINARY                                    1
    
    #define CAPICOM_EXPORT_DEFAULT                                   0
    #define CAPICOM_EXPORT_IGNORE_PRIVATE_KEY_NOT_EXPORTABLE_ERROR   1
    
    #define CAPICOM_HASH_ALGORITHM_SHA1                              0
    #define CAPICOM_HASH_ALGORITHM_MD2                               1
    #define CAPICOM_HASH_ALGORITHM_MD4                               2
    #define CAPICOM_HASH_ALGORITHM_MD5                               3
    #define CAPICOM_HASH_ALGORITHM_SHA_256                           4
    #define CAPICOM_HASH_ALGORITHM_SHA_384                           5
    #define CAPICOM_HASH_ALGORITHM_SHA_512                           6
    
    #define CAPICOM_KEY_STORAGE_DEFAULT                              0
    #define CAPICOM_KEY_STORAGE_EXPORTABLE                           1
    #define CAPICOM_KEY_STORAGE_USER_PROTECTED                       2
    
    #define CAPICOM_MY_STORE                                         "My"
    
    #define CAPICOM_PROPID_KEY_PROV_INFO                             2
    
    #define CAPICOM_STORE_OPEN_READ_ONLY                             0
    #define CAPICOM_STORE_OPEN_READ_WRITE                            1
    #define CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED                       2
    #define CAPICOM_STORE_OPEN_EXISTING_ONLY                         128
    #define CAPICOM_STORE_OPEN_INCLUDE_ARCHIVED                      256
    
    #define CAPICOM_STORE_SAVE_AS_SERIALIZED                         0
    #define CAPICOM_STORE_SAVE_AS_PKCS7                              1
    #define CAPICOM_STORE_SAVE_AS_PFX                                2
    
    #define CAPICOM_MEMORY_STORE                                     0
    #define CAPICOM_LOCAL_MACHINE_STORE                              1
    #define CAPICOM_CURRENT_USER_STORE                               2
    #define CAPICOM_ACTIVE_DIRECTORY_USER_STORE                      3
    #define CAPICOM_SMART_CARD_USER_STORE                            4
    
    // CAPICOM Chain check flag
    #define CAPICOM_TRUST_IS_NOT_TIME_VALID                          &H00000001
    #define CAPICOM_TRUST_IS_NOT_TIME_NESTED                         &H00000002
    #define CAPICOM_TRUST_IS_REVOKED                                 &H00000004
    #define CAPICOM_TRUST_IS_NOT_SIGNATURE_VALID                     &H00000008
    #define CAPICOM_TRUST_IS_NOT_VALID_FOR_USAGE                     &H00000010
    #define CAPICOM_TRUST_IS_UNTRUSTED_ROOT                          &H00000020
    #define CAPICOM_TRUST_REVOCATION_STATUS_UNKNOWN                  &H00000040
    #define CAPICOM_TRUST_IS_CYCLIC                                  &H00000080
    #define CAPICOM_TRUST_INVALID_EXTENSION                          &H00000100
    #define CAPICOM_TRUST_INVALID_POLICY_CONSTRAINTS                 &H00000200
    #define CAPICOM_TRUST_INVALID_BASIC_CONSTRAINTS                  &H00000400
    #define CAPICOM_TRUST_INVALID_NAME_CONSTRAINTS                   &H00000800
    #define CAPICOM_TRUST_HAS_NOT_SUPPORTED_NAME_CONSTRAINT          &H00001000
    #define CAPICOM_TRUST_HAS_NOT_DEFINED_NAME_CONSTRAINT            &H00002000
    #define CAPICOM_TRUST_HAS_NOT_PERMITTED_NAME_CONSTRAINT          &H00004000
    #define CAPICOM_TRUST_HAS_EXCLUDED_NAME_CONSTRAINT               &H00008000
    #define CAPICOM_TRUST_IS_OFFLINE_REVOCATION                      &H01000000
    #define CAPICOM_TRUST_NO_ISSUANCE_CHAIN_POLICY                   &H02000000
    #define CAPICOM_TRUST_IS_PARTIAL_CHAIN                           &H00010000
    #define CAPICOM_TRUST_CTL_IS_NOT_TIME_VALID                      &H00020000
    #define CAPICOM_TRUST_CTL_IS_NOT_SIGNATURE_VALID                 &H00040000
    #define CAPICOM_TRUST_CTL_IS_NOT_VALID_FOR_USAGE                 &H00080000
    #define KNOWN_TRUST_STATUS_MASK                                  &H030FFFFF
    
    #define CAPICOM_VERIFY_SIGNATURE_ONLY                            0
    #define CAPICOM_VERIFY_SIGNATURE_AND_CERTIFICATE                 1

    Manual_Registro_de_Boleto_Bancario_Online - Guia de integração Versão 2.2 janeiro/2019

    http://fivewin.com.br/index.php?/files/file/1123-manual_registro_de_boleto_bancario_online/

    Para testar a criptografia.

    https://redkestrel.co.uk/products/decoder/

  11. Boa tarde,

    Segue exemplo de registro online de boleto bancário BRADESCO, usando CAPICOM.DLL e MRBOLETO..

    Algumas considerações.

    [Fontes consultadas e utilizadas.]
    https://github.com/JoseQuintas/sefazclass
    https://github.com/fernandoathayde/hbnfe
    http://www.pctoledo.com.br/forum/viewtopic.php?f=43&t=18664
    CLASSE enviada pelo Rogerio Figueira em: 16/03/2015 do MRBOLETO

    Obs. Registrar as DLL's que se encontram no GitHub do Sr. Jose Quintas ( "msxml5.dll", "msxml5r.dll", "capicom.dll") OU baixar em https://pt.dll-files.com/capicom.dll.html
    As informações abaixo são do Sr. José Quintas em seu GitHub, de como registrar as dll's.

    1) Copiar as DLLs
    Se Windows 32 bits: copiar para c:\windows\system32
    Se Windows 64 bits: copiar para c:\windows\syswow64

    2) Registrar
    Tem que ser na pasta conforme acima, porque tem mais de um regsvr32.exe no Windows
    E como administrador. Pelo menos uma delas não aceita registrar como usuário comum.
    regsvr32.exe capicom.dll
    regsvr32.exe msxml5.dll

    3) Somente certificados válidos, remova certificados vencidos

    Obs. Eu coloquei na abertura do sistema, para verificar se esta registrada as dll's.

    4) A TIP.LIB, tem que estar no projeto para as funções: //1-hb_SHA1(),224-hb_SHA224(),256-hb_SHA256(),384-hb_SHA384(),512-hb_SHA512() e HB_Base64Encode()

    Obs. A EMPRESA QUE FOR UTILIZAR o software , TEM QUE REGISTRAR ESTE TIPO DE CONTRATO PARA USO DE REGISTRO ONLINE DE BOLETOS NO BRADESCO, ATRAVÉS DE SEU GERENTE. Não consegui anexar o Manual_Registro_de_Boleto_Bancario_Online, mas procurando na internet se acha, é o Guia de integração Versão 2.2 janeiro/2019 ( MANUAL TÉCNICO E LAYOUT REGISTRO ON-LINE DE BOLETOS DE COBRANÇA BRADESCO)

    O Fonte abaixo tem as minhas tabelas, algumas rotinas que são usadas pelo meu software, mas o que interessa são as funções e classes da CAPICOM  e MRBOLETO.

    CONSUMO DE WEBSERVICE (BRADESCO).

    homologação -  "https://cobranca.bradesconetempresa.b.br/ibpjregistrotitulows/registrotitulohomologacao"
    produção        -  "https://cobranca.bradesconetempresa.b.br/ibpjregistrotitulows/registrotitulo"}

    function gera_boleto_nf_pedido(objetboleto)
             LOCAL cSignatureValue, cDigestValue, cPublicKey
    		 
    		 asamplzboletos   = {}
             arecboletos      = {}
    		 xncertificado    = ""
    		 xnpfxcertificado = ""
    		 xnpfxsenha       = ""
    		 xnurlbanco       = ""
    		 
    		 tseqconf = 1
             cwQuery := "select * from adconfiggeral where "+;
                        "seqconf = " + alltrim(str(tseqconf))  +" order by seqconf asc;"
             owQuery := oServer:Query(cwQuery)
             zxboletogeral   = owQuery:Fieldget(owQuery:Fieldpos('boletogeral'))
    		 owQuery:destroy()
    		 
             cquery := "select fncaixas.seqcaixa,fncaixas.descricaocaixa,contaboleto.* from fncaixas,contaboleto where" +;
                       " fncaixas.seqcaixa = contaboleto.caixa"
    		 //cquery += " and substr(fncaixas.descricaocaixa,1"+","+alltrim(str(len(alltrim(opesquisaunidade:cText))))+")"+;
             //          " = " + "'"+alltrim(opesquisaunidade:cText)+"'"
             if zxboletogeral = .f.
    		    cquery += " and contaboleto.loja = " + alltrim(str(zseqloja))
    	     endif
    		 cquery += " order by fncaixas.descricaocaixa asc;"
             oquery := oServer:Query(cquery)
             tt = oquery:Fieldget(oquery:Fieldpos('seqcontaboleto'))
    		 if empty(tt)
                oquery:destroy()
    		    msgstop("Nenhum banco foi cadastrado para emissão de boleto bancário.","Atenção")
    		    return nil
    		 endif
             DO WHILE ! oquery:Eof()
                a = oquery:Fieldget(oquery:Fieldpos('seqcontaboleto'))
                b = oquery:Fieldget(oquery:Fieldpos('descricaocaixa'))
                aadd( asamplzboletos,{b,alltrim(str(a))} )
                aadd( arecboletos,a )
                oquery:Skip()
             END
             oquery:destroy()
    		 
             nresp = fWait( "........* processando *........")
    		 
    		 if objetboleto = "Nfe"
    		    
    			qq = ver_marcado_nota()
                if qq = "N"
                   oDlgWait:end()
                   msgstop("Nenhuma nota fiscal foi marcada para o boleto.","Atenção")
                   return nil
                endif
    		    
                cQuery := "select * from ftnotafiscal where"+;
                          " seqnotafiscal = " + alltrim(str(mnr))+;
                          " order by seqnotafiscal asc;"
                oQuery := oServer:Query(cQuery)
                ncontroledocumento            = oQuery:Fieldget(oQuery:Fieldpos('controledocumento'))
                npstu                         = oQuery:Fieldget(oQuery:Fieldpos('statusdanotafiscal'))
                ntipovenda                    = oQuery:Fieldget(oQuery:Fieldpos('tipovenda'))
                ncodigodestinatario           = oQuery:Fieldget(oQuery:Fieldpos('codigodestinatario'))
    			nDataemissao_a_gravar         = oQuery:Fieldget(oQuery:Fieldpos('dataemissao'))
    			nNumerododocument_a_gravar    = "Boletos_Nfe" + "_" + alltrim(oQuery:Fieldget(oQuery:Fieldpos('numerodanf')))
    			oQuery:destroy()
    			
    		    if npstu = "01"
                   oDlgWait:end()
                   msgstop("Esta nota não foi validada.","Atenção")
                   return nil
                endif
                if val(npstu) <= 4
                   oDlgWait:end()
                   msgstop("Esta nota não foi autorizada.","Atenção")
                   return nil
                endif
    		    if npstu = "06"
                   oDlgWait:end()
                   msgstop("Esta nota foi cancelada.","Atenção")
                   return nil
                endif
    		    if npstu = "08"
                   oDlgWait:end()
                   msgstop("Esta nota foi denegada.","Atenção")
                   return nil
                endif
    		    if ntipovenda != 2
                   oDlgWait:end()
                   msgstop("Esta nota não foi a prazo.","Atenção")
                   return nil
    		    endif
    		 
    		 elseif objetboleto = "Ped"
    		    
    			if empty(mPnumerodopedido)
                   oDlgWait:end()
                   msgstop("Sem pedido inicializado.","Atenção")
                   return nil
                endif
    			if empty(asamplzPEDpedido[1,1])
                   oDlgWait:end()
                   msgstop("Sem pedido inicializado.","Atenção")
                   return nil
    			endif
    			if !empty(mPnumeronotafiscal)
                   oDlgWait:end()
                   msgstop("Foi gerado uma NF-e para este pedido, o boleto deve ser pela NFe.","Atenção")
                   return nil
    			endif
    			
                cquery := "select * from ftpedido where "+;
                          "loja = " + alltrim(str(zseqloja)) +;
                          " and pedidoromaneio = 'P'"+;
    					  " and entradasaida = 'S'"+;
                          " and numerodopedido = " + alltrim(str(mPnumerodopedido))
                cquery += " order by loja asc, numerodopedido asc;"
                oquery := oServer:Query(cquery)
                tseqpedido                 = oquery:Fieldget(oquery:Fieldpos('seqpedido'))
    			ncontroledocumento         = oquery:Fieldget(oquery:Fieldpos('controledocumento'))
                tsituacaopedido            = oquery:Fieldget(oquery:Fieldpos('situacaopedido'))
                ncodigodestinatario        = oQuery:Fieldget(oQuery:Fieldpos('idcliente'))
                ntipovenda                 = oQuery:Fieldget(oQuery:Fieldpos('tipovenda'))
    			nDataemissao_a_gravar      = oQuery:Fieldget(oQuery:Fieldpos('dataemissao'))
    			nNumerododocument_a_gravar = "Boletos_Ped" + "_" + alltrim(str(oQuery:Fieldget(oQuery:Fieldpos('numerodopedido'))))
                oquery:destroy()
                if empty(tseqpedido)
                   oDlgWait:end()
                   msgstop("Pedido não encontrado","Atenção")
                   return nil
                endif
                if tsituacaopedido = 1 .or. tsituacaopedido = 3
                   oDlgWait:end()
                   msgstop(iif(tsituacaopedido = 1,"Pedido em digitação.",iif(tsituacaopedido = 3,"Pedido cancelado.","")),"Atenção")
                   return nil
                endif
    		    if ntipovenda != 2
                   oDlgWait:end()
                   msgstop("Esta nota não foi a prazo.","Atenção")
                   return nil
    		    endif
    		 
    		 endif
    		 
    		 //Pesquisa por clientes
             cQuery := "select * from fncliente where "+;
                       "seqcliente = " + alltrim(str(ncodigodestinatario))
             cQuery += " order by seqcliente asc;"
             oQuery := oServer:Query(cQuery)
             rseqcliente           = oQuery:Fieldget(oQuery:Fieldpos('seqcliente'))
    		 rpessoafisicajuridica = oQuery:Fieldget(oQuery:Fieldpos('pessoafisicajuridica'))
             rrazaosocial          = oQuery:Fieldget(oQuery:Fieldpos('razaosocial'))
             
    		 rfantasia             = alltrim(oQuery:Fieldget(oQuery:Fieldpos('fantasia')))
    		 rfantasia             = trata_boleto( rfantasia )
    		 
             rendereco             = substr(oQuery:Fieldget(oQuery:Fieldpos('endereco')),1,40)
             rcomplemento          = oQuery:Fieldget(oQuery:Fieldpos('complemento'))
             rnumero               = oQuery:Fieldget(oQuery:Fieldpos('numero'))
             rbairro               = oQuery:Fieldget(oQuery:Fieldpos('bairro'))
             rcep                  = oQuery:Fieldget(oQuery:Fieldpos('cep'))
             rcidade               = oQuery:Fieldget(oQuery:Fieldpos('cidadeibge'))
             ruf                   = oQuery:Fieldget(oQuery:Fieldpos('uf'))
             rtelefone             = oQuery:Fieldget(oQuery:Fieldpos('telefone1'))
    		 remail                = oQuery:Fieldget(oQuery:Fieldpos('email'))
    		 rpessoacontato        = oQuery:Fieldget(oQuery:Fieldpos('pessoacontato'))
             rcnpjcpf              = oQuery:Fieldget(oQuery:Fieldpos('numerodocumentonacional'))
             rinscricaoestadualrg  = oQuery:Fieldget(oQuery:Fieldpos('numerodocumentolocal'))
             oquery:destroy()
    		 if empty(rseqcliente)
                oDlgWait:end()
                msgstop("Cliente não encontrado.","Atenção")
                return nil
    		 endif
    		 if substr(rrazaosocial,1,10) = "CONSUMIDOR"
                oDlgWait:end()
                msgstop("Cliente não pode ser consumidor.","Atenção")
                return nil
    		 endif
    		 if empty(rcnpjcpf)
                oDlgWait:end()
                msgstop("CPF/CNPJ não informado.","Atenção")
                return nil
    		 endif
    		 if empty(rrazaosocial)
                oDlgWait:end()
                msgstop("Cliente sem razão social / Nome.","Atenção")
                return nil
    		 endif
    		 if empty(rendereco)
                oDlgWait:end()
                msgstop("Cliente sem endereço.","Atenção")
                return nil
    		 endif
    		 if empty(rnumero)
                oDlgWait:end()
                msgstop("Cliente sem número.","Atenção")
                return nil
    		 endif
    		 if empty(rbairro)
                oDlgWait:end()
                msgstop("Cliente sem bairro.","Atenção")
                return nil
    		 endif
    		 if empty(rcidade)
                oDlgWait:end()
                msgstop("Cliente sem cidade.","Atenção")
                return nil
    		 endif
    		 if empty(ruf)
                oDlgWait:end()
                msgstop("Cliente sem o estado.","Atenção")
                return nil
    		 endif
    		 if len(alltrim(rcep)) != 8
                oDlgWait:end()
                msgstop("Cep inconsistente.","Atenção")
                return nil
    		 endif
    		 
    		 nNumerododocument_a_gravar = nNumerododocument_a_gravar + "_" + alltrim(rfantasia) + ".pdf"
    		 
             
    		 nOpcao   = CurDrive()+ ":\" + CurDir() + "\boletos"
    		 if !IsDirectory(nOpcao)
    		    lmkdir(nOpcao)
    		 endif
             nOpcao   = CurDrive()+ ":\" + CurDir() + "\boletos\" + substr(dtos(nDataemissao_a_gravar),5,2) + substr(dtos(nDataemissao_a_gravar),1,4)
    		 if !IsDirectory(nOpcao)
    		    lmkdir(nOpcao)
    		 endif
             nOpcao   = CurDrive()+ ":\" + CurDir() + "\boletos\" + substr(dtos(nDataemissao_a_gravar),5,2) + substr(dtos(nDataemissao_a_gravar),1,4) + "\" + substr(nNumerododocument_a_gravar,9,3)
    		 if !IsDirectory(nOpcao)
    		    lmkdir(nOpcao)
    		 endif
    		 
    		 cFilePdf = CurDrive()+ ":\" + CurDir() + "\boletos\" + substr(dtos(nDataemissao_a_gravar),5,2) + substr(dtos(nDataemissao_a_gravar),1,4) + "\" + substr(nNumerododocument_a_gravar,9,3) + + "\" + nNumerododocument_a_gravar
    		 
    		 if file( cFilePdf )
                oDlgWait:end()
    			if msgyesno("Deseja reimprimir o boleto ?","Atenção") = .t.
    			   //if file( Curdrive() + ":\" + CurDir() + "\" + "sumatrapdf.exe" )
    		       //   winexec( Curdrive() + ":\" + CurDir() + "\" + "sumatrapdf.exe " + cFilePdf )
    		       //else
                      run("explorer.exe " + cFilePdf )
    		       //endif
    			endif
                return nil
             endif
    
    		 mpassaverificavencimento = "S"
    		 mpassaverificaseboleto   = "N"
    		 tdescricaomeiospagamento = ""
    		 ttnnqq = 1
    		 cquery := "select * from fntitulosclientefornecedor where"+;
                       " controledocumento = " + alltrim(str(ncontroledocumento))+;
                       " order by datavencimento asc;"
             oquery := oServer:Query(cquery)
             aseqtitulo = oquery:Fieldget(oquery:Fieldpos('seqtitulo'))
    		 if !empty(aseqtitulo)
    		    do while !oquery:eof()
    			   andup          = oquery:Fieldget(oquery:Fieldpos('numeroordem'))
                   advenc         = oquery:Fieldget(oquery:Fieldpos('datavencimento'))
                   avdup          = oquery:Fieldget(oquery:Fieldpos('valortitulo'))
    		       tMeiopagamento = oquery:Fieldget(oquery:Fieldpos('idmeiospagamento'))
                   
    			   cwquery := "select * from fnmeiospagamento where "+;
                              "seqmeiospagamento = " + alltrim(str(tMeiopagamento))
                   cwquery += " order by seqmeiospagamento asc;"
                   owquery := oServer:Query(cwquery)
                   tgeneromeiospagamento     = alltrim(upper(owquery:Fieldget(owquery:Fieldpos('generomeiospagamento'))))    // BOLETO
    			   tdescricaomeiospagamento  = owquery:Fieldget(owquery:Fieldpos('descricaomeiospagamento'))
    		       tidmeionf                 = owquery:Fieldget(owquery:Fieldpos('idmeionf'))
    		       owquery:destroy()
    			   
    			   if objetboleto = "Ped"
    			      if alltrim(upper(tgeneromeiospagamento)) = "BOLETO"
    			         if ttnnqq = 1
    				        tidmeionf = 15
    				        mpassaverificaseboleto = "S"
    					    ++ttnnqq
    				     endif
    				  else 
    				     tidmeionf = 99
    				  endif
    			   endif
    			   
                   if tidmeionf = 15
    			      if ttnnqq = 1
    				     mpassaverificaseboleto = "S"
    					 ++ttnnqq
    				  endif
    			      if advenc < ldate
    				     mpassaverificavencimento = "N"
    					 exit
    				  endif
                   endif
    			   oquery:skip()
                end
    		    oquery:destroy()
    		 endif
    		 if mpassaverificavencimento = "N"
                oDlgWait:end()
    		    msgstop("O título " + alltrim(andup) + " no valor de R$ " + alltrim(transform(avdup,"@e 999,999,999.99")) +;
       			        " a data de vencimento " + substr(dtos(advenc),7,2) + "/" + substr(dtos(advenc),5,2) + "/" + substr(dtos(advenc),1,4) +;
    					" é inferior a data de emissão do boleto " + substr(dtos(ldate),7,2) + "/" + substr(dtos(ldate),5,2) + "/" + substr(dtos(ldate),1,4) +;
    					". Favor alterar a data de vencimento do título ou o meio de pagamento. ","Atenção")
    			return nil 
    		 endif
    		 if mpassaverificaseboleto = "N"
    		    if !empty(tdescricaomeiospagamento)
    			   oDlgWait:end()
    			   msgstop("Contas a receber gerado é " + alltrim(tdescricaomeiospagamento),"Atenção")
    		       return nil
    			else
    			   oDlgWait:end()
    			   msgstop("Sem contas a receber localizado.","Atenção")
    		       return nil
    			endif
    		 endif
    		 
    		 mlinha1 = iif(rpessoafisicajuridica = "J",transform(rcnpjcpf,"@r 99.999.999/9999-99"),transform(rcnpjcpf,"@r 999.999.999-99"))
             mlinha2 = alltrim(rrazaosocial)
             mlinha3 = "Endereço: " + alltrim(rendereco) + "," + alltrim(rnumero) + iif(!empty(rcomplemento),"-"+alltrim(rcomplemento),"") +;
                       " Bairro: " + alltrim(rbairro)
    		 mlinha4 = "Cep: " + transform(alltrim(rcep),"@r 99.999-999") + " " + " Cidade: " + alltrim(rcidade) + "/"  + ruf
    
    		 nEscolheuboletos = "N"
    		 define dialog emissao_boleto title "" from 000,000 to 650,595 Pixel transparent
                    @ 005,005 say "Escolha o banco para emitir o boleto" font mtahomagrandeletra size 300,17 of emissao_boleto color corfrtsayds,corfdogetnotafiscal pixel
                    @ 025,005 listbox obrzboletos fields asamplzboletos[obrzboletos:nat,1],asamplzboletos[obrzboletos:nat,2];
                              headers "Banco","Cd" FIELDSIZES 485,020;
                              size 288,290;
                              pixel of emissao_boleto font mtahomagg
                    obrzboletos:nLineStyle := 2
                    obrzboletos:lCellStyle = .t.
                    obrzboletos:lAutoSkip  = .t.
                    obrzboletos:SetArray(asamplzboletos)
                    obrzboletos:bGoTop = { || obrzboletos:nat := 1 }
                    obrzboletos:bGoBottom = { || obrzboletos:nat := Eval( obrzboletos:bLogicLen ) }
                    obrzboletos:bSkip = { | nWant, nOld | nOld := obrzboletos:nat, obrzboletos:nat += nWant,;
                    obrzboletos:nat := Max( 1, Min( obrzboletos:nat, Eval( obrzboletos:bLogicLen ) ) ),;
                    obrzboletos:nat - nOld }
                    obrzboletos:bLogicLen = { || Len( asamplzboletos ) }
                    obrzboletos:cAlias = "Array"
                    obrzboletos:nColAct       := 1
                    obrzboletos:lMChange      := .F.
                    obrzboletos:SetFocus()
                    obrzboletos:Refresh()
    		 		
    		 	    emissao_boleto:bKeyDown := {|nKey| IIf( nKey == VK_RETURN, ((nEscolheuboletos := "S"),emissao_boleto:end()) ,0)}
    		 		
    		 activate dialog emissao_boleto center
    		 if nEscolheuboletos = "N"
                oDlgWait:end()
    		    return nil
    		 endif
    		 
    		 mseqctaboleto = arecboletos[obrzboletos:nat]
    		 
    		 if IsInternet() == .f.
                oDlgWait:end()
                msgstop("Necessário conexão com internet." + CRLF + "Operação cancelada","Informação")
    			return nil
             endif
    		 
             cwquery := "select * from contaboleto where "+;
                        "seqcontaboleto = " + alltrim(str(mseqctaboleto)) + " order by seqcontaboleto asc;"
             owquery := oServer:Query(cwquery)
             xnloja           =  owquery:Fieldget(owquery:Fieldpos('loja'))           //smallint
             xncaixa          =  owquery:Fieldget(owquery:Fieldpos('caixa'))          //integer
             xnbanco          =  owquery:Fieldget(owquery:Fieldpos('banco'))          //character(50)
             xnagencia        =  owquery:Fieldget(owquery:Fieldpos('agencia'))        //character(08)
             xndagencia       =  owquery:Fieldget(owquery:Fieldpos('dagencia'))       //character(02)
             xndagencia_Un    =  owquery:Fieldget(owquery:Fieldpos('dagencia_Un'))    //character(02)
             xnconta          =  owquery:Fieldget(owquery:Fieldpos('conta'))          //character(15)
             xndconta         =  owquery:Fieldget(owquery:Fieldpos('dconta'))         //character(02)
             xnoperacao       =  owquery:Fieldget(owquery:Fieldpos('operacao'))       //character(02)
             xncarteira       =  owquery:Fieldget(owquery:Fieldpos('carteira'))       //character(15)
             xntpcarteira     =  owquery:Fieldget(owquery:Fieldpos('tpcarteira'))     //character(15)
             xnnossonumerobco =  owquery:Fieldget(owquery:Fieldpos('nossonumero'))    //character(15)
    		 xnnMusarnosso    =  owquery:Fieldget(owquery:Fieldpos('usarnosso'))      //boolean
             xnprefixo        =  owquery:Fieldget(owquery:Fieldpos('prefixo'))        //character(08)
             xndprefixo       =  owquery:Fieldget(owquery:Fieldpos('dprefixo'))       //character(02)
             xnaceite         =  owquery:Fieldget(owquery:Fieldpos('aceite'))         //character(02)
             xnespecie        =  owquery:Fieldget(owquery:Fieldpos('especie'))        //character(02)
             xnlocalpagamento =  owquery:Fieldget(owquery:Fieldpos('localpagamento')) //character(200)
             xnvias           =  owquery:Fieldget(owquery:Fieldpos('vias'))           //character(02)
             xninstrucao      =  owquery:Fieldget(owquery:Fieldpos('instrucao'))      //text
             xndemonstrativo  =  owquery:Fieldget(owquery:Fieldpos('demonstrativo'))  //text
    		 xncertificado    =  owquery:Fieldget(owquery:Fieldpos('certificado'))    //Certificado instalado no windows
    		 xnemitido        =  owquery:Fieldget(owquery:Fieldpos('emitido'))        //Data de emissão do certificado
    		 xnvalidade       =  owquery:Fieldget(owquery:Fieldpos('validade'))       //Validade do certificado
             xnpfxcertificado =  alltrim(owquery:Fieldget(owquery:Fieldpos('pfxcertificado'))) //Arquivo pfx do certificado
             xnpfxsenha       =  alltrim(owquery:Fieldget(owquery:Fieldpos('pfxsenha')))       //Senha do arquivo pfx do certificado
             xnurlbanco       =  alltrim(owquery:Fieldget(owquery:Fieldpos('urlbanco')))       //url de envido de registro de boleto do Bradesco
             owquery:destroy()
    		
             cwQuery := "select * from adloja where seqloja = " + alltrim(str(xnloja))
             owQuery := oServer:Query(cwQuery)
             aaloja = owquery:Fieldget(owquery:Fieldpos('numerodocumentonacional'))
             abloja = owquery:Fieldget(owquery:Fieldpos('razaosocial'))
             acloja = owquery:Fieldget(owquery:Fieldpos('endereco'))
             adloja = owquery:Fieldget(owquery:Fieldpos('numero'))
             aeloja = owquery:Fieldget(owquery:Fieldpos('complemento'))
             afloja = owquery:Fieldget(owquery:Fieldpos('bairro'))
             agloja = owquery:Fieldget(owquery:Fieldpos('cep'))
             ahloja = owquery:Fieldget(owquery:Fieldpos('cidadeibge'))
             ailoja = owquery:Fieldget(owquery:Fieldpos('uf'))
             owQuery:destroy()
    		 
    		 mlinh1 = "CNPJ: " + transform(alltrim(aaloja),"@r 99.999.999-9999/99")
             mlinh2 = alltrim(abloja)
             mlinh3 = alltrim(acloja) + "," + alltrim(adloja) + iif(!empty(aeloja),"-"+alltrim(aeloja),"") +;
                      " B:" + alltrim(afloja) + " " + transform(alltrim(agloja),"@r 99.999-999") + " " + alltrim(ahloja) + "/"  + ailoja
    		 
    		 if substr(xnbanco,1,3) = "237" // bradesco
                
    			if !empty(xncertificado)
    		       if ldate > xnvalidade
                      msgstop("Certificado com validade vencida.","Atenção")
    			      oDlgWait:end()
    		          return nil
    			   endif
    			else
    			   if empty(xnpfxcertificado)
                      msgstop("Arquivo pfx não informado.","Atenção")
    			      oDlgWait:end()
    		          return nil
    		       endif
    			   if empty(xnpfxsenha)
                      msgstop("Senha do arquivo pfx não informado.","Atenção")
    			      oDlgWait:end()
    		          return nil
    		       endif
    		    endif
    			if empty(xnurlbanco)
                   msgstop("URL de registro online do boleto Bradesco não informado.","Atenção")
    			   oDlgWait:end()
    		       return nil
    			endif
    			
    		 endif
    		 
    		 nregistroutitulo = "N"
    		 cquery := "select * from fntitulosclientefornecedor where"+;
                       " controledocumento = " + alltrim(str(ncontroledocumento))+;
    				   " and boletoemitido != " + "'"+ "y" + "'"+;
                       " order by datavencimento asc;"
             oquery := oServer:Query(cquery)
             aseqtitulo = oquery:Fieldget(oquery:Fieldpos('seqtitulo'))
    		 if !empty(aseqtitulo)
    		    do while !oquery:eof()
                   aseq           = oquery:Fieldget(oquery:Fieldpos('seqtitulo'))
                   andup          = oquery:Fieldget(oquery:Fieldpos('numeroordem'))
                   advenc         = oquery:Fieldget(oquery:Fieldpos('datavencimento'))
                   avdup          = oquery:Fieldget(oquery:Fieldpos('valortitulo'))
    		       tMeiopagamento = oquery:Fieldget(oquery:Fieldpos('idmeiospagamento'))
    			   if xnnMusarnosso = .t.
    			      tnossonumerosequencia = oquery:Fieldget(oquery:Fieldpos('nossonumerosequencia'))
    			   else
    			      tnossonumerosequencia = oquery:Fieldget(oquery:Fieldpos('nossonumerobancario'))
    			   endif
    			   if !empty(tnossonumerosequencia)
    			      oquery:skip()
    				  loop
    			   endif
    		       
    		       cwquery := "select * from fnmeiospagamento where "+;
                              "seqmeiospagamento = " + alltrim(str(tMeiopagamento))
                   cwquery += " order by seqmeiospagamento asc;"
                   owquery := oServer:Query(cwquery)
                   tgeneromeiospagamento     = alltrim(upper(owquery:Fieldget(owquery:Fieldpos('generomeiospagamento'))))    // BOLETO
    		       tidmeionf                 = owquery:Fieldget(owquery:Fieldpos('idmeionf'))
    		       owquery:destroy()
    			   
    			   if objetboleto = "Ped"
    			      if alltrim(upper(tgeneromeiospagamento)) = "BOLETO"
    				     tidmeionf = 15
    				  else 
    				     tidmeionf = 99
    				  endif
    			   endif
    		       
                   if tidmeionf = 15
    			   
    				  _nxgravarnumero = ""
    				  _nxgravarnumeroPego = ""
    				  
    				  if xnnMusarnosso = .t.
    				     oBoleto  := MR_Boleto():New( "nosso_numero.pdf" )
    				     oBoleto:Banco________ := substr(xnbanco,1,3)
                         oBoleto:Banco_Agencia := alltrim(xnagencia)
                         oBoleto:Banco_Ag_Dv__ := iif(empty(xndagencia),"",alltrim(xndagencia))
                         oBoleto:Banco_Ag_Un_A := iif(empty(xndagencia_Un),"",alltrim(xndagencia_Un))
                         oBoleto:Conta________ := alltrim(xnconta)
                         oBoleto:Conta_DV_____ := alltrim(xndconta)
                         oBoleto:Conta_OP_____ := iif(empty(xnoperacao),"","'" + alltrim(xnoperacao))
                         oBoleto:Carteira_____ := alltrim(xncarteira)
                         oBoleto:Carteira_Tipo := iif(empty(xntpcarteira),"",alltrim(xntpcarteira))
                         oBoleto:NossoNumero__ := alltrim(xnnossonumerobco)
                         oBoleto:Doc_Origem___ := iif( substr(nNumerododocument_a_gravar,9,3) = "Ped","DM","DM")
                         oBoleto:Prefixo______ := iif(empty(xnprefixo),"",alltrim(xnprefixo))
                         oBoleto:Prefixo_DV___ := iif(empty(xndprefixo),"",alltrim(xndprefixo))
                         oBoleto:Doc_Numero___ := alltrim(andup)
                         oBoleto:Doc_Aceite___ := alltrim(xnaceite)
                         oBoleto:Doc_Especie__ := alltrim(xnespecie)
                         oBoleto:Doc_Data_____ := ldate //nDataemissao_a_gravar
                         oBoleto:Vencimento___ := advenc
                         oBoleto:Valor________ := avdup
                         oBoleto:Multa_Auto___ := iif(empty(zfinmultaatraso),0,zfinmultaatraso)
                         oBoleto:Juros_Mes____ := iif(empty(zfintaxajurosmensal),0,zfintaxajurosmensal)
                         oBoleto:Numero_Vias__ := val(xnvias)
                         oBoleto:Local_Pagamen := { xnlocalpagamento }
    				     oBoleto:Instrucoes___ := { "","" }
                         oBoleto:Demonstrativo := { "","","","","","","","","","","","","","","" }
                         oBoleto:Cedente______ := { mlinh1,mlinh2,mlinh3}
                         oBoleto:Sacado_______ := { mlinha1,mlinha2,mlinha3,mlinha4 }
    				     oBoleto:Avalista_____ := { "Não informado.", "", "" }
    				     oBoleto:AddPage()
    			         oBoleto:Finish()
    					 _nxgravarnumero = alltrim(oBoleto:NossoNumero__)
    				     delete file "nosso_numero.pdf"
    				  endif
    				  
    				  if substr(xnbanco,1,3) = "237" // bradesco
    				  	 
    					 narquivoJSON := '{'
                         narquivoJSON += '"nuCPFCNPJ":'                            + '"' + substr(alltrim(aaloja),1,8)               + '",'
                         narquivoJSON += '"filialCPFCNPJ":'                        + '"' + substr(alltrim(aaloja),9,4)               + '",'
                         narquivoJSON += '"ctrlCPFCNPJ":'                          + '"' + substr(alltrim(aaloja),13,2)              + '",'
                         narquivoJSON += '"cdTipoAcesso":'                         + '"' + '2'                                       + '",'
    				  	 narquivoJSON += '"clubBanco":'                            + '"' + '0'                                       + '",'
                         narquivoJSON += '"cdTipoContrato":'                       + '"' + '0'                                       + '",'
    				  	 narquivoJSON += '"nuSequenciaContrato":'                  + '"' + '0'                                       + '",'
                         narquivoJSON += '"idProduto":'                            + '"' + strzero(val(xncarteira),2)                + '",'
    				  	 narquivoJSON += '"nuNegociacao":'                         + '"' + alltrim(xnagencia) + '0000000' + alltrim(xnconta) + '",'
                         narquivoJSON += '"cdBanco":'                              + '"' + substr(xnbanco,1,3)                       + '",'
                         narquivoJSON += '"eNuSequenciaContrato":'                 + '"' + '0'                                       + '",'
                         narquivoJSON += '"tpRegistro":'                           + '"' + '1'                                       + '",'
                         narquivoJSON += '"cdProduto":'                            + '"' + '0'                                       + '",'
                         narquivoJSON += '"nuTitulo":'                             + '"' + iif(empty(_nxgravarnumero),'0',_nxgravarnumero) + '",'
                         narquivoJSON += '"nuCliente":'                            + '"' + substr(alltrim(andup),1,10)               + '",'
                         narquivoJSON += '"dtEmissaoTitulo":'                      + '"' + substr(dtos(ldate),7,2)  + "." + substr(dtos(ldate),5,2)  + "." + substr(dtos(ldate),1,4)  + '",'
                         narquivoJSON += '"dtVencimentoTitulo":'                   + '"' + substr(dtos(advenc),7,2) + "." + substr(dtos(advenc),5,2) + "." + substr(dtos(advenc),1,4) + '",'
                         narquivoJSON += '"tpVencimento":'                         + '"' + '0'                                       + '",'
                         narquivoJSON += '"vlNominalTitulo":'                      + '"' + alltrim(str(int(avdup * 100)))            + '",'
                         narquivoJSON += '"cdEspecieTitulo":'                      + '"' + '02'                                      + '",'
                         narquivoJSON += '"tpProtestoAutomaticoNegativacao":'      + '"' + '0'                                       + '",'
                         narquivoJSON += '"prazoProtestoAutomaticoNegativacao":'   + '"' + '0'                                       + '",'
                         narquivoJSON += '"controleParticipante":'                 + '"' + ''                                        + '",'
                         narquivoJSON += '"cdPagamentoParcial":'                   + '"' + ''                                        + '",'
                         narquivoJSON += '"qtdePagamentoParcial":'                 + '"' + '0'                                       + '",'
                         narquivoJSON += '"percentualJuros":'                      + '"' + '0'                                       + '",'
                         narquivoJSON += '"vlJuros":'                              + '"' + '0'                                       + '",'
                         narquivoJSON += '"qtdeDiasJuros":'                        + '"' + '0'                                       + '",'
                         narquivoJSON += '"percentualMulta":'                      + '"' + '0'                                       + '",'
                         narquivoJSON += '"vlMulta":'                              + '"' + '0'                                       + '",'
                         narquivoJSON += '"qtdeDiasMulta":'                        + '"' + '0'                                       + '",'
                         narquivoJSON += '"percentualDesconto1":'                  + '"' + '0'                                       + '",'
                         narquivoJSON += '"vlDesconto1":'                          + '"' + '0'                                       + '",'
                         narquivoJSON += '"dataLimiteDesconto1":'                  + '"' + ''                                        + '",'
                         narquivoJSON += '"percentualDesconto2":'                  + '"' + '0'                                       + '",'
                         narquivoJSON += '"vlDesconto2":'                          + '"' + '0'                                       + '",'
                         narquivoJSON += '"dataLimiteDesconto2":'                  + '"' + ''                                        + '",'
                         narquivoJSON += '"percentualDesconto3":'                  + '"' + '0'                                       + '",'
                         narquivoJSON += '"vlDesconto3":'                          + '"' + '0'                                       + '",'
                         narquivoJSON += '"dataLimiteDesconto3":'                  + '"' + ''                                        + '",'
                         narquivoJSON += '"prazoBonificacao":'                     + '"' + '0'                                       + '",'
                         narquivoJSON += '"percentualBonificacao":'                + '"' + '0'                                       + '",'
                         narquivoJSON += '"vlBonificacao":'                        + '"' + '0'                                       + '",'
                         narquivoJSON += '"dtLimiteBonificacao":'                  + '"' + ''                                        + '",'
                         narquivoJSON += '"vlAbatimento":'                         + '"' + '0'                                       + '",'
                         narquivoJSON += '"vlIOF":'                                + '"' + '0'                                       + '",'
    				  	 narquivoJSON += '"nomePagador":'                          + '"' + alltrim(rrazaosocial)                     + '",'
                         narquivoJSON += '"logradouroPagador":'                    + '"' + alltrim(rendereco)                        + '",'
                         narquivoJSON += '"nuLogradouroPagador":'                  + '"' + alltrim(rnumero)                          + '",'
                         narquivoJSON += '"complementoLogradouroPagador":'         + '"' + iif(empty(alltrim(rcomplemento)),'',alltrim(rcomplemento)) + '",'
                         narquivoJSON += '"cepPagador":'                           + '"' + substr(alltrim(rcep),1,5)                 + '",'
                         narquivoJSON += '"complementoCepPagador":'                + '"' + substr(alltrim(rcep),6,3)                 + '",'
                         narquivoJSON += '"bairroPagador":'                        + '"' + alltrim(rbairro)                          + '",'
                         narquivoJSON += '"municipioPagador":'                     + '"' + alltrim(rcidade)                          + '",'
                         narquivoJSON += '"ufPagador":'                            + '"' + ruf                                       + '",'
    				  	 narquivoJSON += '"cdIndCpfcnpjPagador":'                  + '"' + iif(len(alltrim(rcnpjcpf)) = 11,'1','2')  + '",'
                         narquivoJSON += '"nuCpfcnpjPagador":'                     + '"' + alltrim(rcnpjcpf)                         + '",'
                         narquivoJSON += '"endEletronicoPagador":'                 + '"' + ''                                        + '",'
                         narquivoJSON += '"nomeSacadorAvalista":'                  + '"' + ''                                        + '",'
                         narquivoJSON += '"logradouroSacadorAvalista":'            + '"' + ''                                        + '",'
                         narquivoJSON += '"nuLogradouroSacadorAvalista":'          + '"' + '0'                                       + '",'
                         narquivoJSON += '"complementoLogradouroSacadorAvalista":' + '"' + ''                                        + '",'
                         narquivoJSON += '"cepSacadorAvalista":'                   + '"' + '0'                                       + '",'
                         narquivoJSON += '"complementoCepSacadorAvalista":'        + '"' + '0'                                       + '",'
                         narquivoJSON += '"bairroSacadorAvalista":'                + '"' + ''                                        + '",'
                         narquivoJSON += '"municipioSacadorAvalista":'             + '"' + ''                                        + '",'
                         narquivoJSON += '"ufSacadorAvalista":'                    + '"' + ''                                        + '",'
                         narquivoJSON += '"cdIndCpfcnpjSacadorAvalista":'          + '"' + '0'                                       + '",'
                         narquivoJSON += '"nuCpfcnpjSacadorAvalista":'             + '"' + '0'                                       + '",'
                         narquivoJSON += '"endEletronicoSacadorAvalista":'         + '"' + ''                                        + '"' 
    		             narquivoJSON += '}'
                         
    					 //1-hb_SHA1(),224-hb_SHA224(),256-hb_SHA256(),384-hb_SHA384(),512-hb_SHA512()
    					 cDigestValue    := CapicomClass():HashData(narquivoJSON,256)
    					 cSignatureValue := CapicomClass():Sign( cDigestValue, , , @cPublicKey )
    					 cDigestValue     = CapicomClass():VerifySignature( cSignatureValue )
    					 if IsValidSignatureCapicom( cDigestValue, cSignatureValue ) = .f.
    					    exit
    					 endif
    					 
                         _cresposta := ""
                         try
    					    _oserver := CreateObject( "MSXML2.XMLHTTP" )
    					    _oserver:Open( "POST", xnurlbanco, .F. )
    					    _oserver:SetRequestHeader("Content-Type","application/json")
    	                    _oserver:Send(cSignatureValue)
    	                    WHILE _oserver:readyState != 4
    	                          _oserver:WaitForResponse( 500 )
    	                    end
    						_cresposta := _oserver:responseText
    	                 catch
    	                    msgstop("Erro no envio do arquivo json do boleto para o Bradesco.","Atenção")
    						exit
    	                 end
    					 if _cresposta = nil
    					    msgstop("Sem resposta do Bradesco.","Atenção")
    						exit
    					 endif
    					 if empty(_cresposta)
    					    msgstop("Sem resposta do Bradesco.","Atenção")
    					    exit
    					 endif
    					 _cresposta = StrTran(_cresposta,Chr(13) + Chr(10), "" )
    					 _nresposta = ""
    					 _ninicia   = "N"
    					 _ncaracter = 0
    					 for ttqq = 1 to len(_cresposta)
    					 	 if substr(_cresposta,ttqq,1) = "{"
    					 	    _nresposta = _nresposta + substr(_cresposta,ttqq,1)
    					 	    _ninicia = "S"
    					 	 elseif substr(_cresposta,ttqq,1) = "}"
    					 	    _nresposta = _nresposta + substr(_cresposta,ttqq,1)
    					        _ninicia = "N"
    					 	 elseif _ninicia = "S"
    					 	    if substr(_cresposta,ttqq,1) = '"' .and. _ncaracter = 0
    					 	 	   _nresposta = _nresposta + substr(_cresposta,ttqq,1)
    					 	 	   ++_ncaracter
    					 	 	elseif substr(_cresposta,ttqq,1) = '"' .and. _ncaracter = 3
    					 	 	   _nresposta = _nresposta + substr(_cresposta,ttqq,1)
    					 	 	   _ncaracter = 0
    					 	 	elseif substr(_cresposta,ttqq,1) = '"' .and. _ncaracter != 0
    					 	 	   ++_ncaracter
    					 	 	else
    					 	 	   _nresposta = _nresposta + substr(_cresposta,ttqq,1)
    					 	 	endif
    					 	 endif
    					 next
    					 
    					 _nretarray := &_nresposta
    					 
    					 _nMotivo = ""
    					 _nPassa  = "N"
    					 for ttqq = 1 to len(_nretarray[1])
    					     if substr(_nretarray[1],ttqq,1) = ":"
    					        _nPassa = "S"
    					     elseif _nPassa = "S"
    						    _nMotivo = _nMotivo + substr(_nretarray[1],ttqq,1)
    						 endif
    					 next
    					 if _nMotivo = "800"
    					    msgstop("Erro Certificado / Formatação dos campos da mensagem inválida.","Atenção")
    						exit
    					 elseif _nMotivo = "810"
    					    msgstop("Erro Certificado / Formatação dos campos da mensagem inválida.","Atenção")
    						exit
    					 elseif empty(_nMotivo)
    					    msgstop("Erro. Motivo não catalogado.","Atenção")
    						exit
    					 else
    					    msn = "S"
    				        if _nMotivo != "00" .or. _nMotivo != "05"
    					       msn = "N"
    					       for ttqq = 1 to len(respostaJSONbra)
    					  	       if respostaJSONbra[ttqq,1] = _nMotivo
    					  	 	      //_nMotivo = _nMotivo + " | " + respostaJSONbra[ttqq,2]
    					  	 	      _nMotivo = respostaJSONbra[ttqq,2]
    					  	 	      exit
    					  	 	   endif
    					  	   next
    				        endif  
    					    if msn = "N"  
    					       msgstop(_nMotivo,"Atenção")
    					       exit
    				        endif
    				     endif
    					 
    					 // Pega o nosso numero gerado pelo banco....................
    					 _nxgravarnumeroPego = ""
    					 _nPassa  = "N"
    					 for ttqq = 1 to len(_nretarray[9])
    					     if substr(_nretarray[9],ttqq,1) = ":"
    					        _nPassa = "S"
    					     elseif _nPassa = "S"
    						    _nxgravarnumeroPego = _nxgravarnumeroPego + substr(_nretarray[9],ttqq,1)
    						 endif
    					 next
    					 if empty(_nxgravarnumeroPego)
    					    msgstop("Não foi gerado nosso número pelo banco bradesco.","Atenção")
    						exit
    					 endif
    					 
    					 // aqui ...
                         msginfo(_nxgravarnumeroPego)
                         exit
    				  
    				  endif
    				  
    				  if xnnMusarnosso = .t.
    				     cwquery := "Update fntitulosclientefornecedor set banco = " + alltrim(str(mseqctaboleto))
    				     cwquery += ",boletoemitido = 'n'"
    				     cwquery += ",dataemissaoboleto = " + "'"+ substr(dtos(ldate),1,4) + "-" + substr(dtos(ldate),5,2) + "-" + substr(dtos(ldate),7,2) +"'"
    				     cwquery += ",nossonumerosequencia = " + alltrim(xnnossonumerobco)
                         cwquery += " where seqtitulo = " + alltrim(str(aseq))
                         owquery := oServer:Query(cwquery)
                         if owquery:neterr()
                            msgstop("Não foi possível realizar a alteração do nosso número.","Atenção")
                         endif
                         owquery:destroy()
                         oServer:Commit()
    				     
    					 xnovonumerobco   = alltrim(str(val(xnnossonumerobco) + 1))
    				     xnnossonumerobco = xnovonumerobco + space(15 - len(xnovonumerobco) )
    				     cwquery := "Update contaboleto set nossonumero = " + "'" + xnnossonumerobco + "'"+;
                                    " where seqcontaboleto = " + alltrim(str(mseqctaboleto))
                         owquery := oServer:Query(cwquery)
                         if owquery:neterr()
                            msgstop("Não foi possível realizar a alteração do nosso número.","Atenção")
                         endif
                         owquery:destroy()
                         oServer:Commit()
    				  else
    				     cwquery := "Update fntitulosclientefornecedor set banco = " + alltrim(str(mseqctaboleto))
    				     cwquery += ",boletoemitido = 'y'"
    				     cwquery += ",dataemissaoboleto = " + "'"+ substr(dtos(ldate),1,4) + "-" + substr(dtos(ldate),5,2) + "-" + substr(dtos(ldate),7,2) +"'"
    			         cwquery += ",nossonumerobancario = " + "'"+ alltrim(_nxgravarnumeroPego) + space(20 - len(alltrim(_nxgravarnumeroPego)) ) +"'"
                         cwquery += " where seqtitulo = " + alltrim(str(aseq))
                         owquery := oServer:Query(cwquery)
                         if owquery:neterr()
                            msgstop("Não foi possível realizar a alteração do nosso número.","Atenção")
                         endif
                         owquery:destroy()
                         oServer:Commit()
    				  endif
    				  
    				  //nregistroutitulo = "S"
    
                   endif
    		       oquery:skip()
                end
    		 endif
             oquery:destroy()
    		 if nregistroutitulo = "N"
                oDlgWait:end()
    		    return nil
    		 endif
    		 
    		 // GERA EM PDF O BOLETO BANCÁRIO
    		 cquery := "select * from fntitulosclientefornecedor where"+;
                       " controledocumento = " + alltrim(str(ncontroledocumento))+;
                       " order by datavencimento asc;"
             oquery := oServer:Query(cquery)
             aseqtitulo = oquery:Fieldget(oquery:Fieldpos('seqtitulo'))
    		 if !empty(aseqtitulo)
    		    nnescolhe = 1
    		    do while !oquery:eof()
                   aseq           = oquery:Fieldget(oquery:Fieldpos('seqtitulo'))
                   andup          = oquery:Fieldget(oquery:Fieldpos('numeroordem'))
                   advenc         = oquery:Fieldget(oquery:Fieldpos('datavencimento'))
                   avdup          = oquery:Fieldget(oquery:Fieldpos('valortitulo'))
    			   ldataemissao   = oquery:Fieldget(oquery:Fieldpos('dataemissaoboleto'))
    		       tMeiopagamento = oquery:Fieldget(oquery:Fieldpos('idmeiospagamento'))
    			   if xnnMusarnosso = .t.
    			      tnossonumerosequencia = alltrim(str(oquery:Fieldget(oquery:Fieldpos('nossonumerosequencia'))))
    			   else
    			      tnossonumerosequencia = oquery:Fieldget(oquery:Fieldpos('nossonumerobancario'))
    			   endif
    			   if empty(tnossonumerosequencia)
    			      oquery:skip()
    				  loop
    			   endif
    
    		       cwquery := "select * from fnmeiospagamento where "+;
                              "seqmeiospagamento = " + alltrim(str(tMeiopagamento))
                   cwquery += " order by seqmeiospagamento asc;"
                   owquery := oServer:Query(cwquery)
                   tgeneromeiospagamento     = alltrim(upper(owquery:Fieldget(owquery:Fieldpos('generomeiospagamento'))))    // BOLETO
    		       owquery:destroy()
    		       
    		 	   if nnescolhe = 1
    		 	      ++nnescolhe
    			      oBoleto  := MR_Boleto():New( cFilePdf )
    		 	   endif
    			   oBoleto:Banco________ := substr(xnbanco,1,3)
                   oBoleto:Banco_Agencia := alltrim(xnagencia)
                   oBoleto:Banco_Ag_Dv__ := iif(empty(xndagencia),"",alltrim(xndagencia))
                   oBoleto:Banco_Ag_Un_A := iif(empty(xndagencia_Un),"",alltrim(xndagencia_Un))
                   oBoleto:Conta________ := alltrim(xnconta)
                   oBoleto:Conta_DV_____ := alltrim(xndconta)
                   oBoleto:Conta_OP_____ := iif(empty(xnoperacao),"","'" + alltrim(xnoperacao))
                   oBoleto:Carteira_____ := alltrim(xncarteira)
                   oBoleto:Carteira_Tipo := iif(empty(xntpcarteira),"",alltrim(xntpcarteira))
                   oBoleto:NossoNumero__ := tnossonumerosequencia
                   oBoleto:Doc_Origem___ := iif( substr(nNumerododocument_a_gravar,9,3) = "Ped","DM","DM")
                   oBoleto:Prefixo______ := iif(empty(xnprefixo),"",alltrim(xnprefixo))
                   oBoleto:Prefixo_DV___ := iif(empty(xndprefixo),"",alltrim(xndprefixo))
                   oBoleto:Doc_Numero___ := alltrim(andup)
                   oBoleto:Doc_Aceite___ := alltrim(xnaceite)
                   oBoleto:Doc_Especie__ := alltrim(xnespecie)
                   oBoleto:Doc_Data_____ := ldataemissao
                   oBoleto:Vencimento___ := advenc
                   oBoleto:Valor________ := avdup
                   oBoleto:Multa_Auto___ := iif(empty(zfinmultaatraso),0,zfinmultaatraso)
                   oBoleto:Juros_Mes____ := iif(empty(zfintaxajurosmensal),0,zfintaxajurosmensal)
                   oBoleto:Numero_Vias__ := val(xnvias)
                   oBoleto:Local_Pagamen := { xnlocalpagamento }
    			   //if empty(xninstrucao)
    			    oBoleto:Instrucoes___ := { "","" }
    			   //else
    			   //endif
                   oBoleto:Demonstrativo := { "","","","","","","","","","","","","","","" }
                   oBoleto:Cedente______ := { mlinh1,mlinh2,mlinh3}
                   oBoleto:Sacado_______ := { mlinha1,mlinha2,mlinha3,mlinha4 }
    			   oBoleto:Avalista_____ := { "Não informado.", "", "" }
    			   oBoleto:AddPage()
    			   
    			   if xnnMusarnosso = .t.
    			      cwquery := "Update fntitulosclientefornecedor set boletoemitido = 'y'"
    			      cwquery += ",nossonumerobancario = " + "'"+ alltrim(oBoleto:NossoNumero__) + space(20 - len(alltrim(oBoleto:NossoNumero__)) ) +"'"
                      cwquery += " where seqtitulo = " + alltrim(str(aseq))
                      owquery := oServer:Query(cwquery)
                      if owquery:neterr()
                         msgstop("Não foi possível realizar a alteração do nosso número.","Atenção")
                      endif
                      owquery:destroy()
                      oServer:Commit()
    			   endif
                   
    		       oquery:skip()
                end
    		 	if nnescolhe > 1
                   oBoleto:Finish()
    		    endif
    		 endif
             oquery:destroy()
             oDlgWait:end()
    		 if nnescolhe > 1
                if file( cFilePdf )
                   run("explorer.exe " + cFilePdf )
                else
                   msgstop( "Erroo na geração do arquivo..." + cFilePdf,"Atenção" )
                endif
    		 endif
    return nil
    function trata_boleto(objetoPassagem)
             nOpcao = ""
             for x = 1 to len(objetoPassagem)
                 if substr(objetoPassagem,x,1) = '<'
                    nOpcao = nOpcao + '_'
                 elseif substr(objetoPassagem,x,1) = '>'
                    nOpcao = nOpcao + '_'
                 elseif substr(objetoPassagem,x,1) = '&'
                    nOpcao = nOpcao + 'E'
                 elseif substr(objetoPassagem,x,1) = '"'
                    nOpcao = nOpcao + '_'
                 elseif substr(objetoPassagem,x,1) = "'"
                    nOpcao = nOpcao + '_; '
                 elseif substr(objetoPassagem,x,1) = "á"
                    nOpcao = nOpcao + 'A'
                 elseif substr(objetoPassagem,x,1) = "é"
                    nOpcao = nOpcao + 'E'
                 elseif substr(objetoPassagem,x,1) = "í"
                    nOpcao = nOpcao + 'I'
                 elseif substr(objetoPassagem,x,1) = "ó"
                    nOpcao = nOpcao + 'O'
                 elseif substr(objetoPassagem,x,1) = "ú"
                    nOpcao = nOpcao + 'U'
                 elseif substr(objetoPassagem,x,1) = "Á"
                    nOpcao = nOpcao + 'A'
                 elseif substr(objetoPassagem,x,1) = "É"
                    nOpcao = nOpcao + 'E'
                 elseif substr(objetoPassagem,x,1) = "Í"
                    nOpcao = nOpcao + 'I'
                 elseif substr(objetoPassagem,x,1) = "Ó"
                    nOpcao = nOpcao + 'O'
                 elseif substr(objetoPassagem,x,1) = "Ú"
                    nOpcao = nOpcao + 'U'
                 elseif substr(objetoPassagem,x,1) = "ã"
                    nOpcao = nOpcao + 'A'
                 elseif substr(objetoPassagem,x,1) = "õ"
                    nOpcao = nOpcao + 'O'
                 elseif substr(objetoPassagem,x,1) = "Ã"
                    nOpcao = nOpcao + 'A'
                 elseif substr(objetoPassagem,x,1) = "Õ"
                    nOpcao = nOpcao + 'O'
                 elseif substr(objetoPassagem,x,1) = "â"
                    nOpcao = nOpcao + 'A'
                 elseif substr(objetoPassagem,x,1) = "ê"
                    nOpcao = nOpcao + 'E'
                 elseif substr(objetoPassagem,x,1) = "î"
                    nOpcao = nOpcao + 'I'
                 elseif substr(objetoPassagem,x,1) = "ô"
                    nOpcao = nOpcao + 'O'
                 elseif substr(objetoPassagem,x,1) = "û"
                    nOpcao = nOpcao + 'U'
                 elseif substr(objetoPassagem,x,1) = "Â"
                    nOpcao = nOpcao + 'A'
                 elseif substr(objetoPassagem,x,1) = "Ê"
                    nOpcao = nOpcao + 'A'
                 elseif substr(objetoPassagem,x,1) = "Î"
                    nOpcao = nOpcao + 'I'
                 elseif substr(objetoPassagem,x,1) = "Ô"
                    nOpcao = nOpcao + 'O'
                 elseif substr(objetoPassagem,x,1) = "Û"
                    nOpcao = nOpcao + 'U'
                 elseif substr(objetoPassagem,x,1) = "ç"
                    nOpcao = nOpcao + 'C'
                 elseif substr(objetoPassagem,x,1) = "Ç"
                    nOpcao = nOpcao + 'C'
                 elseif substr(objetoPassagem,x,1) = "º"
                    nOpcao = nOpcao + ' '
                 elseif substr(objetoPassagem,x,1) = "ª"
                    nOpcao = nOpcao + ' '
                 elseif substr(objetoPassagem,x,1) = " "
                    nOpcao = nOpcao + '_'
                 else
    				nOpcao = nOpcao + substr(objetoPassagem,x,1)
                 endif
    		 next
    return(nOpcao)
    
    /*
    http://www.pctoledo.com.br/forum/viewtopic.php?f=43&t=18664
    */
    //Boleto operações com certificado digital e assinatura
    function boleto_CertificadoEscolhe(objetcert)
             LOCAL dValidFrom, dValidTo
             try
    		   cCertificado := boleto_CapicomEscolheCertificado()
               dValidFrom   := boleto_CapicomCertificado( cCertificado ):ValidFromDate
               dValidTo     := boleto_CapicomCertificado( cCertificado ):ValidToDate
    		   if objetcert = 1
    		      nMcertificado = cCertificado
    		      onMcertificado:settext(nMcertificado)
    		      nMemitido  = ctod(dtoc(dValidFrom))
    		      nMvalidade = ctod(dtoc(dValidTo))
    		      onMemitido:settext(nMemitido)
    		      onMvalidade:settext(nMvalidade)
    		   endif
    		 catch
    	       msgstop("Certificado não selecionado.","Atenção")
    		 end
    return nil
    function boleto_CapicomEscolheCertificado( dValidFrom, dValidTo )
             local oCertificado, oCapicomStore, cNomeCertificado := "NENHUM", oColecao
             
    		 oCapicomStore        := CreateObject( "CAPICOM.Store" )
             oCapicomStore:Open( CAPICOM_CURRENT_USER_STORE, 'My', CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED )
    		 oColecao         := oCapicomStore:Certificates()
             do case
             case oColecao:Count() == 1
                  dValidFrom       := oColecao:item(1):ValidFromDate
                  dValidTo         := oColecao:item(1):ValidToDate
                  cNomeCertificado := oColecao:item(1):SubjectName
             case oColecao:Count() > 1
                  oCertificado     := oColecao:Select( "Selecione o certificado para uso nos boletos.","Selecione o certificado", .F. )
                  dValidFrom       := oCertificado:item(1):ValidFromDate
                  dValidTo         := oCertificado:item(1):ValidToDate
                  cNomeCertificado := oCertificado:item(1):SubjectName
             endcase
    		 if "CN=" $ cNomeCertificado
                cNomeCertificado := Substr( cNomeCertificado, At( "CN=", cNomeCertificado ) + 3 )
                if "," $ cNomeCertificado
                   cNomeCertificado := Substr( cNomeCertificado, 1, At( ",", cNomeCertificado ) - 1 )
    			endif
             endif
    return cNomeCertificado
    function boleto_CapicomCertificado( cNomeCertificado )
             local oCapicomStore, oColecao, oCertificado, nCont
             oCapicomStore := CreateObject( "CAPICOM.Store" )
             oCapicomStore:Open( CAPICOM_CURRENT_USER_STORE, "My", CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED )
             oColecao := oCapicomStore:Certificates()
             for nCont = 1 TO oColecao:Count()
    			 if cNomeCertificado $ oColecao:Item( nCont ):SubjectName
                    oCertificado := oColecao:Item( nCont )
                    exit
                 endif
             next
    return oCertificado
    function IsValidSignatureCapicom( cDigestValue, cSignatureValue )
             if cDigestValue = nil .OR. cSignatureValue = nil
                return .f.
             endif
    return CapicomClass():VerifySignature( cSignatureValue ) == cDigestValue
    
    CREATE CLASS CapicomClass
           METHOD SelectCertificate()
           METHOD VerifySignature( cSignedData )
           METHOD HashData( cData, nAlgorithm )
           METHOD Sign( cDigestValue, oCAPICOMcert, nEncode, cPublicKey )
    ENDCLASS
    
    METHOD SelectCertificate() CLASS CapicomClass
           local oCapicom, oCertificate
           oCapicom:= CreateObject( "CAPICOM.Store" )
           oCapicom:Open( CAPICOM_CURRENT_USER_STORE, "My", CAPICOM_STORE_OPEN_READ_ONLY )
           try
              oCertificate := oCapicom:Certificates:Select( "Selecione um certificado digital", "Algoritmo de Assinatura SHA256RSA" )
           catch
    	   end
           return nil
    	   
    return oCertificate:Item( 1 )
    
    METHOD VerifySignature( cSignedData ) CLASS CapicomClass
           local oCapicom
           if cSignedData == nil
              return nil
           endif
           oCapicom := CreateObject( "CAPICOM.SignedData.1" )
           oCapicom:Verify( cSignedData, .F., CAPICOM_VERIFY_SIGNATURE_ONLY )
    RETURN oCapicom:Content
    
    METHOD HashData( cData, nAlgorithm ) CLASS CapicomClass
           if cData = NIL
              cData := Dtos( Date() ) + Time()
           else
    		  cData = alltrim(cData)
    	   endif
    	   if nAlgorithm = 1
    	      _ShaAlg = StrToHex(hb_SHA1(cData))
    	   elseif nAlgorithm = 224
    	      _ShaAlg = StrToHex(hb_SHA224(cData))
    	   elseif nAlgorithm = 256
    	      _ShaAlg = StrToHex(hb_SHA256(cData))
    	   elseif nAlgorithm = 384
    	      _ShaAlg = StrToHex(hb_SHA384(cData))
    	   elseif nAlgorithm = 512
    	      _ShaAlg = StrToHex(hb_SHA512(cData))
    	   else
    	      _ShaAlg = StrToHex(hb_SHA1(cData))
    	   endif
    	   _ShaAlg = zHexToBinary(_ShaAlg)
    return(StrTran(HB_Base64Encode(_ShaAlg,len(_ShaAlg)),Chr(13) + Chr(10), "" ))
    
    function zHexToBinary(cHex)
             local nLenBin, nX, nPos, cBinNumber, cCharHex, cBinBase
             aHexBinary  := { {"0","0000"},{"1","0001"},{"2","0010"},{"3","0011"},{"4","0100"},{"5","0101"},;
                              {"6","0110"},{"7","0111"},{"8","1000"},{"9","1001"},{"A","1010"},{"B","1011"},;
                              {"C","1100"},{"D","1101"},{"E","1110"},{"F","1111"} }
             cBinNumber := ""
             cHex := alltrim(cHex)
             for nX := len(cHex)  to 1 step -1
                 cCharHex := substr(cHex, -nX, 1)
                 nPos := ascan(aHexBinary, { |a| a[1] == substr(cHex, -nX, 1)} )
                 cBinBase := aHexBinary[nPos,2]
                 cBinNumber := cBinNumber + cBinBase
             next
    return(cBinNumber)
    
    METHOD Sign( cDigestValue, oCAPICOMCert, nEncode, cPublicKey ) CLASS CapicomClass
           local oCAPICOMSignedData, oCAPICOMSigner, oCAPICOMTimeStamp, cSignature
           if cDigestValue = nil
              return nil
           endif
           if nEncode = nil
              nEncode := CAPICOM_ENCODE_BASE64
           endif
           oUtil := CreateObject( "CAPICOM.Utilities" )
           oCAPICOMSigner := CreateObject( "CAPICOM.Signer.2" ) // versao 2
           if oCAPICOMCert = nil
              if empty(xncertificado) // Certificado instalado no store do WINDOWS......
                 if !empty(xnpfxcertificado) .and. !empty(xnpfxsenha) // Certificado em arquivo PFX.
    				oCert := CreateObject( "CAPICOM.Certificate" )
                    oCert:Load( xnpfxcertificado, xnpfxsenha, 1, 0 )
    				oCapicomStore := CreateObject( "CAPICOM.Store" )
                    oCapicomStore:open(CAPICOM_MEMORY_STORE, 'Memoria',CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED )
                    oCapicomStore:Add( oCert )
    				if oCapicomStore:item(1):ValidToDate <= ldate
    				   msgstop("Certificado " + alltrim(xnpfxcertificado) + " VENCIDO!!!","Atenção")
    				   return nil
    				endif
    				oCAPICOMCert := oCapicomStore:item(1)
    			 else
    			    oCAPICOMCert := ::SelectCertificate() // Escolhe o certificado.
    			 endif
    		  else
    		     oCAPICOMCert := boleto_CapicomCertificado( alltrim(xncertificado) )
    	      endif
              if oCAPICOMCert = nil
                 return nil
              endif
              oCAPICOMSigner:Certificate := oCAPICOMcert
           else
              oCAPICOMSigner:Certificate := oCAPICOMcert:DefaultInterface
           endif
           if ! ( oCAPICOMSigner:Certificate:HasPrivateKey;
              .and. Dtos( oCAPICOMSigner:Certificate:ValidFromDate ) <= Dtos( Date() ) ;
              .and. Dtos( oCAPICOMSigner:Certificate:ValidToDate ) >= Dtos( Date() ) )
              return nil
           endif
    	   oCAPICOMSigner:Options   := CAPICOM_CERTIFICATE_INCLUDE_CHAIN_EXCEPT_ROOT
    	   cPublicKey               := StrTran( oCAPICOMSigner:Certificate:Export( CAPICOM_ENCODE_BASE64 ), Chr(13) + Chr(10), "" )
    	   
    	   oCAPICOMTimeStamp := CreateObject( "CAPICOM.Attribute" )
           oCAPICOMTimeStamp:Name  := CAPICOM_AUTHENTICATED_ATTRIBUTE_SIGNING_TIME
           oCAPICOMTimeStamp:Value := DateTime()
           oCAPICOMSigner:AuthenticatedAttributes:Add( oCAPICOMTimeStamp )
           
           oCAPICOMSignedData := CreateObject( "CAPICOM.SignedData.1" )
           oCAPICOMSignedData:Content := cDigestValue
    	   
    	   // segundo parametro falso, apenas retona assinatura do texto, não inclui no texto
    	   cSignature := StrTran( oCAPICOMSignedData:Sign( oCAPICOMSigner, .F., nEncode ), Chr(13) + Chr(10), "" )
    	   
    return cSignature


    Partindo para os próximos. ( ITAÚ e SICOOB). API'S.

    Abraço e espero que ajude.....

  12. Boa tarde Ladinilson,

    Muito obrigado pelas observações era exatamente isso que eu necessitava, vou levar em muita consideração as ponderações e tentar melhorar o visual de forma mais simples e menos impactante para o usuário final.

    Obrigado.

    Abraço.

×
×
  • Create New...