Clipper On Line • Ver Tópico - Classe tGNRE

Classe tGNRE

Aqui você poderá oferecer suas Contribuições, Dicas e Tutoriais (Texto ou Vídeo) que sejam de interesse de todos.

Moderador: Moderadores

 

Classe tGNRE

Mensagempor rochinha » 29 Dez 2015 21:52

Amiguinhos,

O tempo RUGE,

Apresento a todos minha classe, muito simples mesmo de geração do XML para GNRE, necessário para complemento da emissão das Notas Fiscais Eletrônicas relacionadas com DIFAL e Partilha.

Analisem, melhorem e divulguem:
/////////////////////////////////////////////////////////////////////////////
//
//          GNRE - Classe de Funcoes Compativeis para NFe contemplando GNRE
//
//         Autor: Jose Carlos da Rocha
//          Data: 26/12/2015
//         Email: irochinha@hotmail.com.br
//           MSN: fivolution@hotmail.com
//     Linguagem: xBase
//       Prefixo: GNRE       
//   Plataformas: DOS, Windows
// Requerimentos: Harbour/xHarbour
//
//         Fonte: http://www.nfp.fazenda.sp.gov.br/leg03_port102_07.shtm
//
/////////////////////////////////////////////////////////////////////////////

#include "FiveWin.ch"

function Main()
   // Parametrizacao de uso
   cPath          := cFilePath( GetModuleFileName( GetInstance() ) )
   //
   cPathNFE       := VerifyINI( "PATHS", "PathNFE"         , cPath + "\NF-e\remessa\NFE"          , cPath + "\" + "nfw.ini", .f.)
   cPathGNRE      := VerifyINI( "PATHS", "PathGNRE"        , cPath + "\NF-e\remessa\GNRE"         , cPath + "\" + "nfw.ini", .f.)
   // Dados da empresa
   cClNome        := VerifyINI( "EMPRESA", "Nome"    , "5VOLUTION.COM"            , cPath + "\" + "nfw.ini", .f. )
   cClEndereco    := VerifyINI( "EMPRESA", "Endereco", "R Des M C Costa Leite, 25", cPath + "\" + "nfw.ini", .f. )
   cClBairro      := VerifyINI( "EMPRESA", "Bairro"  , "Pirituba"                 , cPath + "\" + "nfw.ini", .f. )
   cClCidade      := VerifyINI( "EMPRESA", "Cidade"  , "Sao Paulo"                , cPath + "\" + "nfw.ini", .f. )
   cClCEP         := VerifyINI( "EMPRESA", "CEP"     , "05171-560"                , cPath + "\" + "nfw.ini", .f. )
   cClEstado      := VerifyINI( "EMPRESA", "Estado"  , "SP"                       , cPath + "\" + "nfw.ini", .f. )
   cClCNPJ        := VerifyINI( "EMPRESA", "CNPJ"    , "18.066.611/0001-06"       , cPath + "\" + "nfw.ini", .f. )
   cClInscr       := VerifyINI( "EMPRESA", "IE"      , "142.365.346.110"          , cPath + "\" + "nfw.ini", .f. )
   cClIM          := VerifyINI( "EMPRESA", "IM"      , "4.743.049-4"              , cPath + "\" + "nfw.ini", .f. )
   //
   cCodUF         := VerifyINI( "NFELETRONICA", "cCodUF" , "35"  , cPath + "\" + "nfw.ini", .f.)

   oGNRE := tGNRE():new()

   oGNRE:nLote                             := 0  // Se numero de lote for igual a ZERO sera gerada uma guia unica, o contratio gera lote com varias guias
   oGNRE:Homologacao                       := .t. // Se homologacao direciona para webservices especificos 

   oGNRE:c01_UfFavorecida                  := 26 // Contém a sigla da UF favorecida. Campo com 2 dígitos. (Ver ANEXO 1, na aba 'Anexos')
   oGNRE:c02_receita                       := 1000099 // Contém o código da receita. Campo numérico com 6 dígitos. (Consultar na aba 'Regras de Preenchimento')
   oGNRE:c25_detalhamentoReceita           := 10101010 // Contém o código do detalhamento da receita. Campo numérico. A quantidade de dígitos corresponde a quantidade de dígitos do código. (Consultar na aba 'Regras de Preenchimento').
   oGNRE:c26_produto                       := "TESTE DE PROD" // Contém o código do produto. Campo numérico. A quantidade de dígitos corresponde a quantidade de dígitos do código. (Consultar na aba 'Regras de Preenchimento').
   oGNRE:c27_tipoIdentificacaoEmitente     := 1 // Contém o código do tipo de identificação do contribuinte emitente (Responsável pelo Pagamento do Tributo). Campo numérico com 1 dígito. (Ver ANEXO 2, na aba 'Anexos'). Caso a identificação seja pela inscrição estadual, esse campo e sua tag poderão ser omitidos.
   oGNRE:c03_idContribuinteEmitente        := 41819055000105 // Contém o número do documento de identificação do contribuinte emitente. O CPF/ CNPJ não deverá conter espaços, pontos ou traços e apenas um documento poderá ser colocado no arquivo. Caso a identificação seja pela inscrição estadual, esse campo e sua tag poderão ser omitidos. Caso a identificação seja pelo CNPJ, a tag de CPF e de Inscrição Estadual poderão ser omitidas. Caso a identificação seja pelo CPF, os campos e as tags de CNPJ e de Inscrição Estadual poderão ser omitidos.
                                                             // Exemplos:
                                                             // CNPJ : <CNPJ>11111111111111</CNPJ>
                                                             // CPF : <CPF>11111111111</CPF>
   oGNRE:c28_tipoDocOrigem                 := 10 // Contém o código do tipo de documento de origem. Campo numérico. A quantidade de dígitos corresponde a quantidade de dígitos do código. (Consultar na aba 'Regras de Preenchimento'). Caso a receita não exija documento de origem, esse campo e sua tag poderão ser omitidos.
   oGNRE:c04_docOrigem                     := 5656 // Contém o número contido no documento de origem. Campo numérico sem espaços, traços, pontos ou vírgulas. A quantidade de dígitos corresponde a quantidade de dígitos do número. Caso a receita não exija documento de origem, esse campo e sua tag poderão ser omitidos.
   oGNRE:c06_valorPrincipal                := 10.99 // Contém o valor original da guia. Digitar apenas números. Usar ponto (".") como separador de decimal, e este deve ter 2 números. Caso a receita não exija valor principal, esse campo e sua tag poderão ser omitidos.
   oGNRE:c10_valorTotal                    := 12.52 // Contém valor total da guia (valor original + encargos). Digitar apenas números. Usar ponto (".") como separador de decimal, e este deve ter 2 números. Caso a receita não exija valor total, esse campo e sua tag poderão ser omitidos. Para calcular os encargos, procurar informações na Sefaz do Estado da UF favorecida.
   oGNRE:c14_dataVencimento                := "2015-05-01" // Contém a data que o contribuinte deve pagar o tributo de acordo com a legislação de cada UF. Formato: AAAA-MM-DD.
   oGNRE:c15_convenio                      := 546456 // Contém o número do convênio. Sem espaços, traços, pontos ou vírgulas. Este campo não é obrigatório e o tamanho do campo corresponde ao número do convênio. No caso de não ter essa informação, esse campo e sua tag poderão ser omitidos.
   oGNRE:c16_razaoSocialEmitente           := "GNRE PHP EMITENTE" // Contém o nome da razão social do contribuinte emitente. No caso da identificação do contribuinte ser por inscrição estadual, esse campo e sua tag poderão ser omitidos.
   oGNRE:c17_inscricaoEstadualEmitente     := 56756 // Contém a inscrição estadual do contribuinte emitente na UF favorecida. Campo numérico sem espaços ou traços. Caso seja inscrito na UF Favorecida, preencher este campo. Caso contrário, esse campo e sua tag poderão ser omitidos.
   oGNRE:c18_enderecoEmitente              := "Queens St" // Contém o endereço do contribuinte emitente. No caso da identificação do contribuinte ser por inscrição estadual, esse campo e sua tag poderão ser omitidos.
   oGNRE:c19_municipioEmitente             := 5300108 // Contém o código do município de localização do contribuinte emitente. Campo numérico. (Consultar no site do IBGE). O IBGE informará o código do município no formato "EEmmmmd". Tirar os 2 primeiros números que indicam o número do Estado e só colocar os 5 números restantes, ficando no formato "mmmmd".
                                                      // A cidade Recife tem o código 2611606, você tirará os dígitos "26" e colocará no arquivo de lote apenas os dígitos "11606".
   oGNRE:c20_ufEnderecoEmitente            := "DF" // Contém a UF de localização do contribuinte emitente. Campo com 2 dígitos. (Ver ANEXO 1, na aba 'Anexos'). No caso da identificação do contribuinte ser por inscrição estadual, esse campo e sua tag poderão ser omitidos.
   oGNRE:c21_cepEmitente                   := "08215917" // Contém o CEP do contribuinte emitente com 8 dígitos. Digitar apenas números. Esse campo não é obrigatório. No caso da identificação do contribuinte ser por inscrição estadual, esse campo e sua tag poderão ser omitidos.
   oGNRE:c22_telefoneEmitente              := 1199999999 // Contém o telefone do contribuinte emitente. Colocar o DDD e o número do telefone. Digitar apenas números. Esse campo não é obrigatório. No caso de não ter essa informação, esse campo e sua tag poderão ser omitidos. Onde: 11 => DDD e 22222222 => Telefone
   oGNRE:c34_tipoIdentificacaoDestinatario := 1 // Contém o código do tipo de identificação do contribuinte destinatário. Campo numérico com 1 dígito. (Ver ANEXO 2, na aba 'Anexos'). Caso a receita não exija destinatário, esse campo e sua tag poderão ser omitidos.
   oGNRE:c35_idContribuinteDestinatario    := 86268158000162 // Contém o número do documento de identificação do contribuinte destinatário. O CPF/ CNPJ não deverá conter espaços, pontos ou traços e apenas um documento poderá ser colocado no arquivo. Caso a receita não exija destinatário, esse campo e sua tag poderão ser omitidos.
   oGNRE:c36_inscricaoEstadualDestinatario := 10809181 // Contém a inscrição estadual do contribuinte destinatário. Campo numérico sem espaços ou traços. Caso seja inscrito na UF Favorecida, preencher este campo. Caso a receita não exija destinatário, esse campo e sua tag poderão ser omitidos.
   oGNRE:c37_razaoSocialDestinatario       := "RAZAO SOCIAL GNRE PHP DESTINATARIO" // Contém o nome da firma ou a razão social do contribuinte destinatário. Caso a receita não exija destinatário, esse campo e sua tag poderão ser omitidos.
   oGNRE:c38_municipioDestinatario         := 2702306 // Contém o município de localização do contribuinte destinatário. Campo numérico. (Consultar no site do IBGE). O IBGE informará o código do município no formato "EEmmmmd". Tirar os 2 primeiros números que indicam o número do Estado e só colocar os 5 números restantes, ficando no formato "mmmmd".
   oGNRE:c33_dataPagamento                 := "2015-11-30" // Contém a data que o contribuinte irá pagar o tributo.Formato: AAAA-MM-DD.
//oGNRE:c05_referencia                    := "" // Contém as informações do período de referência. Caso a receita não exija período de referência, esse campo e sua tag poderão ser omitidos.
   oGNRE:mes                               := "05" // Contém o mês de referência da apuração. Campo numérico com 2 dígitos. (Ver ANEXO 3, na aba 'Anexos'). Caso a receita não exija mês de período de referência, esse campo e sua tag poderão ser omitidos.
   oGNRE:ano                               := 2015 // Contém o ano de referência da apuração. Campo numérico com 4 dígitos. Caso a receita não exija ano de período de referência, esse campo e sua tag poderão ser omitidos.
   oGNRE:parcela                           := 2 // Contém o número da parcela do débito. Campo numérico com tamanho máximo de 3 dígitos. Caso a receita não exija parcela no período de referência, esse campo e sua tag poderão ser omitidos.
   oGNRE:periodo                           := 2014 // Contém o código do período. Campo numérico. A quantidade de dígitos corresponde a quantidade de dígitos do código. (Consultar na aba 'Regras de Preenchimento'). Caso a receita não exija código do período, esse campo e sua tag poderão ser omitidos
   // Nao importantes
   //c39_camposExtras                        := "" // Lista de campos extras. Poderá ter no máximo 3 campos extras por guia. Caso a receita não exija campos extras, esse campo e sua tag poderão ser omitidos.
   //oGNRE:codigo                            := 0 // Contém o código do campo extra. Campo numérico. A quantidade de dígitos corresponde a quantidade de dígitos do código. (Consultar na aba 'Regras de Preenchimento'). Caso a receita não exija campos extras, esse campo e sua tag poderão ser omitidos.
   //oGNRE:tipo                              := "" // Contém o tipo do campo extra. Campo com um caracter. (Consultar na aba 'Regras de Preenchimento'). Caso a receita não exija campos extras, esse campo e sua tag poderão ser omitidos.
   //oGNRE:valor                             := 0.00 // Contém o valor solicitado no campo extra. Se for do tipo Data 'D', o formato é: AAAA-MM-DD. Se for do tipo Númerico 'N', usar ponto (".") como separador de decimal, e este deve ter 2 números.
   //oGNRE:c42_identificadorGuia             := 0 // Contém o identificador da guia no lote. O valor deste campo deverá ser informado pelo contribuinte para a identificação da guia. Esta informação é opcional e deve conter apenas números (até 10 posições).
   
   //     $lote = new Lote();
   //     $lote->addGuia($guia);
   oGNRE:AdicionaGuia()

   oGNRE:Serializa()

   ? oGNRE:MostraXML()
   
   oGNRE:Enviar()
   
return .t.

CREATE CLASS tGNRE
   VAR nLote
   VAR cFileName
   VAR Homologacao
   VAR aGNRERegistros
   VAR aGNRERegExtras
   VAR c01_UfFavorecida
   VAR c02_receita
   VAR c25_detalhamentoReceita
   VAR c26_produto
   VAR c27_tipoIdentificacaoEmitente
   VAR c03_idContribuinteEmitente
   VAR c28_tipoDocOrigem
   VAR c04_docOrigem
   VAR c06_valorPrincipal
   VAR c10_valorTotal
   VAR c14_dataVencimento
   VAR c15_convenio
   VAR c16_razaoSocialEmitente
   VAR c17_inscricaoEstadualEmitente
   VAR c18_enderecoEmitente
   VAR c19_municipioEmitente
   VAR c20_ufEnderecoEmitente
   VAR c21_cepEmitente
   VAR c22_telefoneEmitente
   VAR c34_tipoIdentificacaoDestinatario
   VAR c35_idContribuinteDestinatario
   VAR c36_inscricaoEstadualDestinatario
   VAR c37_razaoSocialDestinatario
   VAR c38_municipioDestinatario
   VAR c33_dataPagamento
//VAR c05_referencia
   VAR mes
   VAR ano
   VAR parcela
   VAR periodo
   //
   METHOD New
   METHOD AdicionaGuia
   METHOD Serializa
   METHOD MostraXML
   //
   METHOD Enviar
   METHOD Consulta
END CLASS

METHOD New( cGNREFileName ) CLASS tGNRE
   if cGNREFileName == nil
      ::cFileName := "GNRE.TXT"
   else
      ::cFileName := cGNREFileName
   endif
   ::nLote := 0
   ::Homologacao := .f.
   ::aGNRERegistros := {}
   ::aGNRERegExtras := {}
RETURN( self )

METHOD AdicionaGuia() CLASS tGNRE
   aadd( ::aGNRERegistros, { ::c01_UfFavorecida                  ,;
                             ::c02_receita                       ,;
                             ::c25_detalhamentoReceita           ,;
                             ::c26_produto                       ,;
                             ::c27_tipoIdentificacaoEmitente     ,;
                             ::c03_idContribuinteEmitente        ,;
                             ::c28_tipoDocOrigem                 ,;
                             ::c04_docOrigem                     ,;
                             ::c06_valorPrincipal                ,;
                             ::c10_valorTotal                    ,;
                             ::c14_dataVencimento                ,;
                             ::c15_convenio                      ,;
                             ::c16_razaoSocialEmitente           ,;
                             ::c17_inscricaoEstadualEmitente     ,;
                             ::c18_enderecoEmitente              ,;
                             ::c19_municipioEmitente             ,;
                             ::c20_ufEnderecoEmitente            ,;
                             ::c21_cepEmitente                   ,;
                             ::c22_telefoneEmitente              ,;
                             ::c34_tipoIdentificacaoDestinatario ,;
                             ::c35_idContribuinteDestinatario    ,;
                             ::c36_inscricaoEstadualDestinatario ,;
                             ::c37_razaoSocialDestinatario       ,;
                             ::c38_municipioDestinatario         ,;
                             ::c33_dataPagamento                 ,;
                             ::mes                               ,;
                             ::ano                               ,;
                             ::parcela                           ,;
                             ::periodo                           })
   //aadd( ::aGNRERegExtras, { ::c39_camposExtras                  ,;
   //                          ::codigo                            ,;
   //                          ::tipo                              ,;
   //                          ::valor                             ,;
   //                          ::c42_identificadorGuia             })
   return ::aGNRERegistros

METHOD Serializa() CLASS tGNRE
   local aGNRE := ::aGNRERegistros
   local nGNRE := fCreate( ::cFileName )
   cResultado := "" // [<?xml version="1.0" encoding="utf-8"?>] + CRLF
   if ::nLote > 0
      //cResultado := cResultado + [         <TLote_GNRE xmlns="http://www.gnre.pe.gov.br">] + CRLF
      //cResultado := cResultado + [            <guias>]  + CRLF
      //
   endif
   FOR I = 1 TO LEN(aGNRE)
     //cResultado := cResultado + [            <guias>] + CRLF
       cResultado := cResultado + [               <TDadosGNRE>] + CRLF
       cResultado := cResultado + [                  <c01_UfFavorecida>] + alltrim(str(aGNRE[I][01])) + [</c01_UfFavorecida>] + CRLF
       cResultado := cResultado + [                  <c02_receita>] + alltrim(str(aGNRE[I][02])) + [</c02_receita>] + CRLF
       cResultado := cResultado + [                  <c25_detalhamentoReceita>] + alltrim(str(aGNRE[I][03])) + [</c25_detalhamentoReceita>] + CRLF
       cResultado := cResultado + [                  <c26_produto>] + alltrim(aGNRE[I][04]) + [</c26_produto>] + CRLF
       cResultado := cResultado + [                  <c27_tipoIdentificacaoEmitente>] + alltrim(str(aGNRE[I][05])) + [</c27_tipoIdentificacaoEmitente>] + CRLF
       cResultado := cResultado + [                  <c03_idContribuinteEmitente>] + CRLF
       cResultado := cResultado + [                     <CNPJ>] + alltrim(str(aGNRE[I][06])) + [</CNPJ>] + CRLF
       cResultado := cResultado + [                  </c03_idContribuinteEmitente>] + CRLF
       cResultado := cResultado + [                  <c28_tipoDocOrigem>] + alltrim(str(aGNRE[I][07])) + [</c28_tipoDocOrigem>] + CRLF
       cResultado := cResultado + [                  <c04_docOrigem>] + alltrim(str(aGNRE[I][08])) + [</c04_docOrigem>] + CRLF
       cResultado := cResultado + [                  <c06_valorPrincipal>] + alltrim(str(aGNRE[I][09],2)) + [</c06_valorPrincipal>] + CRLF
       cResultado := cResultado + [                  <c10_valorTotal>] + alltrim(str(aGNRE[I][10],2)) + [</c10_valorTotal>] + CRLF
       cResultado := cResultado + [                  <c14_dataVencimento>] + alltrim(aGNRE[I][11]) + [</c14_dataVencimento>] + CRLF
       cResultado := cResultado + [                  <c15_convenio>] + alltrim(str(aGNRE[I][12])) + [</c15_convenio>] + CRLF
       cResultado := cResultado + [                  <c16_razaoSocialEmitente>] + alltrim(aGNRE[I][13]) + [</c16_razaoSocialEmitente>] + CRLF
       cResultado := cResultado + [                  <c17_inscricaoEstadualEmitente>] + alltrim(str(aGNRE[I][14])) + [</c17_inscricaoEstadualEmitente>] + CRLF
       cResultado := cResultado + [                  <c18_enderecoEmitente>] + alltrim(aGNRE[I][15]) + [</c18_enderecoEmitente>] + CRLF
       cResultado := cResultado + [                  <c19_municipioEmitente>] + alltrim(str(aGNRE[I][16])) + [</c19_municipioEmitente>] + CRLF
       cResultado := cResultado + [                  <c20_ufEnderecoEmitente>] + alltrim(aGNRE[I][17]) + [</c20_ufEnderecoEmitente>] + CRLF
       cResultado := cResultado + [                  <c21_cepEmitente>] + alltrim(aGNRE[I][18]) + [</c21_cepEmitente>] + CRLF
       cResultado := cResultado + [                  <c22_telefoneEmitente>] + alltrim(str(aGNRE[I][19])) + [</c22_telefoneEmitente>] + CRLF
       cResultado := cResultado + [                  <c34_tipoIdentificacaoDestinatario>] + alltrim(str(aGNRE[I][20])) + [</c34_tipoIdentificacaoDestinatario>] + CRLF
       cResultado := cResultado + [                  <c35_idContribuinteDestinatario>] + CRLF
       cResultado := cResultado + [                     <CNPJ>] + alltrim(str(aGNRE[I][21])) + [</CNPJ>] + CRLF
       cResultado := cResultado + [                  </c35_idContribuinteDestinatario>] + CRLF
       cResultado := cResultado + [                  <c36_inscricaoEstadualDestinatario>] + alltrim(str(aGNRE[I][22])) + [</c36_inscricaoEstadualDestinatario>] + CRLF
       cResultado := cResultado + [                  <c37_razaoSocialDestinatario>] + alltrim(aGNRE[I][23]) + [</c37_razaoSocialDestinatario>] + CRLF
       cResultado := cResultado + [                  <c38_municipioDestinatario>] + alltrim(str(aGNRE[I][24])) + [</c38_municipioDestinatario>] + CRLF
       cResultado := cResultado + [                  <c33_dataPagamento>] + alltrim(aGNRE[I][25]) + [</c33_dataPagamento>] + CRLF
       cResultado := cResultado + [                  <c05_referencia>] + CRLF
       cResultado := cResultado + [                     <mes>] + alltrim(aGNRE[I][26]) + [</mes>] + CRLF
       cResultado := cResultado + [                     <ano>] + alltrim(str(aGNRE[I][27])) + [</ano>] + CRLF
       cResultado := cResultado + [                     <parcela>] + alltrim(str(aGNRE[I][28])) + [</parcela>] + CRLF
       cResultado := cResultado + [                     <periodo>] + alltrim(str(aGNRE[I][29])) + [</periodo>] + CRLF
       cResultado := cResultado + [                  </c05_referencia>] + CRLF
       /*
       cResultado := cResultado + [                  <c39_camposExtras>]
       cResultado := cResultado + [                     <campoExtra>]
       cResultado := cResultado + [                        <codigo>16</codigo>]
       cResultado := cResultado + [                        <tipo>T</tipo>]
       cResultado := cResultado + [                        <valor>1200012</valor>]
       cResultado := cResultado + [                     </campoExtra>]
       cResultado := cResultado + [                     <campoExtra>]
       cResultado := cResultado + [                        <codigo>15</codigo>]
       cResultado := cResultado + [                        <tipo>D</tipo>]
       cResultado := cResultado + [                        <valor>2015-03-02</valor>]
       cResultado := cResultado + [                     </campoExtra>]
       cResultado := cResultado + [                     <campoExtra>]
       cResultado := cResultado + [                        <codigo>10</codigo>]
       cResultado := cResultado + [                        <tipo>T</tipo>]
       cResultado := cResultado + [                        <valor>17.21</valor>]
       cResultado := cResultado + [                     </campoExtra>]
       cResultado := cResultado + [                  </c39_camposExtras>]
       */
       cResultado := cResultado + [               </TDadosGNRE>] + CRLF
   NEXT
   if ::nLote > 0
      //
      //cResultado := cResultado + [            </guias>] + CRLF
      //cResultado := cResultado + [         </TLote_GNRE>] + CRLF
   endif
   fWrite( nGNRE, cResultado, LEN(cResultado) )
   fClose( nGNRE )
   return cResultado

METHOD MostraXML() CLASS tGNRE
   return MemoRead( ::cFileName )

METHOD Enviar() CLASS tGNRE
   LOCAL cResultado
   cURL := iif( ::Homologacao, "http://www.gnre-he.sp.gov.br", "http://www.gnre.sp.gov.br" )
   //
   cResultado := [<?xml version="1.0" encoding="utf-8"?>]
   //
   cResultado := cResultado + [<soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">] + CRLF
   cResultado := cResultado + [   <soap12:Header>] + CRLF
   cResultado := cResultado + [      <gnreCabecMsg xmlns="http://www.gnre.pe.gov.br/wsdl/processar">] + CRLF
   cResultado := cResultado + [         <versaoDados>1.00</versaoDados>] + CRLF
   cResultado := cResultado + [      </gnreCabecMsg>] + CRLF
   cResultado := cResultado + [   </soap12:Header>] + CRLF
   cResultado := cResultado + [   <soap12:Body>] + CRLF
   cResultado := cResultado + [      <gnreDadosMsg xmlns="http://www.gnre.pe.gov.br/webservice/GnreLoteRecepcao">] + CRLF
   cResultado := cResultado + [         <TLote_GNRE xmlns="] + cURL + [">] + CRLF
   cResultado := cResultado + [            <guias>]  + CRLF
   cResultado := cResultado + ::MostraXML()  + CRLF
   cResultado := cResultado + [            </guias>] + CRLF
   cResultado := cResultado + [         </TLote_GNRE>] + CRLF
   cResultado := cResultado + [      </gnreDadosMsg>] + CRLF
   cResultado := cResultado + [   </soap12:Body>] + CRLF
   cResultado := cResultado + [</soap12:Envelope>] + CRLF
   //
   //?"Enviar",  cResultado
   cResultado := GNREWebService( cResultado, "POST", cURL, "" ) // cSoapAction )
   return cResultado

METHOD Consulta( cProtocolo, cUsuario, cSenha, cCNPJ, cCategoria ) CLASS tGNRE
   LOCAL cResultado
   //
   cResultado :=              [<?xml version="1.0" encoding="utf-8"?>]
   cResultado := ""
   //
   return cResultado

Function GNREWebService( cXMLFile, cMethod, cURL, cSoapAction )
   DEFAULT cMethod := "POST", cSoapAction := cURL
   DEFAULT cURL    := "http://www.gnre.pe.gov.br/wsdl/processar"
   oEDXSend:= TOLEAuto():New( "Microsoft.XMLHTTP" )
   oEDXSend:Open( cMethod, cURL, .F. )
   //oEDXSend:setrequestheader( "SOAPAction", cSoapAction )
   //oEDXSend:setrequestheader( "content-type", "text/xml" )
   oEDXSend:Send( cXMLFile )
   cResultado := oEDXSend:ResponseText()
   return cResultado
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para fivolution@hotmail.com. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Avatar de usuário

rochinha
Membro Master

Membro Master
 
Mensagens: 4532
Data de registro: 18 Ago 2003 20:43
Cidade/Estado: São Paulo - Brasil
Curtiu: 796 vezes
Mens.Curtidas: 242 vezes

Classe tGNRE

Mensagempor fladimir » 30 Dez 2015 00:00

vlw
Sun Tzu há mais de três mil anos cita nas epígrafes de seu livro “A Arte da Guerra“:

“Concentre-se nos pontos fortes, reconheça as fraquezas, agarre as oportunidades e proteja-se contra as ameaças”.
“Se não é vantajoso, nunca envie suas tropas; se não lhe rende ganhos, nunca utilize seus homens; se não é uma situação perigosa, nunca lute uma batalha precipitada”
.


Até 2017    Desktop Console [ Legado ] Harbour | MinGW | DBF | CDX | FastReport | MySQL


Novos Projetos:

   Desktop Visual           Windev Desktop
   Celular Android/iOS   Windev Mobile
   WEB                            Windev Web


Sejamos gratos a Deus.
Avatar de usuário

fladimir
Colaborador

Colaborador
 
Mensagens: 2434
Data de registro: 15 Nov 2006 19:21
Curtiu: 28 vezes
Mens.Curtidas: 157 vezes

Classe tGNRE

Mensagempor marcos.gurupi » 03 Jan 2016 10:48

Caro Rochinha, vc compilou com qual? O xhb/hb e versao?
Marcos Roberto
NetService Software
marcos.gurupi
Usuário Nível 4

Usuário Nível 4
 
Mensagens: 930
Data de registro: 06 Jul 2004 11:53
Cidade/Estado: Gurupi-TO
Curtiu: 0 vez
Mens.Curtidas: 6 vezes

Classe tGNRE

Mensagempor JoséQuintas » 03 Jan 2016 15:18

Não seria mais simples criar um array de classe, ao invés de uma classe com arrays?

Ao invés disto:
FOR EACH oGuia IN GNRE:ArrayGuias
   ? oGuia[ 1 ], oGuia[ 2 ], oGuia[ 3 ]
NEXT


Isto:
FOR EACH oGuia IN ArrayGuias
   ? oGuia:Nome, oGuia:Inscricao, oGuia:Valor
NEXT
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 17942
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Classe tGNRE

Mensagempor jairfab » 03 Jan 2016 21:02

Como seria isto

Tem como postar um exemplo
Delpji 7, harbour 3.2, xharbour 1.2.3, Bcc7, Minigw, Minigui 19.11, hwgui 2.20, FiveWin 19.05 Gtwvw, Gtwvg, C# VS 2017
Avatar de usuário

jairfab
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 241
Data de registro: 21 Mai 2007 09:43
Cidade/Estado: São Paulo, Região Leste - Suzano
Curtiu: 0 vez
Mens.Curtidas: 13 vezes

Classe tGNRE

Mensagempor JoséQuintas » 03 Jan 2016 21:53

Pensando bem, facilita pra modificar a classe, mas acho que não vai fazer muita diferença pra quem só usa pronto.

oLote := LoteGuias():New()
FOR nCont = 1 TO 10
   oGuia := Guia():New()
   oGuia:Nome := "xxxx"
   oGuia:Emitente := "xxx"
   oLote:AddGuia( oGuia )
NEXT

FOR EACH oGuia IN oLote:Guias
   ? oGuia:Nome
   ? oGuia:Emitente
NEXT

CREATE CLASS LoteGuias
   VAR Guias INIT {}
   METHOD AdicionaGuia( oGuia )
   END CLASS

METHOD AdicionaGuia( oGuia ) CLASS LoteGuias
   AAdd( ::Guias, oGuia )
   RETURN NIL

CREATE CLASS Guia
   VAR Numero
   VAR Emitente
   END CLASS
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 17942
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Classe tGNRE

Mensagempor rochinha » 07 Jan 2016 13:05

Amiguinhos,

marcos.gurupi
Uso as versoes Simplex 0.45(mais antiga e mais estável) e a versão 3.2.0(r1307082134 compilação 17626).

Talvez o único problema que voce irá encontrar seja em relação a automação OLE, bastando trocar as funções pelas do seu Harbour ou xHarbour.

Eu sempre lembro a todos que só uso o Harbour Tradicional e às vezes escapo pro xHarbour.

JoséQuintas
Como eu disse: Analisem, melhorem e divulguem.

Parti do modo mais básico por necessidade de facilidade de inclusões e alterações durante a criação. Após uma estabilidade é possível reduzir o código e as redundâncias com métodos mais complexos.

Mas se eu deixasse algo complexo, já complexo de inicio, ninguém iria se interessar em pelo menos entender e fixar na mente um: "Oba, vou precisar disso mas não aogra..."
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para fivolution@hotmail.com. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Avatar de usuário

rochinha
Membro Master

Membro Master
 
Mensagens: 4532
Data de registro: 18 Ago 2003 20:43
Cidade/Estado: São Paulo - Brasil
Curtiu: 796 vezes
Mens.Curtidas: 242 vezes

Classe tGNRE

Mensagempor JoséQuintas » 07 Jan 2016 19:37

Ok. é que na verdade pra quem vai usar pronto, não vai ver diferença nenhuma disso.
E pra uso dentro da classe, acaba sendo uma única vez, nem sei mais se compensa o trabalho.

Há mais uma opção: array individual dos campos, lembrando de criar array pra tudo.

Nem é complicar tanto.
Supondo que seja uma lista de clientes:

1. do jeito que está é um array multidimensional

aCilente[ 1, 1 ] = codigo1
aCliente[ 1, 2 ] = nome1
aCliente[ 2, 1 ] = codigo2
aCliente[ 2, 2 ] = nome2


2. a sugestão foi um array contendo uma classe de um registro, um cliente. ficam disponíveis os "campos" dos clientes em cada elemento

aCliente[ 1 ]:codigo = codigo1
aCliente[ 1 ]:nome = nome1

aCliente[ 2 ]:codigo = codigo2
acliente[ 2 ]:nome = nome2


3. a teceira opção é cada uma dessas variáveis ser um array, mas vai ter que lembrar que precisam ser do mesmo tamanho

aCliente:codigo[ 1 ] = codigo1
aCliente:Nome[ 1 ] = nome1

aCliente:codigo[ 2 ] = codigo2
aCliente:Nome[ 2 ] = nome2


Na opção 1, tem que colocar o número certo de cada campo
Na opção 2, cada cliente é um elemento do array, então é só indicar o elemento e o campo.
Na opção 3, cada campo é um array, e cada cliente é composto de um elemento de cada um dos arrays.

O mais interessante é o 2: dá pra definir um conteúdo inicial para cada "cliente", e ao usar cliente, já tem tudo com ele.
Tanto o 1 quanto o 3, ficam dependendo de indicar a posição correta, e do array ter o tamanho correto.

No caso da classe postada, ela passaria a ter uma "variável" array, com uma lista de guias.
E uma classe adicional, seria pra uma única guia, só os campos de cada guia, até com valor default pra cada campo.

Só que não faz diferença pra quem só vai usar, porque vão gerar um INI e imprimir, e nem vão olhar no fonte.
Eu não tinha pensado por esse lado quando fiz a sugestão.
Mas ficam aí registradas as diversas formas de fazer a mesma coisa.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 17942
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Classe tGNRE

Mensagempor rochinha » 07 Jan 2016 20:46

Amiguinhos,

JoseQuintas
Qualquer que seja a solução ou o montante de uso que será feito a partir do código deve levar em consideração que o uso de vetor dimensionar acontece pelo fato de se adicionar várias GNREs para um processamento de lote.

Agora no inicio não vemos horizonte, mas para quem for fazer uso, precisará gerar 2 GNREs por nota e dependendo do volume de notas já teremos um volume muito grande.

Portanto, a margem de erro de um lote com defeito ficará, terá a manutenção mais lenta caso sejamos muito complexos.
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para fivolution@hotmail.com. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Avatar de usuário

rochinha
Membro Master

Membro Master
 
Mensagens: 4532
Data de registro: 18 Ago 2003 20:43
Cidade/Estado: São Paulo - Brasil
Curtiu: 796 vezes
Mens.Curtidas: 242 vezes

Classe tGNRE

Mensagempor HASA » 14 Jan 2016 15:56

:-O
Boa tarde, Rochinha com relação as regras de preenchimento de cada estado, existe algum material na Net, no site da GNRE o que mais encontrei foi mudanças de código de arrecadação.
http://www.gnre.pe.gov.br/gnre/portal/todasNoticias.jsp
:(Neg
HASA
Avatar de usuário

HASA
Colaborador

Colaborador
 
Mensagens: 1082
Data de registro: 01 Set 2003 19:50
Cidade/Estado: São Paulo
Curtiu: 1 vez
Mens.Curtidas: 51 vezes

Classe tGNRE

Mensagempor JoséQuintas » 15 Jan 2016 19:47

Sobre os CRLF e espaços em branco, pude confirmar no manual, é como eu falei mesmo, não é pra ter:

Para reduzir o tamanho final do arquivo XML de Lote da GNRE alguns cuidados de
programação deverão ser assumidos:
...
• Não incluir caracteres de formatação no arquivo XML (“line-feed”, “carriage
return”, “tab” e caractere de “espaço” entre as TAGs).


Nota:
Foi um dia inteiro pra alterar.
Nem imagino quanto deve ter demorado pra criar do zero.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 17942
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Classe tGNRE

Mensagempor HASA » 16 Jan 2016 08:35

:D
Bom dia, a todos, pegando o exemplo do Rocha compilei e gerei o TXT já o do José deu alguns errinhos de variável não existe e ainda não gerava o TXT acertei esses errinhos e coloco aqui o PRG e o TXT, para meu teste inibi as linhas:

25 - oGNRE:nLote := 0, troquei o valor para 1
76 - oGNRE:Enviar(), não envei
134 - ::nLote := 0, e troquei para 1

Liberei as linhas

154 - cResultado += [ <TLote_GNRE xmlns="http://www.gnre.pe.gov.br">] + CRLF
155 - cResultado += [ <guias>] + CRLF

Fiz esses ajustes apenas para testar a classe como está, para incluir em meu sistema existe algumas regras de preenchimento das GNRE´s que estou tentando aprender para ver no que mais a classe pode ser útil, se alguem tiver alguma(s) dica(s) agradeço,

:-Y

HASA
Anexos
GNRE.zip
(5.08 KiB) Baixado 159 vezes
Avatar de usuário

HASA
Colaborador

Colaborador
 
Mensagens: 1082
Data de registro: 01 Set 2003 19:50
Cidade/Estado: São Paulo
Curtiu: 1 vez
Mens.Curtidas: 51 vezes

Classe tGNRE

Mensagempor JoséQuintas » 16 Jan 2016 11:29

Tinha postado uma depois dessa mais atualizada.
Em todo caso acrescentei as alterações mencionadas.

Como sempre... acabei mexendo um pouco mais:

- Como o plano A funcionou, deixei ele por ser mais simples o uso
- Funções internas como STATIC pra não interferir com nada externo
- Função extra pra xHarbour no fonte
- StringXml(), NumberXml() e DateXml()

Facilidade extra (ou não):

CNPJ/CPF/IE, por exemplo, pode ser no formato "11.111.111/1111-11", "11111111111111", ou 111111111111
Datas: pode ser "2016-01-01" ou formato date
Números: pode ser "12.34" ou 12.34
Strings: número será convertido, mas sem acrescentar zeros à esquerda. Nestes casos melhor informar direto como string.

Exemplos válidos:

oGNRE:c03_idContribuinteEmitente := 418199055000105
oGNRE:c03_idContribuinteEmitente := "418199055000105" // string
oGNRE:c03_idContribuinteEmitente := "41.819.9055/0001-05" // string com separadores
oGNRE:c14_DataVencimento := "2015-05-01"
oGNRE:c14_DataVencimento := Ctod( "01/05/2015" ) // date
oGNRE:c22_TelefoneEmitente := 1199999999
oGNRE:c22_TelefoneEmitente := "11999999"

Inválidos:

oGNRE:c21_CepEmitente := 08215917 // inválido. Necessário indicar "08215917" pro zero aparecer
oGNRE:Mes := 5 // inválido, é necessário indicar "05"

Nota possibilidade:
Talvez com base no manual seja interessante já acrescentar StrZero() nesses e já fica resolvido de vez.
Podem existir outros.
Exemplo: StrZero( NumberXml( CEP ), 8 )
Já sai certo, informando número, string, com zero, sem zero, formatado com traço, etc. Do jeito que vier, sai sempre certo.

De repente pode acrescentar as regras de preenchimento que mencionou.

Só estou mexendo na classe de "xereta", no momento não tenho aonde usar.
Achei legal pra mostrar que a gente pode sempre melhorar fontes.
Pode ser na hora, no dia seguinte, um mês depois, mas a gente pode sempre encontrar alguma coisa que pode mehorar.
É assim que aprendemos, e vamos ficando mais empolgados... às vezes até empolgados demais.... rs

Importante:
Guia de impostos é coisa séria. Se o número de recolhimento estiver errado, não vai ser considerado pago.
É bom deixar isso bem claro com o cliente, afinal a conferência final é dele.
Fiquei até na dúvida se essas facilidades que acrescentei são perigosas ou não.
Anexos
test.zip
(4.62 KiB) Baixado 199 vezes
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 17942
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Classe tGNRE

Mensagempor rochinha » 22 Jan 2016 10:44

Amiguinhos,

JoseQuintas
:-Y

:)Pos
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para fivolution@hotmail.com. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Avatar de usuário

rochinha
Membro Master

Membro Master
 
Mensagens: 4532
Data de registro: 18 Ago 2003 20:43
Cidade/Estado: São Paulo - Brasil
Curtiu: 796 vezes
Mens.Curtidas: 242 vezes

Classe tGNRE

Mensagempor Kapiaba » 05 Mai 2016 16:54

-:] :{ :-Y 8-|
Kapiaba
Colaborador

Colaborador
 
Mensagens: 1765
Data de registro: 07 Dez 2012 15:14
Cidade/Estado: São Paulo
Curtiu: 310 vezes
Mens.Curtidas: 119 vezes

Próximo



Retornar para Contribuições, Dicas e Tutoriais

Quem está online

Usuários vendo este fórum: Nenhum usuário registrado online e 1 visitante


Ola Amigo, espero que meu site e forum tem lhe beneficiado, com exemplos e dicas de programacao.
Entao divulgue o link da Doacao abaixo para seus amigos e redes sociais ou faça uma doacao para o site forum...
MUITO OBRIGADO PELA SUA DOACAO!
Faça uma doação para o forum
cron
v
Olá visitante, seja bem-vindo ao Fórum Clipper On Line!
Efetue o seu login ou faça o seu Registro