Clipper On Line • Ver Tópico - NFS-e PMSP

NFS-e PMSP

Projeto Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

 

NFS-e PMSP

Mensagempor eduardomc00 » 24 Ago 2017 16:52

NFSE.prg

// ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
// ³                              NFSE.PRG                                   ³
// ³         NFS-e  Gera Nota Fiscal de Servi‡o Eletr“nica                   ³
// ³                         VIA PROGRAMA WSOFT                              ³
// ³                           29/04/2016                                    ³
// ³                              EMC                                        ³
// ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ

#include "common.ch"
#include "hbclass.ch"
#include "hbnfe.ch"

#include "wsmode.ch"
#include "wsnatop.ch"
#include "wscalc_f.ch"
#include "wsfile.ch"
#include "wsecf.ch"
#include "wsged.ch"

#include "inkey.ch"
#include "fileio.ch"
#include "directry.ch"
#include "dll.ch"

//::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
//::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
//::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
//::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

//////////
CLASS NFSE
//////////

   DATA oFuncoes     INIT hbNFeFuncoes()
   // DATA oCTe_GERAIS  INIT oCTe_GERAIS()
   DATA ohbNFe
   DATA oSigner
   DATA Xml
   
   // Cabecalho
   DATA cab_CodCidade
   DATA cab_CPFCNPJRemetente
   DATA cab_RazaoSocialRemetente
   DATA cab_dtInicio
   DATA cab_dtFim
   DATA cab_QtdRPS
   DATA cab_ValorTotalServicos
   DATA cab_ValorTotalDeducoes
   DATA cab_Versao Init 1
   DATA cab_MetodoEnvio Init 'WS'
   DATA cab_VersaoComponente Init '6.0004'
   
   // Rps
   DATA rps_InscricaoMunicipalPrestador
   DATA rps_RazaoSocialPrestador
   DATA rps_TipoRPS Init 'RPS'
   DATA rps_SerieRPS Init 'NF'
   DATA rps_NumeroRPS
   DATA rps_DataEmissaoRPS
   DATA rps_SituacaoRPS
   DATA rps_SerieRPSSubstituido
   DATA rps_NumeroRPSSubstituido
   DATA rps_NumeroNFSeSubstituida
   DATA rps_DataEmissaoNFSeSubstituida Init CTOD('01/01/1900')
   DATA rps_SeriePrestacao Init '99'
   DATA rps_InscricaoMunicipalTomador
   DATA rps_CPFCNPJTomador
   DATA rps_RazaoSocialTomador
   DATA rps_DocTomadorEstrangeiro
   DATA rps_TipoLogradouroTomador
   DATA rps_LogradouroTomador
   DATA rps_NumeroEnderecoTomador
   DATA rps_ComplementoEnderecoTomador
   DATA rps_TipoBairroTomador
   DATA rps_BairroTomador
   DATA rps_CidadeTomador
   DATA rps_CidadeTomadorDescricao
   DATA rps_CEPTomador
   DATA rps_EmailTomador
   DATA rps_CodigoAtividade
   DATA rps_AliquotaAtividade
   DATA rps_TipoRecolhimento
   DATA rps_MunicipioPrestacao
   DATA rps_MunicipioPrestacaoDescricao
   DATA rps_Operacao
   DATA rps_Tributacao
   DATA rps_ValorPIS
   DATA rps_ValorCOFINS
   DATA rps_ValorINSS
   DATA rps_ValorIR
   DATA rps_ValorCSLL
   DATA rps_AliquotaPIS
   DATA rps_AliquotaCOFINS
   DATA rps_AliquotaINSS
   DATA rps_AliquotaIR
   DATA rps_AliquotaCSLL
   DATA rps_DescricaoRPS
   DATA rps_DDDPrestador
   DATA rps_TelefonePrestador
   DATA rps_DDDTomador
   DATA rps_TelefoneTomador
   DATA rps_MotCancelamento
   DATA rps_CPFCNPJIntermediario

   // V10.0.K1292
   DATA cValorCargaTributaria
   DATA cPercentualCargaTributaria
   // V10.0.K1292

   // Registros de Itens da RPS
   DATA Itens_DiscriminacaoServico
   DATA Itens_Quantidade
   DATA Itens_ValorUnitario
   DATA Itens_ValorTotal
   DATA Itens_Tributavel   
   
   // Registro das Deducoes
   DATA Deducao_DeducaoPor
   DATA Deducao_TipoDeducao
   DATA Deducao_CPFCNPJReferencia
   DATA Deducao_NumeroNFReferencia
   DATA Deducao_ValorTotalReferencia
   DATA Deducao_PercentualDeduzir
   DATA Deducao_ValorDeduzir
   
   DATA numero_nota
   DATA codigo_verificacao
   DATA motivo
   
   METHOD Registro_Cabecalho()
   METHOD Registro_RPS()
   METHOD Registro_Itens_RPS(lABRE,lFECHA)
   METHOD Registro_Deducao_RPS(lABRE,lFECHA)
   METHOD Assina_XML()

   METHOD Finaliza_RPS()

   METHOD Gera_Chave_SHA1()
   METHOD Gera_Chave_SHA1_Cancelamento()
   METHOD DataToYYYY_MM_DD(dDAT,lTIME)
   METHOD DataToYYYYMMDD(dDAT)
   METHOD LinkWebService(cServ)
   METHOD ComunicaWebService(cMETHOD)
   METHOD ctPegaCNCertificado()
   METHOD LeRetorno(cRET)
   METHOD CancelaNFSe()
   METHOD ValidaXML()

ENDCLASS
////////
// EOC NFSE()

//::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

//////////////////////////////////////
METHOD Registro_Cabecalho() Class NFSE
//////////////////////////////////////

LOCAL aRETORNO:=HASH()
LOCAL cXML:='', cARQ:=''
LOCAL nHandle

aRETORNO['STATUS']:=.F.
aRETORNO['MSG']:=''

IF ::cab_CodCidade=NIL .OR. ::cab_CodCidade<=0
   aRETORNO['MSG']:='Favor informar o código do município'
ENDIF
IF ::cab_CPFCNPJRemetente=NIL .OR. EMPTY(::cab_CPFCNPJRemetente)
   aRETORNO['MSG']:='Favor informar o CPF / CNPJ do Remetente'
ENDIF
IF ::cab_RazaoSocialRemetente=NIL .OR. EMPTY(::cab_RazaoSocialRemetente)
   aRETORNO['MSG']:='Favor informar a razão social do Remetente'
ENDIF
IF ::cab_dtInicio=NIL .OR. DAY(::cab_dtInicio)<=0
   aRETORNO['MSG']:='Favor informar a data inicial da remessa'
ENDIF
IF ::cab_dtFim=NIL .OR. DAY(::cab_dtFim)<=0
   aRETORNO['MSG']:='Favor informar a data final da remessa'
ENDIF
IF ::cab_ValorTotalServicos=NIL
   ::cab_ValorTotalServicos:=0
ENDIF
IF ::cab_ValorTotalDeducoes=NIL
   ::cab_ValorTotalDeducoes:=0
ENDIF

IF !EMPTY(aRETORNO['MSG'])
   RETURN(aRETORNO)
ENDIF

cXML+='<PedidoEnvioLoteRPS xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.prefeitura.sp.gov.br/nfe">'

cXML+=   '<Cabecalho Versao="1" xmlns="">'
cXML+=      '<CPFCNPJRemetente><CNPJ>'+ALLTRIM(::cab_CPFCNPJRemetente)+'</CNPJ></CPFCNPJRemetente>'
cXML+=      '<transacao>false</transacao>'
cXML+=      '<dtInicio>'+::DataToYYYY_MM_DD(::cab_dtInicio)+'</dtInicio>'
cXML+=      '<dtFim>'+::DataToYYYY_MM_DD(::cab_dtFim)+'</dtFim>'
cXML+=      '<QtdRPS>'+ALLTRIM(STR(::cab_QtdRPS))+'</QtdRPS>'
cXML+=      '<ValorTotalServicos>'+ALLTRIM(STR(::cab_ValorTotalServicos))+'</ValorTotalServicos>'
cXML+=      '<ValorTotalDeducoes>'+ALLTRIM(STR(::cab_ValorTotalDeducoes))+'</ValorTotalDeducoes>'
cXML+=   '</Cabecalho>'

cARQ:=::ohbNFe:pastaEnvRes+'\NFSe'+ALLTRIM(::cab_CPFCNPJRemetente)+DTOS(DATE())+STRTRAN(LEFT(TIME(),8),':')+'.xml'

nHandle := FCREATE(cARQ)
FWRITE(nHandle, cXML)
FCLOSE( nHandle )
::XML := cARQ
aRETORNO['STATUS']:=.T.
aRETORNO['XML']:=cARQ
aRETORNO['MSG']:='XML criado em '+cARQ

RETURN(aRETORNO)
////////////////
// EOM Registro_Cabecalho()

//::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

////////////////////////////////
METHOD Registro_RPS() Class NFSE
////////////////////////////////

LOCAL aRETORNO:=HASH()
LOCAL cXML:='', cARQ:=''
LOCAL nHandle

aRETORNO['STATUS']:=.F.
aRETORNO['MSG']:=''

IF ::Xml=NIL .OR. EMPTY(::Xml)
   aRETORNO['MSG']:='Arquivo XML com o registro do cabeçalho não informado.'
ENDIF
IF ::rps_InscricaoMunicipalPrestador=NIL .OR. EMPTY(::rps_InscricaoMunicipalPrestador)
   aRETORNO['MSG']:='Favor Informar a Inscrição Municipal do Prestador. Verificar regra de preenchimento do campo no Anexo 03.'
ENDIF
IF ::rps_RazaoSocialPrestador=NIL .OR. EMPTY(::rps_RazaoSocialPrestador)
   aRETORNO['MSG']:='Favor Informar a Razão Social do Prestador.'
ENDIF
IF ::rps_TipoRPS=NIL .OR. EMPTY(::rps_TipoRPS)
   aRETORNO['MSG']:='Favor Informar o Tipo de RPS Padrão "RPS".'
ENDIF
IF ::rps_SerieRPS=NIL .OR. EMPTY(::rps_SerieRPS)
   aRETORNO['MSG']:='Favor Informar a Série do RPS - Padrão "NF".'
ENDIF
IF ::rps_NumeroRPS=NIL .OR. ::rps_NumeroRPS<=0
   aRETORNO['MSG']:='Favor Informar o Número da RPS.'
ENDIF
IF ::rps_NumeroRPS=NIL .OR. ::rps_NumeroRPS<=0
   aRETORNO['MSG']:='Favor Informar o Número da RPS.'
ENDIF
IF ::rps_DataEmissaoRPS=NIL .OR. DAY(::rps_DataEmissaoRPS)<=0
   aRETORNO['MSG']:='Favor Informar o Data de Emissão da RPS.'
ENDIF
IF ::rps_SituacaoRPS=NIL .OR. EMPTY(::rps_SituacaoRPS)
   aRETORNO['MSG']:='Favor Informar a Situação da RPS - "N"-Normal, "C"-Cancelada.'
ENDIF
IF ::rps_SerieRPSSubstituido=NIL
   ::rps_SerieRPSSubstituido:=''
ENDIF

IF ::rps_SituacaoRPS=NIL .OR. EMPTY(::rps_SituacaoRPS)
   aRETORNO['MSG']:='Favor Informar a Situação da RPS - "N"-Normal, "C"-Cancelada.'
ENDIF
IF ::rps_NumeroRPSSubstituido=NIL
   ::rps_NumeroRPSSubstituido:=0
ENDIF
IF ::rps_NumeroNFSeSubstituida=NIL
   ::rps_NumeroNFSeSubstituida:=0
ENDIF
IF ::rps_DataEmissaoNFSeSubstituida=NIL .OR. DAY(::rps_DataEmissaoNFSeSubstituida)<=0
   aRETORNO['MSG']:='Favor Informar a Data de emissão da NFSe Formato= AAAA-MM-DD. Se não for substituto preencher com "01/01/1900".'
ENDIF
IF ::rps_SeriePrestacao=NIL .OR. EMPTY(::rps_SeriePrestacao)
   aRETORNO['MSG']:='Favor Informar o Número do equipamento emissor do RPS ou série de prestação. Caso não utilize a série, preencha o campo com o valor ‘99’ que indica modelo único. Caso queira utilizar o campo série para indicar o número do equipamento emissor do RPS deve-se solicitar liberação da prefeitura.'
ENDIF
IF ::rps_InscricaoMunicipalTomador=NIL .OR. EMPTY(::rps_InscricaoMunicipalTomador)
   aRETORNO['MSG']:='Favor Informar a Inscrição Municipal do Tomador. Caso o tomador não for do municipio não preencher, caso o tomador for do município preencher com a Inscrição Municipal formatada Seguindo Anexo 03.'
ENDIF
IF ::rps_CPFCNPJTomador=NIL .OR. EMPTY(::rps_CPFCNPJTomador)
   aRETORNO['MSG']:='Favor Informar o CPF ou CNPJ do Tomador. Ex: "00000000000191"'
ENDIF
IF ::rps_RazaoSocialTomador=NIL .OR. EMPTY(::rps_RazaoSocialTomador)
   aRETORNO['MSG']:='Favor Informar a Razão Social do Tomador'
ENDIF
IF ::rps_DocTomadorEstrangeiro=NIL
   ::rps_DocTomadorEstrangeiro:=''
ENDIF
IF ::rps_TipoLogradouroTomador=NIL .OR. EMPTY(::rps_TipoLogradouroTomador)
   aRETORNO['MSG']:='Favor Informar o Tipo de Logradouro do Tomador. Campo de preenchimento livre. Verificar exemplos no anexo 04.'
ENDIF
IF ::rps_LogradouroTomador=NIL .OR. EMPTY(::rps_LogradouroTomador)
   aRETORNO['MSG']:='Favor Informar o Logradouro do Tomador.'
ENDIF
IF ::rps_NumeroEnderecoTomador=NIL .OR. EMPTY(::rps_NumeroEnderecoTomador)
   aRETORNO['MSG']:='Favor Informar o Numero de Endereço do Tomador.'
ENDIF
IF ::rps_ComplementoEnderecoTomador=NIL
   ::rps_ComplementoEnderecoTomador:=''
ENDIF
IF ::rps_TipoBairroTomador=NIL .OR. EMPTY(::rps_TipoBairroTomador)
   aRETORNO['MSG']:='Favor Informar o Tipo de Bairro do Tomador . Campo de preenchimento livre. Verificar exemplos no Anexo 05.'
ENDIF
IF ::rps_BairroTomador=NIL .OR. EMPTY(::rps_BairroTomador)
   aRETORNO['MSG']:='Favor Informar o Bairro do Tomador.'
ENDIF
IF ::rps_CidadeTomador=NIL .OR. ::rps_CidadeTomador<=0
   aRETORNO['MSG']:='Favor Informar o Código da Cidade do Tomador padrão SIAFI. (Confira o nome da cidade no cadastro do cliente)'
ENDIF
IF ::rps_CidadeTomadorDescricao=NIL .OR. EMPTY(::rps_CidadeTomadorDescricao)
   aRETORNO['MSG']:='Favor Informar o Nome da Cidade do Tomador.'
ENDIF
IF ::rps_CEPTomador=NIL .OR. EMPTY(::rps_CEPTomador)
   aRETORNO['MSG']:='Favor Informar o CEP do Tomador Ex: "37900000".'
ENDIF
IF ::rps_EmailTomador=NIL .OR. EMPTY(::rps_EmailTomador)
   ::rps_EmailTomador:='-'
ENDIF
IF ::rps_CodigoAtividade=NIL .OR. EMPTY(::rps_CodigoAtividade)
   aRETORNO['MSG']:='Favor Informar o Código da Atividade da RPS. (Confira o codigo CNAE no cadastro do cliente)'
ENDIF
IF ::rps_AliquotaAtividade=NIL
   ::rps_AliquotaAtividade:=0
ENDIF
IF ::rps_TipoRecolhimento=NIL .OR. EMPTY(::rps_TipoRecolhimento)
   aRETORNO['MSG']:='Favor Informar o Tipo de Recolhimento - "A" – A Receber, "R" - Retido na Fonte.'
ENDIF
IF ::rps_MunicipioPrestacao=NIL .OR. ::rps_MunicipioPrestacao<=0
   aRETORNO['MSG']:='Favor Informar o Código do Município de Prestação – Padrão SIAFI.'
ENDIF
IF ::rps_MunicipioPrestacao=NIL .OR. ::rps_MunicipioPrestacao<=0
   aRETORNO['MSG']:='Favor Informar o Código do Município de Prestação – Padrão SIAFI.'
ENDIF
IF ::rps_MunicipioPrestacaoDescricao=NIL .OR. EMPTY(::rps_MunicipioPrestacaoDescricao)
   aRETORNO['MSG']:='Favor Informar o Município de Prestação do Serviço.'
ENDIF
IF ::rps_Operacao=NIL .OR. EMPTY(::rps_Operacao)
   aRETORNO['MSG']:='Favor Informar a Operação - "A"-Sem Dedução, "B"-Com Dedução/Materiais, "C" - Imune/Isenta de ISSQN, "D" - Devolução/Simples Remessa, "J" - Intemediação.'
ENDIF
IF ::rps_Tributacao=NIL .OR. EMPTY(::rps_Tributacao)
   aRETORNO['MSG']:='Favor Informar a Tributação: C - Isenta de ISS, E - Não Incidência no Município, F - Imune, K - Exigibilidd Susp.Dec.J/Proc.A, N - Não Tributável, T – Tributável, G - Tributável Fixo, H - Tributável S.N., M - Micro Empreendedor Individual (MEI).'
ENDIF
IF ::rps_ValorPIS=NIL
   ::rps_ValorPIS:=0.00
ENDIF
IF ::rps_ValorCOFINS=NIL
   ::rps_ValorCOFINS:=0.00
ENDIF
IF ::rps_ValorINSS=NIL
   ::rps_ValorINSS:=0.00
ENDIF
IF ::rps_ValorIR=NIL
   ::rps_ValorIR:=0.00
ENDIF
IF ::rps_ValorCSLL=NIL
   ::rps_ValorCSLL:=0.00
ENDIF
IF ::rps_AliquotaPIS=NIL
   ::rps_AliquotaPIS:=0.00
ENDIF
IF ::rps_AliquotaCOFINS=NIL
   ::rps_AliquotaCOFINS:=0.00
ENDIF
IF ::rps_AliquotaINSS=NIL
   ::rps_AliquotaINSS:=0.00
ENDIF
IF ::rps_AliquotaIR=NIL
   ::rps_AliquotaIR:=0.00
ENDIF
IF ::rps_AliquotaCSLL=NIL
   ::rps_AliquotaCSLL:=0.00
ENDIF
IF ::rps_DescricaoRPS=NIL
   ::rps_DescricaoRPS:=''
ENDIF
IF ::rps_DDDPrestador=NIL
   ::rps_DDDPrestador:=''
ENDIF
IF ::rps_TelefonePrestador=NIL
   ::rps_TelefonePrestador:=''
ENDIF
IF ::rps_DDDTomador=NIL
   ::rps_DDDTomador:=''
ENDIF
IF ::rps_TelefoneTomador=NIL
   ::rps_TelefoneTomador:=''
ENDIF
IF ::rps_MotCancelamento=NIL
   ::rps_MotCancelamento:=''
ENDIF
IF ::rps_CPFCNPJIntermediario=NIL
   ::rps_CPFCNPJIntermediario:=''
ENDIF

IF !EMPTY(aRETORNO['MSG'])
   RETURN(aRETORNO)
ENDIF

cXML:=MEMOREAD(::Xml)
FERASE(::Xml)

cAssinatura:=::Gera_Chave_SHA1()
cXML+=      '<RPS xmlns="">'  //'<RPS Id="rps:2">'
cXML+=         '<Assinatura>'+cAssinatura+'</Assinatura>'
cXML+=         '<ChaveRPS>'
cXML+=            '<InscricaoPrestador>'+ALLTRIM(::rps_InscricaoMunicipalPrestador)+'</InscricaoPrestador>'
cXML+=            '<SerieRPS>'+ALLTRIM(::rps_SerieRPS)+'</SerieRPS>'
cXML+=            '<NumeroRPS>'+ALLTRIM(STR(::rps_NumeroRPS))+'</NumeroRPS>'
cXML+=         '</ChaveRPS>'
cXML+=         '<TipoRPS>'+ALLTRIM(::rps_TipoRPS)+'</TipoRPS>'
cXML+=         '<DataEmissao>'+::DataToYYYY_MM_DD(::rps_DataEmissaoRPS,.F.)+'</DataEmissao>'
cXML+=         '<StatusRPS>'+ALLTRIM(::rps_SituacaoRPS)+'</StatusRPS>'
cXML+=         '<TributacaoRPS>'+ALLTRIM(::rps_Tributacao)+'</TributacaoRPS>'
cXML+=         '<ValorServicos>'+ALLTRIM(STR(::cab_ValorTotalServicos))+'</ValorServicos>'
cXML+=         '<ValorDeducoes>'+ALLTRIM(STR(::cab_ValorTotalDeducoes))+'</ValorDeducoes>'
cXML+=         '<CodigoServico>'+::rps_CodigoAtividade+'</CodigoServico>'
cXML+=         '<AliquotaServicos>'+ALLTRIM(STR(::rps_AliquotaAtividade))+'</AliquotaServicos>'
cXML+=         '<ISSRetido>false</ISSRetido>'

// V10.0.K1608
// cXML+=         '<CPFCNPJTomador><CPF>'+ALLTRIM(::rps_CPFCNPJTomador)+'</CPF></CPFCNPJTomador>'
IF LEN( ALLTRIM(::rps_CPFCNPJTomador) ) == 14
   cXML+=         '<CPFCNPJTomador><CNPJ>'+ALLTRIM(::rps_CPFCNPJTomador)+'</CNPJ></CPFCNPJTomador>'
ELSE
   cXML+=         '<CPFCNPJTomador><CPF>'+ALLTRIM(::rps_CPFCNPJTomador)+'</CPF></CPFCNPJTomador>'
ENDIF
// V10.0.K1608

cXML+=         '<RazaoSocialTomador>'+ALLTRIM(::rps_RazaoSocialTomador)+'</RazaoSocialTomador>'
cXML+=         '<EnderecoTomador>'
cXML+=            '<TipoLogradouro>'+ALLTRIM(::rps_TipoLogradouroTomador)+'</TipoLogradouro>'
cXML+=            '<Logradouro>'+ALLTRIM(::oFuncoes:parseEncode(::rps_LogradouroTomador))+'</Logradouro>'
cXML+=            '<NumeroEndereco>'+ALLTRIM(::rps_NumeroEnderecoTomador)+'</NumeroEndereco>'
cXML+=            '<ComplementoEndereco>'+ALLTRIM(::oFuncoes:parseEncode(::rps_ComplementoEnderecoTomador))+'</ComplementoEndereco>'
cXML+=            '<Bairro>'+ALLTRIM(::oFuncoes:parseEncode(::rps_BairroTomador))+'</Bairro>'
cXML+=            '<Cidade>'+ALLTRIM(STR(::rps_CidadeTomador))+'</Cidade>'
cXML+=            '<UF>'+ALLTRIM("SP")+'</UF>'
cXML+=            '<CEP>'+ALLTRIM(::rps_CEPTomador)+'</CEP>'
cXML+=         '</EnderecoTomador>'
cXML+=         '<EmailTomador>'+ALLTRIM(::oFuncoes:parseEncode(::rps_EmailTomador))+'</EmailTomador>'
cXML+=         '<Discriminacao>'+ALLTRIM(::Itens_DiscriminacaoServico)+'</Discriminacao>'

// V10.0.K1292
cXML+=         '<ValorCargaTributaria>'+::cValorCargaTributaria+'</ValorCargaTributaria>'
cXML+=         '<PercentualCargaTributaria>'+::cPercentualCargaTributaria+'</PercentualCargaTributaria>'
cXML+=         '<FonteCargaTributaria>P.I.085/14</FonteCargaTributaria>'
// V10.0.K1292

cXML+=      '</RPS>'

cXML:=::oFuncoes:RemoveAcentuacao(cXML)

nHandle := FCREATE(::XML)
FWRITE(nHandle, cXML)
FCLOSE( nHandle )

aRETORNO['STATUS']:=.T.
aRETORNO['XML']:=::XML
aRETORNO['MSG']:='XML criado em '+::XML
RETURN(aRETORNO)
////////////////
// EOM Registro_RPS()

//::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

//////////////////////////////////////////////////
METHOD Registro_Itens_RPS(lABRE,lFECHA) Class NFSE
//////////////////////////////////////////////////

LOCAL aRETORNO:=HASH()
LOCAL cXML:=''
LOCAL nHandle

aRETORNO['STATUS']:=.F.
aRETORNO['MSG']:=''

IF ::Xml=NIL .OR. EMPTY(::Xml)
   aRETORNO['MSG']:='Arquivo XML com o registro do cabeçalho e RPS não informado.'
ENDIF
IF ::Itens_DiscriminacaoServico=NIL .OR. EMPTY(::Itens_DiscriminacaoServico)
   aRETORNO['MSG']:='Favor informar a Discriminação do Serviço.'
ENDIF
IF ::Itens_Quantidade=NIL .OR. ::Itens_Quantidade<=0
   aRETORNO['MSG']:='Favor informar a Quantidade do serviço tomado.'
ENDIF
IF ::Itens_ValorUnitario=NIL .OR. ::Itens_ValorUnitario<=0
   aRETORNO['MSG']:='Favor informar o Valor Unitário do serviço tomado.'
ENDIF
IF ::Itens_ValorTotal=NIL .OR. ::Itens_ValorTotal<=0
   aRETORNO['MSG']:='Favor informar o Valor total do serviço tomado.'
ENDIF
IF ::Itens_Tributavel=NIL
   ::Itens_Tributavel:=''
ENDIF

IF !EMPTY(aRETORNO['MSG'])
   RETURN(aRETORNO)
ENDIF

cXML:=MEMOREAD(::Xml)
FERASE(::Xml)

IF lABRE
   cXML+='<Itens>'
ENDIF   

IF lFECHA
   cXML+='</Itens>'
ENDIF   

nHandle := FCREATE(::Xml)
FWRITE(nHandle, cXML)
FCLOSE( nHandle )

aRETORNO['STATUS']:=.T.
aRETORNO['XML']:=::Xml
aRETORNO['MSG']:='XML criado em '+::Xml

RETURN(aRETORNO)
////////////////
// EOM Registro_Itens_RPS()

//::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

/////////////////////////////////////////
METHOD Registro_Deducao_RPS(lABRE,lFECHA)
/////////////////////////////////////////

LOCAL aRETORNO:=HASH()
LOCAL cXML:=''
LOCAL nHandle

aRETORNO['STATUS']:=.F.
aRETORNO['MSG']:=''

IF ::Xml=NIL .OR. EMPTY(::Xml)
   aRETORNO['MSG']:='Arquivo XML com o registro do cabeçalho e RPS não informado.'
ENDIF

IF !EMPTY(aRETORNO['MSG'])
   RETURN(aRETORNO)
ENDIF

cXML:=MEMOREAD(::Xml)
FERASE(::Xml)

nHandle := FCREATE(::Xml)
FWRITE(nHandle, cXML)
FCLOSE( nHandle )

aRETORNO['STATUS']:=.T.
aRETORNO['XML']:=::Xml
aRETORNO['MSG']:='XML criado em '+::Xml

RETURN(aRETORNO)
////////////////
// EOM Registro_Deducao_RPS()

//::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

////////////////////////////////
METHOD Finaliza_RPS() Class NFSE
////////////////////////////////

LOCAL aRETORNO:=HASH()
LOCAL cXML:=''
LOCAL nHandle
aRETORNO['STATUS']:=.F.
aRETORNO['MSG']:=''

IF ::Xml=NIL .OR. EMPTY(::Xml)
   aRETORNO['MSG']:='Arquivo XML com o registro do cabeçalho e RPS não informado.'
ENDIF

cXML:=MEMOREAD(::Xml)

FERASE(::Xml)

cXML+='<Signature></Signature>'

cXML+='</PedidoEnvioLoteRPS>'

nHandle := FCREATE(::Xml)
FWRITE(nHandle, cXML)
FCLOSE( nHandle )

aRETORNO['STATUS']:=.T.
aRETORNO['XML']:=::Xml
aRETORNO['MSG']:='XML criado em '+::Xml

RETURN(aRETORNO)
////////////////
// EOM Finaliza_RPS()

//::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

//////////////////////////////
METHOD Assina_XML() Class NFSE
//////////////////////////////

LOCAL oDOMDoc, oXmldsig, oCert, oStoreMem, dsigKey, signedKey
LOCAL aRETORNO:=HASH()
LOCAL cXML:='', cXMLSig:=''
LOCAL PosIni:=0, PosFim:=0, nP:=0, nResult:=0
LOCAL nHandle

aRETORNO['STATUS']:=.F.
aRETORNO['MSG']:=''

IF ::Xml=NIL .OR. EMPTY(::Xml)
   aRETORNO['MSG']:='Arquivo XML com o registro do cabeçalho e RPS não informado.'
ENDIF
cXML:=MEMOREAD(::Xml)
FERASE(::Xml)

cXML:=STRTRAN(cXML,'<Signature></Signature>','<Signature xmlns="http://www.w3.org/2000/09/xmldsig#">'+;
                                             '<SignedInfo>'+;
                                                '<CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315" />'+;
                                                '<SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1" />'+;
                                                '<Reference URI="">'+;
                                                   '<Transforms>'+;
                                                      '<Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" />'+;
                                                      '<Transform Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315" />'+;
                                                   '</Transforms>'+;
                                                   '<DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" />'+;
                                                   '<DigestValue>'+;
                                                  '</DigestValue>'+;
                                                '</Reference>'+;
                                             '</SignedInfo>'+;
                                             '<SignatureValue>'+;
                                             '</SignatureValue>'+;
                                             '<KeyInfo>'+;
                                                '<X509Data>'+;
                                                   '<X509Certificate>'+;
                                                   '</X509Certificate>'+;
                                                '</X509Data>'+;
                                             '</KeyInfo>'+;
                                          '</Signature>')

// Inicializa o objeto do DOMDocument
TRY
   oDOMDoc := win_oleCreateObject(_MSXML2_DOMDocument)
CATCH
   aRETORNO['MSG']:='Nao foi possível carregar ' + _MSXML2_DOMDocument
   RETURN(aRETORNO)
END
oDOMDoc:async = .F.
oDOMDoc:resolveExternals := .F.
oDOMDoc:validateOnParse  = .T.
oDOMDoc:preserveWhiteSpace = .T.

// inicializa o objeto do MXDigitalSignature
TRY
   oXmldsig := win_oleCreateObject( _MSXML2_MXDigitalSignature )
CATCH
   aRETORNO['MSG']:='Nao foi possível carregar ' +_MSXML2_MXDigitalSignature
   RETURN(aRETORNO)
END

nHandle := FCREATE(::ohbNFe:pastaEnvRes+"\edunfs.xml")
FWRITE( nHandle, cXML )
FCLOSE( nHandle )

// carrega o arquivo XML para o DOM
oDOMDoc:LoadXML(cXML)
IF oDOMDoc:parseError:errorCode<>0
   aRETORNO['MSG']:=' Assinar: Não foi possível carregar o documento pois ele não corresponde ao seu Schema'+HB_OsNewLine()+;
                    ' Linha: '              + STR(oDOMDoc:parseError:line)+HB_OsNewLine()+;
                    ' Caractere na linha: ' + STR(oDOMDoc:parseError:linepos)+HB_OsNewLine()+;
                    ' Causa do erro: '      + oDOMDoc:parseError:reason+HB_OsNewLine()+;
                    ' code: '               + STR(oDOMDoc:parseError:errorCode)
   RETURN(aRETORNO)
ENDIF

// Localiza as assinaturas no XML
oDOMDoc:setProperty('SelectionNamespaces',"xmlns:ds='http://www.w3.org/2000/09/xmldsig#'")
oXmldsig:signature := oDOMDoc:selectSingleNode('.//ds:Signature')
IF (oXmldsig:signature = nil)
   aRETORNO['MSG'] := 'É preciso carregar o template antes de assinar.'
   RETURN(aRETORNO)
ENDIF

// carrega o objeto do certificado digital
oCert:=::ohbNFe:pegaObjetoCertificado(::ohbNFe:cSerialCert)

IF oCert == Nil
   aRETORNO['MSG']  := 'Certificado não encontrado, Favor revisar a instalação do Certificado'
   RETURN(aRETORNO)
ENDIF

// cria o objeto de Store da capicom
oStoreMem := win_oleCreateObject('CAPICOM.Store')

// Aloca o certificado na memoria
TRY
   oStoreMem:open(_CAPICOM_MEMORY_STORE,'Memoria',_CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED)
CATCH oError
   aRETORNO['MSG']:='Falha ao alocar o certificado na memoria '+HB_OsNewLine()+ ;
                    'Error: '     + Transform(oError:GenCode, nil)   + ';' +HB_OsNewLine()+ ;
                    'SubC: '      + Transform(oError:SubCode, nil)   + ';' +HB_OsNewLine()+ ;
                    'OSCode: '    + Transform(oError:OsCode,  nil)   + ';' +HB_OsNewLine()+ ;
                    'SubSystem: ' + Transform(oError:SubSystem, nil) + ';' +HB_OsNewLine()+ ;
                    'Mensangem: ' + oError:Description
   RETURN(aRETORNO)
END

// Aloca o certificado na Capicom
TRY
   oStoreMem:Add(oCert)
CATCH oError
   aRETORNO['MSG']:='Falha ao aloca o certificado na memoria da Capicom '+HB_OsNewLine()+;
                    'Error: '     + Transform(oError:GenCode, nil)   + ';' +HB_OsNewLine()+;
                    'SubC: '      + Transform(oError:SubCode, nil)   + ';' +HB_OsNewLine()+;
                    'OSCode: '    + Transform(oError:OsCode,  nil)   + ';' +HB_OsNewLine()+;
                    'SubSystem: ' + Transform(oError:SubSystem, nil) + ';' +HB_OsNewLine()+;
                    'Mensangem: ' + oError:Description
   RETURN(aRETORNO)
END
oXmldsig:store:=oStoreMem

// Cria chave CSP
TRY
   dsigKey:=oXmldsig:createKeyFromCSP(oCert:PrivateKey:ProviderType, oCert:PrivateKey:ProviderName, oCert:PrivateKey:ContainerName, 0)
CATCH
   aRETORNO['MSG']:='Erro ao criar a chave do CSP, talvez o certificado não esteja instalado corretamente.'
   RETURN(aRETORNO)         
END
IF (dsigKey = nil)
   aRETORNO['MSG']:='Erro ao criar a chave do CSP.'
   RETURN(aRETORNO)
ENDIF

// Assina a chave do CSP
TRY
   signedKey:=oXmldsig:sign(dsigKey, 2)
CATCH
   aRETORNO['MSG']:='Erro ao assinar a chave do CSP, talvez o certificado não esteja instalado corretamente.'
   RETURN(aRETORNO)
END
IF signedKey=NIL
   aRETORNO['MSG']:='Assinatura Falhou.'
   RETURN(aRetorno)
ENDIF

// Trata o formato da estrutura do XML
cXMLSig := STRTRAN(STRTRAN(oDOMDoc:xml,CHR(10)),CHR(13))
PosIni  := AT('<SignatureValue>',cXMLSig)+len('<SignatureValue>')
cXMLSig := SUBS(cXMLSig,1,PosIni-1)+STRTRAN( SUBS(cXMLSig,PosIni,len(cXMLSig)), ' ', '' )
PosIni  := AT('<X509Certificate>',cXMLSig)-1
nP      := AT('<X509Certificate>',cXMLSig)
nResult := 0
DO WHILE nP<>0
   nResult := nP
   nP = WAT('<X509Certificate>',cXMLSig,nP+1)
ENDDO
PosFim := nResult
cXMLSig := SUBS(cXMLSig,1,PosIni)+SUBS(cXMLSig,PosFim,len(cXMLSig))
cXMLsig := STRTRAN( cXMLsig, 'Id="rps:1"', '' )

// grava o arquivo no disco
nHandle := FCREATE(::Xml)
FWRITE(nHandle, cXMLSig)
FCLOSE( nHandle )

aRETORNO['STATUS']:=.T.
aRETORNO['XML']:=::Xml
aRETORNO['MSG']:='XML assinado com sucesso em '+::Xml

RETURN(aRETORNO)
////////////////
// EOM Assina_XML()

//::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

//////////////////////////////////
METHOD LinkWebService() Class NFSE
//////////////////////////////////

LOCAL cWeb:=''

IF ::cab_CodCidade=3550308 // SÆo Paulo-SP
   cWeb:='https://nfe.prefeitura.sp.gov.br/ws/lotenfe.asmx'
ENDIF
RETURN(cWeb)
////////////
// EOM LinkWebService()

//::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

///////////////////////////////////////
METHOD ctPegaCNCertificado() Class NFSE
///////////////////////////////////////

LOCAL oStore, oResult, oCertificados
LOCAL cSubjectName:='', cCN:=''
LOCAL mI:=0

TRY
   oStore := win_oleCreateObject( "CAPICOM.Store" )
CATCH
END

IF oStore = Nil
   RETURN('')
ENDIF

oStore:open(_CAPICOM_CURRENT_USER_STORE,'My',_CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED)
oCertificados:=oStore:Certificates()
FOR mI=1 TO oCertificados:Count()
   IF oCertificados:Item(mI):SerialNumber = ::ohbNFe:cSerialCert
      cSubjectName := oCertificados:Item(mI):SubjectName
   ENDIF
NEXT
cCN:=''
FOR mI:=AT("CN=",cSubjectName)+3 TO LEN(cSubjectName)
   IF SUBS(cSubjectName,mI,1) == ","
      EXIT
   ENDIF
   cCN += SUBS(cSubjectName,mI,1)
NEXT
oCertificados := Nil
oStore := Nil
RETURN(cCN)
///////////
// EOM ctPegaCNCertificado()

//::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

/////////////////////////////////////////////
METHOD ComunicaWebService(cMethod) Class NFSE
/////////////////////////////////////////////

LOCAL oServerWS
LOCAL oDOMDoc
LOCAL aRETORNO   := HASH()
LOCAL cCERT      := ''
LOCAL cUrlWS     := ''
LOCAL cXML       := {}
LOCAL cNameSpace := ""
LOCAL cRetXml

aRETORNO['STATUS']:=.F.
aRETORNO['MSG']:=''

IF ::Xml=NIL .OR. EMPTY(::Xml)
   aRETORNO['MSG']:='Arquivo XML assinado de RPS não informado.'
ENDIF

cXML := MEMOREAD(::Xml)
// FERASE(::Xml)

IF EMPTY(cXML)

   aRETORNO['MSG']:='Favor informar o arquivo de XML.'
   RETURN(aRETORNO)
   
ENDIF

IF cMethod == 'cancelar'

   cNameSpace := "CancelamentoNFeRequest"
   
ELSE

   IF .f. // WSet( LPK_B_PC_TEC ) // NÆo est  funcionando
      cNameSpace := "TesteEnvioLoteRPSRequest"
   ELSE
      cNameSpace := "EnvioLoteRPSRequest"
   ENDIF
   
ENDIF

cXML := '<?xml version="1.0" encoding="utf-8"?>' +;
             '<soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ' +;
             'xmlns:xsd="http://www.w3.org/2001/XMLSchema" ' +;
             'xmlns:soap12="http://schemas.xmlsoap.org/soap/envelope/">' +;
             '<soap12:Body>' +;
               '<'+cNameSpace+' xmlns="http://www.prefeitura.sp.gov.br/nfe">' +;
                 '<VersaoSchema>1</VersaoSchema>' +;
                 '<MensagemXML> ' +;
                 '<![CDATA[ ' + cXML +' ]]>'+;
                 '</MensagemXML>' +;
               '</'+cNameSpace+'>'+;
             '</soap12:Body>' +;
           '</soap12:Envelope>'

nHandle := FCREATE(::ohbNFe:pastaEnvRes+"\edunfs.xml")
FWRITE( nHandle, cXML )
FCLOSE( nHandle )

TRY

   // cCERT := ::ctPegaCNCertificado()
   cCERT := ::ohbNFe:pegaCNCertificado(SetaCros( GC_NFE_NS_CERTIF ))
   
CATCH
END

IF EMPTY(cCERT)

   aRETORNO['MSG']:='Não foi possível carregar as informações do certificado.'
   RETURN(aRETORNO)
   
ENDIF

cUrlWS:=::LinkWebService()

IF EMPTY(cUrlWS)

   aRETORNO['MSG']:='Webservice não localizado'
   RETURN(aRETORNO)
   
ENDIF

TRY

   oServerWS:=win_oleCreateObject( _MSXML2_ServerXMLHTTP )
   oServerWS:setOption( 3, 'CURRENT_USER\MY\'+cCERT )
   oServerWS:open('POST', cUrlWS, .F.)
   IF .F. // WSet( LPK_B_PC_TEC ) // NÆo est  funcionando
      oServerWS:setRequestHeader('SOAPAction', 'http://www.prefeitura.sp.gov.br/nfe/ws/testeenvio' )
   ELSE
      IF cMethod == 'cancelar'
         oServerWS:setRequestHeader('SOAPAction', 'http://www.prefeitura.sp.gov.br/nfe/ws/cancelamentoNFe' )
      ELSE
         oServerWS:setRequestHeader('SOAPAction', 'http://www.prefeitura.sp.gov.br/nfe/ws/envioLoteRPS' )
      ENDIF
   ENDIF
   
   oServerWS:setRequestHeader('Content-Type','text/xml; charset=utf-8')

CATCH

   aRETORNO['MSG']:='Não foi possível inicializar a conexão do webservice'
   RETURN(aRETORNO)
   
END

IF oServerWS=NIL
   aRETORNO['MSG']:='Não foi possível inicializar o objeto de conexão do webservice'
   RETURN(aRETORNO)
ENDIF

TRY

   oDOMDoc:=win_oleCreateObject(_MSXML2_DOMDocument)
   oDOMDoc:async = .F.
   oDOMDoc:validateOnParse  = .T.
   oDOMDoc:resolveExternals := .F.
   oDOMDoc:preserveWhiteSpace = .T.
   oDOMDoc:LoadXML(cXML)
   
CATCH

   aRETORNO['MSG']:='Não foi possível carregar o documento XML'
   RETURN(aRETORNO)
   
END   

IF oDOMDoc:parseError:errorCode <> 0

   aRETORNO['MSG']:='Não foi possível carregar o documento pois ele não corresponde ao seu Schema'+HB_OsNewLine()+;
                    ' Linha: '+STR(oDOMDoc:parseError:line)                                       +HB_OsNewLine()+;
                    ' Caractere na linha: '+STR(oDOMDoc:parseError:linepos)                       +HB_OsNewLine()+;
                    ' Causa do erro: '+oDOMDoc:parseError:reason                                  +HB_OsNewLine()+;
                    ' Code: '+STR(oDOMDoc:parseError:errorCode)
  RETURN(aRETORNO)
 
ENDIF

TRY

   oServerWS:send( oDOMDoc:xml )

CATCH e

   aRETORNO['MSG']:='Falha: Não foi possível conectar-se ao servidor do SEFAZ, Servidor inativo ou inoperante.'+HB_OsNewLine()+;
                    'Error: '+Transform(e:GenCode,nil)                                                     +';'+HB_OsNewLine()+;
                    'SubC: '+Transform(e:SubCode,nil)                                                      +';'+HB_OsNewLine()+;
                    'OSCode: '+Transform(e:OsCode,nil)                                                     +';'+HB_OsNewLine()+;
                    'SubSystem: '+Transform(e:SubSystem,nil)                                               +';'+HB_OsNewLine()+;
                    'Mensangem: '+e:Description
   Wint(aRETORNO['MSG'])
  RETURN(aRETORNO)
 
END

DO WHILE oServerWS:readyState <> 4

  millisec(500)
 
ENDDO

aRETORNO['MSG']:='Comunicação com o webservice finalizada com sucesso.'
aRETORNO['STATUS']:=.T.
aRETORNO['XML']:=oServerWS:responseText

nHandle := FCREATE(::ohbNFe:pastaEnvRes+"\eduret.xml")
FWRITE( nHandle, AlteraCaracteres(oServerWS:responseText, .T.) )
FCLOSE( nHandle )

oDOMDoc   :=Nil
oServerWS :=Nil

RETURN(aRETORNO)
////////////////
// EOM ComunicaWebService()

//::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

///////////////////////////////
METHOD CancelaNFSe() Class NFSE
///////////////////////////////

LOCAL cXML:=''
LOCAL aRETORNO:=HASH()
LOCAL nHandle
aRETORNO['STATUS']:=.F.
aRETORNO['MSG']:=''

IF ::cab_CodCidade=NIL .OR. ::cab_CodCidade<=0
   aRETORNO['MSG']:='Favor informar o código do município'
ENDIF
IF ::cab_CPFCNPJRemetente=NIL .OR. EMPTY(::cab_CPFCNPJRemetente)
   aRETORNO['MSG']:='Favor informar o CPF / CNPJ do Remetente'
ENDIF
IF ::rps_InscricaoMunicipalPrestador=NIL .OR. EMPTY(::rps_InscricaoMunicipalPrestador)
   aRETORNO['MSG']:='Favor Informar a Inscrição Municipal do Prestador. Verificar regra de preenchimento do campo no Anexo 03.'
ENDIF
IF ::numero_nota=NIL .OR. ::numero_nota<=0
   aRETORNO['MSG']:='Favor Informar o número da nota a ser cancelada.'
ENDIF
// IF ::codigo_verificacao=NIL .OR. EMPTY(::codigo_verificacao)
//    aRETORNO['MSG']:='Favor Informar o código verificador.'
// ENDIF

IF !EMPTY(aRETORNO['MSG'])
   aRETORNO["STATUS"] := .F.
   RETURN(aRETORNO)
ENDIF

cXML += '<PedidoCancelamentoNFe xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.prefeitura.sp.gov.br/nfe">'

cXML+= '<Cabecalho Versao="1" xmlns="">'
cXML+=    '<CPFCNPJRemetente>'
cXML+=       '<CNPJ>'+ALLTRIM(::cab_CPFCNPJRemetente)+'</CNPJ>'
cXML+=    '</CPFCNPJRemetente>'
cXML+=    '<transacao>true</transacao>'
cXML+= '</Cabecalho>'
cXML+= '<Detalhe xmlns="">'
cXML+=    '<ChaveNFe>'
cXML+=       '<InscricaoPrestador>'+ALLTRIM(::rps_InscricaoMunicipalPrestador)+'</InscricaoPrestador>'
cXML+=       '<NumeroNFe>'+ALLTRIM(STR(::numero_nota))+'</NumeroNFe>'
cXML+=    '</ChaveNFe>'
cXML+=    '<AssinaturaCancelamento>'+::Gera_Chave_SHA1_Cancelamento()+'</AssinaturaCancelamento>'
cXML+= '</Detalhe>'
cXML+=   '<Signature></Signature>'
cXML+= '</PedidoCancelamentoNFe>'

::Xml:=::ohbNFe:pastaEnvRes+'\NFSe_canc'+ALLTRIM(::cab_CPFCNPJRemetente)+DTOS(DATE())+STRTRAN(LEFT(TIME(),8),':')+'.xml'

nHandle := FCREATE(::Xml)
FWRITE(nHandle, cXML)
FCLOSE( nHandle )

aRETORNO:=::Assina_XML()
IF !aRETORNO['STATUS']
   RETURN(aRETORNO)
ENDIF

// aRETORNO:=::ValidaXML()
// IF !aRETORNO['STATUS']
//    RETURN(aRETORNO)
// ENDIF

aRETORNO:=::ComunicaWebService('cancelar')
IF !aRETORNO['STATUS']
   RETURN(aRETORNO)
ENDIF

aRETORNO:=::LeRetorno(aRETORNO['XML'])

IF !aRETORNO['STATUS']
   RETURN(aRETORNO)
ENDIF

RETURN(aRETORNO)
// EOM CancelaNFSe()

//::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

/////////////////////////////////
METHOD LeRetorno(cRET) Class NFSE
/////////////////////////////////

LOCAL aRETORNO:=HASH()
aRETORNO['STATUS']:=.F.
aRETORNO['MSG']:=''

cRET:=STRTRAN(cRET,'&lt;','<')
cRET:=STRTRAN(cRET,'&gt;','>')
cRET:=STRTRAN(cRET,'&quot;','"')

IF '<Erros>' $ cRET
   cRET:=::oFuncoes:pegaTag(cRET,'Erro')
   aRETORNO['CODIGO']:=::oFuncoes:pegaTag(cRET,'Codigo')
   aRETORNO['DESCRICAO']:=::oFuncoes:pegaTag(cRET,'Descricao')
   aRETORNO['MSG']:=aRETORNO['CODIGO']+'-'+aRETORNO['DESCRICAO']
ELSEIF '<Alertas>' $ cRET
   cRET:=::oFuncoes:pegaTag(cRET,'Alerta')
   aRETORNO['CODIGO']:=::oFuncoes:pegaTag(cRET,'Codigo')
   aRETORNO['DESCRICAO']:=::oFuncoes:pegaTag(cRET,'Descricao')
   aRETORNO['MSG']:=aRETORNO['CODIGO']+'-'+aRETORNO['DESCRICAO']
ELSEIF '>false<' $ cRET
   aRETORNO['STATUS']    := .F.
   aRETORNO['CODIGO']    := ::oFuncoes:pegaTag(cRET,'Codigo')
   aRETORNO['DESCRICAO'] := ::oFuncoes:pegaTag(cRET,'Descricao')
   aRETORNO['MSG']       := aRETORNO['DESCRICAO']
ELSE
   aRETORNO['STATUS']:=.T.
ENDIF

RETURN(aRETORNO)
////////////////
// EOM LeRetorno()

//::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

/////////////////////////////
METHOD ValidaXML() Class NFSE
/////////////////////////////

LOCAL oDOMDoc, oSchema, ParseError
LOCAL aRETORNO:=HASH()
LOCAL cSchemaFilename:=''

aRETORNO['STATUS']:=.F.
aRETORNO['MSG']:=''

IF ::Xml=NIL .OR. EMPTY(::Xml)
   aRETORNO['MSG']:='Arquivo XML assinado de RPS não informado.'
ENDIF

cXML:=MEMOREAD(::Xml)
wint("VALIDA")
IF 'ReqEnvioLoteRPS' $ cXML // Envio de lote
   cXML:=STRTRAN(cXML,' xmlns:tipos="http://localhost:8080/WsNFe2/tp" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://localhost:8080/WsNFe2/lote http://localhost:8080/WsNFe2/xsd/ReqEnvioLoteRPS.xsd"')
   cSchemaFilename := ::ohbNFe:cPastaSchemas+'\ReqEnvioLoteRPS.xsd'
ELSEIF 'ReqCancelamentoNFSe' $ cXML  // Cancelamento de NFSe
   cXML:=STRTRAN(cXML,' xmlns:tipos="http://localhost:8080/WsNFe2/tp" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://localhost:8080/WsNFe2/lote http://localhost:8080/WsNFe2/xsd/ReqCancelamentoNFSe.xsd"')
   cSchemaFilename := ::ohbNFe:cPastaSchemas+'\ReqCancelamentoNFSe.xsd'
ENDIF

TRY
   oDOMDoc := CreateObject( _MSXML2_DOMDocument )
CATCH
   aRETORNO['MSG']:='Não foi possível carregar o MSXML para validação do XML.'
   RETURN(aRETORNO)
END

TRY
   oDOMDoc:async = .F.
   oDOMDoc:resolveExternals := .F.
   oDOMDoc:validateOnParse  = .T.
   oDOMDoc:LoadXML(cXML)
CATCH
   aRETORNO['MSG']:='Não foi possível carregar o arquivo XML para a validação.'
   RETURN(aRETORNO)
END   
IF oDOMDoc:parseError:errorCode <> 0 // XML não carregado
   aRETORNO['MSG']:='Não foi possível carregar o documento pois ele não corresponde ao seu Schema'+HB_OsNewLine()+;
                    'Linha: '+STR(oDOMDoc:parseError:line)                                        +HB_OsNewLine()+;
                    'Caractere na linha: '+STR(oDOMDoc:parseError:linepos)                        +HB_OsNewLine()+;
                    'Causa do erro: '+oDOMDoc:parseError:reason                                   +HB_OsNewLine()+;
                    'Code: '+STR(oDOMDoc:parseError:errorCode)
  RETURN(aRETORNO)
ENDIF

TRY
   oSchema := CreateObject( _MSXML2_XMLSchemaCache )
CATCH
   aRETORNO['MSG']:='Não foi possível carregar o MSXML para o schema do XML.'
   RETURN(aRETORNO)
END

IF !FILE(cSchemaFilename)
  aRETORNO['MSG']:='Arquivo do schema não encontrado '+cSchemaFilename
  RETURN(aRETORNO)
ENDIF

TRY
   oSchema:add( 'http://localhost:8080/WsNFe2/lote', cSchemaFilename )
CATCH oError
   aRETORNO['MSG']:='Falha '+HB_OsNewLine()+ ;
                    'Error: '+Transform(oError:GenCode, nil)       + ';' +HB_OsNewLine()+;
                    'SubC: '+Transform(oError:SubCode, nil)        + ';' +HB_OsNewLine()+;
                    'OSCode: '+Transform(oError:OsCode,  nil)      + ';' +HB_OsNewLine()+;
                    'SubSystem: '+Transform(oError:SubSystem, nil) + ';' +HB_OsNewLine()+;
                    'Mensangem: '+oError:Description
  RETURN(aRETORNO)
END

oDOMDoc:Schemas := oSchema
ParseError := oDOMDoc:validate
IF ParseError:errorCode <> 0
   aRetorno['nResult']  := ParseError:errorCode
   aRETORNO['MSG']  := ParseError:reason
   RETURN(aRetorno)
ENDIF
oDOMDoc := nil
ParseError := nil
oSchema := nil
aRETORNO['XML']:=::Xml
aRETORNO['STATUS']:=.T.

RETURN(aRETORNO)
////////////////
// EOM ValidaXML()

//::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

///////////////////////////////////
METHOD Gera_Chave_SHA1() Class NFSE
///////////////////////////////////

LOCAL cRET:=''
LOCAL cCHA := PADL(ALLTRIM(::rps_InscricaoMunicipalPrestador),8,'0')
LOCAL aRetorno
LOCAL oDll
LOCAL oFuncoes := hbNFeFuncoes()

cCHA += PADR(ALLTRIM(::rps_SerieRPS),5,' ')
cCHA += STRZERO(::rps_NumeroRPS,12)
cCHA += ::DataToYYYYMMDD(::rps_DataEmissaoRPS)
cCHA += ALLTRIM(::rps_Tributacao)
cCHA += LEFT(ALLTRIM(::rps_SituacaoRPS),1)
cCHA += IF(ALLTRIM(LEFT(::rps_TipoRecolhimento,1))='A','N','S')

// V10.0.K1608
// cCHA += STRZERO(VAL(STRTRAN(STR((::cab_ValorTotalServicos-::cab_ValorTotalDeducoes)*100),'.')),15)  //STRZERO((::cab_ValorTotalServicos-::cab_ValorTotalDeducoes),15)
cCHA += STRZERO(VAL(STRTRAN(STR(INT((::cab_ValorTotalServicos-::cab_ValorTotalDeducoes)*100)),'.')),15)  //STRZERO((::cab_ValorTotalServicos-::cab_ValorTotalDeducoes),15)

cCHA += STRZERO(VAL(STRTRAN(STR(::cab_ValorTotalDeducoes*100,15),'.')),15)  //STRZERO(::cab_ValorTotalDeducoes/100,15)
cCHA += PADL(ALLTRIM(::rps_CodigoAtividade),5,'0')

IF LEN(ALLTRIM(::rps_CPFCNPJTomador)) == 11
   cCHA += "1" // CPF
ELSE
   cCHA += "2" // CNPJ
ENDIF

cCHA += PADL(ALLTRIM(::rps_CPFCNPJTomador),14,'0')

nHandle := FCREATE("StringParaAssinar.txt")
FWRITE(nHandle, ::ohbNFe:cSerialCert + CHR(13)+CHR(10)+ cCHA )
FCLOSE( nHandle )
WRunCMD( "AssinaRPS.EXE" )
cRET := MEMOREAD( "StringAssinada.txt" )

cRET := STRTRAN( cRET, CHR(13), "" )
cRET := STRTRAN( cRET, CHR(10), "" )

FERASE("StringParaAssinar.txt")
FERASE("StringAssinada.txt")

RETURN(oFuncoes:parseEncode( cRET ) )
/////////////////////////////////////
// EOM Gera_Chave_SHA1()

//::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

////////////////////////////////////////////////
METHOD Gera_Chave_SHA1_Cancelamento() Class NFSE
////////////////////////////////////////////////

LOCAL cRET:=''
LOCAL cCHA := ""
LOCAL aRetorno
LOCAL oDll
LOCAL oFuncoes := hbNFeFuncoes()

cCHA+=PADL(ALLTRIM(::rps_InscricaoMunicipalPrestador),  8, '0' )
cCHA+=PADL( ALLTRIM(STR(::numero_nota))              , 12, '0' )

nHandle := FCREATE("StringParaAssinar.txt")

FWRITE(nHandle, ::ohbNFe:cSerialCert + CHR(13)+CHR(10)+ cCHA )
FCLOSE( nHandle )
WRunCMD( "AssinaRPS.EXE" )

cRET := MEMOREAD( "StringAssinada.txt" )
cRET := STRTRAN( cRET, CHR(13), "" )
cRET := STRTRAN( cRET, CHR(10), "" )
FERASE("StringParaAssinar.txt")
FERASE("StringAssinada.txt")

RETURN(oFuncoes:parseEncode( cRET ) )
/////////////////////////////////////
// EOM Gera_Chave_SHA1_Cancelamento()

//::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

//////////////////////////////////////////////
METHOD DataToYYYY_MM_DD(dDAT,lTIME) Class NFSE
//////////////////////////////////////////////

LOCAL cRET:=ALLTRIM(STR(YEAR(dDAT)))+'-'+STRZERO(MONTH(dDAT),2)+'-'+STRZERO(DAY(dDAT),2)
IF lTIME=NIL
  lTIME:=.F.
ENDIF
IF lTIME
   cRET+='T'+LEFT(TIME(),8)
ENDIF
RETURN(cRET)
////////////
// EOM DataToYYYY_MM_DD()

//::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

//////////////////////////////////////
METHOD DataToYYYYMMDD(dDAT) Class NFSE
//////////////////////////////////////

LOCAL cRET:=ALLTRIM(STR(YEAR(dDAT)))+STRZERO(MONTH(dDAT),2)+STRZERO(DAY(dDAT),2)

RETURN(cRET)
////////////
// EOM DataToYYYY_MM_DD()

//::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

//////////////////////////////////////
FUNCTION AlteraCaracteres(c, lInverte)
//////////////////////////////////////

LDEFAULT lInverte TO .F.

IF lInverte
   c := STRTRAN( c, "&gt;"   , ">")
   c := STRTRAN( c, "&lt;"   , "<")
   c := STRTRAN( c, "&amp;"  , "&")
   c := STRTRAN( c, "&quot;" , '"')
   c := STRTRAN( c, "&apos;" , "'")
ELSE
   c := STRTRAN( c, ">", "&gt;"   )
   c := STRTRAN( c, "<", "&lt;"   )
   c := STRTRAN( c, "&", "&amp;"  )
   c := STRTRAN( c, '"', "&quot;" )
   c := STRTRAN( c, "'", "&apos;" )
ENDIF

RETURN( c )
///////////
// EOF AlteraCaracteres()

eduardomc00
Usuário Nível 1

Usuário Nível 1
 
Mensagens: 43
Data de registro: 07 Out 2014 18:29
Cidade/Estado: São Paulo
Curtiu: 3 vezes
Mens.Curtidas: 0 vez

NFS-e PMSP

Mensagempor eduardomc00 » 24 Ago 2017 16:55

Exe que Assina o RPS.

Me desculpem se tiver código sobrando ou retalhos no código. não tive tempo de rever ainda!
Anexos
AssinaRPS.rar
Exe que Assina
(4.29 KiB) Baixado 126 vezes
eduardomc00
Usuário Nível 1

Usuário Nível 1
 
Mensagens: 43
Data de registro: 07 Out 2014 18:29
Cidade/Estado: São Paulo
Curtiu: 3 vezes
Mens.Curtidas: 0 vez

NFS-e PMSP

Mensagempor geovaninogueira » 24 Ago 2017 17:00

Boa Tarde.

Eduardo, obrigado por compartilhar os seus códigos...

:D :D :D
geovaninogueira
Usuário Nível 1

Usuário Nível 1
 
Mensagens: 2
Data de registro: 11 Jun 2014 08:55
Cidade/Estado: Itaquaquecetuba/SP
Curtiu: 0 vez
Mens.Curtidas: 1 vez

NFS-e PMSP

Mensagempor HASA » 24 Ago 2017 17:29

:)) :{
Eduardo, vou tentar SIM meu problema pessoal e emitir as nossas notas, quanto a clientes não estou preocupado ainda,
-:]
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

NFS-e PMSP

Mensagempor JoséQuintas » 24 Ago 2017 17:43

Vou tentar melhorar os fontes, mas não vou ter como testar com o webservice.
Ainda são os originais, coloquei aqui.

https://github.com/JoseQuintas/nfse-sp-eduardo

Provavelmente depois vá ficar presa à SefazClass porque vou usar rotinas de lá.
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: 18013
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

NFS-e PMSP

Mensagempor HASA » 24 Ago 2017 18:01

:))
ObrigaEduuuuu
:)Pos
Valeu, Zé, Aguardamos...
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

NFS-e PMSP

Mensagempor HASA » 24 Ago 2017 18:05

Eduardo, o arquivo hbnfe.ch ?
:-o
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

NFS-e PMSP

Mensagempor HASA » 24 Ago 2017 18:05

Eduardo, o arquivo hbnfe.ch ?
:-o
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

NFS-e PMSP

Mensagempor JoséQuintas » 24 Ago 2017 18:16

Aproveitar como "cobaia" pra algumas coisas.
Por exemplo pra mostrar no que a compilação -w3 -es2 ajuda.

Quando a gente acostuma com -w3 -es2, os fontes ficam mais interessantes.
Mas quando o fonte nunca usou isso... é bastante coisa pra acertar.
Primeira compilação com -w3 -es2

d:\CVSFiles\nfsesp>HBMK2 *.prg *.rc -m -n -w3 -es2 -workdir=c:\temp -compr -strip -mt -quiet -ge1 -Id:\cdrom\fontes\build\
Harbour 3.4.0dev (9562905f5c) (2017-08-11 06:49)
Copyright (c) 1999-2017, https://github.com/vszakats/harbour-core/
Compiling 'nfsesp.prg'...
nfsesp.prg:221: warning W0032 Variable 'CARQ' is assigned but not used in function '160:NFSE_REGISTRO_CABECALHO'
nfsesp.prg:402: warning W0001 Ambiguous reference 'CASSINATURA'
nfsesp.prg:404: warning W0001 Ambiguous reference 'CASSINATURA'
nfsesp.prg:467: warning W0032 Variable 'CARQ' is assigned but not used in function '225:NFSE_REGISTRO_RPS'
nfsesp.prg:526: warning W0032 Variable 'CXML' is assigned but not used in function '471:NFSE_REGISTRO_ITENS_RPS'
nfsesp.prg:562: warning W0003 Variable 'LABRE' declared but not used in function '526:NFSE_REGISTRO_DEDUCAO_RPS'
nfsesp.prg:562: warning W0003 Variable 'LFECHA' declared but not used in function '526:NFSE_REGISTRO_DEDUCAO_RPS'
nfsesp.prg:562: warning W0032 Variable 'CXML' is assigned but not used in function '530:NFSE_REGISTRO_DEDUCAO_RPS'
nfsesp.prg:598: warning W0032 Variable 'CXML' is assigned but not used in function '566:NFSE_FINALIZA_RPS'
nfsesp.prg:641: error E0020 Incomplete statement or unbalanced delimiters
nfsesp.prg:642: warning W0001 Ambiguous reference '_MSXML2_DOMDOCUMENT'
nfsesp.prg:643: error E0020 Incomplete statement or unbalanced delimiters
nfsesp.prg:644: warning W0001 Ambiguous reference '_MSXML2_DOMDOCUMENT'
nfsesp.prg:646: error E0010 ENDIF does not match IF
nfsesp.prg:647: warning W0028 Unreachable code
nfsesp.prg:653: error E0020 Incomplete statement or unbalanced delimiters
nfsesp.prg:654: warning W0001 Ambiguous reference '_MSXML2_MXDIGITALSIGNATURE'
nfsesp.prg:655: error E0020 Incomplete statement or unbalanced delimiters
nfsesp.prg:656: warning W0001 Ambiguous reference '_MSXML2_MXDIGITALSIGNATURE'
nfsesp.prg:658: error E0010 ENDIF does not match IF
nfsesp.prg:660: warning W0028 Unreachable code
nfsesp.prg:695: error E0020 Incomplete statement or unbalanced delimiters
nfsesp.prg:696: warning W0001 Ambiguous reference '_CAPICOM_MEMORY_STORE'
nfsesp.prg:696: warning W0001 Ambiguous reference '_CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED'
nfsesp.prg:697: error E0030 Syntax error "syntax error at 'OERROR'"
nfsesp.prg:703: warning W0001 Ambiguous reference 'OERROR'
nfsesp.prg:703: warning W0001 Ambiguous reference 'OERROR'
nfsesp.prg:703: warning W0001 Ambiguous reference 'OERROR'
nfsesp.prg:703: warning W0001 Ambiguous reference 'OERROR'
nfsesp.prg:703: warning W0001 Ambiguous reference 'OERROR'
nfsesp.prg:705: error E0010 ENDIF does not match IF
nfsesp.prg:708: error E0020 Incomplete statement or unbalanced delimiters
nfsesp.prg:709: warning W0028 Unreachable code
nfsesp.prg:710: error E0030 Syntax error "syntax error at 'OERROR'"
nfsesp.prg:716: warning W0001 Ambiguous reference 'OERROR'
nfsesp.prg:716: warning W0001 Ambiguous reference 'OERROR'
nfsesp.prg:716: warning W0001 Ambiguous reference 'OERROR'
nfsesp.prg:716: warning W0001 Ambiguous reference 'OERROR'
nfsesp.prg:716: warning W0001 Ambiguous reference 'OERROR'
nfsesp.prg:718: error E0010 ENDIF does not match IF
nfsesp.prg:719: warning W0028 Unreachable code
nfsesp.prg:722: error E0020 Incomplete statement or unbalanced delimiters
nfsesp.prg:724: error E0020 Incomplete statement or unbalanced delimiters
nfsesp.prg:727: error E0010 ENDIF does not match IF
nfsesp.prg:728: warning W0028 Unreachable code
nfsesp.prg:734: error E0020 Incomplete statement or unbalanced delimiters
nfsesp.prg:736: error E0020 Incomplete statement or unbalanced delimiters
nfsesp.prg:739: error E0010 ENDIF does not match IF
nfsesp.prg:740: warning W0028 Unreachable code
nfsesp.prg:776: warning W0001 Method <LinkWebService()> not declared or declaration mismatch in class <NFSE>
nfsesp.prg:798: error E0020 Incomplete statement or unbalanced delimiters
nfsesp.prg:800: error E0020 Incomplete statement or unbalanced delimiters
nfsesp.prg:801: error E0010 ENDIF does not match IF
nfsesp.prg:807: warning W0001 Ambiguous reference '_CAPICOM_CURRENT_USER_STORE'
nfsesp.prg:807: warning W0001 Ambiguous reference '_CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED'
nfsesp.prg:830: warning W0003 Variable 'ORESULT' declared but not used in function '794:NFSE_CTPEGACNCERTIFICADO'
nfsesp.prg:887: warning W0001 Ambiguous reference 'NHANDLE'
nfsesp.prg:888: warning W0001 Ambiguous reference 'NHANDLE'
nfsesp.prg:889: warning W0001 Ambiguous reference 'NHANDLE'
nfsesp.prg:891: error E0020 Incomplete statement or unbalanced delimiters
nfsesp.prg:894: warning W0001 Ambiguous reference 'GC_NFE_NS_CERTIF'
nfsesp.prg:896: error E0020 Incomplete statement or unbalanced delimiters
nfsesp.prg:897: error E0010 ENDIF does not match IF
nfsesp.prg:915: error E0020 Incomplete statement or unbalanced delimiters
nfsesp.prg:917: warning W0001 Ambiguous reference '_MSXML2_SERVERXMLHTTP'
nfsesp.prg:932: error E0020 Incomplete statement or unbalanced delimiters
nfsesp.prg:937: error E0010 ENDIF does not match IF
nfsesp.prg:939: warning W0028 Unreachable code
nfsesp.prg:944: error E0020 Incomplete statement or unbalanced delimiters
nfsesp.prg:946: warning W0001 Ambiguous reference '_MSXML2_DOMDOCUMENT'
nfsesp.prg:953: error E0020 Incomplete statement or unbalanced delimiters
nfsesp.prg:958: error E0010 ENDIF does not match IF
nfsesp.prg:960: warning W0028 Unreachable code
nfsesp.prg:971: error E0020 Incomplete statement or unbalanced delimiters
nfsesp.prg:975: error E0030 Syntax error "syntax error at 'E'"
nfsesp.prg:982: warning W0001 Ambiguous reference 'E'
nfsesp.prg:982: warning W0001 Ambiguous reference 'E'
nfsesp.prg:982: warning W0001 Ambiguous reference 'E'
nfsesp.prg:982: warning W0001 Ambiguous reference 'E'
nfsesp.prg:982: warning W0001 Ambiguous reference 'E'
nfsesp.prg:986: error E0010 ENDIF does not match IF
nfsesp.prg:988: warning W0028 Unreachable code
nfsesp.prg:998: warning W0001 Ambiguous reference 'NHANDLE'
nfsesp.prg:999: warning W0001 Ambiguous reference 'NHANDLE'
nfsesp.prg:1000: warning W0001 Ambiguous reference 'NHANDLE'
nfsesp.prg:1012: warning W0003 Variable 'CRETXML' declared but not used in function '840:NFSE_COMUNICAWEBSERVICE'
nfsesp.prg:1144: warning W0001 Ambiguous reference 'CXML'
nfsesp.prg:1146: warning W0001 Ambiguous reference 'CXML'
nfsesp.prg:1147: warning W0001 Ambiguous reference 'CXML'
nfsesp.prg:1147: warning W0001 Ambiguous reference 'CXML'
nfsesp.prg:1149: warning W0001 Ambiguous reference 'CXML'
nfsesp.prg:1150: warning W0001 Ambiguous reference 'CXML'
nfsesp.prg:1150: warning W0001 Ambiguous reference 'CXML'
nfsesp.prg:1154: error E0020 Incomplete statement or unbalanced delimiters
nfsesp.prg:1155: warning W0001 Ambiguous reference '_MSXML2_DOMDOCUMENT'
nfsesp.prg:1156: error E0020 Incomplete statement or unbalanced delimiters
nfsesp.prg:1159: error E0010 ENDIF does not match IF
nfsesp.prg:1161: error E0020 Incomplete statement or unbalanced delimiters
nfsesp.prg:1162: warning W0028 Unreachable code
nfsesp.prg:1165: warning W0001 Ambiguous reference 'CXML'
nfsesp.prg:1166: error E0020 Incomplete statement or unbalanced delimiters
nfsesp.prg:1169: error E0010 ENDIF does not match IF
nfsesp.prg:1170: warning W0028 Unreachable code
nfsesp.prg:1179: error E0020 Incomplete statement or unbalanced delimiters
nfsesp.prg:1180: warning W0001 Ambiguous reference '_MSXML2_XMLSCHEMACACHE'
nfsesp.prg:1181: error E0020 Incomplete statement or unbalanced delimiters
nfsesp.prg:1184: error E0010 ENDIF does not match IF
nfsesp.prg:1186: warning W0028 Unreachable code
nfsesp.prg:1191: error E0020 Incomplete statement or unbalanced delimiters
nfsesp.prg:1193: error E0030 Syntax error "syntax error at 'OERROR'"
nfsesp.prg:1199: warning W0001 Ambiguous reference 'OERROR'
nfsesp.prg:1199: warning W0001 Ambiguous reference 'OERROR'
nfsesp.prg:1199: warning W0001 Ambiguous reference 'OERROR'
nfsesp.prg:1199: warning W0001 Ambiguous reference 'OERROR'
nfsesp.prg:1199: warning W0001 Ambiguous reference 'OERROR'
nfsesp.prg:1201: error E0010 ENDIF does not match IF
nfsesp.prg:1203: warning W0028 Unreachable code
nfsesp.prg:1254: warning W0001 Ambiguous reference 'NHANDLE'
nfsesp.prg:1255: warning W0001 Ambiguous reference 'NHANDLE'
nfsesp.prg:1256: warning W0001 Ambiguous reference 'NHANDLE'
nfsesp.prg:1273: warning W0003 Variable 'ARETORNO' declared but not used in function '1228:NFSE_GERA_CHAVE_SHA1'
nfsesp.prg:1273: warning W0003 Variable 'ODLL' declared but not used in function '1229:NFSE_GERA_CHAVE_SHA1'
nfsesp.prg:1273: warning W0032 Variable 'CRET' is assigned but not used in function '1226:NFSE_GERA_CHAVE_SHA1'
nfsesp.prg:1285: warning W0001 Ambiguous reference 'NHANDLE'
nfsesp.prg:1287: warning W0001 Ambiguous reference 'NHANDLE'
nfsesp.prg:1288: warning W0001 Ambiguous reference 'NHANDLE'
nfsesp.prg:1304: warning W0003 Variable 'ARETORNO' declared but not used in function '1278:NFSE_GERA_CHAVE_SHA1_CANCELAMENTO'
nfsesp.prg:1304: warning W0003 Variable 'ODLL' declared but not used in function '1279:NFSE_GERA_CHAVE_SHA1_CANCELAMENTO'
nfsesp.prg:1304: warning W0032 Variable 'CRET' is assigned but not used in function '1276:NFSE_GERA_CHAVE_SHA1_CANCELAMENTO'
nfsesp.prg:1336: error E0030 Syntax error "syntax error at 'LINVERTE'"
46 errors

No code generated.
hbmk2: Error: Running Harbour compiler (built-in). 1


Já dá pra perceber:
- Falta arquivo CH
- Tem diferença Harbour/xHarbour, o que gera erro de IF/ENDIF
- Variável sobrando
- Declaração de variável faltando

Ok, sem problemas.
FORMATAR o fonte pelo HBFORMAT neste momento é perigoso.
Agora é ir resolvendo um de cada vez, até compilar.
Isso já vai causar uma limpeza no fonte.
Depois disso dá pra pensar em usar o HBFORMAT.

Talvez a lista de erros aumente, talvez não, conforme for resolvendo... rs
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: 18013
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

NFS-e PMSP

Mensagempor JoséQuintas » 24 Ago 2017 18:39

Por enquanto deu falta disto.
Alguns até já sei o conteúdo, porque a maioria tem na SefazClass, mas não importa no momento.
por enquanto o FOCO é que compile, então apenas criar tapa-buraco pra eles.

#define _MSXML2_DOMDOCUMENT "FALTA"
#define _MSXML2_MXDIGITALSIGNATURE "FALTA"
#define _CAPICOM_MEMORY_STORE "FALTA"
#define _CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED "FALTA"
#define _MSXML2_XMLSCHEMACACHE "FALTA"
#define _MSXML2_SERVERXMLHTTP "FALTA"
#define GC_NFE_NS_CERTIF "FALTA"
#define _CAPICOM_CURRENT_USER_STORE "FALTA"


também bloqueei todos estes ch
//#include "hbnfe.ch"
//#include "wsmode.ch"
//#include "wsnatop.ch"
//#include "wscalc_f.ch"
//#include "wsfile.ch"
//#include "wsecf.ch"
//#include "wsged.ch"


Primeiro é alterar pra compilar.
Já se sabe que funciona, então sem pressa pra ver funcionando, ou pra melhorar.

Nota:
É assim que trabalho, uma coisa de cada vez.
Acertar -w3 -es2 ajuda em tudo depois.
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: 18013
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

NFS-e PMSP

Mensagempor JoséQuintas » 24 Ago 2017 18:51

Um jeito também tapa-buraco de resolver variáveis, declarar tudo como PRIVATE.

MEMVAR cArq, cAssinatura, cXml, lAbre, lFecha, oError, cXmlSig, PosIni, PosFim, NP, nResult, oResult
MEMVAR MI, E, nHandle, cRetXml, cUrlWs, cNameSpace, aRetorno, oDll, cRet


Reduziu.

Harbour 3.4.0dev (9562905f5c) (2017-08-11 06:49)
Copyright (c) 1999-2017, https://github.com/vszakats/harbour-core/
Compiling 'nfsesp.prg'...
nfsesp.prg:233: warning W0032 Variable 'CARQ' is assigned but not used in function '172:NFSE_REGISTRO_CABECALHO'
nfsesp.prg:479: warning W0032 Variable 'CARQ' is assigned but not used in function '237:NFSE_REGISTRO_RPS'
nfsesp.prg:538: warning W0032 Variable 'CXML' is assigned but not used in function '483:NFSE_REGISTRO_ITENS_RPS'
nfsesp.prg:574: warning W0003 Variable 'LABRE' declared but not used in function '538:NFSE_REGISTRO_DEDUCAO_RPS'
nfsesp.prg:574: warning W0003 Variable 'LFECHA' declared but not used in function '538:NFSE_REGISTRO_DEDUCAO_RPS'
nfsesp.prg:574: warning W0032 Variable 'CXML' is assigned but not used in function '542:NFSE_REGISTRO_DEDUCAO_RPS'
nfsesp.prg:610: warning W0032 Variable 'CXML' is assigned but not used in function '578:NFSE_FINALIZA_RPS'
nfsesp.prg:788: warning W0001 Method <LinkWebService()> not declared or declaration mismatch in class <NFSE>
nfsesp.prg:788: warning W0032 Variable 'CXML' is assigned but not used in function '615:NFSE_ASSINA_XML'
nfsesp.prg:788: warning W0032 Variable 'CXMLSIG' is assigned but not used in function '615:NFSE_ASSINA_XML'
nfsesp.prg:788: warning W0032 Variable 'POSINI' is assigned but not used in function '616:NFSE_ASSINA_XML'
nfsesp.prg:788: warning W0032 Variable 'POSFIM' is assigned but not used in function '616:NFSE_ASSINA_XML'
nfsesp.prg:788: warning W0032 Variable 'NP' is assigned but not used in function '616:NFSE_ASSINA_XML'
nfsesp.prg:788: warning W0032 Variable 'NRESULT' is assigned but not used in function '616:NFSE_ASSINA_XML'
nfsesp.prg:841: warning W0003 Variable 'ORESULT' declared but not used in function '806:NFSE_CTPEGACNCERTIFICADO'
nfsesp.prg:841: warning W0032 Variable 'MI' is assigned but not used in function '808:NFSE_CTPEGACNCERTIFICADO'
nfsesp.prg:1022: warning W0003 Variable 'CRETXML' declared but not used in function '851:NFSE_COMUNICAWEBSERVICE'
nfsesp.prg:1022: warning W0032 Variable 'CURLWS' is assigned but not used in function '848:NFSE_COMUNICAWEBSERVICE'
nfsesp.prg:1022: warning W0032 Variable 'CXML' is assigned but not used in function '849:NFSE_COMUNICAWEBSERVICE'
nfsesp.prg:1022: warning W0032 Variable 'CNAMESPACE' is assigned but not used in function '850:NFSE_COMUNICAWEBSERVICE'
nfsesp.prg:1283: warning W0003 Variable 'ARETORNO' declared but not used in function '1238:NFSE_GERA_CHAVE_SHA1'
nfsesp.prg:1283: warning W0003 Variable 'ODLL' declared but not used in function '1239:NFSE_GERA_CHAVE_SHA1'
nfsesp.prg:1283: warning W0032 Variable 'CRET' is assigned but not used in function '1236:NFSE_GERA_CHAVE_SHA1'
nfsesp.prg:1314: warning W0003 Variable 'ARETORNO' declared but not used in function '1288:NFSE_GERA_CHAVE_SHA1_CANCELAMENTO'
nfsesp.prg:1314: warning W0003 Variable 'ODLL' declared but not used in function '1289:NFSE_GERA_CHAVE_SHA1_CANCELAMENTO'
nfsesp.prg:1314: warning W0032 Variable 'CRET' is assigned but not used in function '1286:NFSE_GERA_CHAVE_SHA1_CANCELAMENTO'
nfsesp.prg:1346: error E0030 Syntax error "syntax error at 'LINVERTE'"
1 error
No code generated.
hbmk2: Error: Running Harbour compiler (built-in). 1


Pelo menos reduziu pra UM ÚNICO ERRO, o último.
O resto é -ws3 -es2, chamo de tolerância zero.
Na compilação de tolerância zero, nada é deixado pra trás, se tem coisa no fonte que não precisa, só prossegue depois que eliminar isso do fonte.

Provavelmente depois que remover todos os MEMVAR, vai aparecer mais, mas por enquanto vamos aos estes que sobraram.

Vão ver como vale a pena fazer tudo isso primeiro.
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: 18013
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

NFS-e PMSP

Mensagempor JoséQuintas » 24 Ago 2017 19:21

No outro fonte,depende de mais coisas não existentes.
Novamente tapa-buraco, mas com certeza vai dar erro de execução.

MEMVAR FIL_RODAPE_CNPJ, FIL_RODAPE_IM, FIL_RODAPE_CID, FIL_RODAPE_UF
MEMVAR oNFE, GC_NF_A_IRRF, EMAIL_2_NF_99, NAT_OP_NOVO_VENDA
MEMVAR cUF, LPK_B_PC_TEC, LPK_B_PC_DEMO, LPK_B_PC_TREINAMENTO, GC_NFE_NS_CERTIF
MEMVAR cSerialCert, CPK_B_PARENT_DISK_DIR, HBNFE_MSXML, GF_NF_H_VERAO, IS_ON, GC_NFE_MODE
MEMVAR HBNFE_MXML, WS_NFE_TP_AMB_HOMOLOGACAO, WS_NFE_TP_AMB_TESTE, GC_NFE_PORTRAIT, GC_NFE_TPEMIS


Só restou o "tolerância zero" pra acertar.

Compiling 'nfse_emite.prg'...
nfse_emite.prg:220: warning W0003 Variable 'LEMITEANTESDEGRAVAR' declared but not used in function '37:NFSE_EMITE'
nfse_emite.prg:220: warning W0032 Variable 'NCHOOSE' is assigned but not used in function '59:NFSE_EMITE'
nfse_emite.prg:220: warning W0032 Variable 'CCOD_VERIFICACAO' is assigned but not used in function '188:NFSE_EMITE'
nfse_emite.prg:220: warning W0032 Variable 'CRPS' is assigned but not used in function '189:NFSE_EMITE'
nfse_emite.prg:284: warning W0003 Variable 'CNF' declared but not used in function '233:NFSE_CANCELAR'
nfse_emite.prg:284: warning W0003 Variable 'AMSGERR' declared but not used in function '236:NFSE_CANCELAR'
No code generated.


Depois disso, tentar usar o HBFORMAT pra formatar os fontes, pra "enxergar melhor".
É aÍ que a brincadeira vai começar, de tentar melhorar os fontes.
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: 18013
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

NFS-e PMSP

Mensagempor JoséQuintas » 24 Ago 2017 19:29

Agora o resultado da compilação, alguns são porque não acrescentei LIB, mas outros são específicos do aplicativo:

c:/temp/nfsesp.o:nfsesp.c:(.data+0x88): undefined reference to `HB_FUN_HBNFEFUNCOES'
c:/temp/nfsesp.o:nfsesp.c:(.data+0x208): undefined reference to `HB_FUN_HASH'
c:/temp/nfsesp.o:nfsesp.c:(.data+0x978): undefined reference to `HB_FUN_WIN_OLECREATEOBJECT'
c:/temp/nfsesp.o:nfsesp.c:(.data+0x9f8): undefined reference to `HB_FUN_HB_OSNEWLINE'
c:/temp/nfsesp.o:nfsesp.c:(.data+0xbb8): undefined reference to `HB_FUN_WAT'
c:/temp/nfsesp.o:nfsesp.c:(.data+0xc38): undefined reference to `HB_FUN_SETACROS'
c:/temp/nfsesp.o:nfsesp.c:(.data+0xc98): undefined reference to `HB_FUN_WINT'
c:/temp/nfsesp.o:nfsesp.c:(.data+0xcb8): undefined reference to `HB_FUN_MILLISEC'
c:/temp/nfsesp.o:nfsesp.c:(.data+0xd68): undefined reference to `HB_FUN_CREATEOBJECT'
c:/temp/nfsesp.o:nfsesp.c:(.data+0xe08): undefined reference to `HB_FUN_WRUNCMD'
c:/temp/nfsesp.o:nfsesp.c:(.data+0xe38): undefined reference to `HB_FUN_HB_DEFAUILT'
c:/temp/nfse_emite.o:nfse_emite.c:(.data+0x48): undefined reference to `HB_FUN_FIL_ARODAPE'
c:/temp/nfse_emite.o:nfse_emite.c:(.data+0x68): undefined reference to `HB_FUN_STRINGDEL'
c:/temp/nfse_emite.o:nfse_emite.c:(.data+0x78): undefined reference to `HB_FUN_FIL_RAZAOSOC'
c:/temp/nfse_emite.o:nfse_emite.c:(.data+0xd8): undefined reference to `HB_FUN_VALIDACIDADEIBGE'
c:/temp/nfse_emite.o:nfse_emite.c:(.data+0xe8): undefined reference to `HB_FUN_H_DEFAULT'
c:/temp/nfse_emite.o:nfse_emite.c:(.data+0x268): undefined reference to `HB_FUN_GNUM_SET'
c:/temp/nfse_emite.o:nfse_emite.c:(.data+0x298): undefined reference to `HB_FUN_WORDER'
c:/temp/nfse_emite.o:nfse_emite.c:(.data+0x2a8): undefined reference to `HB_FUN_WSEEK'
c:/temp/nfse_emite.o:nfse_emite.c:(.data+0x2f8): undefined reference to `HB_FUN_CLEAR_SLASHS'
c:/temp/nfse_emite.o:nfse_emite.c:(.data+0x548): undefined reference to `HB_FUN_SETACROS'
c:/temp/nfse_emite.o:nfse_emite.c:(.data+0x5a8): undefined reference to `HB_FUN_NTRIM'
c:/temp/nfse_emite.o:nfse_emite.c:(.data+0x628): undefined reference to `HB_FUN_WINMSG'
c:/temp/nfse_emite.o:nfse_emite.c:(.data+0x688): undefined reference to `HB_FUN_HBNFE_PEGADADOSXML'
c:/temp/nfse_emite.o:nfse_emite.c:(.data+0x6c8): undefined reference to `HB_FUN_WINMSGMU'
c:/temp/nfse_emite.o:nfse_emite.c:(.data+0x6d8): undefined reference to `HB_FUN_ENVIA_FAIL_2_VENDOR_GESTOR_GACUM_OP'
c:/temp/nfse_emite.o:nfse_emite.c:(.data+0x748): undefined reference to `HB_FUN_ISSERVICO'
c:/temp/nfse_emite.o:nfse_emite.c:(.data+0x798): undefined reference to `HB_FUN_WINASK'
c:/temp/nfse_emite.o:nfse_emite.c:(.data+0x7a8): undefined reference to `HB_FUN_MSGINFO'
c:/temp/nfse_emite.o:nfse_emite.c:(.data+0x7f8): undefined reference to `HB_FUN_MSGINFOCLOSE'
c:/temp/nfse_emite.o:nfse_emite.c:(.data+0x818): undefined reference to `HB_FUN_WSET'
c:/temp/nfse_emite.o:nfse_emite.c:(.data+0x898): undefined reference to `HB_FUN_WDIRMAKE'
c:/temp/nfse_emite.o:nfse_emite.c:(.data+0x8b8): undefined reference to `HB_FUN_HBNFE'
c:/temp/nfse_emite.o:nfse_emite.c:(.data+0x8c8): undefined reference to `HB_FUN_NFE_NEW_LERCERTIFICADO'
c:/temp/nfse_emite.o:nfse_emite.c:(.data+0x938): undefined reference to `HB_FUN_SUFCODEIBGE'
c:/temp/nfse_emite.o:nfse_emite.c:(.data+0x948): undefined reference to `HB_FUN_SETAFIL'
collect2.exe: error: ld returned 1 exit status
hbmk2: Error: Running linker. 1
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: 18013
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

NFS-e PMSP

Mensagempor JoséQuintas » 24 Ago 2017 19:31

E no meio deles:

c:/temp/nfsesp.o:nfsesp.c:(.data+0xe38): undefined reference to `HB_FUN_HB_DEFAUILT'


Esse fui eu que digitei errado.... rs
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: 18013
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

NFS-e PMSP

Mensagempor JoséQuintas » 24 Ago 2017 19:39

Vou mexer só no nfesp.prg, porque ele deve ter tudo que precisa, e vai ser mais fácil completar.

Compiling 'nfsesp.prg'...
Lines 2741, Functions/Procedures 18
Generating C source output to 'c:\temp\nfsesp.c'... Done.
c:/temp/nfsesp.o:nfsesp.c:(.data+0x88): undefined reference to `HB_FUN_HBNFEFUNCOES'
c:/temp/nfsesp.o:nfsesp.c:(.data+0x208): undefined reference to `HB_FUN_HASH'
c:/temp/nfsesp.o:nfsesp.c:(.data+0x9f8): undefined reference to `HB_FUN_HB_OSNEWLINE'
c:/temp/nfsesp.o:nfsesp.c:(.data+0xbb8): undefined reference to `HB_FUN_WAT'
c:/temp/nfsesp.o:nfsesp.c:(.data+0xc38): undefined reference to `HB_FUN_SETACROS'
c:/temp/nfsesp.o:nfsesp.c:(.data+0xc98): undefined reference to `HB_FUN_WINT'
c:/temp/nfsesp.o:nfsesp.c:(.data+0xcb8): undefined reference to `HB_FUN_MILLISEC'
c:/temp/nfsesp.o:nfsesp.c:(.data+0xd68): undefined reference to `HB_FUN_CREATEOBJECT'
c:/temp/nfsesp.o:nfsesp.c:(.data+0xe08): undefined reference to `HB_FUN_WRUNCMD'
collect2.exe: error: ld returned 1 exit status
hbmk2: Error: Running linker. 1
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: 18013
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Anterior Próximo



Retornar para Harbour

Quem está online

Usuários vendo este fórum: Nenhum usuário registrado online e 5 visitantes


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