Como sabemos os PIS/COFINS deve ser lançado na Notas Eletronicas conforme criticas de regime empresarial seguindo também a critica da CST envolvida.
Na apuração do PIS e da COFINS é importante identificar as formas de tributação das contribuições, pois, a depender dessa análise, veremos a formação da base de cálculo e as alÃquotas aplicáveis.
Desse modo, temos duas formas de apuração da base de cálculo do PIS e da COFINS: cumulativa e não cumulativa.
Na modalidade de PIS e COFINS cumulativos, a formação da base de cálculo é a receita operacional bruta da pessoa jurÃdica. Nesse tipo de apuração, não temos direito a créditos dos custos e das despesas. Além disso, as alÃquotas da Contribuição para o PIS/PASEP e da COFINS são, respectivamente, de 0,65% e de 3%. Por exemplo:
Receita Operacional Bruta x 3,65%, sendo 0,65% de PIS e 3% de COFINS.
Já em relação ao PIS e COFINS não cumulativos, nessa modalidade temos direito a crédito dos custos e despesas, e as alÃquotas aplicáveis são, por exemplo:
Receita bruta x 9,25%, sendo 1,65% de PIS e 7,6% de COFINS nas operações que geram faturamento.
Crédito de Custos e despesas nas alÃquotas de total de 9,25%, sendo 1,65% de PIS e 7,6% de COFINS.
Exemplo: O valor total da nota fiscal de venda é de R$ 5.000,00.
*AlÃquota de ICMS: 18,00%
*AlÃquota PIS (regime não cumulativo): 7,60%
*AlÃquota COFINS (regime não cumulativo): 1,65%
*Total dos impostos em alÃquotas = 27,25%
Apuração da base de cálculo:
Base de cálculo: R$ 5.000,00
ICMS devido na operação / destacado em nota: 5.000 x 18% = 900,00
PIS devido na operação: 5.000 x 1,65% = 82,00
COFINS devido na operação: 5.000 x 7,6% = 380,00
Baseado no exposto acima e incluindo os cálculos de Aliquota Zero e Aliquota Diferenciada formulei os resultados através de algums P.O.G.
Apresento alguns trechos de meus cálculos e criticas para gerar o XML
// Referente a CST relacionadas a PIS/COFINS
// 1-Lucro Real, 2-Lucro Presumido, 3-Simples Nacional
// Lucro Real - Regime não cumulativo: Pis - 1,65% Cofins 7,6%
// Lucro Presumido - Regime Cumulativo: Pis - 0,65% Cofins - 3%
cRegimeTrib := substr( VerifyINI("REGIME" , "RegimeTributario", "", cPathDados+"nfw.ini", .f.), 1, 1 )
lRegimeCumulativo := iif( cRegimeTrib="2", .t., .f. )
// Aliquota Basica
pPIS := iif( cSimples = "S",0,iif(lRegimeCumulativo,0.65,1.65) )
pCOFINS := iif( cSimples = "S",0,iif(lRegimeCumulativo,3.00,7.60) )
if cCSTPIS = "02" .or. cCSTPIS = "04"
// Aliquota Diferenciada - forcar pela busca na nova tabela - funcao esta no NFWHFAT.PRG
pPISDif := NCMCST( es->nCmfiscal, es->nBmfiscal )[2] // cCSTPIS
// Verifica se NCM esta na lista de Aliquota Zero forcando CST 04
if NCMAliquotaZero( strtran( cNCMIPI,".","" ) )
// Somente para SIMPLES
cCSTPIS := "04"
endif
// Verifica se NCM esta na lista de Aliquota Zero forcando CST 02
aAliquotaDifer := NCMAliquotaDifer( strtran( cNCMIPI,".","" ) )
if LEN(aAliquotaDifer) > 0
cCSTPIS := "02"
pPISDif := aAliquotaDifer[2] // cCSTPIS
endif
pPIS := pPISDif
endif
if cCSTCOFINS = "02" .or. cCSTCOFINS = "04"
// Aliquota Diferenciada - forcar pela busca na nova tabela - funcao esta no NFWHFAT.PRG
pCOFINSDif := NCMCST( es->nCmfiscal, es->nBmfiscal )[3] // cCSTCOFINS
// Verifica se NCM esta na lista de Aliquota Zero forcando CST 04
if NCMAliquotaZero( strtran( cNCMIPI,".","" ) )
// Somente para SIMPLES
cCSTCOFINS := "04"
endif
// Verifica se NCM esta na lista de Aliquota Zero forcando CST 02
aAliquotaDifer := NCMAliquotaDifer( strtran( cNCMIPI,".","" ) )
if LEN(aAliquotaDifer) > 0
cCSTCOFINS := "02"
pCOFINSDif := aAliquotaDifer[3] // cCSTCOFINS
endif
pCOFINS := pCOFINSDif
endif
As CSTs de PIS/COFINS em meu sistema estão atreladas à CST do ICMS em uma tabela.
A função NCMCST() recebe NCM e NBM, já que através do NBM eu tenho desmembrados o mesmo NCM(mas isto não vem ao caso) mas a mesma pode pesquisar somente pelo NCM.
FUNCTION NCMCST( _nCmfiscal_, _nBmfiscal_ )
// Base Legal
// PIS – Lei Complementar nº 7, de 7 de setembro de 1970.
// COFINS – Lei Complementar nº 70, de 30 de dezembro de 1991.
oldArea := select()
cNCMIPI := charrem( ".", _nCmfiscal_ )
nNCMIPI := 0
nNCMPIS := 0
nNCMCOFINS := 0
dbSelectArea( "NCM" )
// Pesquisa pelos dois campos
OrdSetFocus( 1 ) // Pesquisa por campos NCMFiscal e NBMFiscal
dbSeek( charrem( ".", _nCmfiscal_ )+charrem( ".", _nBmfiscal_ ) )
if !found()
OrdSetFocus( 2 ) // Pesquisa somente pelo campo NCMFiscal
dbSeek( charrem( ".", _nCmfiscal_ ) )
if !found()
cNCMIPI := "99" // "99999900" // Tentar passar o cupom mesmo com falha de NCM
nNCMIPI := 0
nNCMPIS := 0
nNCMCOFINS := 0
else
nNCMIPI := NCM->ALIQUOTA // PESQ(es->ncmfiscal+es->nbmfiscal,"NCM",1,"ALIQUOTA")
nNCMPIS := iif( IsField( "PIS" ) , NCM->PIS , 0 )
nNCMCOFINS := iif( IsField( "COFINS" ), NCM->COFINS, 0 )
endif
OrdSetFocus( 1 )
else
nNCMIPI := NCM->ALIQUOTA // PESQ(es->ncmfiscal+es->nbmfiscal,"NCM",1,"ALIQUOTA")
nNCMPIS := NCM->PIS
nNCMCOFINS := NCM->COFINS
endif
dbSelectArea( oldArea )
return { nNCMIPI, nNCMPIS, nNCMCOFINS, cNCMIPI }
As tabelas verificadas pela função são pequenas e coloquei em vetor.
FUNCTION NCMAliquotaZero( cNCMQTenho )
aNCMRRAY := {}
aadd( aNCMRRAY, "07133319" ) // 01
aadd( aNCMRRAY, "07133329" ) // 02
aadd( aNCMRRAY, "07133399" ) // 03
aadd( aNCMRRAY, "11010010" ) // 04
aadd( aNCMRRAY, "19012000" ) // 05
aadd( aNCMRRAY, "19059090" ) // 06
aadd( aNCMRRAY, "05111000" ) // 07
aadd( aNCMRRAY, "05119910" ) // 08*
aadd( aNCMRRAY, "05119920" ) // 09
aadd( aNCMRRAY, "19021100" ) // 10
aadd( aNCMRRAY, "19021900" ) // 11
aadd( aNCMRRAY, "19022000" ) // 12*
aadd( aNCMRRAY, "19023000" ) // 13
aadd( aNCMRRAY, "19021100" ) // 14
aadd( aNCMRRAY, "19021900" ) // 15
aadd( aNCMRRAY, "19022000" ) // 16
aadd( aNCMRRAY, "19023000" ) // 17
aadd( aNCMRRAY, "02061000" ) // 18
aadd( aNCMRRAY, "02102000" ) // 19
aadd( aNCMRRAY, "05069000" ) // 20
aadd( aNCMRRAY, "05100010" ) // 21
aadd( aNCMRRAY, "02063000" ) // 22
aadd( aNCMRRAY, "17019900" ) // 23
aadd( aNCMRRAY, "17011400" ) // 24
aadd( aNCMRRAY, "04051000" ) // 25
aadd( aNCMRRAY, "48181000" ) // 26
aadd( aNCMRRAY, "84433222" ) // 27
aadd( aNCMRRAY, "84690039" ) // 28
aadd( aNCMRRAY, "87142000" ) // 29
aadd( aNCMRRAY, "90214000" ) // 30
aadd( aNCMRRAY, "84433222" ) // 31
aadd( aNCMRRAY, "87142000" ) // 32
aadd( aNCMRRAY, "90214000" ) // 33
aadd( aNCMRRAY, "90219082" ) // 34
aadd( aNCMRRAY, "90219092" ) // 35
aadd( aNCMRRAY, "84690039" ) // 36
aadd( aNCMRRAY, "84701000" ) // 37
aadd( aNCMRRAY, "84716090" ) // 38
aadd( aNCMRRAY, "84719014" ) // 39
aadd( aNCMRRAY, "84721000" ) // 40
aadd( aNCMRRAY, "84716053" ) // 41
aadd( aNCMRRAY, "85258019" ) // 42
aadd( aNCMRRAY, "22011000" ) // 43
aadd( aNCMRRAY, "22011000" ) // 44
aadd( aNCMRRAY, "27101921" ) // 45
aadd( aNCMRRAY, "1502101" ) // 46
aadd( aNCMRRAY, "100620" ) // 47
aadd( aNCMRRAY, "100630" ) // 48
aadd( aNCMRRAY, "110620" ) // 49
aadd( aNCMRRAY, "300230" ) // 50*
aadd( aNCMRRAY, "110220" ) // 51
aadd( aNCMRRAY, "110313" ) // 52
aadd( aNCMRRAY, "010511" ) // 53
aadd( aNCMRRAY, "902110" ) // 54
aadd( aNCMRRAY, "90213" ) // 55
aadd( aNCMRRAY, "02062" ) // 56
aadd( aNCMRRAY, "02064" ) // 57*
aadd( aNCMRRAY, "02101" ) // 58
aadd( aNCMRRAY, "0201" ) // 59
aadd( aNCMRRAY, "0202" ) // 60
aadd( aNCMRRAY, "0203" ) // 61
aadd( aNCMRRAY, "0204" ) // 62
aadd( aNCMRRAY, "0207" ) // 63
aadd( aNCMRRAY, "0209" ) // 64
aadd( aNCMRRAY, "0302" ) // 65
aadd( aNCMRRAY, "0303" ) // 66
aadd( aNCMRRAY, "0304" ) // 67
aadd( aNCMRRAY, "1507" ) // 68
aadd( aNCMRRAY, "1508" ) // 69*
aadd( aNCMRRAY, "1509" ) // 70
aadd( aNCMRRAY, "1510" ) // 71
aadd( aNCMRRAY, "1511" ) // 72
aadd( aNCMRRAY, "1512" ) // 73
aadd( aNCMRRAY, "1513" ) // 74
aadd( aNCMRRAY, "1514" ) // 75
aadd( aNCMRRAY, "3306" ) // 76
aadd( aNCMRRAY, "8802" ) // 77
aadd( aNCMRRAY, "8713" ) // 78
aadd( aNCMRRAY, "1001" ) // 79
aadd( aNCMRRAY, "0407" ) // 80
aadd( aNCMRRAY, "07" ) // 81*
aadd( aNCMRRAY, "08" ) // 82
lAliquotaZero := .f.
for nI2I := 1 to len( aNCMRRAY )
for nI3I = 1 to 8
if alltrim( substr( cNCMQTenho, 1, 9-nI3I ) ) = alltrim( aNCMRRAY[nI2I] )
lAliquotaZero := .t.
exit
endif
next
if lAliquotaZero
//? "nI3I",9-nI3I,nI2I,alltrim( substr( cNCMQTenho, 1, 9-nI3I ) ),alltrim( aNCMRRAY[nI2I] )
exit
endif
next
return lAliquotaZero
FUNCTION NCMAliquotaDifer( cNCMQTenho )
aNCMRRAY := {}
aadd( aNCMRRAY, { "30029020", 2.10, 9.90 } )
aadd( aNCMRRAY, { "30029092", 2.10, 9.90 } )
aadd( aNCMRRAY, { "30029099", 2.10, 9.90 } )
aadd( aNCMRRAY, { "30051010", 2.10, 9.90 } )
aadd( aNCMRRAY, { "30066000", 2.10, 9.90 } )
aadd( aNCMRRAY, { "34011190", 2.20, 10.30 } )
aadd( aNCMRRAY, { "34012010", 2.20, 10.30 } )
aadd( aNCMRRAY, { "96032100", 2.20, 10.30 } )
aadd( aNCMRRAY, { "84324000", 2.00, 9.60 } )
aadd( aNCMRRAY, { "84328000", 2.00, 9.60 } )
aadd( aNCMRRAY, { "84333000", 2.00, 9.60 } )
aadd( aNCMRRAY, { "84334000", 2.00, 9.60 } )
aadd( aNCMRRAY, { "87162000", 2.00, 9.60 } )
aadd( aNCMRRAY, { "76129012", 2.00, 9.60 } )
aadd( aNCMRRAY, { "84324000", 2.00, 9.60 } )
aadd( aNCMRRAY, { "84328000", 2.00, 9.60 } )
aadd( aNCMRRAY, { "84333000", 2.00, 9.60 } )
aadd( aNCMRRAY, { "84334000", 2.00, 9.60 } )
aadd( aNCMRRAY, { "3002101", 2.10, 9.90 } )
aadd( aNCMRRAY, { "3002102", 2.10, 9.90 } )
aadd( aNCMRRAY, { "3002103", 2.10, 9.90 } )
aadd( aNCMRRAY, { "3002201", 2.10, 9.90 } )
aadd( aNCMRRAY, { "3002202", 2.10, 9.90 } )
aadd( aNCMRRAY, { "3006301", 2.10, 9.90 } )
aadd( aNCMRRAY, { "3006302", 2.10, 9.90 } )
aadd( aNCMRRAY, { "843320", 2.00, 9.60 } )
aadd( aNCMRRAY, { "731029", 2.00, 9.60 } )
aadd( aNCMRRAY, { "842481", 2.00, 9.60 } )
aadd( aNCMRRAY, { "843320", 2.00, 9.60 } )
aadd( aNCMRRAY, { "84335", 2.00, 9.60 } )
aadd( aNCMRRAY, { "7309", 2.00, 9.60 } )
aadd( aNCMRRAY, { "8429", 2.00, 9.60 } )
aadd( aNCMRRAY, { "8701", 2.00, 9.60 } )
aadd( aNCMRRAY, { "8702", 2.00, 9.60 } )
aadd( aNCMRRAY, { "8703", 2.00, 9.60 } )
aadd( aNCMRRAY, { "8704", 2.00, 9.60 } )
aadd( aNCMRRAY, { "8705", 2.00, 9.60 } )
aadd( aNCMRRAY, { "8706", 2.00, 9.60 } )
aadd( aNCMRRAY, { "3001", 2.10, 9.90 } )
aadd( aNCMRRAY, { "3003", 2.10, 9.90 } )
aadd( aNCMRRAY, { "3004", 2.10, 9.90 } )
aadd( aNCMRRAY, { "3303", 2.20, 10.30 } )
aadd( aNCMRRAY, { "3304", 2.20, 10.30 } )
aadd( aNCMRRAY, { "3305", 2.20, 10.30 } )
aadd( aNCMRRAY, { "3306", 2.20, 10.30 } )
aadd( aNCMRRAY, { "3307", 2.20, 10.30 } )
lAliquotaDifer := .f.
aAliquotaDifer := {}
for nI2I := 1 to len( aNCMRRAY )
for nI3I = 1 to 8
if alltrim( substr( cNCMQTenho, 1, 9-nI3I ) ) = alltrim( aNCMRRAY[nI2I][1] )
// Se a pesquisa do NCM ou trecho estiver no array...
lAliquotaDifer := .t.
aAliquotaDifer := aNCMRRAY[nI2I]
exit
endif
next
if lAliquotaDifer
//? "nI3I",9-nI3I,nI2I,alltrim( substr( cNCMQTenho, 1, 9-nI3I ) ),alltrim( aNCMRRAY[nI2I][1] ),aNCMRRAY[nI2I][2],aNCMRRAY[nI2I][3]
exit
endif
next
return aAliquotaDifer
Segue um trecho de formatação das tags PIS/COFINS para efeito de analise:
// Joguei os calculos dentro das criticas de PIS w COFINS
vBCPIS := round( nSubtotal, 2 ) // -nDesconto // vBC // Vania-ContiMax-Nao calcular pela base reduzida e nao descontar
vBCCOFINS := round( nSubtotal, 2 ) // -nDesconto // vBC // Vania-ContiMax-Nao calcular pela base reduzida e nao descontar
vCSTPIS := round( (vBCPIS)*(pPIS*.01), 2 )
vCSTCOFINS := round( (vBCCOFINS)*(pCOFINS*.01), 2 )
if cPISNat = "S" //.and. empty(ClInscrMun)
EDX OPEN MARK "PIS" OF oEDX
cTAGPIS := "PISAliq"
/* PISAliq 01 Basica */ if alltrim(cCSTPIS) $ "01" ; cTAGPIS := "PISAliq"; endif
/* PISAliq 02 Diferenciada */ if alltrim(cCSTPIS) $ "02" ; cTAGPIS := "PISAliq"; endif
/* PISQtde 03 */ if alltrim(cCSTPIS) $ "03" ; cTAGPIS := "PISQtde"; endif
/* PISNT 04...09 */ if alltrim(cCSTPIS) $ "04|05|06|07|08|09"; cTAGPIS := "PISNT" ; pPIS := 0; endif
/* Somente para emitentes Simples Nacional */
/* PISOutr 49...99 */ if alltrim(cCSTPIS) $ "49|50|51|52|53|54|55|56|60|61|62|63|64|65|66|67|70|71|72|73|74|75|98|99"; cTAGPIS := "PISOutr"; endif
EDX OPEN MARK cTAGPIS OF oEDX
EDX OPEN MARK "CST" TYPE "" TAG cCSTPIS AUTOCLOSE OF oEDX
/* PISAliq 01|02" */
if alltrim(cCSTPIS) $ "01|02"
EDX OPEN MARK "vBC" TYPE "" TAG str( vBCPIS,9,2 ) AUTOCLOSE OF oEDX
EDX OPEN MARK "pPIS" TYPE "" TAG str( pPIS,7,4 ) AUTOCLOSE OF oEDX // ERRO: Estava dividindo por 100
EDX OPEN MARK "vPIS" TYPE "" TAG str( vCSTPIS,9,2 ) AUTOCLOSE OF oEDX
vTTCSTPIS := vTTCSTPIS + vCSTPIS
endif
/* PISQtde 03 */
if alltrim(cCSTPIS) $ "03"
EDX OPEN MARK "qBCProd" TYPE "" TAG str( IIF(ES->IDOP>0,ES->PRODUZIDAS,ES->QUANTIDADE),12,4 ) AUTOCLOSE OF oEDX
EDX OPEN MARK "vAliqProd" TYPE "" TAG str( IIF(ES->IDOP>0,ES->PRODUZIDAS,ES->QUANTIDADE)*(pPIS),12,4 ) AUTOCLOSE OF oEDX
EDX OPEN MARK "vPIS" TYPE "" TAG str( vCSTPIS,9,2 ) AUTOCLOSE OF oEDX
vTTCSTPIS := vTTCSTPIS + vCSTPIS
endif
/* PISNT 04|05|06|07|08|09 */
if alltrim(cCSTPIS) $ "04|05|06|07|08|09"
endif
/* PISOutr 49|50|51|52|53|54|55|56|60|61|62|63|64|65|66|67|70|71|72|73|74|75|98|99 */
if alltrim(cCSTPIS) $ "49|50|51|52|53|54|55|56|60|61|62|63|64|65|66|67|70|71|72|73|74|75|98|99"
EDX OPEN MARK "vBC" TYPE "" TAG str( vBCPIS,9,2 ) AUTOCLOSE OF oEDX
EDX OPEN MARK "pPIS" TYPE "" TAG str( pPIS,6,4 ) AUTOCLOSE OF oEDX // ERRO: Estava dividindo por 100
EDX OPEN MARK "vPIS" TYPE "" TAG str( vCSTPIS,9,2 ) AUTOCLOSE OF oEDX
vTTCSTPIS := vTTCSTPIS + vCSTPIS
endif
EDX CLOSE MARK OF oEDX // pisnt
EDX CLOSE MARK OF oEDX // pis
endif
if cCOFINSNat = "S" //.and. empty(ClInscrMun)
EDX OPEN MARK "COFINS" OF oEDX
cTAGCOFINS := "COFINSAliq"
/* COFINSAliq 01 Basica */ if alltrim(cCSTCOFINS) $ "01" ; cTAGCOFINS := "COFINSAliq"; endif
/* COFINSAliq 02 Diferenciada */ if alltrim(cCSTCOFINS) $ "02" ; cTAGCOFINS := "COFINSAliq"; endif
/* COFINSQtde 03 */ if alltrim(cCSTCOFINS) $ "03" ; cTAGCOFINS := "COFINSQtde"; endif
/* COFINSNT 04...09 */ if alltrim(cCSTCOFINS) $ "04|05|06|07|08|09"; cTAGCOFINS := "COFINSNT" ; pCOFINS := 0; endif
/* Somente para emitentes Simples Nacional */
/* COFINSOutr 49...99 */ if alltrim(cCSTCOFINS) $ "49|50|51|52|53|54|55|56|60|61|62|63|64|65|66|67|70|71|72|73|74|75|98|99"; cTAGCOFINS := "COFINSOutr"; endif
EDX OPEN MARK cTAGCOFINS OF oEDX
EDX OPEN MARK "CST" TYPE "" TAG cCSTCOFINS AUTOCLOSE OF oEDX
/* COFINSAliq 01|02" */
if alltrim(cCSTCOFINS) $ "01|02"
EDX OPEN MARK "vBC" TYPE "" TAG str( vBCCOFINS,9,2 ) AUTOCLOSE OF oEDX
EDX OPEN MARK "pCOFINS" TYPE "" TAG str( pCOFINS,7,4 ) AUTOCLOSE OF oEDX // ERRO: Estava dividindo por 100
EDX OPEN MARK "vCOFINS" TYPE "" TAG str( vCSTCOFINS,9,2 ) AUTOCLOSE OF oEDX
vTTCSTCOFINS := vTTCSTCOFINS + vCSTCOFINS
endif
/* COFINSQtde 03 */
if alltrim(cCSTCOFINS) $ "03"
EDX OPEN MARK "qBCProd" TYPE "" TAG str( IIF(ES->IDOP>0,ES->PRODUZIDAS,ES->QUANTIDADE),12,4 ) AUTOCLOSE OF oEDX
EDX OPEN MARK "vAliqProd" TYPE "" TAG str( IIF(ES->IDOP>0,ES->PRODUZIDAS,ES->QUANTIDADE)*(pCOFINS),12,4 ) AUTOCLOSE OF oEDX
EDX OPEN MARK "vCOFINS" TYPE "" TAG str( vCSTCOFINS,9,2 ) AUTOCLOSE OF oEDX
vTTCSTCOFINS := vTTCSTCOFINS + vCSTCOFINS
endif
/* COFINSNT 04|05|06|07|08|09 */
if alltrim(cCSTCOFINS) $ "04|05|06|07|08|09"
endif
/* COFINSOutr 49|50|51|52|53|54|55|56|60|61|62|63|64|65|66|67|70|71|72|73|74|75|98|99 */
if alltrim(cCSTCOFINS) $ "49|50|51|52|53|54|55|56|60|61|62|63|64|65|66|67|70|71|72|73|74|75|98|99"
EDX OPEN MARK "vBC" TYPE "" TAG str( vBCCOFINS,9,2 ) AUTOCLOSE OF oEDX
EDX OPEN MARK "pCOFINS" TYPE "" TAG str( pCOFINS,7,4 ) AUTOCLOSE OF oEDX // ERRO: Estava dividindo por 100
EDX OPEN MARK "vCOFINS" TYPE "" TAG str( vCSTCOFINS,9,2 ) AUTOCLOSE OF oEDX
vTTCSTCOFINS := vTTCSTCOFINS + vCSTCOFINS
endif
EDX CLOSE MARK OF oEDX // COFINSnt
EDX CLOSE MARK OF oEDX // COFINS
endif
Bons cálculos