Jump to content
Fivewin Brasil

Wellington Vieira

Membros
  • Posts

    424
  • Joined

  • Last visited

  • Days Won

    10

Everything 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
  2. Boa tarde Marca, Sou eu mesmo quem faço, uso o "Adobe Dreamweaver CS6".
  3. 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.
  4. 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
  5. Desculpe-me acho que me expressei mal, com qualquer arquivo de MANIFET isso ocorre seja WindowXP.Manifest, Windows10.Manifest, WindowsXP.Manifet64 etc..
  6. Esqueci de mencionar que o sumiço da RADIO só ocorre quando uso no meu ".RC" o WindowsXP.Manifest.
  7. macs, é um bitmap inserido em um brush. define brush obrushpedidoTela file "emissao_pedido.bmp" define dialog pedido title "" from 000,000 to 650,1020 Pixel brush obrushpedidoTela transparent activate dialog pedido
  8. Boa tarde, Alguém já passou por isso: Quando chamo a dialog com o brush uma imagem ela vem com a função radio normal conforme a imagem abaixo: Quando pressione a tecla "ALT" a função radio SOME ALGEM SABERIA O PORQUE ??
  9. 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 ) )
  10. 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"
  11. bom dia, Contingência Ativada SPDesde 12/11/2020 07:24:40 http://www.nfe.fazenda.gov.br/portal/principal.aspx
  12. 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
  13. Tentou, janela:SetFocus() janela:Show()
  14. #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 ) //----------------------------------------------------------------------------//
  15. 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.
  16. 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
  17. Manual_Registro_de_Boleto_Bancario_Online Visulizar Arquivo Manual_Registro_de_Boleto_Bancario_Online - Guia de integração Versão 2.2 janeiro/2019 Autor Wellington Vieira Enviado 23-07-2020 Categoria Dicas  
  18. 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/
  19. 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.....
  20. Nova abordagem, Tela normal e touchscreem para bar e restaurantes
  21. Nova abordagem, Tela normal de venda sem touchscreen
  22. Nova abordagem, Tela consulta produto touchscreen
  23. 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...