odoo-addon-l10n-br-fiscal 16.0.1.18.1__py3-none-any.whl → 16.0.1.18.2.1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of odoo-addon-l10n-br-fiscal might be problematic. Click here for more details.

Files changed (40) hide show
  1. odoo/addons/l10n_br_fiscal/README.rst +225 -105
  2. odoo/addons/l10n_br_fiscal/__manifest__.py +1 -1
  3. odoo/addons/l10n_br_fiscal/models/comment.py +4 -4
  4. odoo/addons/l10n_br_fiscal/models/data_abstract.py +3 -3
  5. odoo/addons/l10n_br_fiscal/models/data_ncm_nbs_abstract.py +7 -9
  6. odoo/addons/l10n_br_fiscal/models/document_eletronic.py +3 -4
  7. odoo/addons/l10n_br_fiscal/models/document_event.py +1 -1
  8. odoo/addons/l10n_br_fiscal/models/document_fiscal_line_mixin_methods.py +4 -3
  9. odoo/addons/l10n_br_fiscal/models/document_fiscal_mixin_fields.py +2 -2
  10. odoo/addons/l10n_br_fiscal/models/document_fiscal_mixin_methods.py +37 -31
  11. odoo/addons/l10n_br_fiscal/models/document_move_mixin.py +3 -1
  12. odoo/addons/l10n_br_fiscal/models/document_serie.py +1 -1
  13. odoo/addons/l10n_br_fiscal/models/product_template.py +2 -2
  14. odoo/addons/l10n_br_fiscal/models/subsequent_document.py +0 -1
  15. odoo/addons/l10n_br_fiscal/models/subsequent_operation.py +0 -2
  16. odoo/addons/l10n_br_fiscal/models/tax_definition.py +1 -5
  17. odoo/addons/l10n_br_fiscal/readme/CONFIGURE.md +7 -0
  18. odoo/addons/l10n_br_fiscal/readme/CONTRIBUTORS.md +12 -0
  19. odoo/addons/l10n_br_fiscal/readme/DESCRIPTION.md +196 -0
  20. odoo/addons/l10n_br_fiscal/readme/HISTORY.md +1 -0
  21. odoo/addons/l10n_br_fiscal/readme/INSTALL.md +5 -0
  22. odoo/addons/l10n_br_fiscal/readme/ROADMAP.md +1 -0
  23. odoo/addons/l10n_br_fiscal/readme/USAGE.md +4 -0
  24. odoo/addons/l10n_br_fiscal/static/description/index.html +155 -43
  25. odoo/addons/l10n_br_fiscal/tests/test_fiscal_document_generic.py +1 -1
  26. odoo/addons/l10n_br_fiscal/tests/test_ibpt.py +1 -2
  27. odoo/addons/l10n_br_fiscal/tools.py +2 -2
  28. odoo_addon_l10n_br_fiscal-16.0.1.18.2.1.dist-info/METADATA +364 -0
  29. {odoo_addon_l10n_br_fiscal-16.0.1.18.1.dist-info → odoo_addon_l10n_br_fiscal-16.0.1.18.2.1.dist-info}/RECORD +31 -31
  30. {odoo_addon_l10n_br_fiscal-16.0.1.18.1.dist-info → odoo_addon_l10n_br_fiscal-16.0.1.18.2.1.dist-info}/WHEEL +1 -1
  31. odoo_addon_l10n_br_fiscal-16.0.1.18.2.1.dist-info/top_level.txt +1 -0
  32. odoo/addons/l10n_br_fiscal/readme/CONFIGURE.rst +0 -5
  33. odoo/addons/l10n_br_fiscal/readme/CONTRIBUTORS.rst +0 -19
  34. odoo/addons/l10n_br_fiscal/readme/DESCRIPTION.rst +0 -103
  35. odoo/addons/l10n_br_fiscal/readme/HISTORY.rst +0 -0
  36. odoo/addons/l10n_br_fiscal/readme/INSTALL.rst +0 -4
  37. odoo/addons/l10n_br_fiscal/readme/ROADMAP.rst +0 -0
  38. odoo/addons/l10n_br_fiscal/readme/USAGE.rst +0 -1
  39. odoo_addon_l10n_br_fiscal-16.0.1.18.1.dist-info/METADATA +0 -244
  40. odoo_addon_l10n_br_fiscal-16.0.1.18.1.dist-info/top_level.txt +0 -1
@@ -7,7 +7,7 @@ Módulo fiscal brasileiro
7
7
  !! This file is generated by oca-gen-addon-readme !!
8
8
  !! changes will be overwritten. !!
9
9
  !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
10
- !! source digest: sha256:9fa01cd837e4c47121656b5ea00d0dd8a35417a08afadb987905da99d4ae3699
10
+ !! source digest: sha256:a248da3cdce943ad2d1d06331dca73ca572668dbf62b6786726192e4a000e1f2
11
11
  !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
12
12
 
13
13
  .. |badge1| image:: https://img.shields.io/badge/maturity-Production%2FStable-green.png
@@ -28,109 +28,213 @@ Módulo fiscal brasileiro
28
28
 
29
29
  |badge1| |badge2| |badge3| |badge4| |badge5|
30
30
 
31
- .. image:: https://raw.githubusercontent.com/OCA/l10n-brazil/16.0/l10n_br_fiscal/static/img/fiscal_dashboard.png
32
-
31
+ |image|
33
32
 
34
33
  Classificações fiscais
35
- ~~~~~~~~~~~~~~~~~~~~~~
34
+ ----------------------
36
35
 
37
- Primeramente, este módulo traz uma variedade de cadastros fiscais para produtos, parceiros ou empresas. Na hora de emitir documentos fiscais como NF-e, NFS-e etc... até empresas do regime simplificado ou MEI precisam de vários desses cadastros. E empresas do regime normal precisam deles para calcular os impostos ou emitir documentos fiscais.
36
+ Primeramente, este módulo traz uma variedade de cadastros fiscais para
37
+ produtos, parceiros ou empresas. Na hora de emitir documentos fiscais
38
+ como NF-e, NFS-e etc... até empresas do regime simplificado ou MEI
39
+ precisam de vários desses cadastros. E empresas do regime normal
40
+ precisam deles para calcular os impostos ou emitir documentos fiscais.
38
41
 
39
42
  Produtos:
40
- * tipo fiscal
41
- * NCM (com ligações com os impostos)
42
- * genêro fiscal
43
- * CEST
44
- * NBM
45
- * NBS
46
- * tipo de serviço
47
- * unidades fiscais
43
+
44
+ - tipo fiscal
45
+ - NCM (com ligações com os impostos)
46
+ - genêro fiscal
47
+ - CEST
48
+ - NBM
49
+ - NBS
50
+ - tipo de serviço
51
+ - unidades fiscais
48
52
 
49
53
  Parceiros:
50
- * CNAE
51
- * perfil fiscal
52
54
 
55
+ - CNAE
56
+ - perfil fiscal
53
57
 
54
58
  Conceito de documento fiscal
55
- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
56
-
57
- O Odoo nativo não tem o conceito de documento fiscal. O conceito mais parecido seria o ``account.move`` e até a versão 10.0 a localização estendia o invoice para suportar as NF-e e NFS-e apenas. Naquela época não era razoável você cogitar fazer o SPED no Odoo, o próprio core do Odoo não tinha maturidade para isso então era válido a abordagem empírica de ir suportando mais casos de NFe dentro do invoice Odoo apenas.
58
-
59
- Porém, na v12, amadurecemos o framework XML/SOAP de forma que se torna razoável suportar vários documentos fiscais (NF-e, NFS-e, MDF-e, CT-e, EFD-Reinf, e-Social, GNRE, BP-e...) com a qualidade OCA dentro do Odoo. Também, apesar de complexo, o core do Odoo finalmente tem suporte suficiente para as operações de uma empresa que faria o SPED.
60
-
61
- Nisso se torna interessante ter o conceito de documento fiscal ``l10n_br_fiscal.document`` independente do invoice Odoo para suportar todos os documentos fiscais mesmo, de forma modular. Um outro motivo para ter o conceito de documento fiscal fora do módulo account é que quando você analisa o código deste módulo ``l10n_br_fiscal``, quase nada dele poderia ser feito pelo módulo account do Odoo. Então ter esse módulo l10n_br_fiscal que não depende do módulo account também é uma forma de modularizar a localização para facilitar a manutenção dela, especialmente quando se trata de migrar e que o módulo pode ter mudado bastante como foi o caso entre a v8.0 e a v9.0 ou a v12.0 e v13.0 por exemplo. Facilita também a governança do projeto possibilitando que pessoas sejam responsáveis por diferentes partes. O módulo l10n_br_fiscal foi principalmente extraído do módulo l10n_br_l10n_br_account_product das v7.0 as v.10.0.
62
-
63
- Esse módulo ``l10n_br_fiscal`` é agnóstico de qualquer tecnologia XML ou SOAP. Ele contém apenas o que há de comum entre os documentos fiscais mas esses últimos são implementados em outros módulos. Para um determinado documento fiscal como a Nf-e, você tem então por exemplo:
64
-
65
- * ``nfelib``: um pacote de data bindings puro Python (que não depende do Odoo). Em geral usamos um gerador de código para gerar esses bindings a partir dos esquemas XSD da fazenda.
66
- * ``l10n_br_nfe_spec``: um modulo de mixins Odoo geridos também a partir dos XSD. Esses mixins são apenas as estruturas de dados das especificações antes de ser injectados em objetos Odoo existantes (como res.partner ou l10n_br_fiscal.document) ou até tornados concretos caso não exite objetos na Odoo ou na OCA para eles já.
67
- * ``l10n_br_nfe``: um módulo Odoo que trata de injectar esses mappings fiscais nos objetos Odoo e que implementa a lógica como os wizards para a transmissão.
68
-
69
- A transmissão é realizada usando uma lib de transmissão como ``erpbrasil.doc`` (baseada em Python Zeep). Importante: no caso da ``NFS-e``, a ausência de padrão nacional hoje e a simplicidade do modelo (comparado com a NFe) faz que foi decidido de não usar um módulo de mixins fiscais Odoo geridos, o mapping é com a lib de binding é feito manualmente, família de NFS-e por família.
70
-
71
- Alem disso a maioria do codigo do ``l10n_br_fiscal.document`` e das linhas dele ``l10n_br_fiscal.document.line`` é na verdade feito dentro de mixins ``10n_br_fiscal.document.mixin`` e ``10n_br_fiscal.document.line.mixin`` respectivamente. Esses mixins podem assim ser injectados em outros objetos Odoo que precedem os documentos fiscais e podem armazenar então o mesmo tipo de informação: ``sale.order``, ``purchase.order``, ``stock.picking``... Isso é bem visível nos módulos que estendem esse módulo:
72
-
73
- .. code-block:: text
74
-
75
- |-- l10n_br_fiscal
76
- |-- l10n_br_sale
77
- |-- l10n_br_purchase
78
- |-- l10n_br_account
79
- |-- ...
80
-
81
-
82
- Porem o caso do invoice Odoo no modulo ``l10n_br_account`` é diferente ainda. Pois já se tem a tabela independente do documento fiscal cuja grande maioria das dezenas e até centenas de campos fiscais (no caso de muitos tipos de documentos fiscais) não são redundante com os do invoice Odoo. Se a gente injetasse esses mixins dentro do invoice, aí sim essas centenas de campos seriam duplicados entre o invoice e o documento fiscal. Por isso, o sistema que foi adotado no modulo ``l10n_br_account`` é que um invoice Odoo passa a ter um ``_inherits = "l10n_br_fiscal.document"`` de forma que se pilota o documento fiscal através do invoice, oferecendo o mesmo tipo de integração como antes. O mesmo tipo de mecanismo acontece com a linha do documento fiscal.
83
-
84
- Sendo assim, já pelos _inherits, o invoice Odoo e as linhas dele já vão puxar todos campos fiscais como se eles fossem das suas respectivas tabelas sem duplicar eles no banco. Se alem disso a gente injetasse os mixins ``10n_br_fiscal.document.mixin`` e ``10n_br_fiscal.document.line.mixin`` no invoice e invoice.line, esses campos fiscais apareceriam também nas tabelas ``account_move`` e ``account_move_line`` de forma redundantes com os campos puxados pelos _inherits. Para não ter esse problema, os métodos fiscais comuns (sem os campos) foram ainda extraidos nos mixins: ``10n_br_fiscal.document.mixin.methods`` e ``10n_br_fiscal.document.line.mixin.methods`` que são injectados nos objetos ``account_move`` e ``account_move_line`` respectivamente dentro do modulo ``l10n_br_account``.
85
-
59
+ ----------------------------
60
+
61
+ O Odoo nativo não tem o conceito de documento fiscal. O conceito mais
62
+ parecido seria o ``account.move`` e até a versão 10.0 a localização
63
+ estendia o invoice para suportar as NF-e e NFS-e apenas. Naquela época
64
+ não era razoável você cogitar fazer o SPED no Odoo, o próprio core do
65
+ Odoo não tinha maturidade para isso então era válido a abordagem
66
+ empírica de ir suportando mais casos de NFe dentro do invoice Odoo
67
+ apenas.
68
+
69
+ Porém, na v12, amadurecemos o framework XML/SOAP de forma que se torna
70
+ razoável suportar vários documentos fiscais (NF-e, NFS-e, MDF-e, CT-e,
71
+ EFD-Reinf, e-Social, GNRE, BP-e...) com a qualidade OCA dentro do Odoo.
72
+ Também, apesar de complexo, o core do Odoo finalmente tem suporte
73
+ suficiente para as operações de uma empresa que faria o SPED.
74
+
75
+ Nisso se torna interessante ter o conceito de documento fiscal
76
+ ``l10n_br_fiscal.document`` independente do invoice Odoo para suportar
77
+ todos os documentos fiscais mesmo, de forma modular. Um outro motivo
78
+ para ter o conceito de documento fiscal fora do módulo account é que
79
+ quando você analisa o código deste módulo ``l10n_br_fiscal``, quase nada
80
+ dele poderia ser feito pelo módulo account do Odoo. Então ter esse
81
+ módulo l10n_br_fiscal que não depende do módulo account também é uma
82
+ forma de modularizar a localização para facilitar a manutenção dela,
83
+ especialmente quando se trata de migrar e que o módulo pode ter mudado
84
+ bastante como foi o caso entre a v8.0 e a v9.0 ou a v12.0 e v13.0 por
85
+ exemplo. Facilita também a governança do projeto possibilitando que
86
+ pessoas sejam responsáveis por diferentes partes. O módulo
87
+ l10n_br_fiscal foi principalmente extraído do módulo
88
+ l10n_br_l10n_br_account_product das v7.0 as v.10.0.
89
+
90
+ Esse módulo ``l10n_br_fiscal`` é agnóstico de qualquer tecnologia XML ou
91
+ SOAP. Ele contém apenas o que há de comum entre os documentos fiscais
92
+ mas esses últimos são implementados em outros módulos. Para um
93
+ determinado documento fiscal como a Nf-e, você tem então por exemplo:
94
+
95
+ - ``nfelib``: um pacote de data bindings puro Python (que não depende
96
+ do Odoo). Em geral usamos um gerador de código para gerar esses
97
+ bindings a partir dos esquemas XSD da fazenda.
98
+ - ``l10n_br_nfe_spec``: um modulo de mixins Odoo geridos também a
99
+ partir dos XSD. Esses mixins são apenas as estruturas de dados das
100
+ especificações antes de ser injectados em objetos Odoo existantes
101
+ (como res.partner ou l10n_br_fiscal.document) ou até tornados
102
+ concretos caso não exite objetos na Odoo ou na OCA para eles já.
103
+ - ``l10n_br_nfe``: um módulo Odoo que trata de injectar esses mappings
104
+ fiscais nos objetos Odoo e que implementa a lógica como os wizards
105
+ para a transmissão.
106
+
107
+ A transmissão é realizada usando uma lib de transmissão como
108
+ ``erpbrasil.doc`` (baseada em Python Zeep). Importante: no caso da
109
+ ``NFS-e``, a ausência de padrão nacional hoje e a simplicidade do modelo
110
+ (comparado com a NFe) faz que foi decidido de não usar um módulo de
111
+ mixins fiscais Odoo geridos, o mapping é com a lib de binding é feito
112
+ manualmente, família de NFS-e por família.
113
+
114
+ Alem disso a maioria do codigo do ``l10n_br_fiscal.document`` e das
115
+ linhas dele ``l10n_br_fiscal.document.line`` é na verdade feito dentro
116
+ de mixins ``10n_br_fiscal.document.mixin`` e
117
+ ``10n_br_fiscal.document.line.mixin`` respectivamente. Esses mixins
118
+ podem assim ser injectados em outros objetos Odoo que precedem os
119
+ documentos fiscais e podem armazenar então o mesmo tipo de informação:
120
+ ``sale.order``, ``purchase.order``, ``stock.picking``... Isso é bem
121
+ visível nos módulos que estendem esse módulo:
122
+
123
+ .. code:: text
124
+
125
+ |-- l10n_br_fiscal
126
+ |-- l10n_br_sale
127
+ |-- l10n_br_purchase
128
+ |-- l10n_br_account
129
+ |-- ...
130
+
131
+ Porem o caso do invoice Odoo no modulo ``l10n_br_account`` é diferente
132
+ ainda. Pois já se tem a tabela independente do documento fiscal cuja
133
+ grande maioria das dezenas e até centenas de campos fiscais (no caso de
134
+ muitos tipos de documentos fiscais) não são redundante com os do invoice
135
+ Odoo. Se a gente injetasse esses mixins dentro do invoice, aí sim essas
136
+ centenas de campos seriam duplicados entre o invoice e o documento
137
+ fiscal. Por isso, o sistema que foi adotado no modulo
138
+ ``l10n_br_account`` é que um invoice Odoo passa a ter um
139
+ ``_inherits = "l10n_br_fiscal.document"`` de forma que se pilota o
140
+ documento fiscal através do invoice, oferecendo o mesmo tipo de
141
+ integração como antes. O mesmo tipo de mecanismo acontece com a linha do
142
+ documento fiscal.
143
+
144
+ Sendo assim, já pelos \_inherits, o invoice Odoo e as linhas dele já vão
145
+ puxar todos campos fiscais como se eles fossem das suas respectivas
146
+ tabelas sem duplicar eles no banco. Se alem disso a gente injetasse os
147
+ mixins ``10n_br_fiscal.document.mixin`` e
148
+ ``10n_br_fiscal.document.line.mixin`` no invoice e invoice.line, esses
149
+ campos fiscais apareceriam também nas tabelas ``account_move`` e
150
+ ``account_move_line`` de forma redundantes com os campos puxados pelos
151
+ \_inherits. Para não ter esse problema, os métodos fiscais comuns (sem
152
+ os campos) foram ainda extraidos nos mixins:
153
+ ``10n_br_fiscal.document.mixin.methods`` e
154
+ ``10n_br_fiscal.document.line.mixin.methods`` que são injectados nos
155
+ objetos ``account_move`` e ``account_move_line`` respectivamente dentro
156
+ do modulo ``l10n_br_account``.
86
157
 
87
158
  Impostos brasileiros
88
- ~~~~~~~~~~~~~~~~~~~~
89
-
90
- O módulo l10n_br_fiscal lida com os principais impostos brasileiros como:
91
-
92
- * ICMS do Simples Nacional
93
- * ICMS do Regime normal
94
- * IPI
95
- * PIS
96
- * COFINS
97
- * ISSQN
98
- * IRPJ
99
- * II
100
- * CSLL
101
- * INSS
159
+ --------------------
160
+
161
+ O módulo l10n_br_fiscal lida com os principais impostos brasileiros
162
+ como:
163
+
164
+ - ICMS do Simples Nacional
165
+ - ICMS do Regime normal
166
+ - IPI
167
+ - PIS
168
+ - COFINS
169
+ - ISSQN
170
+ - IRPJ
171
+ - II
172
+ - CSLL
173
+ - INSS
102
174
 
103
175
  O módulo l10n_br_fiscal também lida com:
104
176
 
105
- * ST
106
- * retenções
107
-
108
-
109
- .. image:: https://raw.githubusercontent.com/OCA/l10n-brazil/16.0/l10n_br_fiscal/static/img/fiscal_line.png
110
-
111
- .. image:: https://raw.githubusercontent.com/OCA/l10n-brazil/16.0/l10n_br_fiscal/static/img/fiscal_total.png
112
-
113
- É notório que o cálculo dos impostos no Brasil é muito especial e muito trabalhoso. Geralmente é o motivo pelo qual os ERPs internacionais não tem grande fatia de mercado brasileiro.
114
-
115
- Até a versão 10.0, tentamos usar e estender o objeto Odoo ``account.tax``. A Akretion até criou o projeto ``OCA/account-fiscal-rule`` para determinar as alíquotas de cada imposto de accordo com os parâmetros da operação fiscal. Porém, a gente acabava usando quase nada do ``account.fiscal.position`` nativo na parte fiscal e pelo contrário, isso nos obrigava a ter um registro ``account.tax`` para cada aliquota e nos obrigava a manter centenas de taxas e dezenas de milhares de regras para selecionar a "posição fiscal" Odoo que aplicaria as taxas corretas. E você ainda tinha que gerir essas dezenas de milhares de regras para uma determinada empresa do regime normal. Conclusão: era inviável nos projetos menores de tentar se encaixa na lógica do Odoo para calcular os impostos brasileiros.
116
-
117
- Nisso criamos neste módulo os modelos de taxas que representam exatamente o funcionamentos dos impostos brasileiros. Além dos cálculos, esses modelos também nos servem a carregar as tabelas dos impostos. E mais adiante, no módulo ``l10n_br_account``, ligamos os objetos nativos ``account.tax`` as alíquotas dos impostos brasileiros.
118
-
119
- Claro esses modelos dos impostos atendem as empresas do regime normal, mas é bom lembrar que até empresas do regime simplificado precisam desses modelos para realizar as operações com ST (Substituição Tributária)...
120
-
177
+ - ST
178
+ - retenções
179
+
180
+ |image1|
181
+
182
+ |image2|
183
+
184
+ É notório que o cálculo dos impostos no Brasil é muito especial e muito
185
+ trabalhoso. Geralmente é o motivo pelo qual os ERPs internacionais não
186
+ tem grande fatia de mercado brasileiro.
187
+
188
+ Até a versão 10.0, tentamos usar e estender o objeto Odoo
189
+ ``account.tax``. A Akretion até criou o projeto
190
+ ``OCA/account-fiscal-rule`` para determinar as alíquotas de cada imposto
191
+ de accordo com os parâmetros da operação fiscal. Porém, a gente acabava
192
+ usando quase nada do ``account.fiscal.position`` nativo na parte fiscal
193
+ e pelo contrário, isso nos obrigava a ter um registro ``account.tax``
194
+ para cada aliquota e nos obrigava a manter centenas de taxas e dezenas
195
+ de milhares de regras para selecionar a "posição fiscal" Odoo que
196
+ aplicaria as taxas corretas. E você ainda tinha que gerir essas dezenas
197
+ de milhares de regras para uma determinada empresa do regime normal.
198
+ Conclusão: era inviável nos projetos menores de tentar se encaixa na
199
+ lógica do Odoo para calcular os impostos brasileiros.
200
+
201
+ Nisso criamos neste módulo os modelos de taxas que representam
202
+ exatamente o funcionamentos dos impostos brasileiros. Além dos cálculos,
203
+ esses modelos também nos servem a carregar as tabelas dos impostos. E
204
+ mais adiante, no módulo ``l10n_br_account``, ligamos os objetos nativos
205
+ ``account.tax`` as alíquotas dos impostos brasileiros.
206
+
207
+ Claro esses modelos dos impostos atendem as empresas do regime normal,
208
+ mas é bom lembrar que até empresas do regime simplificado precisam
209
+ desses modelos para realizar as operações com ST (Substituição
210
+ Tributária)...
121
211
 
122
212
  Operações fiscais
123
- ~~~~~~~~~~~~~~~~~
213
+ -----------------
214
+
215
+ |image3|
124
216
 
125
- .. image:: https://raw.githubusercontent.com/OCA/l10n-brazil/16.0/l10n_br_fiscal/static/img/fiscal_operation.png
217
+ No Odoo nativo, o conceito mais parecido com a operação fiscal e o
218
+ ``account.fiscal.position``. E ate a versão 10.0, era o que a gente
219
+ usava. Porém, a posição fiscal do Odoo não resolve muito os nossos
220
+ problemas pois:
126
221
 
127
- No Odoo nativo, o conceito mais parecido com a operação fiscal e o ``account.fiscal.position``. E ate a versão 10.0, era o que a gente usava. Porém, a posição fiscal do Odoo não resolve muito os nossos problemas pois:
222
+ - no Brasil se tem uma operação fiscal por linha de documento fiscal
223
+ - a posição fiscal do Odoo desconhece a lógica da parametrização fiscal
224
+ brasileira
225
+ - já que puxamos o cadastro dos impostos no módulo l10n_br_fiscal fora
226
+ do módulo account (sem depender dele), não temos ainda o objeto
227
+ ``account.fiscal.position`` neste módulo.
128
228
 
129
- * no Brasil se tem uma operação fiscal por linha de documento fiscal
130
- * a posição fiscal do Odoo desconhece a lógica da parametrização fiscal brasileira
131
- * que puxamos o cadastro dos impostos no módulo l10n_br_fiscal fora do módulo account (sem depender dele), não temos ainda o objeto ``account.fiscal.position`` neste módulo.
229
+ Com tudo, optamos por criar um objeto ``l10n_br_fiscal.operation`` que
230
+ faz exactamente o que precisamos para o Brasil. Mais adiante, no módulo
231
+ ``l10n_br_account`` é realizado a integração entre a posição fiscal do
232
+ Odoo e essa operação fiscal.
132
233
 
133
- Com tudo, optamos por criar um objeto ``l10n_br_fiscal.operation`` que faz exactamente o que precisamos para o Brasil. Mais adiante, no módulo ``l10n_br_account`` é realizado a integração entre a posição fiscal do Odoo e essa operação fiscal.
234
+ .. |image| image:: https://raw.githubusercontent.com/OCA/l10n-brazil/16.0/l10n_br_fiscal/static/img/fiscal_dashboard.png
235
+ .. |image1| image:: https://raw.githubusercontent.com/OCA/l10n-brazil/16.0/l10n_br_fiscal/static/img/fiscal_line.png
236
+ .. |image2| image:: https://raw.githubusercontent.com/OCA/l10n-brazil/16.0/l10n_br_fiscal/static/img/fiscal_total.png
237
+ .. |image3| image:: https://raw.githubusercontent.com/OCA/l10n-brazil/16.0/l10n_br_fiscal/static/img/fiscal_operation.png
134
238
 
135
239
  **Table of contents**
136
240
 
@@ -140,24 +244,40 @@ Com tudo, optamos por criar um objeto ``l10n_br_fiscal.operation`` que faz exact
140
244
  Installation
141
245
  ============
142
246
 
143
- Para instalar o módulo l10n_br_fiscal, você precisa de instalar primeiro os pacotes Python
247
+ Para instalar o módulo l10n_br_fiscal, você precisa de instalar primeiro
248
+ os pacotes Python
144
249
 
145
- * erpbrasil.base
146
- * erpbrasil.assinatura
250
+ - erpbrasil.base
251
+ - erpbrasil.assinatura
147
252
 
148
253
  Configuration
149
254
  =============
150
255
 
151
256
  Para uma boa configuração fiscal, você tem que revisar bem:
152
257
 
153
- * em Configurações: as operaçoes fiscais que você vai usar, as linhas de operação fiscal e as definições das taxas nessas linhas.
154
- * a configuração fiscal da sua empresa (aba fiscal)
155
- * a configuração fiscal dos clientes e fornecedores (aba fiscal) e dos produtos (aba fiscal).
258
+ - em Configurações: as operaçoes fiscais que você vai usar, as linhas
259
+ de operação fiscal e as definições das taxas nessas linhas.
260
+ - a configuração fiscal da sua empresa (aba fiscal)
261
+ - a configuração fiscal dos clientes e fornecedores (aba fiscal) e dos
262
+ produtos (aba fiscal).
156
263
 
157
264
  Usage
158
265
  =====
159
266
 
160
- Você pode criar documentos fiscais direitamente pelo menu fiscal, mas a princípio você vai pilotar a criação de documentos fiscais a partir dos invoices Odoo, usando módulos adicionais como l10n_br_account, l10n_br_sale, l10n_br_purchase...
267
+ Você pode criar documentos fiscais direitamente pelo menu fiscal, mas a
268
+ princípio você vai pilotar a criação de documentos fiscais a partir dos
269
+ invoices Odoo, usando módulos adicionais como l10n_br_account,
270
+ l10n_br_sale, l10n_br_purchase...
271
+
272
+ Known issues / Roadmap
273
+ ======================
274
+
275
+
276
+
277
+ Changelog
278
+ =========
279
+
280
+
161
281
 
162
282
  Bug Tracker
163
283
  ===========
@@ -173,35 +293,35 @@ Credits
173
293
  =======
174
294
 
175
295
  Authors
176
- ~~~~~~~
296
+ -------
177
297
 
178
298
  * Akretion
179
299
 
180
300
  Contributors
181
- ~~~~~~~~~~~~
301
+ ------------
182
302
 
183
- * `Akretion <https://www.akretion.com/pt-BR>`_:
303
+ - `Akretion <https://www.akretion.com/pt-BR>`__:
184
304
 
185
- * Renato Lima <renato.lima@akretion.com.br>
186
- * Raphaël Valyi <raphael.valyi@akretion.com.br>
187
- * Magno Costa <magno.costa@akretion.com.br>
305
+ - Renato Lima <renato.lima@akretion.com.br>
306
+ - Raphaël Valyi <raphael.valyi@akretion.com.br>
307
+ - Magno Costa <magno.costa@akretion.com.br>
188
308
 
189
- * `KMEE <https://www.kmee.com.br>`_:
309
+ - `KMEE <https://www.kmee.com.br>`__:
190
310
 
191
- * Luis Felipe Mileo <mileo@kmee.com.br>
192
- * Luis Otavio Malta Conceição <luis.malta@kmee.com.br>
311
+ - Luis Felipe Mileo <mileo@kmee.com.br>
312
+ - Luis Otavio Malta Conceição <luis.malta@kmee.com.br>
193
313
 
194
- * `Escodoo <https://www.escodoo.com.br>`_:
314
+ - `Escodoo <https://www.escodoo.com.br>`__:
195
315
 
196
- * Marcel Savegnago <marcel.savegnago@escodoo.com.br>
316
+ - Marcel Savegnago <marcel.savegnago@escodoo.com.br>
197
317
 
198
- * `Engenere <https://engenere.one>`_:
318
+ - `Engenere <https://engenere.one>`__:
199
319
 
200
- * Antônio S. Pereira Neto <neto@engenere.one>
201
- * Felipe Motter Pereira <felipe@engenere.one>
320
+ - Antônio S. Pereira Neto <neto@engenere.one>
321
+ - Felipe Motter Pereira <felipe@engenere.one>
202
322
 
203
323
  Maintainers
204
- ~~~~~~~~~~~
324
+ -----------
205
325
 
206
326
  This module is maintained by the OCA.
207
327
 
@@ -10,7 +10,7 @@
10
10
  "maintainers": ["renatonlima"],
11
11
  "website": "https://github.com/OCA/l10n-brazil",
12
12
  "development_status": "Production/Stable",
13
- "version": "16.0.1.18.1",
13
+ "version": "16.0.1.18.2",
14
14
  "depends": [
15
15
  "product",
16
16
  "l10n_br_base",
@@ -89,16 +89,16 @@ class Comment(models.Model):
89
89
  def name_get(self):
90
90
  def truncate_name(name):
91
91
  if len(name) > 60:
92
- name = "{}...".format(name[:60])
92
+ name = f"{name[:60]}..."
93
93
  return name
94
94
 
95
- return [(r.id, "{}".format(truncate_name(r.name))) for r in self]
95
+ return [(r.id, f"{truncate_name(r.name)}") for r in self]
96
96
 
97
97
  # format_amount function for fiscal observation
98
98
  # This way we can format numbers in currency template on fiscal observation
99
99
  # msg We'll call this function when setting the variables env below
100
100
  def format_amount(self, env, amount, currency):
101
- fmt = "%.{}f".format(currency.decimal_places)
101
+ fmt = f"%.{currency.decimal_places}f"
102
102
  lang = env.ref("base.lang_pt_BR")
103
103
 
104
104
  formatted_amount = (
@@ -113,7 +113,7 @@ class Comment(models.Model):
113
113
  else:
114
114
  post = "\N{NO-BREAK SPACE}" + "{}".format(currency.symbol or "")
115
115
 
116
- return "{pre}{0}{post}".format(formatted_amount, pre=pre, post=post)
116
+ return f"{pre}{formatted_amount}{post}"
117
117
 
118
118
  def compute_message(self, vals, manual_comment=None):
119
119
  if not self.ids and not manual_comment:
@@ -94,10 +94,10 @@ class DataAbstract(models.AbstractModel):
94
94
  def name_get(self):
95
95
  def truncate_name(name):
96
96
  if len(name) > 60:
97
- name = "{}...".format(name[:60])
97
+ name = f"{name[:60]}..."
98
98
  return name
99
99
 
100
100
  if self._context.get("show_code_only"):
101
- return [(r.id, "{}".format(r.code)) for r in self]
101
+ return [(r.id, f"{r.code}") for r in self]
102
102
 
103
- return [(r.id, "{} - {}".format(r.code, truncate_name(r.name))) for r in self]
103
+ return [(r.id, f"{r.code} - {truncate_name(r.name)}") for r in self]
@@ -147,20 +147,18 @@ class DataNcmNbsAbstract(models.AbstractModel):
147
147
  lambda r: r.product_tmpl_qty > 0 and not r.tax_estimate_ids
148
148
  )
149
149
 
150
- query = """
151
- WITH {0}_max_date AS (
150
+ query = f"""
151
+ WITH {object_name.lower()}_max_date AS (
152
152
  SELECT
153
- {0}_id,
153
+ {object_name.lower()}_id,
154
154
  max(create_date)
155
155
  FROM
156
156
  l10n_br_fiscal_tax_estimate
157
- GROUP BY {0}_id)
158
- SELECT {0}_id
159
- FROM {0}_max_date
157
+ GROUP BY {object_name.lower()}_id)
158
+ SELECT {object_name.lower()}_id
159
+ FROM {object_name.lower()}_max_date
160
160
  WHERE max < %(create_date)s
161
- """.format(
162
- object_name.lower()
163
- )
161
+ """
164
162
 
165
163
  query_params = {"create_date": data_max.strftime("%Y-%m-%d")}
166
164
 
@@ -191,9 +191,7 @@ class DocumentEletronic(models.AbstractModel):
191
191
  if attachment_id:
192
192
  return {
193
193
  "type": "ir.actions.act_url",
194
- "url": "/web/content/{id}/{nome}".format(
195
- id=attachment_id.id, nome=attachment_id.name
196
- ),
194
+ "url": f"/web/content/{attachment_id.id}/{attachment_id.name}",
197
195
  "target": "new",
198
196
  }
199
197
 
@@ -229,6 +227,7 @@ class DocumentEletronic(models.AbstractModel):
229
227
  if not record.issuer:
230
228
  raise ValidationError(
231
229
  _(
232
- "The field 'Issuer' is required for brazilian electronic documents!"
230
+ "The field 'Issuer' is required for brazilian electronic "
231
+ "documents!"
233
232
  )
234
233
  )
@@ -242,7 +242,7 @@ class Event(models.Model):
242
242
  if not os.path.exists(save_dir):
243
243
  os.makedirs(save_dir)
244
244
  f = open(file_path, "w")
245
- except IOError as e:
245
+ except OSError as e:
246
246
  raise UserError(
247
247
  _("Erro!"),
248
248
  _(
@@ -207,7 +207,8 @@ class FiscalDocumentLineMixinMethods(models.AbstractModel):
207
207
  for line in self:
208
208
  # Determine if 'CSLL' and 'IRPJ' taxes may apply:
209
209
  # 1. When providing services (tax_icms_or_issqn == "issqn")
210
- # 2. When supplying products to public entities (partner_is_public_entity is True)
210
+ # 2. When supplying products to public entities (partner_is_public_entity
211
+ # is True)
211
212
  if line.tax_icms_or_issqn == "issqn" or line.partner_is_public_entity:
212
213
  line.allow_csll_irpj = True # Tax charges may apply
213
214
  else:
@@ -224,7 +225,7 @@ class FiscalDocumentLineMixinMethods(models.AbstractModel):
224
225
  vals.pop("id", None)
225
226
 
226
227
  if default: # in case you want to use new rather than write later
227
- return {"default_%s" % (k,): vals[k] for k in vals.keys()}
228
+ return {f"default_{k}": vals[k] for k in vals.keys()}
228
229
  return vals
229
230
 
230
231
  def _get_all_tax_id_fields(self):
@@ -275,7 +276,7 @@ class FiscalDocumentLineMixinMethods(models.AbstractModel):
275
276
  for line in self:
276
277
  taxes_groups = line.fiscal_tax_ids.mapped("tax_domain")
277
278
  fiscal_taxes = line.fiscal_tax_ids.filtered(
278
- lambda ft: ft.tax_domain not in taxes_groups
279
+ lambda ft, taxes_groups=taxes_groups: ft.tax_domain not in taxes_groups
279
280
  )
280
281
  line.fiscal_tax_ids = fiscal_taxes + taxes
281
282
 
@@ -29,9 +29,9 @@ class FiscalDocumentMixinFields(models.AbstractModel):
29
29
  domain = (
30
30
  "[('state', '=', 'approved'),"
31
31
  "'|',"
32
- "('company_id', '=', %s),"
32
+ f"('company_id', '=', {self.env.company.id}),"
33
33
  "('company_id', '=', False),"
34
- ) % (self.env.company.id,)
34
+ )
35
35
  return domain
36
36
 
37
37
  fiscal_operation_id = fields.Many2one(