Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
40 changes: 40 additions & 0 deletions pynfe/entidades/notafiscal.py
Original file line number Diff line number Diff line change
Expand Up @@ -1009,15 +1009,33 @@ class NotaFiscalProduto(Entidade):
# - Declaracao de Importacao (lista 1 para * / ManyToManyField)
declaracoes_importacao = None

# Grupo K - Detalhamento Específico de Medicamentos
# K01a - Código de Produto da ANVISA (ou "ISENTO" para medicamentos isentos)
med_cProdANVISA = str()
# K01b - Motivo da isenção da ANVISA (opcional, para medicamentos isentos)
med_xMotivoIsencao = str()
# K06 - Preço máximo consumidor
med_vPMC = Decimal()

# Grupo I80 - Rastreabilidade de produto (lista 0 para 500)
rastro = None

def __init__(self, *args, **kwargs):
self.declaracoes_importacao = []
self.rastro = []

super(NotaFiscalProduto, self).__init__(*args, **kwargs)

def adicionar_declaracao_importacao(self, **kwargs):
"""Adiciona uma instancia de Declaracao de Importacao"""
self.declaracoes_importacao.append(NotaFiscalDeclaracaoImportacao(**kwargs))

def adicionar_rastro(self, **kwargs):
"""Adiciona uma instância de Rastreabilidade do Produto"""
obj = NotaFiscalRastro(**kwargs)
self.rastro.append(obj)
return obj


class NotaFiscalDeclaracaoImportacao(Entidade):
# - Numero DI/DSI/DA
Expand Down Expand Up @@ -1081,6 +1099,28 @@ class NotaFiscalDeclaracaoImportacaoAdicao(Entidade):
numero_drawback = str()


class NotaFiscalRastro(Entidade):
"""Grupo I80 - Rastreabilidade de produto

Detalhes de rastreabilidade para produtos que necessitam de
controle de lote (ex: medicamentos, alimentos, etc.)
"""
# I81 - Número do lote do produto
nLote = str()

# I82 - Quantidade de produto no lote
qLote = Decimal()

# I83 - Data de fabricação (formato AAAA-MM-DD)
dFab = None

# I84 - Data de validade (formato AAAA-MM-DD)
dVal = None

# I85 - Código de Agregação (opcional)
cAgreg = str()


class NotaFiscalTransporteVolume(Entidade):
# - Quantidade
quantidade = Decimal()
Expand Down
32 changes: 32 additions & 0 deletions pynfe/processamento/serializacao.py
Original file line number Diff line number Diff line change
Expand Up @@ -377,6 +377,23 @@ def _serializar_produto_servico(
if produto_servico.nfci:
etree.SubElement(prod, "nFCI").text = produto_servico.nfci

# Grupo I80 - Rastreabilidade de produto (rastro)
if produto_servico.rastro:
for rastro_item in produto_servico.rastro:
rastro = etree.SubElement(prod, "rastro")
etree.SubElement(rastro, "nLote").text = str(rastro_item.nLote)
etree.SubElement(rastro, "qLote").text = "{:.3f}".format(
rastro_item.qLote or 0
)
etree.SubElement(rastro, "dFab").text = rastro_item.dFab.strftime(
"%Y-%m-%d"
)
etree.SubElement(rastro, "dVal").text = rastro_item.dVal.strftime(
"%Y-%m-%d"
)
if rastro_item.cAgreg:
etree.SubElement(rastro, "cAgreg").text = str(rastro_item.cAgreg)

# Combustível
if produto_servico.cProdANP:
combustivel = etree.SubElement(prod, "comb")
Expand Down Expand Up @@ -409,6 +426,21 @@ def _serializar_produto_servico(
if produto_servico.comb_p_bio:
etree.SubElement(combustivel, "pBio").text = "{:.4f}".format(produto_servico.comb_p_bio or 0)

# Grupo K - Detalhamento Específico de Medicamentos (med)
# Note: med is inside prod, as a product-specific group alternative to comb, veicProd, arma
if produto_servico.med_cProdANVISA:
med = etree.SubElement(prod, "med")
etree.SubElement(med, "cProdANVISA").text = str(
produto_servico.med_cProdANVISA
)
if produto_servico.med_xMotivoIsencao:
etree.SubElement(med, "xMotivoIsencao").text = str(
produto_servico.med_xMotivoIsencao
)
etree.SubElement(med, "vPMC").text = "{:.2f}".format(
produto_servico.med_vPMC or 0
)

# Imposto
imposto = etree.SubElement(raiz, "imposto")

Expand Down
Loading
Loading