Pois é, foi o contador que deu a orientação errada.
Vou tentar entrar em contato com o cliente e tentar por ele em contato com outro contador.
No momento eu estou fazendo assim, tenho uma função que me diz se tem substituição ou não. Ela verifica se o CSOSN é diferente de '0202' e o estado é 'RS' ou 'MG'.
function TemSubstituicao(CSOSN, UF: string): Boolean;
begin
Result := (CSOSN = '0202') and ((UF = 'RS') or (UF = 'MG'));
end;
Se tem substituição então eu pego a alíquota de substituição (a externa), o iva, calculo o icms do produto, calculo a base de cálculo e o valor do ICMS-ST e calculo os totais
ICMS.vBCST := NFItensDataSet.fieldByName('BASECALCULOICMSSUBST').AsCurrency;
ICMS.pICMSST := NFItensDataSet.fieldByName('ALIQICMSSUBST').AsCurrency;
ICMS.vICMSST := NFItensDataSet.fieldByName('VALORICMSSUBST').AsCurrency;
e nos totais
Total.ICMSTot.vBCST := NFDAtaSet.fieldByName('BASECALCICMSSUBST').AsCurrency;
Total.ICMSTot.vST := NFDAtaSet.fieldByName('VALORICMSSUBST').AsCurrency;
Mas se não tiver substituição, se essa função retornar false, eu não faço nada disso, e tanto os valores do ICMS como os do ICMS ST eu mando tudo zerado. Gostaria de saber se estou fazendo certo em mandar zerado ou se eu tenho que preencher mesmo assim.
Ou seja:
Eu calculo e salvo as bases de cálculo, subtotais e totais tanto do ICMS normal como do ICMS ST, como se não fosse do regime simples, mas na hora de gerar e enviar a nf-e eu não preencho os campos relativos a base de calculo, valor e icms total do componente, para não ir no xml, a menos que TemSubstituicao retorne true, aí eu preencho apenas os valores vBCST, pICMSST, vICMSST e os totais Total.ICMSTot.vBCST e Total.ICMSTot.vST.
Sempre que precisar dos dados eu tenho. Mas quando for isento de tudo eu preencho tudo ou eu deixo em branco o que for isento?
Valeu anfm! É sempre você que me dá o maior help