A pauta dos ultimos tempos é se falar em siglas, e sinceramente já não aguento mais, ta parecendo taquigrafia informatizada.
Bom vamos ao que interessa e que me trouxe aqui mais uma vez para juntos escovarmos bits( se bem que estamos na ERA de escovar tERA ).
Como o Maligno disse outro dia, tudo é concatenação de palavras, vamos concatenar com classe então.
O código é simples de se entender e implementar e aqueles que quizerem ir mais a fundo poderão melhorá-lo acrescentando consistencias e consumo de webservices.
Eu poderia postar tudo isto já completo, mas vamos e covenhamos, teremos os velhos craques e os novos fenomenos, para debater e aprimorar.
NFP, muito chamada por Nota Fiscal Paulista não tem nada de Paulista. O P é de Prefeitura pois é ela que comanda o show das notas ao consumidor nos estados.
Vejamos o código:
Código: Selecionar todos
/////////////////////////////////////////////////////////////////////////////
//
// NFP - Classe de Funcoes Compativeis para Nota Fiscal Prefeitura
//
// Autor: Jose Carlos da Rocha
// Data: 11/02/2011
// Email: irochinha@hotmail.com.br
// MSN: fivolution@hotmail.com
// Linguagem: xBase
// Prefixo: NFPRegistro
// Plataformas: DOS, Windows
// Requerimentos: Harbour/xHarbour
//
// Hierarquia:
// 10-Identificação do Arquivo (Cabeçalho)
// 1 por arquivo
// 20-Dados de Identificação da Nota Fiscal
// >= 1 por arquivo
// 30-Mercadoria / Produto / Servico
// >= 1 por NF na criacao
// 0 por NF no cancelamento
// 40-Valores Totais da NF
// = 1 por NF na criacao
// = 0 por NF no cancelamento
// 50-Informações do Transporte da NF
// = 1 por NF na criacao
// = 0 por NF no cancelamento
// 60-Informações Adicionais e de Cobrança
// 0 ou 1 por NF na criacao
// = 0 por NF no cancelamento
// 90-Rodape
// =1 por arquivo
// Fonte: http://www.nfp.fazenda.sp.gov.br/leg03_port102_07.shtm
/////////////////////////////////////////////////////////////////////////////
#include "FiveWin.ch"
function Main()
oNFP := tNFP():new( "TESTE.TXT" )
oNFP:NFPRegistro10( "1,00", ; // (N 2) Versão do leiaute do arquivo. Preencher com “1,00” nesta versão.
CharRem( [./-], "00.000.000/0000-00" ), ; // (X 14) Informar o CNPJ do emitente com os zeros não significativos. Preencher apenas com números, sem separadores.
dtoc(date()), ; // (D 10) Menor data de emissão das notas fiscais transmitidas.
dtoc(date()) ) // (D 10) Menor data de emissão das notas fiscais transmitidas.
? oNFP:NFPFinaliza()
return .t.
CREATE CLASS tNFP
VAR cFileName
VAR aNFPRegistros
VAR aNFPListagem
//
METHOD New
METHOD NFPRegistro10
METHOD NFPRegistro20
METHOD NFPRegistro30
METHOD NFPRegistro40
METHOD NFPRegistro50
METHOD NFPRegistro60
METHOD NFPRegistro90
METHOD NFPSalvaRegistro
METHOD NFPFinaliza
//
METHOD NFPEnviar
METHOD NFPConsulta
END CLASS
METHOD New( cNFPFileName )
if cNFPFileName == nil
::cFileName := "NFP.TXT"
else
::cFileName := cNFPFileName
endif
::aNFPRegistros := {}
::aNFPListagem := {}
RETURN( self )
METHOD NFPRegistro10( p02,p03,p04,p05 )
local cCRLF := "chr(13)+chr(10)", cPIPE := "|"
cTrailler := "10" // (X 2) Preencher com o valor "10" para indicar o tipo de registro
cTrailler := cTrailler + cPIPE + StrFill( p02, 02, " ", "R" ) // (N 2) Versão do leiaute do arquivo. Preencher com “1,00” nesta versão.
cTrailler := cTrailler + cPIPE + StrFill( p03, 14, " ", "R" ) // (X 14) Informar o CNPJ do emitente com os zeros não significativos. Preencher apenas com números, sem separadores.
cTrailler := cTrailler + cPIPE + StrFill( p04, 10, " ", "R" ) // (D 10) Menor data de emissão das notas fiscais transmitidas.
cTrailler := cTrailler + cPIPE + StrFill( p05, 10, " ", "R" ) // (D 10) Maior data de emissão das notas fiscais transmitidas.
cTrailler := alltrim( cTrailler ) + &(cCRLF)
::NFPSalvaRegistro( cTrailler )
RETURN nil
METHOD NFPRegistro20( p02,p03,p04,p05,p06,p07,p08,p09,p10,p11,p12,p13,p14,p15,p16,p17,p18,p19,p20,p21,p22,p23,p24 )
local cCRLF := "chr(13)+chr(10)", cPIPE := "|"
cTrailler := "20" // (X 2) Preencher com o valor "20" para indicar o tipo de registro
cTrailler := cTrailler + cPIPE + StrFill( p02, 01, " ", "R" ) // (X 1) Informar conforme a função do registro:
// I – Inclusão do registro da NF
// R – Retificação do registro da NF
// C – Cancelamento da NF
cTrailler := cTrailler + cPIPE + StrFill( p03,255, " ", "R" ) // (X 15-255) Informar a justificativa do cancelamento. Campo obrigatório se campo 7 (Função do Registro) for igual a “C”.
cTrailler := cTrailler + cPIPE + StrFill( p04, 60, " ", "R" ) // (X 60) Informar a natureza da operação da qual decorreu a saída ou a entrada, tais como: venda, compra, transferência, devolução, importação, consignação, remessa (para fins de demonstração, de industrialização ou outra), conforme previsto na alínea 'i', inciso I, art. 19 do CONVÊNIO S/Nº, de 15 de dezembro de 1970.
cTrailler := cTrailler + cPIPE + StrFill( p05, 02, " ", "R" ) // (N 2) Série da Nota Fiscal. Informar 0 (zero) para série única.
cTrailler := cTrailler + cPIPE + StrFill( p06, 06, " ", "R" ) // (N 6) Número da Nota Fiscal.
cTrailler := cTrailler + cPIPE + StrFill( p07, 20, " ", "R" ) // (D 20) Data de Emissao Formato “DD/MM/AAAA HH:MM:SS” ; Hora: 0 a 23
cTrailler := cTrailler + cPIPE + StrFill( p08, 20, " ", "R" ) // (D 20) Data de Saida/Entrada Formato “DD/MM/AAAA HH:MM:SS ”.
cTrailler := cTrailler + cPIPE + StrFill( p09, 01, " ", "R" ) // (N 1) 0-entrada / 1-saída
cTrailler := cTrailler + cPIPE + StrFill( p10, 04, " ", "R" ) // (N 4) Utilizar Tabela de CFOP prevista no Anexo V do RICMS aprovado pelo decreto 45.490 de 30/11/2000 - Convênio s/nº de 15 de dezembro de 1970. Na hipótese de o documento fiscal conter mais de um Código Fiscal de Operações ou Prestação – CFOP, nesse campo deverá ser informado apenas o “CFOP” do item de maior valor; os demais “CFOP” deverão ser informados no campo “Descrição do produto ou serviço” conforme previsto no artigo 127, § 19, do RICMS/2000.
cTrailler := cTrailler + cPIPE + StrFill( p11, 14, " ", "R" ) // (X 14) Informar a IE do substituto tributário na UF de destino da mercadoria conforme previsto no artigo 127, inciso I, alínea “ l ” e § 5º do RICMS/2000. Preencher apenas com números, sem separadores.
cTrailler := cTrailler + cPIPE + StrFill( p12, 15, " ", "R" ) // (X 15) Este campo deve ser informado quando ocorrer a emissão de NF-e conjugada, com prestação de serviços sujeitos ao ISSQN e fornecimento sujeito ao ICMS. Deve ser preenchido apenas com números, sem separadores.
cTrailler := cTrailler + cPIPE + StrFill( p13, 14, " ", "R" ) // (X 11 ou 14) Informar o CNPJ ou o CPF do destinatário, preenchendo com os zeros não significativos.
// Deve ser preenchido apenas com números, sem separadores.
// Não informar se a operação for realizada com o exterior.
cTrailler := cTrailler + cPIPE + StrFill( p14,100, " ", "R" ) // (X Razão Social ou nome do destinatário
cTrailler := cTrailler + cPIPE + StrFill( p15,100, " ", "R" ) // (X Livre) Logradouro
cTrailler := cTrailler + cPIPE + StrFill( p16, 05, " ", "R" ) // (X Livre) Número
cTrailler := cTrailler + cPIPE + StrFill( p17, 50, " ", "R" ) // (X Livre) Complemento
cTrailler := cTrailler + cPIPE + StrFill( p18, 50, " ", "R" ) // (X Livre) Bairro
cTrailler := cTrailler + cPIPE + StrFill( p19, 08, " ", "R" ) // (X Livre) Informar “EXTERIOR” para operações com o exterior.
cTrailler := cTrailler + cPIPE + StrFill( p20, 02, " ", "R" ) // (X 2) Informar “EX” para operações com o exterior.
cTrailler := cTrailler + cPIPE + StrFill( p21, 08, "0", "R" ) // (N 8) CEP. Informar os zeros não significativos. Preencher apenas com números, sem separadores.
cTrailler := cTrailler + cPIPE + StrFill( p22, 10, " ", "R" ) // (X 20) Pais
cTrailler := cTrailler + cPIPE + StrFill( p23, 10, " ", "R" ) // (N Livre) Preencher o número do telefone com o respectivo código DDD, sem caracteres como hífens e parênteses.
cTrailler := cTrailler + cPIPE + StrFill( p24, 10, " ", "R" ) // (X 0-14) Informar a Inscrição Estadual quando o destinatário for inscrito no cadastro de contribuintes do ICMS. Preencher apenas com números, sem separadores.
cTrailler := alltrim( cTrailler ) + &(cCRLF)
::NFPSalvaRegistro( cTrailler )
RETURN nil
METHOD NFPRegistro30( p02,p03,p04,p05,p06,p07,p08,p09,p10,p11,p12 )
local cCRLF := "chr(13)+chr(10)", cPIPE := "|"
*** Registro30 - Mercadoria / Produto / Servico
*** 30|Produto 0|Pinga tipo 0|12345678|caixa|1,0000|5,0000|5,00|010|18,00|6,00|10,00
cTrailler := "30" // (X 2) Preencher com o valor "30" para indicar o tipo de registro
cTrailler := cTrailler + cPIPE + StrFill( p02, 20, "0", "R" ) // (X 16) Preencher com o código do produto ou serviço.
cTrailler := cTrailler + cPIPE + StrFill( p03,120, "0", "R" ) // (X 120) Nome, marca, tipo, modelo, série, espécie, qualidade e demais elementos que permitam sua perfeita identificação. Deve conter também os demais “CFOP” não informados no campo “CFOP”, na hipótese de o documento fiscal conter mais de um “CFOP”, conforme previsto no artigo 127, § 19, do RICMS/2000.
cTrailler := cTrailler + cPIPE + StrFill( p04, 08, "0", "R" ) // (X 8) Para mercadorias e produtos, preencher de acordo com a Tabela de Capítulos da NCM. Para serviços, não preencher o campo.
cTrailler := cTrailler + cPIPE + StrFill( p05, 03, "0", "R" ) // (X 3) Informar a unidade de comercialização da mercadoria / produto.
cTrailler := cTrailler + cPIPE + StrFill( p06, 12, "0", "R" ) // (N 12 4) Informar a quantidade de comercialização da mercadoria / produto.
cTrailler := cTrailler + cPIPE + StrFill( p07, 16, "0", "R" ) // (N 16 4) Informar o valor unitário de comercialização da mercadoria / produto
cTrailler := cTrailler + cPIPE + StrFill( p08, 15, "0", "R" ) // (N 15 2) Valor Total Bruto dos Produtos ou Serviços
cTrailler := cTrailler + cPIPE + StrFill( p09, 03, "0", "R" ) // (N 3) Código da Situação Tributária:
// 1° Dígito: Origem da mercadoria
// 0 – Nacional
// 1 – Estrangeira – Importação direta
// 2 – Estrangeira – Adquirida no mercado interno
// 2° e 3° Dígitos: Tributação pelo ICMS
// 00 – Tributada integralmente;
// 10 – Tributada e com cobrança de; ICMS por substituição tributária;
// 20 – Com redução de base de cálculo;
// 30 – Isenta ou não tributada e com cobrança do ICMS por substituição tributária;
// 40 – Isenta;
// 41 – Não tributada;
// 50 – Suspensão;
// 51 – Diferimento;
// 60 – ICMS cobrado anteriormente por substituição tributária;
// 70 – Com redução de base de cálculo e cobrança de ICMS substituição tributária;
// 90 - Outras.
cTrailler := cTrailler + cPIPE + StrFill( p10, 05, "0", "R" ) // (N 5 2) Alíquota do imposto ICMS
cTrailler := cTrailler + cPIPE + StrFill( p11, 05, "0", "R" ) // (N 5 2) Alíquota do IPI
cTrailler := cTrailler + cPIPE + StrFill( p12, 15, "0", "R" ) // (N 15 2) Valor do IPI
cTrailler := alltrim( cTrailler ) + &(cCRLF)
::NFPSalvaRegistro( cTrailler )
RETURN nil
METHOD NFPRegistro40( p02,p03,p04,p05,p06,p07,p08,p09,p10,p11,p12,p13,p14,p15 )
local cCRLF := "chr(13)+chr(10)", cPIPE := "|"
*** Registro40 - Valores Totais da NF
*** 40|69,01|1234,56|45,78|123,45|100,10|20,02|10,01|30,00|5,00|1,00|106,13|234,00|6,00|154,00
cTrailler := "40" // (X 2) Preencher com o valor "40" para indicar o tipo de registro
cTrailler := cTrailler + cPIPE + StrFill( p02, 15, "0", "R" ) // (N 15 2) Base de Calculo do ICMS
cTrailler := cTrailler + cPIPE + StrFill( p03, 15, "0", "R" ) // (N 15 2) Valor Total do ICMS
cTrailler := cTrailler + cPIPE + StrFill( p04, 15, "0", "R" ) // (N 15 2) Base de Cálculo do ICMS ST
cTrailler := cTrailler + cPIPE + StrFill( p05, 15, "0", "R" ) // (N 15 2) Valor Total do ICMS ST
cTrailler := cTrailler + cPIPE + StrFill( p06, 15, "0", "R" ) // (N 15 2) Valor Total dos produtos e serviços
cTrailler := cTrailler + cPIPE + StrFill( p07, 15, "0", "R" ) // (N 15 2) Valor Total do Frete
cTrailler := cTrailler + cPIPE + StrFill( p08, 15, "0", "R" ) // (N 15 2) Valor Total do Seguro
cTrailler := cTrailler + cPIPE + StrFill( p09, 15, "0", "R" ) // (N 15 2) Valor Total do Desconto
cTrailler := cTrailler + cPIPE + StrFill( p10, 15, "0", "R" ) // (N 15 2) Valor Total do IPI
cTrailler := cTrailler + cPIPE + StrFill( p11, 15, "0", "R" ) // (N 15 2) Outras Despesas acessórias
cTrailler := cTrailler + cPIPE + StrFill( p12, 15, "0", "R" ) // (N 15 2) Valor Total da NF
cTrailler := cTrailler + cPIPE + StrFill( p13, 15, "0", "R" ) // (N 15 2) Valor Total dos Serviços sob não-incidência ou não tributados pelo ICMS
cTrailler := cTrailler + cPIPE + StrFill( p14, 05, "0", "R" ) // (N 5 2) Alíquota do ISS
cTrailler := cTrailler + cPIPE + StrFill( p15, 15, "0", "R" ) // (N 15 2) Valor Total do ISS
cTrailler := alltrim( cTrailler ) + &(cCRLF)
::NFPSalvaRegistro( cTrailler )
RETURN nil
METHOD NFPRegistro50( p02,p03,p04,p05,p06,p07,p08,p09,p10,p11,p12,p13,p14,p15,p16 )
local cCRLF := "chr(13)+chr(10)", cPIPE := "|"
*** Registro50 - Informações do Transporte da NF
*** 50|0|00000000000000|Transportadora Xing Ling|000000000000|Av. da Lentidao, 321|Sao Paulo|SP|ABC1234|SP|123456789012345|litros|Xing Ling|123456789|123,000|154,064
cTrailler := "50" // (X 2) O tipo do registro deve ser “50”
cTrailler := cTrailler + cPIPE + StrFill( p02, 01, "0", "R" ) // (N 1) 0 – por conta do emitente; 1 – por conta do destinatário;
cTrailler := cTrailler + cPIPE + StrFill( p03, 14, " ", "R" ) // (X 14 ou 11) Informar o CNPJ ou o CPF do Transportador, preenchendo com os zeros não significativos.
cTrailler := cTrailler + cPIPE + StrFill( p04,100, " ", "R" ) // (X Livre) Razão Social ou nome
cTrailler := cTrailler + cPIPE + StrFill( p05, 14, " ", "R" ) // (X Livre) Inscrição Estadual
cTrailler := cTrailler + cPIPE + StrFill( p06,100, " ", "R" ) // (X Livre) Endereço Completo
cTrailler := cTrailler + cPIPE + StrFill( p07, 50, " ", "R" ) // (X Livre) Nome do município
cTrailler := cTrailler + cPIPE + StrFill( p08, 02, " ", "R" ) // (X 2) Sigla da UF
cTrailler := cTrailler + cPIPE + StrFill( p09, 08, " ", "R" ) // (X Livre) Placa do Veículo
cTrailler := cTrailler + cPIPE + StrFill( p10, 02, " ", "R" ) // (X 2) Sigla da UF da Placa
cTrailler := cTrailler + cPIPE + StrFill( p11, 15, " ", "R" ) // (N 15) Quantidade de volumes transportados
cTrailler := cTrailler + cPIPE + StrFill( p12, 20, " ", "R" ) // (X Livre) Especie dos volumes transportados
cTrailler := cTrailler + cPIPE + StrFill( p13, 20, " ", "R" ) // (X Livre) Marca dos volumes transportados
cTrailler := cTrailler + cPIPE + StrFill( p14, 10, " ", "R" ) // (X Livre) Numeração dos volumes transportados
cTrailler := cTrailler + cPIPE + StrFill( p15, 15, " ", "R" ) // (N 15 3) Peso Líquido (em kg)
cTrailler := cTrailler + cPIPE + StrFill( p16, 15, " ", "R" ) // (N 15 3) Peso Bruto (em kg)
cTrailler := alltrim( cTrailler ) + &(cCRLF)
::NFPSalvaRegistro( cTrailler )
RETURN nil
METHOD NFPRegistro60( p02,p03,p04 )
local cCRLF := "chr(13)+chr(10)", cPIPE := "|"
*** Registro60 - Informações Adicionais e de Cobrança
*** 60|Dados da fatura|Informacoes adicionais de interesse do Fisco|Informacoes complementares de interesse do contribuinte
cTrailler := "60" // (X 2) Preencher com o valor "60" para indicar o tipo de registro
cTrailler := cTrailler + cPIPE + StrFill( p02, 256, " ", "R" ) // (X 1-256) Preencher o campo com os dados da fatura
cTrailler := cTrailler + cPIPE + StrFill( p03, 256, " ", "R" ) // (X 1-256) Informacoes adicionais de interesse do Fisco
cTrailler := cTrailler + cPIPE + StrFill( p04, 256, " ", "R" ) // (X ...) Informacoes complementares de interesse do contribuinte
cTrailler := alltrim( cTrailler ) + &(cCRLF)
::NFPSalvaRegistro( cTrailler )
RETURN nil
METHOD NFPRegistro90()
local cCRLF := "chr(13)+chr(10)", cPIPE := "|"
*** Registro90 - Rodape
*** 90|00002|00010|00002|00002|00001
nSR20 := nSR30 := nSR40 := nSR50 := nSR60 := 0
for i = 1 to len( aNFPRegistros )
nSR20 := nSR20 + iif( "20" = aNFPRegistros[i], 1, 0 )
nSR30 := nSR30 + iif( "30" = aNFPRegistros[i], 1, 0 )
nSR40 := nSR40 + iif( "40" = aNFPRegistros[i], 1, 0 )
nSR50 := nSR50 + iif( "50" = aNFPRegistros[i], 1, 0 )
nSR60 := nSR60 + iif( "60" = aNFPRegistros[i], 1, 0 )
next
cTrailler := "90" // (X 2) Preencher com o valor "90" para indicar o tipo de registro
cTrailler := cTrailler + cPIPE + strZero( nSR20, 5 ) // (N 5) Indicar total de registros tipo 20 existentes no arquivo
cTrailler := cTrailler + cPIPE + strZero( nSR30, 5 ) // (N 5) Indicar total de registros tipo 30 existentes no arquivo
cTrailler := cTrailler + cPIPE + strZero( nSR40, 5 ) // (N 5) Indicar total de registros tipo 40 existentes no arquivo
cTrailler := cTrailler + cPIPE + strZero( nSR50, 5 ) // (N 5) Indicar total de registros tipo 50 existentes no arquivo
cTrailler := cTrailler + cPIPE + strZero( nSR60, 5 ) // (N 5) Indicar total de registros tipo 60 existentes no arquivo
cTrailler := alltrim( cTrailler ) + &(cCRLF)
::NFPSalvaRegistro( cTrailler )
RETURN nil
METHOD NFPSalvaRegistro( _Trailler_ )
aadd( ::aNFPRegistros, substr( _Trailler_, 1, 2 ) )
aadd( ::aNFPListagem, _Trailler_ )
return ""
METHOD NFPFinaliza()
local aNFP := ASORT( ::aNFPListagem )
local nNFP := fCreate( ::cFileName )
FOR I = 1 TO LEN(aNFP)
fWrite( nNFP, aNFP[I], LEN(aNFP[I]) )
NEXT
fClose( nNFP )
return MemoRead( ::cFileName )
METHOD NFPEnviar( cUsuario,;
cSenha,;
cCNPJ,;
cCategoria,;
cNomArq,;
cConteudo,;
lEnvio,;
lRetificar,;
cObs )
LOCAL cResultado
//
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">]
cResultado := cResultado + [ <soap12:Header>]
cResultado := cResultado + [ <Autenticacao Usuario="] + cUsuario + [" ]
cResultado := cResultado + [ Senha="] + cSenha + [" ]
cResultado := cResultado + [ CNPJ="] + cCNPJ + [" ]
cResultado := cResultado + [ CategoriaUsuario="] + cCategoria + [" ]
cResultado := cResultado + [ xmlns="https://www.nfp.sp.gov.br/ws" />]
cResultado := cResultado + [ </soap12:Header>]
cResultado := cResultado + [ <soap12:Body>]
if lRetificar
cResultado := cResultado + [ <Retificar xmlns="https://www.nfp.sp.gov.br/ws">]
else
cResultado := cResultado + [ <Enviar xmlns="https://www.nfp.sp.gov.br/ws">]
endif
cResultado := cResultado + [ <NomeArquivo>"] + cNomArq + ["</NomeArquivo>]
cResultado := cResultado + [ <ConteudoArquivo>] + cConteudo + [</ConteudoArquivo>]
if lEnvio
cResultado := cResultado + [ <EnvioNormal>true</EnvioNormal>]
else
cResultado := cResultado + [ <EnvioNormal>false</EnvioNormal>]
endif
cResultado := cResultado + [ <Observacoes>"] + cObs + ["</Observacoes>]
if lRetificar
cResultado := cResultado + [ </Retificar>]
else
cResultado := cResultado + [ </Enviar>]
endif
cResultado := cResultado + [ </soap12:Body>]
cResultado := cResultado + [</soap12:Envelope>]
//
return cResultado
METHOD NFPConsulta( cProtocolo, cUsuario, cSenha, cCNPJ, cCategoria )
LOCAL cResultado
//
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">]
cResultado := cResultado + [ <soap12:Header>]
cResultado := cResultado + [ <Autenticacao Usuario='] + cUsuario + [' ]
cResultado := cResultado + [ Senha='] + cSenha + [' ]
cResultado := cResultado + [ CNPJ='] + cCNPJ + [' ]
cResultado := cResultado + [ CategoriaUsuario='] + cCategoria + [' ]
cResultado := cResultado + [ xmlns="https://www.nfp.sp.gov.br/ws" />]
cResultado := cResultado + [ </soap12:Header>]
cResultado := cResultado + [ <soap12:Body>]
cResultado := cResultado + [ <Consultar xmlns="https://www.nfp.sp.gov.br/ws">]
cResultado := cResultado + [ <Protocolo>'] + cProtocolo + ['</Protocolo>]
cResultado := cResultado + [ </Consultar>]
cResultado := cResultado + [ </soap12:Body>]
cResultado := cResultado + [</soap12:Envelope>]
//
return cResultado
STATIC Function StrFill( _string_, _tamanho_, _fill_, _direction_ )
default _fill_ := " ", _direction_ := "R"
cStrFill := alltrim( CharRem( "[<(-.)>]*&@", _string_ ) )
//if _direction_ = "R"
// cStrFill := PadR(SubStr(cStrFill,1,_tamanho_),_tamanho_,_fill_)
//else
// cStrFill := PadL(SubStr(cStrFill,1,_tamanho_),_tamanho_,_fill_)
//endif
return alltrim( cStrFill )
O trecho de teste foi para meu teste usando Fivewin, mas não é requisito principal, pois a classe apenas concatena conteúdos.
Bom trabalho.
