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: - destinatario (Destinatario) – Opcional. Uma instância de
Destinatario
contendo apenas os dados exigidos para a operação de cancelamento (ie.CPF
ouCNPJ
do destinatário). - chCanc (str) – Chave de acesso do CF-e a ser cancelado. Deve ser
precedido do literal
CFe
seguido dos quarenta e quatro dígitos que compõem a chave de acesso. - CNPJ (str) – CNPJ da software house, desenvolvedora do aplicativo comercial, contendo apenas os dígitos do número e incluindo zeros não significativos, se for o caso (14 dígitos).
- signAC (str) – Assinatura do aplicativo comercial (344 dígitos).
- numeroCaixa (int) – Número do caixa ao qual o SAT está conectado.
Normalmente este será o número do caixa de onde parte a solicitação de
cancelamento. Deverá ser um número inteiro entre
0
e999
.
>>> 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
ouNone
.
- destinatario (Destinatario) – Opcional. Uma instância de
-
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: - emitente (Emitente) – Identificação do emitente do CF-e.
- destinatario (Destinatario) – Opcional. Identificação do destinatário.
- entrega (LocalEntrega) – Opcional. Informações do local de entrega.
- detalhamentos (list) – Uma lista de objetos
ProdutoServico
que representam os produtos/serviços participantes do CF-e de venda. - descontos_acrescimos_subtotal (DescAcrEntr) – Opcional. Se informado,
deverá ser um objeto
DescAcrEntr
que contenha o valor de desconto ou acréscimo sobre o subtotal. - pagamentos (list) – Uma lista de objetos
MeioPagamento
que descrevem cada um dos meios de pagamentos usados no CF-e de venda. - informacoes_adicionais (InformacoesAdicionais) – Opcional.
- versaoDadosEnt (str) – Opcional. String contendo a versão do layout
do arquivo de dados do aplicativo comercial. Se não informado será
utilizado o valor da constante
VERSAO_LAYOUT_ARQUIVO_DADOS_AC
do móduloconstantes
do projeto ``satcomum` <https://github.com/base4sistemas/satcomum/>`_ - CNPJ (str) – CNPJ da software house, desenvolvedora do aplicativo comercial, contendo apenas os dígitos do número e incluindo zeros não significativos, se for o caso (14 dígitos).
- signAC (str) – Assinatura do aplicativo comercial (344 dígitos).
- numeroCaixa (int) – Número do caixa ao qual o SAT está conectado.
Normalmente este será o número do caixa de onde parte a solicitação de
cancelamento. Deverá ser um número inteiro entre
0
e999
. - vCFeLei12741 (Decimal) – Opcional. Se informado deve representar a soma total dos valores aproximados dos tributos, em cumprimento à Lei nº 12.741/2012.
Note que não há uma classe específica para representar o elemento
ide
do grupoB01
, 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
) ouNone
.
-
destinatario
¶ O
Destinatario
do CF-e ouNone
.
-
detalhamentos
¶ Lista de objetos
Detalhamento
, descrevendo os produtos e serviços do CF-e.
-
entrega
¶ O Local de entrega (
LocalEntrega
) ouNone
.
-
informacoes_adicionais
¶ Informações adicionais do CF-e (
InformacoesAdicionais
) ouNone
.
-
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
, grupoS02
).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
, grupoS04
).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
, grupoS06
).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
eqBCProd
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
, grupoS03
).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
, grupoS05
).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
, grupoT01
).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
eqBCProd
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: ...
- vBC (str) – Opcional Se informado deverá ser também informado o
parâmetro
-
class
satcfe.entidades.
DescAcrEntr
(**kwargs)¶ Grupo de valores de entrada de desconto/acréscimo sobre subtotal (
DescAcrEntr
, grupoW19
).Parâmetros: - vDescSubtot (Decimal) – Valor de entrada de desconto sobre subtotal.
Se este argumento for informado, então o argumento
vAcresSubtot
não deve ser informado. - vAcresSubtot (Decimal) – Valor de entrada de acréscimo sobre subtotal.
Se este argumento for informado, então o argumento
vDescSubtot
não deve ser informado.
>>> grupo = DescAcrEntr() >>> ET.tostring(grupo._xml()) '<DescAcrEntr />' >>> # os atributos são mutamente exclusivos >>> grupo = DescAcrEntr( ... vDescSubtot=Decimal('0.01'), ... vAcresSubtot=Decimal('0.02')) >>> ET.tostring(grupo._xml()) Traceback (most recent call last): ... ValidationError: ... >>> grupo = DescAcrEntr(vDescSubtot=Decimal('0.01')) >>> ET.tostring(grupo._xml()) '<DescAcrEntr><vDescSubtot>0.01</vDescSubtot></DescAcrEntr>' >>> grupo = DescAcrEntr(vAcresSubtot=Decimal('0.02')) >>> ET.tostring(grupo._xml()) '<DescAcrEntr><vAcresSubtot>0.02</vAcresSubtot></DescAcrEntr>'
- vDescSubtot (Decimal) – Valor de entrada de desconto sobre subtotal.
Se este argumento for informado, então o argumento
-
class
satcfe.entidades.
Destinatario
(**kwargs)¶ Identificação do destinatário do CF-e (
dest
, grupoE01
).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
eCPF
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
, grupoH01
).Parâmetros: - produto (ProdutoServico) –
- imposto (Imposto) –
- infAdProd (str) – Opcional
Note que o atributo XML
nItem
(H02
) não é determinado aqui, mas atribuído automaticamente, conforme a sua posição na lista dedetalhamentos
.>>> 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
, grupoC01
).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
, grupoN02
).Parâmetros: >>> 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
, grupoN03
).Parâmetros: >>> 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
, grupoN04
).Parâmetros: >>> 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
, grupoN05
).Parâmetros: >>> 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
, grupoU01
).Parâmetros: >>> 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
, grupoM01
).Parâmetros: - icms – Opcional Deve ser uma instância de uma das classes dos
grupos de ICMS (
ICMS00
,ICMS40
,ICMSSN102
ouICMSSN900
) se o item for um produto tributado pelo ICMS ouNone
em caso contrário. - pis – Deve ser uma instância de uma das classes dos grupos de
PIS (
PISAliq
,PISQtde
,PISNT
,PISSN
ouPISOutr
). - pisst – Opcional Instância de
PISST
ouNone
. - cofins (str) – Deve ser uma instância de uma dlas classes dos grupos
de COFINS (
COFINSAliq
,COFINSQtde
,COFINSNT
,COFINSSN
ouCOFINSOutr
). - cofinsst (str) – Opcional Instância de
COFINSST
ouNone
. - issqn (str) – Opcional Uma instância de
ISSQN
se o item for um serviço tributado pelo ISSQN ouNone
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
ouCOFINSOutr
).
-
icms
¶ Um dos grupos de ICMS (
ICMS00
,ICMS40
,ICMSSN102
ouICMSSN900
) se o item for um produto tributado pelo ICMS ouNone
em caso contrário.
- icms – Opcional Deve ser uma instância de uma das classes dos
grupos de ICMS (
-
class
satcfe.entidades.
InformacoesAdicionais
(**kwargs)¶ Grupo de informações adicionais (
infAdic
, grupoZ01
).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
, grupoG01
).Parâmetros: >>> 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
, grupoWA02
).Parâmetros: >>> 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
, grupoI17
).Parâmetros: >>> 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
, grupoQ02
).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
, grupoQ04
).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
, grupoQ06
).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
eqBCProd
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
, grupoQ03
).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
, grupoQ05
).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
, grupoR01
).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
eqBCProd
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: ...
- vBC (str) – Opcional Se informado deverá ser também informado o
parâmetro
-
class
satcfe.entidades.
ProdutoServico
(observacoes_fisco=[], **kwargs)¶ Produto ou serviço do CF-e (
prod
, grupoI01
).Parâmetros: # 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
.
-