Até que não deu o trabalho que eu pensava pra totalizar no XML.
Segui o manual, mas não testei ainda.
Lembrando que só deixei o cálculo/totalização da partilha pra fase do XML. O resto é calculado no pedido, naquelas linhas que já postei aqui.
Ainda gero TXT e XML ao mesmo tempo - pode ser uma referência pra quem gera só txt
Código: Selecionar todos
LOCAL nTotIcmFcp := 0, nTotIcmRem := 0, nTotIcmDes := 0
...
NfeBlocoProduto( @cTxt, @cXml, nNumItem, nTotIcmFcp, nTotIcmRem, nTotIcmDes )
...
NfeBlocoTotais( @cTxt, @cXml, nTotIcmFcp, nTotIcmRem, nTotIcmDes )
...
NfeBlocoProdutoIcms( @cTxt, @cXml, nTotIcmFcp, nTotIcmRem, nTotIcmDes )
...
NfeBlocoProdutoIcmPartilha( @cTxt, @cXml, nTotIcmFcp, nTotIcmRem, nTotIcmDes )
cXml += [</ICMS>]
...
STATIC FUNCTION NfeBlocoProdutoIcmPartilha( cTxt, cXml, nTotIcmFcp, nTotIcmRem, nTotIcmDes )
LOCAL nIcmRem, nIcmDes
IF jpitped->ipIcdAli == 0 .AND. jpitped->ipFcpAli == 0
RETURN NIL
ENDIF
nIcmRem := Int( jpitped->ipIcdVal * PartilhaAli( "R" ) ) / 100
nIcmDes := Int( jpitped->ipIcdVal * PartilhaAli( "D" ) ) / 100
nTotIcmRem += nIcmRem
nTotIcmDes += nIcmDes
nTotIcmFcp += jpitped->ipIcmFcp
cTxt += "NA" + SPED_SEPARADOR
cTxt += NumberXml( jpitped->ipIcmBas, 2 ) + SPED_SEPARADOR
cTxt += NumberXml( jpitped->ipFcpAli, 2 ) + SPED_SEPARADOR
cTxt += NumberXml( jpitped->ipIcdVal, 2 ) + SPED_SEPARADOR
cTxt += NumberXml( jpitped->ipIcmAli, 2 ) + SPED_SEPARADOR
cTxt += NumberXml( PartilhaAli( "D" ), 2 ) + SPED_SEPARADOR
cTxt += NumberXml( jpitped->ipFcpVal, 2 ) + SPED_SEPARADOR
cTxt += NumberXml( Int( jpitped->ipIcdVal * PartilhaAli( "D" ) ) / 100, 2 ) + SPED_SEPARADOR
cTxt += NumberXml( Int( jpitped->ipIcdVal * PartilhaAli( "R" ) ) / 100, 2 ) + SPED_SEPARADOR
cXml += "<ICMSUFDest>"
cXml += XmlTag( "vBCUFDest", NumberXml( jpitped->ipIcmBas, 2 ) )
cXml += XmlTag( "pFCPUFDest", NumberXml( jpitped->ipFcpAli, 2 ) )
cXml += XmlTag( "pICMSUFDest", NumberXml( jpitped->ipIcdVal, 2 ) )
cXml += XmlTag( "pICMSInter", NumberXml( jpitped->ipIcmAli, 2 ) )
cXml += XmlTag( "pICMSInterPart", NumberXml( PartilhaAli( "D" ), 2 ) )
cXml += XmlTag( "vFCPUFDest", NumberXml( jpitped->ipFcpVal, 2 ) )
cXml += XmlTag( "vICMSUFDest", NumberXml( nIcmDes, 2 ) )
cXml += XmlTag( "vICMSUFRemet", NumberXml( nIcmRem, 2 ) )
cXml += "</ICMSUFDest>"
RETURN NIL
...
IF .F.
cTxt += NumberXml( nTotIcmFcp, 2 ) + SPED_SEPARADOR
cTxt += NumberXml( nTotIcmDes, 2 ) + SPED_SEPARADOR
cTxt += NumberXml( nTotIcmRem, 2 ) + SPED_SEPARADOR
ENDIF
...
IF .F.
cXml += XmlTag( "vFCPUFDest", NumberXml( nTotIcmFcp, 2 ) )
cXml += XmlTag( "vICMSUFDest", NumberXml( nTotIcmDes, 2 ) )
cXml += XmlTag( "vICMSUFRemet", NumberXml( nTotIcmRem, 2 ) )
ENDIF
cXml += XmlTag( "vBCST", NumberXml( jppedi->pdSubBas, 2 ) )
...
STATIC FUNCTION PartilhaAli( cRemetenteDestinatario )
IF cRemetenteDestinatario == "D"
DO CASE
CASE Year( Date() ) == 2016 ; RETURN 40
CASE Year( Date() ) == 2017 ; RETURN 60
CASE Year( Date() ) == 2018 ; RETURN 80
CASE Year( Date() ) >= 2019 ; RETURN 100
ENDCASE
ELSE
DO CASE
CASE Year( Date() ) == 2016 ; RETURN 60
CASE Year( Date() ) == 2017 ; RETURN 40
CASE Year( Date() ) == 2018 ; RETURN 20
CASE Year( Date() ) >= 2019 ; RETURN 0 // nem precisa
ENDCASE
ENDIF
RETURN 0
As funções são autoexplicativas.
Nota: após postar percebi que faltaram algumas arrobas ( @ ), aliás... todas elas.
Aproveitando:
a vantagem de compilar usando -w3 -es2, e a necessidade adicional se percebe nesse fonte.
Passei as variáveis por referência, e cada rotina pode ser alterada de forma independente.
Ao compilar com -w3 -es2 já garanti que as variáveis existem, foram declaradas, e 99% de chance de não dar erro depois.
Ao NÃO USAR private, tudo garantido.
Apesar de rotina que chama rotina, que chama rotina, que chama rotina... é iniciar variáveis com zero, somar, e mostrar conteúdo. Cada coisa no seu bloco.