TIP: You can type at any time to perform a new search.
Common EDI fiscal features
l10n_br_fiscal_edi · OCA/l10n-brazil
Security findings
- Repository
- OCA/l10n-brazil · module folder · Try on Runboat
- Module version
- Category
- Localisation
- Folder size
- 0.28 MB
- License
- AGPL-3
- Application
- No
- Auto-installable
- No
- Website
- https://github.com/OCA/l10n-brazil
- Last tracking update
- 2026-09-19 23:36:06
- Authors
- Akretion, Odoo Community Association (OCA), KMEE
- Maintainers
- Akretion, Odoo Community Association (OCA), KMEE
- Committers
- Raphaël Valyi, Weblate, OCA-git-bot, oca-ci
- Odoo dependencies
- Python dependencies
- transitions, erpbrasil-base>=2.4.2, email-validator, num2words, phonenumbers
- System dependencies
- None
- Required by
- None
- Description
Este módulo fornece a infraestrutura base para o Intercâmbio Eletrônico de Dados (EDI) de documentos fiscais brasileiros no Odoo. Ele implementa uma Máquina de Estados Finitos (FSM - Finite State Machine) para gerenciar o ciclo de vida dos documentos fiscais eletrônicos (NF-e, NFC-e, NFS-e, CT-e, MDF-e etc.), garantindo integridade, consistência e rastreabilidade das transições de estado. Principais Características -------------------------- * **Máquina de Estados (FSM):** controle rigoroso das transições de estado (por exemplo, de `draft` para `open`, depois para `sending` e finalmente para `authorized`, `rejected` ou `denied`), com bloqueio de movimentos inválidos. * **Configuração extensível por documento:** a FSM base é definida no método `get_state_machine_config()` e pode ser sobrescrita por módulos específicos de documento fiscal para ajustar estados, transições e callbacks. * **Gerenciamento de Eventos:** arquitetura para suportar eventos fiscais vinculados ao documento, como Cancelamento, Carta de Correção Eletrônica (CC-e) e Inutilização de Numeração. * **Abstração de Protocolo:** separa a lógica de negócios da lógica de comunicação. Módulos específicos (como `l10n_br_nfe` ou `l10n_br_nfse`) herdam deste módulo para implementar a integração com webservices (SEFAZ/Prefeituras), enquanto o `l10n_br_fiscal_edi` orquestra o fluxo. * **Interface Padronizada:** oferece uma experiência consistente com botões e ações uniformes, independentemente do modelo de documento fiscal. Workflow de Estados ------------------- O diagrama abaixo ilustra os estados e transições padrão definidos no módulo base (a configuração pode ser estendida/sobrescrita por módulos filhos): 
Code Analysis
Views touched (13)
| XML ID | Name | Model | Type | Status |
|---|---|---|---|---|
document_cancel_wizard_form |
l10n_br_fiscal.document.cancel.wizard | l10n_br_fiscal.document.cancel.wizard | form | New |
document_correction_wizard_form |
l10n_br_fiscal.document.correction.wizard.form | l10n_br_fiscal.document.correction.wizard | form | New |
document_form |
l10n_br_fiscal_edi.document.form | l10n_br_fiscal.document | form | Inherits l10n_br_fiscal.document_form |
document_search |
l10n_br_fiscal_edi.document.search | l10n_br_fiscal.document | search | Inherits l10n_br_fiscal.document_search |
document_tree |
l10n_br_fiscal_edi.document.tree | l10n_br_fiscal.document | tree | Inherits l10n_br_fiscal.document_tree |
event_form |
l10n_br_fiscal.event.form | l10n_br_fiscal.event | form | New |
event_search |
l10n_br_fiscal.event.search | l10n_br_fiscal.event | search | New |
event_tree |
l10n_br_fiscal.event.tree | l10n_br_fiscal.event | list | New |
invalidate_number_form |
l10n_br_fiscal_edi.invalidate.number.form | l10n_br_fiscal.invalidate.number | form | Inherits l10n_br_fiscal.invalidate_number_form |
invalidate_number_wizard |
l10n_br_fiscal.invalidate.number.wizard | l10n_br_fiscal.invalidate.number.wizard | form | New |
main_report_document_event |
main_report_document_event | ir.ui.view | qweb | New |
report_document_event |
report_document_event | ir.ui.view | qweb | New |
wizard_document_status_form |
wizard.l10n_br_fiscal.base.wizard.mixin (in l10n_br_fiscal) | l10n_br_fiscal.document.status.wizard | form | New |
HTTP endpoints (0)
No HTTP endpoints found for this module.
Models touched (8)
New fields (1)
-
event_idMany2one → l10n_br_fiscal.eventcomodel_name='l10n_br_fiscal.event'string='Fiscal Event'
No public methods.
New fields (25)
-
authorization_dateDatetimerelated='authorization_event_id.protocol_date'string='Authorization Protocol Date' -
authorization_event_idMany2one → l10n_br_fiscal.eventcomodel_name='l10n_br_fiscal.event'copy=Falsereadonly=Truestring='Authorization Event' -
authorization_file_idMany2one → ir.attachmentcomodel_name='ir.attachment'ondelete='restrict'readonly=Truerelated='authorization_event_id.file_response_id'string='Authorization File XML' -
authorization_protocolCharrelated='authorization_event_id.protocol_number'string='Authorization Protocol Number' -
cancel_dateDatetimerelated='cancel_event_id.protocol_date'string='Cancel Protocol Date' -
cancel_event_idMany2one → l10n_br_fiscal.eventcomodel_name='l10n_br_fiscal.event'copy=Falsestring='Cancel Event' -
cancel_file_idMany2one → ir.attachmentcomodel_name='ir.attachment'ondelete='restrict'readonly=Truerelated='cancel_event_id.file_response_id'string='Cancel File XML' -
cancel_protocol_numberCharrelated='cancel_event_id.protocol_number'string='Cancel Protocol Protocol' -
cancel_reasonChar -
correction_event_idsOne2many → l10n_br_fiscal.eventcomodel_name='l10n_br_fiscal.event'copy=Falsedomain=[('type', '=', '14')]inverse_name='document_id'readonly=Truestring='Correction Events' -
correction_reasonChar -
document_versionChardefault='4.00'readonly=Truestring='Version' -
event_idsOne2many → l10n_br_fiscal.eventcomodel_name='l10n_br_fiscal.event'copy=Falseinverse_name='document_id'readonly=Truestring='Events' -
file_report_idMany2one → ir.attachmentcomodel_name='ir.attachment'copy=Falseondelete='restrict'readonly=Truestring='Document Report' -
invalidate_dateDatetimerelated='invalidate_event_id.protocol_date'string='Invalidate Protocol Date' -
invalidate_event_idMany2one → l10n_br_fiscal.eventcomodel_name='l10n_br_fiscal.event'copy=Falsestring='Invalidate Event' -
invalidate_file_idMany2one → ir.attachmentcomodel_name='ir.attachment'ondelete='restrict'readonly=Truerelated='invalidate_event_id.file_response_id'string='Invalidate File XML' -
invalidate_protocol_numberCharrelated='invalidate_event_id.protocol_number'string='Invalidate Protocol Number' -
is_edoc_printedBooleanreadonly=Truestring='Is Printed?' -
issuerSelectiondefault=DOCUMENT_ISSUER_COMPANYselection=DOCUMENT_ISSUER -
send_file_idMany2one → ir.attachmentcomodel_name='ir.attachment'ondelete='restrict'readonly=Truerelated='authorization_event_id.file_request_id'string='Send Document File XML' -
state_edocSelectionondelete={DOCUMENT_STATE_SENDING: 'set default', DOCUMENT_STATE_AUTHORIZED: 'set default', DOCUMENT_STATE_REJECTED: 'set default', DOCUMENT_STATE_DENIED: 'set default'}selection_add=DOCUMENT_STATES -
status_codeCharcopy=False -
status_descriptionCharcompute='_compute_status_description'copy=False -
status_nameCharcopy=False
-
action_document_back2draft(self)Override base button -
action_document_cancel(self)Override base button -
action_document_confirm(self)Override base button to trigger FSM validation. This method must be idempotent because account.move._post() may call it again for already confirmed documents. - Electronic company-issued docs: draft -> open (action_validate), then optionally send if _direct_draft_send(). - Non-electronic company docs: draft -> authorized (action_authorize), skipping the sending step since there is nothing to transmit. - Partner-issued docs (imported supplier NF-e): draft -> authorized (action_authorize), since they are already authorized externally. All paths go through _before_document_validate (numbering, date, operation comments) to avoid the regression where non-electronic and partner docs were confirmed without numbering. -
action_document_correction(self)Open the correction wizard for authorized company-issued documents. -
action_document_invalidate(self)Open the number invalidation wizard for company-issued documents that are in a state where the number was consumed but the document can still be invalidated (rejected/denied). -
action_document_send(self)Trigger Sending -
get_state_machine_config(self) -
make_pdf(self) -
serialize(self)Serialize the document to a list of EDocs (objects from erpbrasil.edoc). Modules should override _serialize to add their EDocs. -
view_pdf(self) -
view_xml(self)
New fields (0)
No new fields.
Public methods (2)-
do_cancel(self) -
doit(self)
New fields (0)
No new fields.
Public methods (1)-
doit(self)
New fields (25)
-
company_idMany2one → res.companycomodel_name='res.company'index=Truerequired=Truestring='Company' -
create_dateDatetimedefault=fields.Datetime.nowindex=Truereadonly=True -
display_nameCharcompute='_compute_display_name'store=Truestring='name' -
document_idMany2one → l10n_br_fiscal.documentcomodel_name='l10n_br_fiscal.document'index=Truestring='Fiscal Document' -
document_numberCharrequired=True -
document_serie_idMany2one → l10n_br_fiscal.document.seriecomodel_name='l10n_br_fiscal.document.serie'required=True -
document_type_idMany2one → l10n_br_fiscal.document.typecomodel_name='l10n_br_fiscal.document.type'index=Truerequired=Truestring='Fiscal Document Type' -
environmentSelectionselection=EVENT_ENVIRONMENT -
file_pathCharreadonly=True -
file_request_idMany2one → ir.attachmentcomodel_name='ir.attachment'copy=Falsereadonly=Truestring='XML' -
file_response_idMany2one → ir.attachmentcomodel_name='ir.attachment'copy=Falsereadonly=Truestring='XML Response' -
invalidate_number_idMany2one → l10n_br_fiscal.invalidate.numbercomodel_name='l10n_br_fiscal.invalidate.number'index=Truestring='Invalidate Number' -
justificationChar -
lot_receipt_numberCharhelp='In asynchronous processing, a lot receipt number is generated, which is used for later consultation.' -
messageCharreadonly=True -
originCharhelp='Document reference that generated this event.'readonly=Truestring='Source Document' -
partner_idMany2one → res.partnercomodel_name='res.partner'index=Truestring='Partner' -
protocol_dateDatetimeindex=Truereadonly=True -
protocol_numberChar -
responseCharreadonly=Truestring='Response Message' -
sequenceCharhelp='Fiscal Document Event Sequence' -
stateSelectiondefault='draft'index=Truereadonly=Trueselection=[('draft', 'Draft'), ('send', 'Sending'), ('wait', 'Waiting Response'), ('done', 'Response received')]string='Status' -
status_codeCharreadonly=True -
typeSelectionselection=[('-1', 'Exception'), ('0', 'Autorização de Uso'), ('1', 'Consulta Recibo'), ('2', 'Cancelamento'), ('3', 'Inutilização'), ('4', 'Consulta NFE'), ('5', 'Consulta Situação'), ('6', 'Consulta Cadastro'), ('7', 'DPEC Recepção'), ('8', 'DPEC Consulta'), ('9', 'Recepção Evento'), ('10', 'Download'), ('11', 'Consulta Destinadas'), ('12', 'Distribuição DFe'), ('13', 'Manifestação'), ('14', 'Carta de Correção')]string='Service' -
write_dateDatetimeindex=Truereadonly=True
-
create_event_save_xml(self, company_id, environment, event_type, xml_file, document_id=False, invalidate_number_id=False, sequence=False, justification=False) -
print_document_event(self) -
set_done(self, status_code, response, protocol_date, protocol_number, file_response_xml)
New fields (6)
-
authorization_dateDatetimerelated='authorization_event_id.protocol_date'string='Authorization Date' -
authorization_event_idMany2one → l10n_br_fiscal.eventcomodel_name='l10n_br_fiscal.event'copy=Falsereadonly=Truestring='Authorization Event' -
authorization_file_idMany2one → ir.attachmentcomodel_name='ir.attachment'ondelete='restrict'related='authorization_event_id.file_response_id'string='Authorization File XML' -
authorization_protocolCharrelated='authorization_event_id.protocol_number'string='Authorization Protocol' -
event_idsOne2many → l10n_br_fiscal.eventcomodel_name='l10n_br_fiscal.event'inverse_name='invalidate_number_id'readonly=Truestring='Events' -
send_file_idMany2one → ir.attachmentcomodel_name='ir.attachment'ondelete='restrict'related='authorization_event_id.file_request_id'string='Send Document File XML'
No public methods.
New fields (0)
No new fields.
Public methods (2)-
do_invalidate(self) -
doit(self)
New fields (0)
No new fields.
Public methods (0)No public methods.
Loading…
Loading…
Loading…
Loading…
Loading…
- Status
- Open migration PR — not merged yet for this version
- CI status
- checks failing
- Open since
- 4 days ago
- Last activity
- 4 days ago
- Repository
- OCA/l10n-brazil
- Pull request
- [20.0][MIG] l10n_br_fiscal_edi: Migration to 20.0 (#5260)