Módulo satcfe.entidades

Representação das entidades que compõem o layout do CF-e.

A documentação oficial para os atributos que as classes de entidades referenciam, estão na Especificação Técnica de Requisitos (ER) do SAT, item 4.2.2, Layout do Arquivo de Venda (CF-e-SAT) que pode ser obtido no site oficial.

Nem todas as classes que representam os grupos de informações do CF-e possuem o mesmo nome usado no item 4.2.2 do layout do arquivo de venda ou no item 4.2.3 do layout do arquivo de cancelamento. Entretanto, todos os elementos e atributos, possuem exatamente o mesmo nome usado na ER SAT.

A tabela abaixo, relaciona as classes de entidades com os grupos que elas representam:

Grupo ID Classe de Entidade
emit C01 Emitente
dest E01 Destinatario
entrega G01 LocalEntrega
det H01 Detalhamento
prod I01 ProdutoServico
obsFiscoDet I17 ObsFiscoDet
ICMS00 N02 ICMS00
ICMS40 N03 ICMS40
ICMSSN102 N04 ICMSSN102
ICMSSN900 N05 ICMSSN900
PISAliq Q02 PISAliq
PISQtde Q03 PISQtde
PISNT Q04 PISNT
PISSN Q05 PISSN
PISOutr Q06 PISOutr
PISST R01 PISST
COFINSAliq S02 COFINSAliq
COFINSQtde S03 COFINSQtde
COFINSNT S04 COFINSNT
COFINSSN S05 COFINSSN
COFINSOutr S06 COFINSOutr
COFINSST T01 COFINSST
ISSQN U01 ISSQN
imposto M01 Imposto
DescAcrEntr W19 DescAcrEntr
MP WA02 MeioPagamento
infAdic Z01 InformacoesAdicionais

Hierarquia dos elementos XML do layout do CF-e, ER SAT, item 4.2.2.

Destinatário e Local de entrega:

infCFe (A01, 1)
|
+--- dest (E01, 1)
|
+--- entrega (G01, 0..1)
:

Detalhamento dos produtos/serviços e impostos:

infCFe (A01, 1)
|
+--- det (H01, 1..500)
|    |
|    +--- prod (I01, 1)
|    |    |
|    |    +--- obsFiscoDet (I17, 0..10)
|    |
|    +--- imposto (M01, 1)
|         |
|         +--- ICMS (N01, 0..1)
:         |    |
:         |    +--- ICMS00 (N02, 0..1)
.         |    |         > ICMS 00, 20, 90
.         |    |
          |    +--- ICMS40 (N03, 0..1)
          |    |         > ICMS 40, 41, 50, 60
          |    |
          |    +--- ICMSSN102 (N04, 0..1)
          |    |         > cRegTrib = 1, Simples Nacional
          |    |         > CSOSN 102, 300, 500
          |    |
          |    +--- ICMSSN900 (N05, 0..1)
          |              > cRegTrib = 1, Simples Nacional
          |              > CSOSN 900
          |
          +--- PIS (Q01, 1..1)
          |    |
          |    +--- PISAliq (Q02, 0..1)
          |    |         > CST 01, 02, 05
          |    |
          |    +--- PISQtde (Q03, 0..1)
          |    |         > CST 03
          |    |
          |    +--- PISNT (Q04, 0..1)
          |    |         > Não Tributado
          |    |         > CST 04, 06, 07, 08, 09
          |    |
          |    +--- PISSN (Q05, 0..1)
          |    |         > Simples Nacional
          |    |         > CST 49
          |    |
          |    +--- PISOutr (Q06, 0..1)
          |              > Outras Operações
          |              > CST 99
          |
          +--- PISST (R01, 0..1)
          |          > Substituição Tributária
          |
          +--- COFINS (S01, 1..1)
          |    |
          |    +--- COFINSAliq (S02, 0..1)
          |    |         > CST 01, 02, 05
          |    |
          |    +--- COFINSQtde (S03, 0..1)
          |    |         > CST 03
          |    |
          |    +--- COFINSNT (S04, 0..1)
          |    |         > Não Tributado
          |    |         > CST 04, 06, 07, 08, 09
          |    |
          |    +--- COFINSSN (S05, 0..1)
          |    |         > Simples Nacional
          |    |         > CST 49
          |    +--- COFINSOutr (S06, 0..1)
          |              > Outras Operações
          |              > CST 99
          |
          +--- COFINSST (T01, 0..1)
          |          > Substituição Tributária
          |
          +--- ISSQN (U01, 0..1)

Totais:

infCFe (A01, 1)
|
+--- total (W01, 1)
|    |
|    +--- ICMSTot (W02, 0..1)
|    |          > Neste grupo, todos os elementos
:    |          > são calculados pelo equipamento SAT
:    |
.    +--- ISSQNTot (W12, 0..1)
.    |          > Neste grupo, todos os elementos
     |          > são calculados pelo equipamento SAT
     |
     +--- DescAcrEntr (W19, 0..1)

Pagamento:

infCFe (A01, 1)
|
+--- pgto (WA01, 1)
:    |
     +--- MP (WA02, 1..10)
class satcfe.entidades.CFeCancelamento(destinatario=None, **kwargs)

Representa um CF-e de cancelamento.

Parâmetros:
>>> cfecanc = CFeCancelamento(
...         chCanc='CFe01234567890123456789012345678901234567890123',
...         CNPJ='08427847000169',
...         signAC=constantes.ASSINATURA_AC_TESTE,
...         numeroCaixa=1)
>>> ET.tostring(cfecanc._xml())
'<CFeCanc><infCFe chCanc="CFe01234567890123456789012345678901234567890123"><ide><CNPJ>08427847000169</CNPJ><signAC>SGR-SAT SISTEMA DE GESTAO E RETAGUARDA DO SAT</signAC><numeroCaixa>001</numeroCaixa></ide><emit /><dest /><total /></infCFe></CFeCanc>'
destinatario

O Destinatario ou None.

class satcfe.entidades.CFeVenda(emitente=None, destinatario=None, entrega=None, detalhamentos=[], descontos_acrescimos_subtotal=None, pagamentos=[], informacoes_adicionais=None, **kwargs)

Representa um CF-e de venda.

Parâmetros:

Note que não há uma classe específica para representar o elemento ide do grupo B01, já que todos os seus atributos são esperados nesta classe.

>>> cfe = CFeVenda(
...         CNPJ='08427847000169',
...         signAC=constantes.ASSINATURA_AC_TESTE,
...         numeroCaixa=1,
...         emitente=Emitente(
...                 CNPJ='61099008000141',
...                 IE='111111111111',
...                 IM='12345',
...                 cRegTribISSQN=constantes.C15_SOCIEDADE_PROFISSIONAIS,
...                 indRatISSQN=constantes.C16_NAO_RATEADO))
>>> ET.tostring(cfe._xml())
'<CFe><infCFe versaoDadosEnt="0.06"><ide><CNPJ>08427847000169</CNPJ><signAC>SGR-SAT SISTEMA DE GESTAO E RETAGUARDA DO SAT</signAC><numeroCaixa>001</numeroCaixa></ide><emit><CNPJ>61099008000141</CNPJ><IE>111111111111</IE><IM>12345</IM><cRegTribISSQN>3</cRegTribISSQN><indRatISSQN>N</indRatISSQN></emit><dest /><total /><pgto /></infCFe></CFe>'
descontos_acrescimos_subtotal

Os descontos e acréscimos no subtotal do CF-e (DescAcrEntr) ou None.

destinatario

O Destinatario do CF-e ou None.

detalhamentos

Lista de objetos Detalhamento, descrevendo os produtos e serviços do CF-e.

emitente

O Emitente do CF-e.

entrega

O Local de entrega (LocalEntrega) ou None.

informacoes_adicionais

Informações adicionais do CF-e (InformacoesAdicionais) ou None.

pagamentos

Lista de objetos :class`MeioPagamento`, descrevendo os meios de pagamento empregados na quitação do CF-e.

class satcfe.entidades.COFINSAliq(**kwargs)

Grupo de COFINS tributado pela alíquota, CST 01, 02 ou 05 (COFINSAliq, grupo S02).

Parâmetros:
  • CST (str) –
  • vBC (Decimal) –
  • pCOFINS (Decimal) –
>>> cofins = COFINSAliq(CST='01', vBC=Decimal('1.00'), pCOFINS=Decimal('0.0065'))
>>> ET.tostring(cofins._xml())
'<COFINSAliq><CST>01</CST><vBC>1.00</vBC><pCOFINS>0.0065</pCOFINS></COFINSAliq>'
class satcfe.entidades.COFINSNT(**kwargs)

Grupo de COFINS não tributado, CST 04, 06, 07 08 ou 09 (COFINSNT, grupo S04).

Parâmetros:CST (str) –
>>> cofins = COFINSNT(CST='04')
>>> ET.tostring(cofins._xml())
'<COFINSNT><CST>04</CST></COFINSNT>'
class satcfe.entidades.COFINSOutr(**kwargs)

Grupo de COFINS para outras operações, CST 99 (COFINSOutr, grupo S06).

Parâmetros:
  • CST (str) –
  • vBC (str) – Opcional Se informado deverá ser também informado o parâmetro pCOFINS.
  • pCOFINS (str) – Opcional Se informado deverá ser também informado o parâmetro vBC.
  • qBCProd (str) – Opcional Se informado deverá ser também informado o parâmetro vAliqProd.
  • vAliqProd (str) – Opcional Se informado deverá ser também informado o parâmetro qBCProd.

Os parâmetros vBC e qBCProd são mutuamente exclusivos, e um ou outro devem ser informados.

>>> cofins = COFINSOutr(CST='99', vBC=Decimal('1.00'), pCOFINS=Decimal('0.0065'))
>>> ET.tostring(cofins._xml())
'<COFINSOutr><CST>99</CST><vBC>1.00</vBC><pCOFINS>0.0065</pCOFINS></COFINSOutr>'
>>> cofins = COFINSOutr(CST='99', qBCProd=Decimal('100.0000'), vAliqProd=Decimal('0.6500'))
>>> ET.tostring(cofins._xml())
'<COFINSOutr><CST>99</CST><qBCProd>100.0000</qBCProd><vAliqProd>0.6500</vAliqProd></COFINSOutr>'

# atributo vBC depende de pCOFINS que não foi informado
>>> cofins = COFINSOutr(CST='99', vBC=Decimal('1.00')) # vBC depende de pCOFINS
>>> cofins._xml()
Traceback (most recent call last):
 ...
ValidationError: ...

# atributo qBCProd depende de vAliqProd que não foi informado
>>> cofins = COFINSOutr(CST='99', qBCProd=Decimal('100.0000'))
>>> cofins._xml()
Traceback (most recent call last):
 ...
ValidationError: ...

# neste caso, deve falhar pois vBC ou qBCProd não foram informados
>>> cofins = COFINSOutr(CST='99')
>>> cofins._xml()
Traceback (most recent call last):
 ...
ValidationError: Grupo 'COFINSOutr' requer exclusivamente 'vBC' ou 'qBCProd' (nenhum informado)

# neste caso, deve falhar pois apenas um ou outro grupo pode ser informado:
# ou informa-se vBC e pCOFINS ou informa-se qBCProd e vAliqProd
>>> cofins = COFINSOutr(CST='99', vBC=Decimal('1.00'), pCOFINS=Decimal('1.00'), qBCProd=Decimal('1.00'), vAliqProd=Decimal('1.00'))
>>> cofins._xml()
Traceback (most recent call last):
 ...
ValidationError: Grupo 'COFINSOutr' requer exclusivamente 'vBC' ou 'qBCProd' (ambos informados)

# neste caso as falhara pela ausencia das dependencias:
# pCOFINS depende de vBC e vAliqProd depende de qBCProd
>>> cofins = COFINSOutr(CST='99', pCOFINS=Decimal('1.00'), vAliqProd=Decimal('1.00'))
>>> cofins._xml()
Traceback (most recent call last):
 ...
ValidationError: ...
class satcfe.entidades.COFINSQtde(**kwargs)

Grupo de COFINS tributado por quantidade, CST 03 (COFINSQtde, grupo S03).

Parâmetros:
  • CST (str) –
  • qBCProd (Decimal) –
  • vAliqProd (Decimal) –
>>> cofins = COFINSQtde(CST='03', qBCProd=Decimal('100.0000'), vAliqProd=Decimal('0.6500'))
>>> ET.tostring(cofins._xml())
'<COFINSQtde><CST>03</CST><qBCProd>100.0000</qBCProd><vAliqProd>0.6500</vAliqProd></COFINSQtde>'
class satcfe.entidades.COFINSSN(**kwargs)

Grupo de COFINS para contribuíntes do Simples Nacional, CST 49 (COFINSSN, grupo S05).

Parâmetros:CST (str) –
>>> cofins = COFINSSN(CST='49')
>>> ET.tostring(cofins._xml())
'<COFINSSN><CST>49</CST></COFINSSN>'
class satcfe.entidades.COFINSST(**kwargs)

Grupo de COFINS substituição tributária (COFINSST, grupo T01).

Parâmetros:
  • vBC (str) – Opcional Se informado deverá ser também informado o parâmetro pCOFINS.
  • pCOFINS (str) – Opcional Se informado deverá ser também informado o parâmetro vBC.
  • qBCProd (str) – Opcional Se informado deverá ser também informado o parâmetro vAliqProd.
  • vAliqProd (str) – Opcional Se informado deverá ser também informado o parâmetro qBCProd.

Os parâmetros vBC e qBCProd são mutuamente exclusivos, e um ou outro devem ser informados.

>>> cofins = COFINSST(vBC=Decimal('1.00'), pCOFINS=Decimal('0.0065'))
>>> ET.tostring(cofins._xml())
'<COFINSST><vBC>1.00</vBC><pCOFINS>0.0065</pCOFINS></COFINSST>'
>>> cofins = COFINSST(qBCProd=Decimal('100.0000'), vAliqProd=Decimal('0.6500'))
>>> ET.tostring(cofins._xml())
'<COFINSST><qBCProd>100.0000</qBCProd><vAliqProd>0.6500</vAliqProd></COFINSST>'

# atributo vBC depende de pCOFINS que não foi informado
>>> cofins = COFINSST(vBC=Decimal('1.00')) # vBC depende de pCOFINS
>>> cofins._xml()
Traceback (most recent call last):
 ...
ValidationError: ...

# atributo qBCProd depende de vAliqProd que não foi informado
>>> cofins = COFINSST(qBCProd=Decimal('100.0000'))
>>> cofins._xml()
Traceback (most recent call last):
 ...
ValidationError: ...

# neste caso, deve falhar pois vBC ou qBCProd não foram informados
>>> cofins = COFINSST()
>>> cofins._xml()
Traceback (most recent call last):
 ...
ValidationError: Grupo 'COFINSST' requer exclusivamente 'vBC' ou 'qBCProd' (nenhum informado)

# neste caso, deve falhar pois apenas um ou outro grupo pode ser informado:
# ou informa-se vBC e pCOFINS ou informa-se qBCProd e vAliqProd
>>> cofins = COFINSST(vBC=Decimal('1.00'), pCOFINS=Decimal('1.00'), qBCProd=Decimal('1.00'), vAliqProd=Decimal('1.00'))
>>> cofins._xml()
Traceback (most recent call last):
 ...
ValidationError: Grupo 'COFINSST' requer exclusivamente 'vBC' ou 'qBCProd' (ambos informados)

# neste caso as falhara pela ausencia das dependencias:
# pCOFINS depende de vBC e vAliqProd depende de qBCProd
>>> cofins = COFINSST(pCOFINS=Decimal('1.00'), vAliqProd=Decimal('1.00'))
>>> cofins._xml()
Traceback (most recent call last):
 ...
ValidationError: ...
class satcfe.entidades.DescAcrEntr(**kwargs)

Grupo de valores de entrada de desconto/acréscimo sobre subtotal (DescAcrEntr, grupo W19).

Parâmetros:
  • vDescSubtot (Decimal) –
  • vAcresSubtot (Decimal) –
  • vCFeLei12741 (Decimal) –
>>> grupo = DescAcrEntr()
>>> ET.tostring(grupo._xml())
'<DescAcrEntr />'

>>> grupo = DescAcrEntr(
...         vDescSubtot=Decimal('0.01'),
...         vAcresSubtot=Decimal('0.02'),
...         vCFeLei12741=Decimal('0.03'))
>>> ET.tostring(grupo._xml())
'<DescAcrEntr><vDescSubtot>0.01</vDescSubtot><vAcresSubtot>0.02</vAcresSubtot><vCFeLei12741>0.03</vCFeLei12741></DescAcrEntr>'
class satcfe.entidades.Destinatario(**kwargs)

Identificação do destinatário do CF-e (dest, grupo E01).

Parâmetros:
  • CNPJ (str) – Número do CNPJ do destinatário, contendo apenas os digitos e incluindo os zeros não significativos. Não deve ser informado se o ``CPF`` for informado.
  • CPF (str) – Número do CPF do destinatário, contendo apenas os digitos e incluindo os zeros não significativos. Não deve ser informado se o ``CNPJ`` for informado.
  • xNome (str) – Opcional. Nome ou razão social do destinatário.

Note que os parâmetros CNPJ e CPF são mutuamente exclusivos.

>>> dest = Destinatario()
>>> ET.tostring(dest._xml(), encoding='utf-8')
'<dest />'
>>> dest = Destinatario(CNPJ='08427847000169')
>>> ET.tostring(dest._xml(), encoding='utf-8')
'<dest><CNPJ>08427847000169</CNPJ></dest>'
>>> dest = Destinatario(CPF='11122233396', xNome=u'Fulano Beltrano')
>>> ET.tostring(dest._xml(), encoding='utf-8')
'<dest><CPF>11122233396</CPF><xNome>Fulano Beltrano</xNome></dest>'
>>> dest = Destinatario(CPF='11122233396', CNPJ='08427847000169')
>>> dest._xml()
Traceback (most recent call last):
 ...
ValidationError: ...

# testa criação do XML para cancelamento; o nome deverá ser ignorado
>>> dest = Destinatario(CPF='11122233396', xNome=u'Fulano Beltrano')
>>> ET.tostring(dest._xml(cancelamento=True), encoding='utf-8')
'<dest><CPF>11122233396</CPF></dest>'
class satcfe.entidades.Detalhamento(produto=None, imposto=None, **kwargs)

Detalhamento do produto ou serviço do CF-e (det, grupo H01).

Parâmetros:

Note que o atributo XML nItem (H02) não é determinado aqui, mas atribuído automaticamente, conforme a sua posição na lista de detalhamentos.

>>> det = Detalhamento(
...         produto=ProdutoServico(
...                 cProd='123456',
...                 xProd='BORRACHA STAEDTLER',
...                 CFOP='5102',
...                 uCom='UN',
...                 qCom=Decimal('1.0000'),
...                 vUnCom=Decimal('5.75'),
...                 indRegra='A'),
...         imposto=Imposto(
...                 pis=PISSN(CST='49'),
...                 cofins=COFINSSN(CST='49'),
...                 icms=ICMSSN102(Orig='2', CSOSN='500')),
...         infAdProd='Teste')
>>> ET.tostring(det._xml(nItem=1))
'<det nItem="1"><prod><cProd>123456</cProd><xProd>BORRACHA STAEDTLER</xProd><CFOP>5102</CFOP><uCom>UN</uCom><qCom>1.0000</qCom><vUnCom>5.75</vUnCom><indRegra>A</indRegra></prod><imposto><ICMS><ICMSSN102><Orig>2</Orig><CSOSN>500</CSOSN></ICMSSN102></ICMS><PIS><PISSN><CST>49</CST></PISSN></PIS><COFINS><COFINSSN><CST>49</CST></COFINSSN></COFINS></imposto><infAdProd>Teste</infAdProd></det>'
imposto

O grupo de tributos incidentes no produto ou serviço ao qual o detalhamento se refere, como uma instância de Imposto.

produto

O produto ou serviço como uma instância de ProdutoServico ao qual o detalhamento se refere.

class satcfe.entidades.Emitente(**kwargs)

Identificação do emitente do CF-e (emit, grupo C01).

Parâmetros:
  • CNPJ (str) – Número do CNPJ do emitente do CF-e, contendo apenas os digitos e incluindo os zeros não significativos.
  • IE (str) – Número de Inscrição Estadual do emitente do CF-e, contendo apenas digitos.
  • IM (str) – Opcional. Deve ser informado o número da Inscrição Municipal quando o CF-e possuir itens com prestação de serviços sujeitos ao ISSQN, por exemplo.
  • cRegTribISSQN (str) – Opcional. Indica o regime especial de tributação do ISSQN. Veja as constantes em C15_CREGTRIBISSQN_EMIT.
  • indRatISSQN (str) – Opcional. Indicador de rateio do desconto sobre o subtotal entre itens sujeitos à tributação pelo ISSQN. Veja as constantes em C16_INDRATISSQN_EMIT.
>>> emit = Emitente(CNPJ='08427847000169', IE='111222333444', indRatISSQN='S')
>>> ET.tostring(emit._xml())
'<emit><CNPJ>08427847000169</CNPJ><IE>111222333444</IE><indRatISSQN>S</indRatISSQN></emit>'

>>> emit = Emitente(
...         CNPJ='08427847000169',
...         IE='111222333444',
...         IM='123456789012345',
...         cRegTribISSQN='1',
...         indRatISSQN='S')
>>> ET.tostring(emit._xml())
'<emit><CNPJ>08427847000169</CNPJ><IE>111222333444</IE><IM>123456789012345</IM><cRegTribISSQN>1</cRegTribISSQN><indRatISSQN>S</indRatISSQN></emit>'
class satcfe.entidades.Entidade(schema={}, validator_class=None, **kwargs)

Classe base para todas as classes que representem as entidades da implementação do SAT-CF-e. Aqui, chamaremos de “entidade” as classes que representem os grupos de dados que são usados para formar o XML do CF-e de venda ou de cancelamento.

Basicamente, as subclasses precisam sobre-escrever a implementação do método _construir_elemento_xml, definir o atributo _schema e, quando necessário, implementar uma especialização do validador Cerberus no atributo _validator_class.

documento(*args, **kwargs)

Resulta no documento XML como string, que pode ou não incluir a declaração XML no início do documento.

class satcfe.entidades.ICMS00(**kwargs)

Grupo de tributação do ICMS 00, 20 e 90 (ICMS00, grupo N02).

Parâmetros:
  • Orig (str) –
  • CST (str) –
  • pICMS (Decimal) –
>>> icms = ICMS00(Orig='0', CST='00', pICMS=Decimal('18.00'))
>>> ET.tostring(icms._xml())
'<ICMS00><Orig>0</Orig><CST>00</CST><pICMS>18.00</pICMS></ICMS00>'
class satcfe.entidades.ICMS40(**kwargs)

Grupo de tributação do ICMS 40, 41, 50 e 60 (ICMS40, grupo N03).

Parâmetros:
  • Orig (str) –
  • CST (str) –
>>> icms = ICMS40(Orig='0', CST='60')
>>> ET.tostring(icms._xml())
'<ICMS40><Orig>0</Orig><CST>60</CST></ICMS40>'
class satcfe.entidades.ICMSSN102(**kwargs)

Grupo de tributação do ICMS Simples Nacional, CSOSN 102, 300 e 500 (ICMSSN102, grupo N04).

Parâmetros:
  • Orig (str) –
  • CSOSN (str) –
>>> icms = ICMSSN102(Orig='0', CSOSN='500')
>>> ET.tostring(icms._xml())
'<ICMSSN102><Orig>0</Orig><CSOSN>500</CSOSN></ICMSSN102>'
class satcfe.entidades.ICMSSN900(**kwargs)

Grupo de tributação do ICMS Simples Nacional, CSOSN 900 (ICMSSN900, grupo N05).

Parâmetros:
  • Orig (str) –
  • CSOSN (str) –
  • pICMS (Decimal) –
>>> icms = ICMSSN900(Orig='0', CSOSN='900', pICMS=Decimal('18.00'))
>>> ET.tostring(icms._xml())
'<ICMSSN900><Orig>0</Orig><CSOSN>900</CSOSN><pICMS>18.00</pICMS></ICMSSN900>'
class satcfe.entidades.ISSQN(**kwargs)

Grupo do ISSQN (ISSQN, grupo U01).

Parâmetros:
  • vDeducISSQN (Decimal) –
  • vAliq (Decimal) –
  • cMunFG (str) – Opcional
  • cListServ (str) – Opcional
  • cServTribMun (str) – Opcional
  • cNatOp (str) –
  • indIncFisc (str) –
>>> issqn = ISSQN(vDeducISSQN=Decimal('10.00'), vAliq=Decimal('7.00'), cNatOp='01', indIncFisc='2')
>>> ET.tostring(issqn._xml())
'<ISSQN><vDeducISSQN>10.00</vDeducISSQN><vAliq>7.00</vAliq><cNatOp>01</cNatOp><indIncFisc>2</indIncFisc></ISSQN>'

>>> issqn = ISSQN(vDeducISSQN=Decimal('10.00'), vAliq=Decimal('7.00'), cNatOp='01', indIncFisc='2', cMunFG='3511102', cListServ='01.01', cServTribMun='01234567890123456789')
>>> ET.tostring(issqn._xml())
'<ISSQN><vDeducISSQN>10.00</vDeducISSQN><vAliq>7.00</vAliq><cMunFG>3511102</cMunFG><cListServ>01.01</cListServ><cServTribMun>01234567890123456789</cServTribMun><cNatOp>01</cNatOp><indIncFisc>2</indIncFisc></ISSQN>'
class satcfe.entidades.Imposto(icms=None, pis=None, pisst=None, cofins=None, cofinsst=None, issqn=None, **kwargs)

Grupo de tributos incidentes no produto ou serviço (imposto, grupo M01).

Parâmetros:
  • icmsOpcional Deve ser uma instância de uma das classes dos grupos de ICMS (ICMS00, ICMS40, ICMSSN102 ou ICMSSN900) se o item for um produto tributado pelo ICMS ou None em caso contrário.
  • pis – Deve ser uma instância de uma das classes dos grupos de PIS (PISAliq, PISQtde, PISNT, PISSN ou PISOutr).
  • pisstOpcional Instância de PISST ou None.
  • cofins (str) – Deve ser uma instância de uma dlas classes dos grupos de COFINS (COFINSAliq, COFINSQtde, COFINSNT, COFINSSN ou COFINSOutr).
  • cofinsst (str) – Opcional Instância de COFINSST ou None.
  • issqn (str) – Opcional Uma instância de ISSQN se o item for um serviço tributado pelo ISSQN ou None em caso contrário.
  • vItem12741 (Decimal) – Opcional Valor aproximado dos tributos do produto ou serviço, conforme a Lei 12.741/12.
>>> imposto = Imposto(
...         vItem12741=Decimal('0.10'),
...         icms=ICMS00(Orig='0', CST='00', pICMS=Decimal('18.00')),
...         pis=PISSN(CST='49'),
...         cofins=COFINSSN(CST='49'))
>>> ET.tostring(imposto._xml())
'<imposto><vItem12741>0.10</vItem12741><ICMS><ICMS00><Orig>0</Orig><CST>00</CST><pICMS>18.00</pICMS></ICMS00></ICMS><PIS><PISSN><CST>49</CST></PISSN></PIS><COFINS><COFINSSN><CST>49</CST></COFINSSN></COFINS></imposto>'

# sem pis
>>> imposto = Imposto(cofins=COFINSSN(CST='49'))
>>> imposto._xml()
Traceback (most recent call last):
 ...
ValidationError: 'Imposto' (grupo M01 'imposto') atributo 'pis' nao pode ser 'None'

# sem cofins
>>> imposto = Imposto(pis=PISSN(CST='49'))
>>> imposto._xml()
Traceback (most recent call last):
 ...
ValidationError: 'Imposto' (grupo M01 'imposto') atributo 'cofins' nao pode ser 'None'
cofins

Um dos grupos de COFINS (COFINSAliq, COFINSQtde, COFINSNT, COFINSSN ou COFINSOutr).

cofinsst

O grupo do COFINS Substituição Tributária (COFINSST) se for o caso, ou None.

icms

Um dos grupos de ICMS (ICMS00, ICMS40, ICMSSN102 ou ICMSSN900) se o item for um produto tributado pelo ICMS ou None em caso contrário.

issqn

O grupo de ISSQN (ISSQN) se o item for um serviço tributado pelo ISSQN ou None em caso contrário.

pis

Um dos grupos de PIS (PISAliq, PISQtde, PISNT, PISSN ou PISOutr).

pisst

O grupo do PIS Substituição Tributária (PISST) se for o caso, ou None.

class satcfe.entidades.InformacoesAdicionais(**kwargs)

Grupo de informações adicionais (infAdic, grupo Z01).

Parâmetros:infCpl (str) – Opcional
>>> grupo = InformacoesAdicionais()
>>> ET.tostring(grupo._xml())
'<infAdic />'

>>> grupo = InformacoesAdicionais(infCpl='Teste')
>>> ET.tostring(grupo._xml())
'<infAdic><infCpl>Teste</infCpl></infAdic>'
class satcfe.entidades.LocalEntrega(**kwargs)

Identificação do Local de Entrega (entrega, grupo G01).

Parâmetros:
  • xLgr (str) –
  • nro (str) –
  • xCpl (str) – Opcional
  • xBairro (str) –
  • xMun (str) –
  • UF (str) –
>>> entrega = LocalEntrega()
>>> ET.tostring(entrega._xml(), encoding='utf-8')
Traceback (most recent call last):
 ...
ValidationError: ...
>>> entrega.xLgr = 'Rua Armando Gulim'
>>> entrega.nro = '65'
>>> entrega.xBairro = 'Parque Gloria III'
>>> entrega.xMun = 'Catanduva'
>>> entrega.UF = 'SP'
>>> ET.tostring(entrega._xml(), encoding='utf-8')
'<entrega><xLgr>Rua Armando Gulim</xLgr><nro>65</nro><xBairro>Parque Gloria III</xBairro><xMun>Catanduva</xMun><UF>SP</UF></entrega>'
class satcfe.entidades.MeioPagamento(**kwargs)

Meio de pagamento (MP, grupo WA02).

Parâmetros:
  • cMP (str) –
  • vMP (Decimal) –
  • cAdmC (str) – Opcional
>>> mp = MeioPagamento(cMP='01', vMP=Decimal('10.00'))
>>> ET.tostring(mp._xml())
'<MP><cMP>01</cMP><vMP>10.00</vMP></MP>'

>>> mp = MeioPagamento(cMP='01', vMP=Decimal('10.00'), cAdmC='999')
>>> ET.tostring(mp._xml())
'<MP><cMP>01</cMP><vMP>10.00</vMP><cAdmC>999</cAdmC></MP>'
class satcfe.entidades.ObsFiscoDet(**kwargs)

Grupo do campo de uso livre do Fisco (obsFiscoDet, grupo I17).

Parâmetros:
  • xCampoDet (str) –
  • xTextoDet (str) –
>>> obs = ObsFiscoDet(xCampoDet='Cod. Produto ANP', xTextoDet='320101001')
>>> ET.tostring(obs._xml())
'<obsFiscoDet xCampoDet="Cod. Produto ANP"><xTextoDet>320101001</xTextoDet></obsFiscoDet>'
class satcfe.entidades.PISAliq(**kwargs)

Grupo de PIS tributado pela alíquota, CST 01, 02 ou 05 (PISAliq, grupo Q02).

Parâmetros:
  • CST (str) –
  • vBC (Decimal) –
  • pPIS (Decimal) –
>>> pis = PISAliq(CST='01', vBC=Decimal('1.00'), pPIS=Decimal('0.0065'))
>>> ET.tostring(pis._xml())
'<PISAliq><CST>01</CST><vBC>1.00</vBC><pPIS>0.0065</pPIS></PISAliq>'
class satcfe.entidades.PISNT(**kwargs)

Grupo de PIS não tributado, CST 04, 06, 07 08 ou 09 (PISNT, grupo Q04).

Parâmetros:CST (str) –
>>> pis = PISNT(CST='04')
>>> ET.tostring(pis._xml())
'<PISNT><CST>04</CST></PISNT>'
class satcfe.entidades.PISOutr(**kwargs)

Grupo de PIS para outras operações, CST 99 (PISOutr, grupo Q06).

Parâmetros:
  • CST (str) –
  • vBC (str) – Opcional Se informado deverá ser também informado o parâmetro pPIS.
  • pPIS (str) – Opcional Se informado deverá ser também informado o parâmetro vBC.
  • qBCProd (str) – Opcional Se informado deverá ser também informado o parâmetro vAliqProd.
  • vAliqProd (str) – Opcional Se informado deverá ser também informado o parâmetro qBCProd.

Os parâmetros vBC e qBCProd são mutuamente exclusivos, e um ou outro devem ser informados.

>>> pis = PISOutr(CST='99', vBC=Decimal('1.00'), pPIS=Decimal('0.0065'))
>>> ET.tostring(pis._xml())
'<PISOutr><CST>99</CST><vBC>1.00</vBC><pPIS>0.0065</pPIS></PISOutr>'
>>> pis = PISOutr(CST='99', qBCProd=Decimal('100.0000'), vAliqProd=Decimal('0.6500'))
>>> ET.tostring(pis._xml())
'<PISOutr><CST>99</CST><qBCProd>100.0000</qBCProd><vAliqProd>0.6500</vAliqProd></PISOutr>'

# atributo vBC depende de pPIS que não foi informado
>>> pis = PISOutr(CST='99', vBC=Decimal('1.00')) # vBC depende de pPIS
>>> pis._xml()
Traceback (most recent call last):
 ...
ValidationError: ...

# atributo qBCProd depende de vAliqProd que não foi informado
>>> pis = PISOutr(CST='99', qBCProd=Decimal('100.0000'))
>>> pis._xml()
Traceback (most recent call last):
 ...
ValidationError: ...

# neste caso, deve falhar pois vBC ou qBCProd não foram informados
>>> pis = PISOutr(CST='99')
>>> pis._xml()
Traceback (most recent call last):
 ...
ValidationError: Grupo 'PISOutr' requer exclusivamente 'vBC' ou 'qBCProd' (nenhum informado)

# neste caso, deve falhar pois apenas um ou outro grupo pode ser informado:
# ou informa-se vBC e pPIS ou informa-se qBCProd e vAliqProd
>>> pis = PISOutr(CST='99', vBC=Decimal('1.00'), pPIS=Decimal('1.00'), qBCProd=Decimal('1.00'), vAliqProd=Decimal('1.00'))
>>> pis._xml()
Traceback (most recent call last):
 ...
ValidationError: Grupo 'PISOutr' requer exclusivamente 'vBC' ou 'qBCProd' (ambos informados)

# neste caso as falhara pela ausencia das dependencias:
# pPIS depende de vBC e vAliqProd depende de qBCProd
>>> pis = PISOutr(CST='99', pPIS=Decimal('1.00'), vAliqProd=Decimal('1.00'))
>>> pis._xml()
Traceback (most recent call last):
 ...
ValidationError: ...
class satcfe.entidades.PISQtde(**kwargs)

Grupo de PIS tributado por quantidade, CST 03 (PISQtde, grupo Q03).

Parâmetros:
  • CST (str) –
  • qBCProd (Decimal) –
  • vAliqProd (Decimal) –
>>> pis = PISQtde(CST='03', qBCProd=Decimal('100.0000'), vAliqProd=Decimal('0.6500'))
>>> ET.tostring(pis._xml())
'<PISQtde><CST>03</CST><qBCProd>100.0000</qBCProd><vAliqProd>0.6500</vAliqProd></PISQtde>'
class satcfe.entidades.PISSN(**kwargs)

Grupo de PIS para contribuíntes do Simples Nacional, CST 49 (PISSN, grupo Q05).

Parâmetros:CST (str) –
>>> pis = PISSN(CST='49')
>>> ET.tostring(pis._xml())
'<PISSN><CST>49</CST></PISSN>'
class satcfe.entidades.PISST(**kwargs)

Grupo de PIS substituição tributária (PISST, grupo R01).

Parâmetros:
  • vBC (str) – Opcional Se informado deverá ser também informado o parâmetro pPIS.
  • pPIS (str) – Opcional Se informado deverá ser também informado o parâmetro vBC.
  • qBCProd (str) – Opcional Se informado deverá ser também informado o parâmetro vAliqProd.
  • vAliqProd (str) – Opcional Se informado deverá ser também informado o parâmetro qBCProd.

Os parâmetros vBC e qBCProd são mutuamente exclusivos, e um ou outro devem ser informados.

>>> pis = PISST(vBC=Decimal('1.00'), pPIS=Decimal('0.0065'))
>>> ET.tostring(pis._xml())
'<PISST><vBC>1.00</vBC><pPIS>0.0065</pPIS></PISST>'
>>> pis = PISST(qBCProd=Decimal('100.0000'), vAliqProd=Decimal('0.6500'))
>>> ET.tostring(pis._xml())
'<PISST><qBCProd>100.0000</qBCProd><vAliqProd>0.6500</vAliqProd></PISST>'

# atributo vBC depende de pPIS que não foi informado
>>> pis = PISST(vBC=Decimal('1.00')) # vBC depende de pPIS
>>> pis._xml()
Traceback (most recent call last):
 ...
ValidationError: ...

# atributo qBCProd depende de vAliqProd que não foi informado
>>> pis = PISST(qBCProd=Decimal('100.0000'))
>>> pis._xml()
Traceback (most recent call last):
 ...
ValidationError: ...

# neste caso, deve falhar pois vBC ou qBCProd não foram informados
>>> pis = PISST()
>>> pis._xml()
Traceback (most recent call last):
 ...
ValidationError: Grupo 'PISST' requer exclusivamente 'vBC' ou 'qBCProd' (nenhum informado)

# neste caso, deve falhar pois apenas um ou outro grupo pode ser informado:
# ou informa-se vBC e pPIS ou informa-se qBCProd e vAliqProd
>>> pis = PISST(vBC=Decimal('1.00'), pPIS=Decimal('1.00'), qBCProd=Decimal('1.00'), vAliqProd=Decimal('1.00'))
>>> pis._xml()
Traceback (most recent call last):
 ...
ValidationError: Grupo 'PISST' requer exclusivamente 'vBC' ou 'qBCProd' (ambos informados)

# neste caso as falhara pela ausencia das dependencias:
# pPIS depende de vBC e vAliqProd depende de qBCProd
>>> pis = PISST(pPIS=Decimal('1.00'), vAliqProd=Decimal('1.00'))
>>> pis._xml()
Traceback (most recent call last):
 ...
ValidationError: ...
class satcfe.entidades.ProdutoServico(observacoes_fisco=[], **kwargs)

Produto ou serviço do CF-e (prod, grupo I01).

Parâmetros:
  • cProd (str) –
  • cEAN (str) – Opcional
  • xProd (str) –
  • NCM (str) – Opcional
  • CFOP (str) –
  • uCom (str) –
  • qCom (Decimal) –
  • vUnCom (Decimal) –
  • indRegra (str) –
  • vDesc (Decimal) – Opcional
  • vOutro (Decimal) – Opcional
  • observacoes_fisco (list) – Opcional
# apenas os atributos requeridos;
# note que, diferente da NF-e/NFC-e a ER SAT indica que o
# atributo NCM não é obrigatório
>>> prod = ProdutoServico(
...         cProd='123456',
...         xProd='BORRACHA STAEDTLER',
...         CFOP='5102',
...         uCom='UN',
...         qCom=Decimal('1.0000'),
...         vUnCom=Decimal('5.75'),
...         indRegra='A')
>>> ET.tostring(prod._xml())
'<prod><cProd>123456</cProd><xProd>BORRACHA STAEDTLER</xProd><CFOP>5102</CFOP><uCom>UN</uCom><qCom>1.0000</qCom><vUnCom>5.75</vUnCom><indRegra>A</indRegra></prod>'

# todos os atributos (se vDesc for informado, então não informa vOutro)
>>> prod = ProdutoServico(
...         cProd='123456',
...         cEAN='4007817525074',
...         xProd='BORRACHA STAEDTLER',
...         NCM='40169200',
...         CFOP='5102',
...         uCom='UN',
...         qCom=Decimal('1.0000'),
...         vUnCom=Decimal('5.75'),
...         indRegra='A',
...         vDesc=Decimal('0.25'))
>>> ET.tostring(prod._xml())
'<prod><cProd>123456</cProd><cEAN>4007817525074</cEAN><xProd>BORRACHA STAEDTLER</xProd><NCM>40169200</NCM><CFOP>5102</CFOP><uCom>UN</uCom><qCom>1.0000</qCom><vUnCom>5.75</vUnCom><indRegra>A</indRegra><vDesc>0.25</vDesc></prod>'

# todos os atributos (informando vOutro)
>>> prod = ProdutoServico(
...         cProd='123456',
...         cEAN='4007817525074',
...         xProd='BORRACHA STAEDTLER',
...         NCM='40169200',
...         CFOP='5102',
...         uCom='UN',
...         qCom=Decimal('1.0000'),
...         vUnCom=Decimal('5.75'),
...         indRegra='A',
...         vOutro=Decimal('0.25'))
>>> ET.tostring(prod._xml())
'<prod><cProd>123456</cProd><cEAN>4007817525074</cEAN><xProd>BORRACHA STAEDTLER</xProd><NCM>40169200</NCM><CFOP>5102</CFOP><uCom>UN</uCom><qCom>1.0000</qCom><vUnCom>5.75</vUnCom><indRegra>A</indRegra><vOutro>0.25</vOutro></prod>'

# informa vDesc e vOutro, não deve validar
>>> prod = ProdutoServico(
...         cProd='123456',
...         xProd='BORRACHA STAEDTLER',
...         CFOP='5102',
...         uCom='UN',
...         qCom=Decimal('1.0000'),
...         vUnCom=Decimal('5.75'),
...         indRegra='A',
...         vDesc=Decimal('0.25'),
...         vOutro=Decimal('0.25'))
>>> prod._xml()
Traceback (most recent call last):
 ...
ValidationError: 'ProdutoServico' (grupo H01 'prod') atributos 'vDesc' e 'vOutro' sao mutuamente exclusivos
observacoes_fisco

Cada produto, pode opcionalmente, conter uma lista de campos de uso livre do fisco, cujos campos e valores são representados por instâncias da classe ObsFiscoDet.