Initial commit: L10N_Americas packages

This commit is contained in:
Ernad Husremovic 2025-08-29 15:20:52 +02:00
commit 12b27ce151
714 changed files with 79328 additions and 0 deletions

View file

@ -0,0 +1,81 @@
# Brazilian - Accounting
Base module for the Brazilian localization
==========================================
This module consists of:
- Generic Brazilian chart of accounts
- Brazilian taxes such as:
- IPI
- ICMS
- PIS
- COFINS
- ISS
- IR
- IRPJ
- CSLL
The field tax_discount has also been added in the account.tax.template and
account.tax objects to allow the proper computation of some Brazilian VATs
such as ICMS. The chart of account creation wizard has been extended to
propagate those new data properly.
It's important to note however that this module lack many implementations to
use Odoo properly in Brazil. Those implementations (such as the electronic
fiscal Invoicing which is already operational) are brought by more than 15
additional modules of the Brazilian Launchpad localization project
https://launchpad.net/openerp.pt-br-localiz and their dependencies in the
extra addons branch. Those modules aim at not breaking with the remarkable
Odoo modularity, this is why they are numerous but small. One of the
reasons for maintaining those modules apart is that Brazilian Localization
leaders need commit rights agility to complete the localization as companies
fund the remaining legal requirements (such as soon fiscal ledgers,
accounting SPED, fiscal SPED and PAF ECF that are still missing as September
2011). Those modules are also strictly licensed under AGPL V3 and today don't
come with any additional paid permission for online use of 'private modules'.
## Installation
```bash
pip install odoo-bringout-oca-ocb-l10n_br
```
## Dependencies
This addon depends on:
- account
- base_vat
## Manifest Information
- **Name**: Brazilian - Accounting
- **Version**: N/A
- **Category**: Accounting/Localizations/Account Charts
- **License**: LGPL-3
- **Installable**: False
## Source
Based on [OCA/OCB](https://github.com/OCA/OCB) branch 16.0, addon `l10n_br`.
## License
This package maintains the original LGPL-3 license from the upstream Odoo project.
## Documentation
- Overview: doc/OVERVIEW.md
- Architecture: doc/ARCHITECTURE.md
- Models: doc/MODELS.md
- Controllers: doc/CONTROLLERS.md
- Wizards: doc/WIZARDS.md
- Install: doc/INSTALL.md
- Usage: doc/USAGE.md
- Configuration: doc/CONFIGURATION.md
- Dependencies: doc/DEPENDENCIES.md
- Troubleshooting: doc/TROUBLESHOOTING.md
- FAQ: doc/FAQ.md

View file

@ -0,0 +1,32 @@
# Architecture
```mermaid
flowchart TD
U[Users] -->|HTTP| V[Views and QWeb Templates]
V --> C[Controllers]
V --> W[Wizards Transient Models]
C --> M[Models and ORM]
W --> M
M --> R[Reports]
DX[Data XML] --> M
S[Security ACLs and Groups] -. enforces .-> M
subgraph L10n_br Module - l10n_br
direction LR
M:::layer
W:::layer
C:::layer
V:::layer
R:::layer
S:::layer
DX:::layer
end
classDef layer fill:#eef8ff,stroke:#6ea8fe,stroke-width:1px
```
Notes
- Views include tree/form/kanban templates and report templates.
- Controllers provide website/portal routes when present.
- Wizards are UI flows implemented with `models.TransientModel`.
- Data XML loads data/demo records; Security defines groups and access.

View file

@ -0,0 +1,3 @@
# Configuration
Refer to Odoo settings for l10n_br. Configure related models, access rights, and options as needed.

View file

@ -0,0 +1,3 @@
# Controllers
This module does not define custom HTTP controllers.

View file

@ -0,0 +1,6 @@
# Dependencies
This addon depends on:
- [account](../../odoo-bringout-oca-ocb-account)
- [base_vat](../../odoo-bringout-oca-ocb-base_vat)

View file

@ -0,0 +1,4 @@
# FAQ
- Q: Which Odoo version? A: 16.0 (OCA/OCB packaged).
- Q: How to enable? A: Start server with --addon l10n_br or install in UI.

View file

@ -0,0 +1,7 @@
# Install
```bash
pip install odoo-bringout-oca-ocb-l10n_br"
# or
uv pip install odoo-bringout-oca-ocb-l10n_br"
```

View file

@ -0,0 +1,18 @@
# Models
Detected core models and extensions in l10n_br.
```mermaid
classDiagram
class account_chart_template
class account_fiscal_position
class account_fiscal_position_template
class account_tax
class account_tax_template
class res_company
class res_partner
```
Notes
- Classes show model technical names; fields omitted for brevity.
- Items listed under _inherit are extensions of existing models.

View file

@ -0,0 +1,6 @@
# Overview
Packaged Odoo addon: l10n_br. Provides features documented in upstream Odoo 16 under this addon.
- Source: OCA/OCB 16.0, addon l10n_br
- License: LGPL-3

View file

@ -0,0 +1,3 @@
# Reports
This module does not define custom reports.

View file

@ -0,0 +1,8 @@
# Security
This module does not define custom security rules or access controls beyond Odoo defaults.
Default Odoo security applies:
- Base user access through standard groups
- Model access inherited from dependencies
- No custom row-level security rules

View file

@ -0,0 +1,5 @@
# Troubleshooting
- Ensure Python and Odoo environment matches repo guidance.
- Check database connectivity and logs if startup fails.
- Validate that dependent addons listed in DEPENDENCIES.md are installed.

View file

@ -0,0 +1,7 @@
# Usage
Start Odoo including this addon (from repo root):
```bash
python3 scripts/nix_odoo_web_server.py --db-name mydb --addon l10n_br
```

View file

@ -0,0 +1,3 @@
# Wizards
This module does not include UI wizards.

View file

@ -0,0 +1,6 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
# Copyright (C) 2009 Renato Lima - Akretion
from . import models

View file

@ -0,0 +1,66 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
# Copyright (C) 2009 Renato Lima - Akretion
{
'name': 'Brazilian - Accounting',
'category': 'Accounting/Localizations/Account Charts',
'description': """
Base module for the Brazilian localization
==========================================
This module consists of:
- Generic Brazilian chart of accounts
- Brazilian taxes such as:
- IPI
- ICMS
- PIS
- COFINS
- ISS
- IR
- IRPJ
- CSLL
The field tax_discount has also been added in the account.tax.template and
account.tax objects to allow the proper computation of some Brazilian VATs
such as ICMS. The chart of account creation wizard has been extended to
propagate those new data properly.
It's important to note however that this module lack many implementations to
use Odoo properly in Brazil. Those implementations (such as the electronic
fiscal Invoicing which is already operational) are brought by more than 15
additional modules of the Brazilian Launchpad localization project
https://launchpad.net/openerp.pt-br-localiz and their dependencies in the
extra addons branch. Those modules aim at not breaking with the remarkable
Odoo modularity, this is why they are numerous but small. One of the
reasons for maintaining those modules apart is that Brazilian Localization
leaders need commit rights agility to complete the localization as companies
fund the remaining legal requirements (such as soon fiscal ledgers,
accounting SPED, fiscal SPED and PAF ECF that are still missing as September
2011). Those modules are also strictly licensed under AGPL V3 and today don't
come with any additional paid permission for online use of 'private modules'.
""",
'author': 'Akretion, Odoo Brasil',
'depends': ['account', 'base_vat'],
'data': [
'data/l10n_br_chart_data.xml',
'data/account.account.template.csv',
'data/account_chart_template_data.xml',
'data/account_tax_group_data.xml',
'data/account_tax_report_data.xml',
'data/account_tax_template_data.xml',
'data/fiscal_templates_data.xml',
'data/account_fiscal_position_tax_template_data.xml',
'views/account_view.xml',
'views/account_fiscal_position_views.xml',
'views/res_company_views.xml',
'views/res_partner_views.xml',
],
'demo': [
'demo/demo_company.xml',
],
'license': 'LGPL-3',
}

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,30 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="br_3_01_01_05_01_47" model="account.account.template">
<field name="code">3.01.01.05.01.47</field>
<field name="name">Ganho Cambial</field>
<field name="account_type">income_other</field>
<field name="chart_template_id" ref="l10n_br_account_chart_template"/>
</record>
<record id="br_3_11_01_09_01_40" model="account.account.template">
<field name="code">3.11.01.09.01.40</field>
<field name="name">Perda Cambial</field>
<field name="account_type">expense</field>
<field name="chart_template_id" ref="l10n_br_account_chart_template"/>
</record>
<record id="l10n_br_account_chart_template" model="account.chart.template">
<field name="property_account_receivable_id" ref="account_template_101010401"/>
<field name="property_account_payable_id" ref="account_template_201010301"/>
<field name="property_account_expense_categ_id" ref="account_template_30101030101"/>
<field name="property_account_income_categ_id" ref="account_template_30101010105"/>
<field name="property_tax_payable_account_id" ref="account_template_202011003"/>
<field name="property_tax_receivable_account_id" ref="account_template_102010802"/>
<field name="income_currency_exchange_account_id" ref="br_3_01_01_05_01_47"/>
<field name="expense_currency_exchange_account_id" ref="br_3_11_01_09_01_40"/>
<field name="default_pos_receivable_account_id" ref="account_template_101010402"/>
<field name="account_journal_early_pay_discount_loss_account_id" ref="account_template_31101010202"/>
<field name="account_journal_early_pay_discount_gain_account_id" ref="account_template_30101050148"/>
</record>
</odoo>

View file

@ -0,0 +1,107 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<!-- Sales within the same state -->
<record id="account_fiscal_position_same_state_sale1" model="account.fiscal.position.tax.template">
<field name="position_id" ref="fiscal_position_template_1"/>
<field name="tax_src_id" ref="tax_template_out_icms_externo17"/>
<field name="tax_dest_id" ref="tax_template_out_icms_interno17"/>
</record>
<!-- Purchases within the same state -->
<record id="account_fiscal_position_same_state_purchase1" model="account.fiscal.position.tax.template">
<field name="position_id" ref="fiscal_position_template_1"/>
<field name="tax_src_id" ref="tax_template_in_icms_externo17"/>
<field name="tax_dest_id" ref="tax_template_in_icms_interno17"/>
</record>
<!-- Foreign sales -->
<record id="account_fiscal_position_foreign_sale1" model="account.fiscal.position.tax.template">
<field name="position_id" ref="fiscal_position_template_2"/>
<field name="tax_src_id" ref="tax_template_out_icms_interno17"/>
<field name="tax_dest_id" ref="tax_template_out_icms_externo"/>
</record>
<record id="account_fiscal_position_foreign_sale2" model="account.fiscal.position.tax.template">
<field name="position_id" ref="fiscal_position_template_2"/>
<field name="tax_src_id" ref="tax_template_out_icms_externo17"/>
<field name="tax_dest_id" ref="tax_template_out_icms_externo"/>
</record>
<record id="account_fiscal_position_foreign_sale3" model="account.fiscal.position.tax.template">
<field name="position_id" ref="fiscal_position_template_2"/>
<field name="tax_src_id" ref="tax_template_out_ipi10"/>
<field name="tax_dest_id" ref="tax_template_out_ipi"/>
</record>
<!-- Foreign purchases -->
<record id="account_fiscal_position_foreign_purchase1" model="account.fiscal.position.tax.template">
<field name="position_id" ref="fiscal_position_template_2"/>
<field name="tax_src_id" ref="tax_template_in_icms_interno17"/>
<field name="tax_dest_id" ref="tax_template_in_icms_interno"/>
</record>
<record id="account_fiscal_position_foreign_purchase2" model="account.fiscal.position.tax.template">
<field name="position_id" ref="fiscal_position_template_2"/>
<field name="tax_src_id" ref="tax_template_in_icms_externo17"/>
<field name="tax_dest_id" ref="tax_template_in_icms_externo"/>
</record>
<record id="account_fiscal_position_foreign_purchase3" model="account.fiscal.position.tax.template">
<field name="position_id" ref="fiscal_position_template_2"/>
<field name="tax_src_id" ref="tax_template_in_ipi10"/>
<field name="tax_dest_id" ref="tax_template_in_ipi"/>
</record>
<!-- Interstate sales between South/Southeast and North/Northeast/Midwest-->
<record id="account_fiscal_position_interstate_sale1" model="account.fiscal.position.tax.template">
<field name="position_id" ref="fiscal_position_template_ss_nnm"/>
<field name="tax_src_id" ref="tax_template_out_icms_externo17"/>
<field name="tax_dest_id" ref="tax_template_out_icms_externo7"/>
</record>
<record id="account_fiscal_position_interstate_sale2" model="account.fiscal.position.tax.template">
<field name="position_id" ref="fiscal_position_template_ss_nnm"/>
<field name="tax_src_id" ref="tax_template_out_icms_interno17"/>
<field name="tax_dest_id" ref="tax_template_out_icms_externo7"/>
</record>
<!-- Interstate purchases between South/Southeast and North/Northeast/Midwest-->
<record id="account_fiscal_position_interstate_purchase1" model="account.fiscal.position.tax.template">
<field name="position_id" ref="fiscal_position_template_ss_nnm"/>
<field name="tax_src_id" ref="tax_template_in_icms_externo17"/>
<field name="tax_dest_id" ref="tax_template_in_icms_externo7"/>
</record>
<record id="account_fiscal_position_interstate_purchase2" model="account.fiscal.position.tax.template">
<field name="position_id" ref="fiscal_position_template_ss_nnm"/>
<field name="tax_src_id" ref="tax_template_in_icms_interno17"/>
<field name="tax_dest_id" ref="tax_template_in_icms_externo7"/>
</record>
<!-- Interstate sales -->
<record id="account_fiscal_position_interstate_sale3" model="account.fiscal.position.tax.template">
<field name="position_id" ref="fiscal_position_template_interstate"/>
<field name="tax_src_id" ref="tax_template_out_icms_externo17"/>
<field name="tax_dest_id" ref="tax_template_out_icms_externo12"/>
</record>
<record id="account_fiscal_position_interstate_sale4" model="account.fiscal.position.tax.template">
<field name="position_id" ref="fiscal_position_template_interstate"/>
<field name="tax_src_id" ref="tax_template_out_icms_interno17"/>
<field name="tax_dest_id" ref="tax_template_out_icms_externo12"/>
</record>
<!-- Interstate purchases -->
<record id="account_fiscal_position_interstate_purchase3" model="account.fiscal.position.tax.template">
<field name="position_id" ref="fiscal_position_template_interstate"/>
<field name="tax_src_id" ref="tax_template_in_icms_externo17"/>
<field name="tax_dest_id" ref="tax_template_in_icms_externo12"/>
</record>
<record id="account_fiscal_position_interstate_purchase4" model="account.fiscal.position.tax.template">
<field name="position_id" ref="fiscal_position_template_interstate"/>
<field name="tax_src_id" ref="tax_template_in_icms_interno17"/>
<field name="tax_dest_id" ref="tax_template_in_icms_externo12"/>
</record>
</odoo>

View file

@ -0,0 +1,303 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data noupdate="1">
<record id="tax_group_icms_0" model="account.tax.group">
<field name="name">ICMS 0%</field>
<field name="country_id" ref="base.br"/>
</record>
<record id="tax_group_icms_7" model="account.tax.group">
<field name="name">ICMS 7%</field>
<field name="country_id" ref="base.br"/>
</record>
<record id="tax_group_icms_12" model="account.tax.group">
<field name="name">ICMS 12%</field>
<field name="country_id" ref="base.br"/>
</record>
<record id="tax_group_icms_17" model="account.tax.group">
<field name="name">ICMS 17%</field>
<field name="country_id" ref="base.br"/>
</record>
<record id="tax_group_irpj_0" model="account.tax.group">
<field name="name">IRPJ 0%</field>
<field name="country_id" ref="base.br"/>
</record>
<record id="tax_group_pis_0" model="account.tax.group">
<field name="name">PIS 0%</field>
<field name="country_id" ref="base.br"/>
</record>
<record id="tax_group_pis_065" model="account.tax.group">
<field name="name">PIS 0.65%</field>
<field name="country_id" ref="base.br"/>
</record>
<record id="tax_group_cofins_0" model="account.tax.group">
<field name="name">COFINS 0%</field>
<field name="country_id" ref="base.br"/>
</record>
<record id="tax_group_cofins_3" model="account.tax.group">
<field name="name">COFINS 3%</field>
<field name="country_id" ref="base.br"/>
</record>
<record id="tax_group_ir_0" model="account.tax.group">
<field name="name">IR 0%</field>
<field name="country_id" ref="base.br"/>
</record>
<record id="tax_group_issqn_2" model="account.tax.group">
<field name="name">ISSQN 2%</field>
<field name="country_id" ref="base.br"/>
</record>
<record id="tax_group_csll_0" model="account.tax.group">
<field name="name">CSLL 0%</field>
<field name="country_id" ref="base.br"/>
</record>
<record id="tax_group_ipi_0" model="account.tax.group">
<field name="name">IPI 0%</field>
<field name="country_id" ref="base.br"/>
</record>
<record id="tax_group_ipi_10" model="account.tax.group">
<field name="name">IPI 10%</field>
<field name="country_id" ref="base.br"/>
</record>
<record id="tax_group_ii_0" model="account.tax.group">
<field name="name">II</field>
<field name="country_id" ref="base.br"/>
</record>
<record id="tax_group_inss_0" model="account.tax.group">
<field name="name">INSS</field>
<field name="country_id" ref="base.br"/>
</record>
<!-- New goods groups -->
<record id="tax_group_aproxtrib_fed_incl_goods" model="account.tax.group">
<field name="name">Tributação Federal Aproximada Incl.</field>
<field name="country_id" ref="base.br"/>
</record>
<record id="tax_group_aproxtrib_fed_excl_goods" model="account.tax.group">
<field name="name">Tributação Federal Aproximada Excl.</field>
<field name="country_id" ref="base.br"/>
</record>
<record id="tax_group_aproxtrib_state_incl_goods" model="account.tax.group">
<field name="name">Tributação Estadual Aproximada Incl.</field>
<field name="country_id" ref="base.br"/>
</record>
<record id="tax_group_aproxtrib_state_excl_goods" model="account.tax.group">
<field name="name">Tributação Estadual Aproximada Excl.</field>
<field name="country_id" ref="base.br"/>
</record>
<record id="tax_group_cofins_incl_goods" model="account.tax.group">
<field name="name">COFINS Incl.</field>
<field name="country_id" ref="base.br"/>
</record>
<record id="tax_group_cofins_excl_goods" model="account.tax.group">
<field name="name">COFINS Excl.</field>
<field name="country_id" ref="base.br"/>
</record>
<record id="tax_group_cofins_deson_incl_goods" model="account.tax.group">
<field name="name">COFINS Desoneração Incl.</field>
<field name="country_id" ref="base.br"/>
</record>
<record id="tax_group_cofins_deson_excl_goods" model="account.tax.group">
<field name="name">COFINS Desoneração Excl.</field>
<field name="country_id" ref="base.br"/>
</record>
<record id="tax_group_cofins_st_incl_goods" model="account.tax.group">
<field name="name">COFINS ST Incl.</field>
<field name="country_id" ref="base.br"/>
</record>
<record id="tax_group_cofins_st_excl_goods" model="account.tax.group">
<field name="name">COFINS ST Excl.</field>
<field name="country_id" ref="base.br"/>
</record>
<record id="tax_group_icms_incl_goods" model="account.tax.group">
<field name="name">ICMS Incl.</field>
<field name="country_id" ref="base.br"/>
</record>
<record id="tax_group_icms_excl_goods" model="account.tax.group">
<field name="name">ICMS Excl.</field>
<field name="country_id" ref="base.br"/>
</record>
<record id="tax_group_icms_credsn_incl_goods" model="account.tax.group">
<field name="name">ICMS CredSN Incl.</field>
<field name="country_id" ref="base.br"/>
</record>
<record id="tax_group_icms_credsn_excl_goods" model="account.tax.group">
<field name="name">ICMS CredSN Excl.</field>
<field name="country_id" ref="base.br"/>
</record>
<record id="tax_group_icms_deson_incl_goods" model="account.tax.group">
<field name="name">ICMS Desoneração Incl.</field>
<field name="country_id" ref="base.br"/>
</record>
<record id="tax_group_icms_deson_excl_goods" model="account.tax.group">
<field name="name">ICMS Desoneração Excl.</field>
<field name="country_id" ref="base.br"/>
</record>
<record id="tax_group_icms_difa_dest_incl_goods" model="account.tax.group">
<field name="name">ICMS DIFA Destinatário Incl.</field>
<field name="country_id" ref="base.br"/>
</record>
<record id="tax_group_icms_difa_dest_excl_goods" model="account.tax.group">
<field name="name">ICMS DIFA Destinatário Excl.</field>
<field name="country_id" ref="base.br"/>
</record>
<record id="tax_group_icms_difa_fcp_incl_goods" model="account.tax.group">
<field name="name">ICMS DIFA FCP Incl.</field>
<field name="country_id" ref="base.br"/>
</record>
<record id="tax_group_icms_difa_fcp_excl_goods" model="account.tax.group">
<field name="name">ICMS DIFA FCP Excl.</field>
<field name="country_id" ref="base.br"/>
</record>
<record id="tax_group_icms_difa_remet_incl_goods" model="account.tax.group">
<field name="name">ICMS DIFA Remetente Incl.</field>
<field name="country_id" ref="base.br"/>
</record>
<record id="tax_group_icms_difa_remet_excl_goods" model="account.tax.group">
<field name="name">ICMS DIFA Remetente Excl.</field>
<field name="country_id" ref="base.br"/>
</record>
<record id="tax_group_icms_eff_incl_goods" model="account.tax.group">
<field name="name">ICMS EFF Incl.</field>
<field name="country_id" ref="base.br"/>
</record>
<record id="tax_group_icms_eff_excl_goods" model="account.tax.group">
<field name="name">ICMS EFF Excl.</field>
<field name="country_id" ref="base.br"/>
</record>
<record id="tax_group_icms_fcp_incl_goods" model="account.tax.group">
<field name="name">ICMS FCP Incl.</field>
<field name="country_id" ref="base.br"/>
</record>
<record id="tax_group_icms_fcp_excl_goods" model="account.tax.group">
<field name="name">ICMS FCP Excl.</field>
<field name="country_id" ref="base.br"/>
</record>
<record id="tax_group_icms_own_payer_incl_goods" model="account.tax.group">
<field name="name">ICMS Próprio Emitente Incl.</field>
<field name="country_id" ref="base.br"/>
</record>
<record id="tax_group_icms_own_payer_excl_goods" model="account.tax.group">
<field name="name">ICMS Próprio Emitente Excl.</field>
<field name="country_id" ref="base.br"/>
</record>
<record id="tax_group_icms_part_incl_goods" model="account.tax.group">
<field name="name">ICMS Partilha Incl.</field>
<field name="country_id" ref="base.br"/>
</record>
<record id="tax_group_icms_part_excl_goods" model="account.tax.group">
<field name="name">ICMS Partilha Excl.</field>
<field name="country_id" ref="base.br"/>
</record>
<record id="tax_group_icms_rf_incl_goods" model="account.tax.group">
<field name="name">ICMS RF Incl.</field>
<field name="country_id" ref="base.br"/>
</record>
<record id="tax_group_icms_rf_excl_goods" model="account.tax.group">
<field name="name">ICMS RF Excl.</field>
<field name="country_id" ref="base.br"/>
</record>
<record id="tax_group_icms_st_incl_goods" model="account.tax.group">
<field name="name">ICMS ST Incl.</field>
<field name="country_id" ref="base.br"/>
</record>
<record id="tax_group_icms_st_excl_goods" model="account.tax.group">
<field name="name">ICMS ST Excl.</field>
<field name="country_id" ref="base.br"/>
</record>
<record id="tax_group_icms_st_fcp_incl_goods" model="account.tax.group">
<field name="name">ICMS ST FCP Incl.</field>
<field name="country_id" ref="base.br"/>
</record>
<record id="tax_group_icms_st_fcp_excl_goods" model="account.tax.group">
<field name="name">ICMS ST FCP Excl.</field>
<field name="country_id" ref="base.br"/>
</record>
<record id="tax_group_icms_st_fcppart_incl_goods" model="account.tax.group">
<field name="name">ICMS ST FCP Partilha Incl.</field>
<field name="country_id" ref="base.br"/>
</record>
<record id="tax_group_icms_st_fcppart_excl_goods" model="account.tax.group">
<field name="name">ICMS ST FCP Partilha Excl.</field>
<field name="country_id" ref="base.br"/>
</record>
<record id="tax_group_icms_st_part_incl_goods" model="account.tax.group">
<field name="name">ICMS ST Partilha Incl.</field>
<field name="country_id" ref="base.br"/>
</record>
<record id="tax_group_icms_st_part_excl_goods" model="account.tax.group">
<field name="name">ICMS ST Partilha Excl.</field>
<field name="country_id" ref="base.br"/>
</record>
<record id="tax_group_icms_st_sd_incl_goods" model="account.tax.group">
<field name="name">ICMS ST SD Incl.</field>
<field name="country_id" ref="base.br"/>
</record>
<record id="tax_group_icms_st_sd_excl_goods" model="account.tax.group">
<field name="name">ICMS ST SD Excl.</field>
<field name="country_id" ref="base.br"/>
</record>
<record id="tax_group_icms_st_sd_fcp_incl_goods" model="account.tax.group">
<field name="name">ICMS ST SD FCP Incl.</field>
<field name="country_id" ref="base.br"/>
</record>
<record id="tax_group_icms_st_sd_fcp_excl_goods" model="account.tax.group">
<field name="name">ICMS ST SD FCP Excl.</field>
<field name="country_id" ref="base.br"/>
</record>
<record id="tax_group_ii_incl_goods" model="account.tax.group">
<field name="name">II - Imposto de Importação Incl.</field>
<field name="country_id" ref="base.br"/>
</record>
<record id="tax_group_ii_excl_goods" model="account.tax.group">
<field name="name">II - Imposto de Importação Excl.</field>
<field name="country_id" ref="base.br"/>
</record>
<record id="tax_group_iof_incl_goods" model="account.tax.group">
<field name="name">IOF - Imposto sobre Operações Financeiras Incl.</field>
<field name="country_id" ref="base.br"/>
</record>
<record id="tax_group_iof_excl_goods" model="account.tax.group">
<field name="name">IOF - Imposto sobre Operações Financeiras Excl.</field>
<field name="country_id" ref="base.br"/>
</record>
<record id="tax_group_ipi_incl_goods" model="account.tax.group">
<field name="name">IPI Incl.</field>
<field name="country_id" ref="base.br"/>
</record>
<record id="tax_group_ipi_excl_goods" model="account.tax.group">
<field name="name">IPI Excl.</field>
<field name="country_id" ref="base.br"/>
</record>
<record id="tax_group_ipi_returned_incl_goods" model="account.tax.group">
<field name="name">IPI Retornado Incl.</field>
<field name="country_id" ref="base.br"/>
</record>
<record id="tax_group_ipi_returned_excl_goods" model="account.tax.group">
<field name="name">IPI Retornado Excl.</field>
<field name="country_id" ref="base.br"/>
</record>
<record id="tax_group_pis_incl_goods" model="account.tax.group">
<field name="name">PIS Incl.</field>
<field name="country_id" ref="base.br"/>
</record>
<record id="tax_group_pis_excl_goods" model="account.tax.group">
<field name="name">PIS Excl.</field>
<field name="country_id" ref="base.br"/>
</record>
<record id="tax_group_pis_deson_incl_goods" model="account.tax.group">
<field name="name">PIS Desoneração Incl.</field>
<field name="country_id" ref="base.br"/>
</record>
<record id="tax_group_pis_deson_excl_goods" model="account.tax.group">
<field name="name">PIS Desoneração Excl.</field>
<field name="country_id" ref="base.br"/>
</record>
<record id="tax_group_pis_st_incl_goods" model="account.tax.group">
<field name="name">PIS ST Incl.</field>
<field name="country_id" ref="base.br"/>
</record>
<record id="tax_group_pis_st_excl_goods" model="account.tax.group">
<field name="name">PIS ST Excl.</field>
<field name="country_id" ref="base.br"/>
</record>
</data>
</odoo>

View file

@ -0,0 +1,369 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="tax_report" model="account.report">
<field name="name">Tax Report</field>
<field name="root_report_id" ref="account.generic_tax_report"/>
<field name="country_id" ref="base.br"/>
<field name="filter_fiscal_position" eval="True"/>
<field name="availability_condition">country</field>
<field name="column_ids">
<record id="tax_report_balance" model="account.report.column">
<field name="name">Balance</field>
<field name="expression_label">balance</field>
</record>
</field>
<field name="line_ids">
<record id="tax_report_icms" model="account.report.line">
<field name="name">ICMS</field>
<field name="aggregation_formula">TRIBUTADA_INTEGRALMENTE.balance + TRIBUTADA_E_COM_COBRANCA_DO_ICMS_POR_SUBSTITUICAO_TRIBUTARIA.balance</field>
<field name="children_ids">
<record id="tax_report_icms_tributada" model="account.report.line">
<field name="name">Tributada integralmente</field>
<field name="code">TRIBUTADA_INTEGRALMENTE</field>
<field name="aggregation_formula">ICMS_1.balance</field>
<field name="children_ids">
<record id="tax_report_icms_1" model="account.report.line">
<field name="name">ICMS base</field>
<field name="code">ICMS_1</field>
<field name="expression_ids">
<record id="tax_report_icms_1_tag" model="account.report.expression">
<field name="label">balance</field>
<field name="engine">tax_tags</field>
<field name="formula">ICMS_1</field>
</record>
</field>
</record>
</field>
</record>
<record id="tax_report_icms_tributada_com" model="account.report.line">
<field name="name">Tributada e com cobrança do ICMS por substituição tributária</field>
<field name="code">TRIBUTADA_E_COM_COBRANCA_DO_ICMS_POR_SUBSTITUICAO_TRIBUTARIA</field>
<field name="aggregation_formula">ICMS_2.balance</field>
<field name="children_ids">
<record id="tax_report_icms_2" model="account.report.line">
<field name="name">ICMS tax</field>
<field name="code">ICMS_2</field>
<field name="expression_ids">
<record id="tax_report_icms_2_tag" model="account.report.expression">
<field name="label">balance</field>
<field name="engine">tax_tags</field>
<field name="formula">ICMS_2</field>
</record>
</field>
</record>
</field>
</record>
</field>
</record>
<record id="tax_report_icmsst" model="account.report.line">
<field name="name">ICMS Subist</field>
<field name="aggregation_formula">ICMSST_1.balance + ICMSST_2.balance</field>
<field name="children_ids">
<record id="tax_report_icmsst_1" model="account.report.line">
<field name="name">ICMSST base</field>
<field name="code">ICMSST_1</field>
<field name="expression_ids">
<record id="tax_report_icmsst_1_tag" model="account.report.expression">
<field name="label">balance</field>
<field name="engine">tax_tags</field>
<field name="formula">ICMSST_1</field>
</record>
</field>
</record>
<record id="tax_report_icmsst_2" model="account.report.line">
<field name="name">ICMSST tax</field>
<field name="code">ICMSST_2</field>
<field name="expression_ids">
<record id="tax_report_icmsst_2_tag" model="account.report.expression">
<field name="label">balance</field>
<field name="engine">tax_tags</field>
<field name="formula">ICMSST_2</field>
</record>
</field>
</record>
</field>
</record>
<record id="tax_report_irpj" model="account.report.line">
<field name="name">IRPJ</field>
<field name="aggregation_formula">IRPJ_1.balance + IRPJ_2.balance</field>
<field name="children_ids">
<record id="tax_report_irpj_1" model="account.report.line">
<field name="name">IRPJ base</field>
<field name="code">IRPJ_1</field>
<field name="expression_ids">
<record id="tax_report_irpj_1_tag" model="account.report.expression">
<field name="label">balance</field>
<field name="engine">tax_tags</field>
<field name="formula">IRPJ_1</field>
</record>
</field>
</record>
<record id="tax_report_irpj_2" model="account.report.line">
<field name="name">IRPJ tax</field>
<field name="code">IRPJ_2</field>
<field name="expression_ids">
<record id="tax_report_irpj_2_tag" model="account.report.expression">
<field name="label">balance</field>
<field name="engine">tax_tags</field>
<field name="formula">IRPJ_2</field>
</record>
</field>
</record>
</field>
</record>
<record id="tax_report_ir" model="account.report.line">
<field name="name">IR</field>
<field name="aggregation_formula">IR_1.balance + IR_2.balance</field>
<field name="children_ids">
<record id="tax_report_ir_1" model="account.report.line">
<field name="name">IR base</field>
<field name="code">IR_1</field>
<field name="expression_ids">
<record id="tax_report_ir_1_tag" model="account.report.expression">
<field name="label">balance</field>
<field name="engine">tax_tags</field>
<field name="formula">IR_1</field>
</record>
</field>
</record>
<record id="tax_report_ir_2" model="account.report.line">
<field name="name">IR tax</field>
<field name="code">IR_2</field>
<field name="expression_ids">
<record id="tax_report_ir_2_tag" model="account.report.expression">
<field name="label">balance</field>
<field name="engine">tax_tags</field>
<field name="formula">IR_2</field>
</record>
</field>
</record>
</field>
</record>
<record id="tax_report_issqn" model="account.report.line">
<field name="name">ISSQN</field>
<field name="aggregation_formula">ISSQN_1.balance + ISSQN_2.balance</field>
<field name="children_ids">
<record id="tax_report_issqn_1" model="account.report.line">
<field name="name">ISSQN base</field>
<field name="code">ISSQN_1</field>
<field name="expression_ids">
<record id="tax_report_issqn_1_tag" model="account.report.expression">
<field name="label">balance</field>
<field name="engine">tax_tags</field>
<field name="formula">ISSQN_1</field>
</record>
</field>
</record>
<record id="tax_report_issqn_2" model="account.report.line">
<field name="name">ISSQN tax</field>
<field name="code">ISSQN_2</field>
<field name="expression_ids">
<record id="tax_report_issqn_2_tag" model="account.report.expression">
<field name="label">balance</field>
<field name="engine">tax_tags</field>
<field name="formula">ISSQN_2</field>
</record>
</field>
</record>
</field>
</record>
<record id="tax_report_csll" model="account.report.line">
<field name="name">CSLL</field>
<field name="aggregation_formula">CSLL_1.balance + CSLL_2.balance</field>
<field name="children_ids">
<record id="tax_report_csll_1" model="account.report.line">
<field name="name">CSLL base</field>
<field name="code">CSLL_1</field>
<field name="expression_ids">
<record id="tax_report_csll_1_tag" model="account.report.expression">
<field name="label">balance</field>
<field name="engine">tax_tags</field>
<field name="formula">CSLL_1</field>
</record>
</field>
</record>
<record id="tax_report_csll_2" model="account.report.line">
<field name="name">CSLL tax</field>
<field name="code">CSLL_2</field>
<field name="expression_ids">
<record id="tax_report_csll_2_tag" model="account.report.expression">
<field name="label">balance</field>
<field name="engine">tax_tags</field>
<field name="formula">CSLL_2</field>
</record>
</field>
</record>
</field>
</record>
<record id="tax_report_cofins" model="account.report.line">
<field name="name">COFINS</field>
<field name="aggregation_formula">COFINS_OPERACAO_TRIBUTAVEL_COM_ALIQUOTA_BASICA.balance</field>
<field name="children_ids">
<record id="tax_report_cofins_oper_bas" model="account.report.line">
<field name="name">Operação Tributável com Alíquota Básica</field>
<field name="code">COFINS_OPERACAO_TRIBUTAVEL_COM_ALIQUOTA_BASICA</field>
<field name="aggregation_formula">COFINS_1.balance + COFINS_2.balance</field>
<field name="children_ids">
<record id="tax_report_cofins_1" model="account.report.line">
<field name="name">COFINS base</field>
<field name="code">COFINS_1</field>
<field name="expression_ids">
<record id="tax_report_cofins_1_tag" model="account.report.expression">
<field name="label">balance</field>
<field name="engine">tax_tags</field>
<field name="formula">COFINS_1</field>
</record>
</field>
</record>
<record id="tax_report_cofins_2" model="account.report.line">
<field name="name">COFINS tax</field>
<field name="code">COFINS_2</field>
<field name="expression_ids">
<record id="tax_report_cofins_2_tag" model="account.report.expression">
<field name="label">balance</field>
<field name="engine">tax_tags</field>
<field name="formula">COFINS_2</field>
</record>
</field>
</record>
</field>
</record>
</field>
</record>
<record id="tax_report_pis" model="account.report.line">
<field name="name">PIS</field>
<field name="aggregation_formula">PIS_OPERACAO_TRIBUTAVEL_COM_ALIQUOTA_BASICA.balance</field>
<field name="children_ids">
<record id="tax_report_pis_oper_tri_basica" model="account.report.line">
<field name="name">Operação Tributável com Alíquota Básica</field>
<field name="code">PIS_OPERACAO_TRIBUTAVEL_COM_ALIQUOTA_BASICA</field>
<field name="aggregation_formula">PIS_1.balance + PIS_2.balance</field>
<field name="children_ids">
<record id="tax_report_pis_1" model="account.report.line">
<field name="name">PIS base</field>
<field name="code">PIS_1</field>
<field name="expression_ids">
<record id="tax_report_pis_1_tag" model="account.report.expression">
<field name="label">balance</field>
<field name="engine">tax_tags</field>
<field name="formula">PIS_1</field>
</record>
</field>
</record>
<record id="tax_report_pis_2" model="account.report.line">
<field name="name">PIS tax</field>
<field name="code">PIS_2</field>
<field name="expression_ids">
<record id="tax_report_pis_2_tag" model="account.report.expression">
<field name="label">balance</field>
<field name="engine">tax_tags</field>
<field name="formula">PIS_2</field>
</record>
</field>
</record>
</field>
</record>
</field>
</record>
<record id="tax_report_ipi" model="account.report.line">
<field name="name">IPI</field>
<field name="code">BRTAX07</field>
<field name="aggregation_formula">ENTRADA_COM_RECUPERACAO_DE_CREDITO.balance + ENTRADA_TRIBUTADA_COM_ALIQUOTA_ZERO.balance</field>
<field name="children_ids">
<record id="tax_report_ipi_extrada_com" model="account.report.line">
<field name="name">Entrada com recuperação de crédito</field>
<field name="code">ENTRADA_COM_RECUPERACAO_DE_CREDITO</field>
<field name="aggregation_formula">BRTAX07_1.balance</field>
<field name="children_ids">
<record id="tax_report_ipi_1" model="account.report.line">
<field name="name">IPI base</field>
<field name="code">BRTAX07_1</field>
<field name="expression_ids">
<record id="tax_report_ipi_1_tag" model="account.report.expression">
<field name="label">balance</field>
<field name="engine">tax_tags</field>
<field name="formula">IPI_1</field>
</record>
</field>
</record>
</field>
</record>
<record id="tax_report_ipi_extrada_tributada" model="account.report.line">
<field name="name">Entrada tributada com alíquota zero</field>
<field name="code">ENTRADA_TRIBUTADA_COM_ALIQUOTA_ZERO</field>
<field name="aggregation_formula">IPI_2.balance</field>
<field name="children_ids">
<record id="tax_report_ipi_2" model="account.report.line">
<field name="name">IPI tax</field>
<field name="code">IPI_2</field>
<field name="expression_ids">
<record id="tax_report_ipi_2_tag" model="account.report.expression">
<field name="label">balance</field>
<field name="engine">tax_tags</field>
<field name="formula">IPI_2</field>
</record>
</field>
</record>
</field>
</record>
</field>
</record>
<record id="tax_report_ii" model="account.report.line">
<field name="name">II</field>
<field name="aggregation_formula">II_1.balance + II_2.balance</field>
<field name="children_ids">
<record id="tax_report_ii_1" model="account.report.line">
<field name="name">II base</field>
<field name="code">II_1</field>
<field name="expression_ids">
<record id="tax_report_ii_1_tag" model="account.report.expression">
<field name="label">balance</field>
<field name="engine">tax_tags</field>
<field name="formula">II_1</field>
</record>
</field>
</record>
<record id="tax_report_ii_2" model="account.report.line">
<field name="name">II tax</field>
<field name="code">II_2</field>
<field name="expression_ids">
<record id="tax_report_ii_2_tag" model="account.report.expression">
<field name="label">balance</field>
<field name="engine">tax_tags</field>
<field name="formula">II_2</field>
</record>
</field>
</record>
</field>
</record>
<record id="tax_report_inss" model="account.report.line">
<field name="name">INSS</field>
<field name="aggregation_formula">INSS_1.balance + INSS_2.balance</field>
<field name="children_ids">
<record id="tax_report_inss_1" model="account.report.line">
<field name="name">INSS base</field>
<field name="code">INSS_1</field>
<field name="expression_ids">
<record id="tax_report_inss_1_tag" model="account.report.expression">
<field name="label">balance</field>
<field name="engine">tax_tags</field>
<field name="formula">INSS_1</field>
</record>
</field>
</record>
<record id="tax_report_inss_2" model="account.report.line">
<field name="name">INSS tax</field>
<field name="code">INSS_2</field>
<field name="expression_ids">
<record id="tax_report_inss_2_tag" model="account.report.expression">
<field name="label">balance</field>
<field name="engine">tax_tags</field>
<field name="formula">INSS_2</field>
</record>
</field>
</record>
</field>
</record>
</field>
</record>
</odoo>

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,55 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<!-- Fiscal Position Templates -->
<record id="fiscal_position_template_1" model="account.fiscal.position.template">
<field name="sequence">1</field>
<field name="name">Internal (within one state)</field>
<field name="chart_template_id" ref="l10n_br_account_chart_template"/>
<field name="auto_apply" eval="True"/>
<field name="vat_required" eval="True"/>
<field name="country_id" ref="base.br"/>
<field name="l10n_br_fp_type">internal</field>
</record>
<record id="fiscal_position_template_2" model="account.fiscal.position.template">
<field name="sequence">2</field>
<field name="name">Foreign</field>
<field name="chart_template_id" ref="l10n_br_account_chart_template"/>
<field name="auto_apply" eval="True"/>
</record>
<!-- South and Southeast company delivering to North, Northeast, and Midwest -->
<record id="fiscal_position_template_ss_nnm" model="account.fiscal.position.template">
<field name="sequence">3</field>
<field name="name">South and Southeast to North, Northeast, and Midwest</field>
<field name="chart_template_id" ref="l10n_br_account_chart_template"/>
<field name="auto_apply" eval="True"/>
<field name="vat_required" eval="True"/>
<field name="country_id" ref="base.br"/>
<field name="l10n_br_fp_type">ss_nnm</field>
</record>
<!-- Other interstate transactions -->
<record id="fiscal_position_template_interstate" model="account.fiscal.position.template">
<field name="sequence">4</field>
<field name="name">Interstate</field>
<field name="chart_template_id" ref="l10n_br_account_chart_template"/>
<field name="auto_apply" eval="True"/>
<field name="vat_required" eval="True"/>
<field name="country_id" ref="base.br"/>
<field name="l10n_br_fp_type">interstate</field>
</record>
<!-- Fiscal Position Account Templates -->
<record id="fiscal_position_account_template_2" model="account.fiscal.position.account.template">
<field name="position_id" ref="fiscal_position_template_2" />
<field name="account_src_id" ref="l10n_br.account_template_30101010105" />
<field name="account_dest_id" ref="l10n_br.account_template_30101010101" />
</record>
<record id="fiscal_position_account_template_3" model="account.fiscal.position.account.template">
<field name="position_id" ref="fiscal_position_template_2" />
<field name="account_src_id" ref="l10n_br.account_template_30101010106" />
<field name="account_dest_id" ref="l10n_br.account_template_30101010103" />
</record>
</odoo>

View file

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="l10n_br_account_chart_template" model="account.chart.template">
<field name="name">Plano de Contas Brasileiro</field>
<field name="code_digits">6</field>
<field name="bank_account_code_prefix">1.01.01.02.00</field>
<field name="cash_account_code_prefix">1.01.01.01.00</field>
<field name="transfer_account_code_prefix">1.01.01.12.00</field>
<field name="currency_id" ref="base.BRL"/>
<field name="country_id" ref="base.br"/>
</record>
</odoo>

View file

@ -0,0 +1,34 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="partner_demo_company_br" model="res.partner">
<field name="name">BR Company</field>
<field name="vat">51494569013170</field>
<field name="street">Praça Mauá 1</field>
<field name="city">Rio de Janeiro</field>
<field name="country_id" ref="base.br"/>
<field name="state_id" ref="base.state_br_rj"/>
<field name="zip">20081-240</field>
<field name="phone">+55 11 96123-4567</field>
<field name="email">info@company.brexample.com</field>
<field name="website">www.brexample.com</field>
</record>
<record id="demo_company_br" model="res.company">
<field name="name">BR Company</field>
<field name="partner_id" ref="partner_demo_company_br"/>
</record>
<function model="res.company" name="_onchange_country_id">
<value eval="[ref('demo_company_br')]"/>
</function>
<function model="res.users" name="write">
<value eval="[ref('base.user_root'), ref('base.user_admin'), ref('base.user_demo')]"/>
<value eval="{'company_ids': [(4, ref('l10n_br.demo_company_br'))]}"/>
</function>
<function model="account.chart.template" name="try_loading">
<value eval="[ref('l10n_br.l10n_br_account_chart_template')]"/>
<value model="res.company" eval="obj().env.ref('l10n_br.demo_company_br')"/>
</function>
</odoo>

View file

@ -0,0 +1,11 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
# Copyright (C) 2009 Renato Lima - Akretion
from . import account
from . import account_fiscal_position_template
from . import account_fiscal_position
from . import account_chart_template
from . import res_company
from . import res_partner

View file

@ -0,0 +1,28 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from odoo import fields, models
class AccountTaxTemplate(models.Model):
""" Add fields used to define some brazilian taxes """
_inherit = 'account.tax.template'
tax_discount = fields.Boolean(string='Discount this Tax in Prince',
help="Mark it for (ICMS, PIS e etc.).")
base_reduction = fields.Float(string='Redution', digits=0, required=True,
help="Um percentual decimal em % entre 0-1.", default=0)
amount_mva = fields.Float(string='MVA Percent', digits=0, required=True,
help="Um percentual decimal em % entre 0-1.", default=0)
class AccountTax(models.Model):
""" Add fields used to define some brazilian taxes """
_inherit = 'account.tax'
tax_discount = fields.Boolean(string='Discount this Tax in Prince',
help="Mark it for (ICMS, PIS e etc.).")
base_reduction = fields.Float(string='Redution', digits=0, required=True,
help="Um percentual decimal em % entre 0-1.", default=0)
amount_mva = fields.Float(string='MVA Percent', digits=0, required=True,
help="Um percentual decimal em % entre 0-1.", default=0)

View file

@ -0,0 +1,13 @@
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from odoo import models
class AccountChartTemplate(models.Model):
_inherit = 'account.chart.template'
def _get_fp_vals(self, company, position):
res = super()._get_fp_vals(company, position)
if company.country_id.code == 'BR':
res['l10n_br_fp_type'] = position['l10n_br_fp_type']
return res

View file

@ -0,0 +1,42 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from odoo import api, fields, models
SOUTH_SOUTHEAST = {"PR", "RS", "SC", "SP", "ES", "MG", "RJ"}
NORTH_NORTHEAST_MIDWEST = {
"AC", "AP", "AM", "PA", "RO", "RR", "TO", "AL", "BA", "CE",
"MA", "PB", "PE", "PI", "RN", "SE", "DF", "GO", "MT", "MS"
}
class AccountFiscalPosition(models.Model):
_inherit = 'account.fiscal.position'
l10n_br_fp_type = fields.Selection(
selection=[
('internal', 'Internal'),
('ss_nnm', 'South/Southeast selling to North/Northeast/Midwest'),
('interstate', 'Other interstate'),
],
string='Interstate Fiscal Position Type',
)
@api.model
def _get_fiscal_position(self, partner, delivery=None):
if not delivery:
delivery = partner
if self.env.company.country_id.code != "BR" or delivery.country_id.code != 'BR':
return super()._get_fiscal_position(partner, delivery=delivery)
# manually set fiscal position on partner has a higher priority
manual_fiscal_position = delivery.property_account_position_id or partner.property_account_position_id
if manual_fiscal_position:
return manual_fiscal_position
# Taxation in Brazil depends on both the state of the partner and the state of the company
if self.env.company.state_id == delivery.state_id:
return self.search([('l10n_br_fp_type', '=', 'internal'), ('company_id', '=', self.env.company.id)], limit=1)
if self.env.company.state_id.code in SOUTH_SOUTHEAST and delivery.state_id.code in NORTH_NORTHEAST_MIDWEST:
return self.search([('l10n_br_fp_type', '=', 'ss_nnm'), ('company_id', '=', self.env.company.id)], limit=1)
return self.search([('l10n_br_fp_type', '=', 'interstate'), ('company_id', '=', self.env.company.id)], limit=1)

View file

@ -0,0 +1,16 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from odoo import fields, models
class AccountFiscalPositionTemplate(models.Model):
_inherit = 'account.fiscal.position.template'
l10n_br_fp_type = fields.Selection(
selection=[
('internal', 'Internal'),
('ss_nnm', 'South/Southeast selling to North/Northeast/Midwest'),
('interstate', 'Other interstate'),
],
string='Interstate Fiscal Position Type',
)

View file

@ -0,0 +1,14 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from odoo import fields, models
class ResCompany(models.Model):
_inherit = "res.company"
# ==== Business fields ====
l10n_br_cpf_code = fields.Char(string="CPF", help="Natural Persons Register.")
l10n_br_ie_code = fields.Char(string="IE", help="State Tax Identification Number. Should contain 9-14 digits.") # each state has its own format. Not all of the validation rules can be easily found.
l10n_br_im_code = fields.Char(string="IM", help="Municipal Tax Identification Number") # each municipality has its own format. There is no information about validation anywhere.
l10n_br_nire_code = fields.Char(string="NIRE", help="State Commercial Identification Number. Should contain 11 digits.")

View file

@ -0,0 +1,15 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from odoo import _, api, fields, models
from odoo.exceptions import ValidationError
import re
class ResPartner(models.Model):
_inherit = 'res.partner'
l10n_br_cpf_code = fields.Char(string="CPF", help="Natural Persons Register.")
l10n_br_ie_code = fields.Char(string="IE", help="State Tax Identification Number. Should contain 9-14 digits.")
l10n_br_im_code = fields.Char(string="IM", help="Municipal Tax Identification Number")
l10n_br_isuf_code = fields.Char(string="SUFRAMA code", help="SUFRAMA registration number.")

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 155 KiB

View file

@ -0,0 +1,15 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="view_account_position_form" model="ir.ui.view">
<field name="name">account.fiscal.position.form</field>
<field name="model">account.fiscal.position</field>
<field name="inherit_id" ref="account.view_account_position_form"/>
<field name="arch" type="xml">
<field name="auto_apply" position="after">
<field name="l10n_br_fp_type" options="{'no_open': True, 'no_create': True}" attrs="{'invisible': [('country_id', '!=', %(base.br)d)]}"/>
</field>
</field>
</record>
</odoo>

View file

@ -0,0 +1,33 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<!-- Include fields created in account.tax and account.tax.template form views -->
<record model="ir.ui.view" id="view_l10n_br_account_tax_template_form">
<field name="name">l10n_br_account.tax.template.form</field>
<field name="model">account.tax.template</field>
<field name="inherit_id" ref="account.view_account_tax_template_form"/>
<field name="arch" type="xml">
<field position="after" name="price_include">
<field name="tax_discount"/>
</field>
<field position="after" name="tax_discount">
<field name="base_reduction" widget="monetary"/>
<field name="amount_mva" widget="monetary"/>
</field>
</field>
</record>
<record model="ir.ui.view" id="view_l10n_br_account_tax_form">
<field name="name">l10n_br_account.tax.form</field>
<field name="model">account.tax</field>
<field name="inherit_id" ref="account.view_tax_form"/>
<field name="arch" type="xml">
<field position="after" name="price_include">
<field name="tax_discount" attrs="{'invisible': [('country_code', '!=', 'BR')]}"/>
</field>
<field position="after" name="tax_discount">
<field name="base_reduction" widget="monetary" attrs="{'invisible': [('country_code', '!=', 'BR')]}"/>
<field name="amount_mva" widget="monetary" attrs="{'invisible': [('country_code', '!=', 'BR')]}"/>
</field>
</field>
</record>
</odoo>

View file

@ -0,0 +1,16 @@
<?xml version="1.0" encoding="UTF-8"?>
<odoo>
<record id="view_company_form" model="ir.ui.view">
<field name="name">res.company.form</field>
<field name="model">res.company</field>
<field name="inherit_id" ref="base.view_company_form"/>
<field name="arch" type="xml">
<xpath expr="//field[@name='vat']" position="after">
<field name="l10n_br_cpf_code" attrs="{'invisible': [('country_id', '!=', %(base.br)d)]}"/>
<field name="l10n_br_ie_code" attrs="{'invisible': [('country_id', '!=', %(base.br)d)]}"/>
<field name="l10n_br_im_code" attrs="{'invisible': [('country_id', '!=', %(base.br)d)]}"/>
<field name="l10n_br_nire_code" attrs="{'invisible': [('country_id', '!=', %(base.br)d)]}"/>
</xpath>
</field>
</record>
</odoo>

View file

@ -0,0 +1,18 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data>
<record id="br_partner_tax_fields_form" model="ir.ui.view">
<field name="name">res.partner.form</field>
<field name="model">res.partner</field>
<field name="inherit_id" ref="base.view_partner_form"/>
<field name="arch" type="xml">
<xpath expr="//field[@name='vat']" position="after">
<field name="l10n_br_cpf_code" attrs="{'invisible': [('country_id', '!=', %(base.br)d)]}"/>
<field name="l10n_br_ie_code" attrs="{'invisible': [('country_id', '!=', %(base.br)d)]}"/>
<field name="l10n_br_im_code" attrs="{'invisible': [('country_id', '!=', %(base.br)d)]}"/>
<field name="l10n_br_isuf_code" attrs="{'invisible': [('country_id', '!=', %(base.br)d)]}"/>
</xpath>
</field>
</record>
</data>
</odoo>

View file

@ -0,0 +1,43 @@
[project]
name = "odoo-bringout-oca-ocb-l10n_br"
version = "16.0.0"
description = "Brazilian - Accounting - Odoo addon"
authors = [
{ name = "Ernad Husremovic", email = "hernad@bring.out.ba" }
]
dependencies = [
"odoo-bringout-oca-ocb-account>=16.0.0",
"odoo-bringout-oca-ocb-base_vat>=16.0.0",
"requests>=2.25.1"
]
readme = "README.md"
requires-python = ">= 3.11"
classifiers = [
"Development Status :: 5 - Production/Stable",
"Intended Audience :: Developers",
"License :: OSI Approved :: GNU Lesser General Public License v3 (LGPLv3)",
"Programming Language :: Python :: 3",
"Programming Language :: Python :: 3.11",
"Programming Language :: Python :: 3.12",
"Topic :: Office/Business",
]
[project.urls]
homepage = "https://github.com/bringout/0"
repository = "https://github.com/bringout/0"
[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"
[tool.hatch.metadata]
allow-direct-references = true
[tool.hatch.build.targets.wheel]
packages = ["l10n_br"]
[tool.rye]
managed = true
dev-dependencies = [
"pytest>=8.4.1",
]