From a937c2f632fea6e346769586a218499ffed497fb Mon Sep 17 00:00:00 2001 From: Pedro Castro Silva Date: Fri, 2 Oct 2015 12:55:02 +0100 Subject: [PATCH 001/157] Initial submission to OCA --- l10n_pt_vat/README.rst | 34 ++++++ l10n_pt_vat/__init__.py | 4 + l10n_pt_vat/__openerp__.py | 40 +++++++ l10n_pt_vat/data/vat_adjustment_norm.xml | 100 ++++++++++++++++++ l10n_pt_vat/models/__init__.py | 24 +++++ l10n_pt_vat/models/account_invoice.py | 31 ++++++ l10n_pt_vat/models/vat_adjustment_norm.py | 71 +++++++++++++ l10n_pt_vat/security/ir.model.access.csv | 3 + l10n_pt_vat/static/description/icon.png | Bin 0 -> 3019 bytes l10n_pt_vat/views/account_invoice_view.xml | 42 ++++++++ .../views/vat_adjustment_norm_view.xml | 76 +++++++++++++ 11 files changed, 425 insertions(+) create mode 100644 l10n_pt_vat/README.rst create mode 100644 l10n_pt_vat/__init__.py create mode 100644 l10n_pt_vat/__openerp__.py create mode 100644 l10n_pt_vat/data/vat_adjustment_norm.xml create mode 100644 l10n_pt_vat/models/__init__.py create mode 100644 l10n_pt_vat/models/account_invoice.py create mode 100644 l10n_pt_vat/models/vat_adjustment_norm.py create mode 100644 l10n_pt_vat/security/ir.model.access.csv create mode 100644 l10n_pt_vat/static/description/icon.png create mode 100644 l10n_pt_vat/views/account_invoice_view.xml create mode 100644 l10n_pt_vat/views/vat_adjustment_norm_view.xml diff --git a/l10n_pt_vat/README.rst b/l10n_pt_vat/README.rst new file mode 100644 index 00000000..a552be99 --- /dev/null +++ b/l10n_pt_vat/README.rst @@ -0,0 +1,34 @@ +.. image:: https://img.shields.io/badge/licence-AGPL--3-blue.svg + :alt: License: AGPL-3 + +Portugal - VAT +=================================== + +This modules extends the base localization modules with a few VAT specific functions that are required by the Portuguese Tax Authorities, including: + +* The use of pre-defined legally accepted reasons for issuing credit notes, as required for fields 40/41 of the VAT statement (Portaria nº 255/2013). + + +Credits +======== + +Contributors +------------ + +- Pedro Castro Silva (Sossia) +- Odoo Community Association (OCA) + +Maintainer +---------- + +.. image:: https://odoo-community.org/logo.png + :alt: Odoo Community Association + :target: https://odoo-community.org + +This module is maintained by the OCA. + +OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use. + +To contribute to this module, please visit http://odoo-community.org. diff --git a/l10n_pt_vat/__init__.py b/l10n_pt_vat/__init__.py new file mode 100644 index 00000000..77bbdbd3 --- /dev/null +++ b/l10n_pt_vat/__init__.py @@ -0,0 +1,4 @@ +# -*- coding: utf-8 -*- + +from . import models + diff --git a/l10n_pt_vat/__openerp__.py b/l10n_pt_vat/__openerp__.py new file mode 100644 index 00000000..5970514d --- /dev/null +++ b/l10n_pt_vat/__openerp__.py @@ -0,0 +1,40 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# Odoo, Open Source Management Solution +# Copyright (C) 2014- Sossia, Lda. () +# Copyright (C) 2004 OpenERP SA () +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## + +{ + "name": "Portugal - IVA", + "version": "0.2", + "depends": ['account', 'base_vat'], + "author": "Sossia, Odoo Community Association (OCA)", + "summary": "Portuguese VAT requirements extensions", + "website": "http://www.sossia.pt", + "category": "Accounting & Finance", + "data": [ + "security/ir.model.access.csv", + "data/vat_adjustment_norm.xml", + "views/vat_adjustment_norm_view.xml", + "views/account_invoice_view.xml", + ], + "installable": True, + "auto_install": False, + "application": False, +} diff --git a/l10n_pt_vat/data/vat_adjustment_norm.xml b/l10n_pt_vat/data/vat_adjustment_norm.xml new file mode 100644 index 00000000..1c5c4a08 --- /dev/null +++ b/l10n_pt_vat/data/vat_adjustment_norm.xml @@ -0,0 +1,100 @@ + + + + + + + Art. 78º, nº 2 + + + + Art. 78º, nº 3 + + + + + Art. 78º, nº 4 + + + + Art. 78º, nº 6 + + + + + Art. 78º, nº 7, alínea a) + + + + + Art. 78º, nº 7, alínea b) + + + + + Art. 78º, nº 7, alínea c) + + + + + Art. 78º, nº 7, alínea d) + + + + + Art. 78º, nº 8, alínea b) + + + + Art. 78º, nº 8, alínea c) + + + + Art. 78º, nº 8, alínea d) + + + + + Art. 78º, nº 8, alínea e) + + + + Art. 78º, nº 12 + + + + Art. 78º-A, nº 2, alínea a) + + + + Art. 78º-A, nº 4, alínea a) + + + + Art. 78º-A, nº 4, alínea b) + + + + Art. 78º-A, nº 4, alínea c) + + + + Art. 78º-A, nº 4, alínea d) + + + + Art. 78º-B, nº 4 + + + + Art. 78º-C, nº 1 + + + + Art. 78º-C, nº 3 + + + + diff --git a/l10n_pt_vat/models/__init__.py b/l10n_pt_vat/models/__init__.py new file mode 100644 index 00000000..bcaa4a81 --- /dev/null +++ b/l10n_pt_vat/models/__init__.py @@ -0,0 +1,24 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# Odoo, Open Source Management Solution +# Copyright (C) 2014- Sossia, Lda. () +# Copyright (C) 2004 OpenERP SA () +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## + +from . import account_invoice +from . import vat_adjustment_norm diff --git a/l10n_pt_vat/models/account_invoice.py b/l10n_pt_vat/models/account_invoice.py new file mode 100644 index 00000000..9e46aff4 --- /dev/null +++ b/l10n_pt_vat/models/account_invoice.py @@ -0,0 +1,31 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# Copyright (C) 2014- Sossia, Lda. () +# Copyright (C) 2004 OpenERP SA () +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## + +from openerp import models, fields + + +class AccountInvoice(models.Model): + _inherit = 'account.invoice' + + # VAT Adjustment Norm (Fields 40/41 of the VAT Statement) + vat_adjustment_norm_id = fields.Many2one( + 'account.vat.adjustment_norm', + string='VAT Adjustment Norm',) diff --git a/l10n_pt_vat/models/vat_adjustment_norm.py b/l10n_pt_vat/models/vat_adjustment_norm.py new file mode 100644 index 00000000..5f8dd241 --- /dev/null +++ b/l10n_pt_vat/models/vat_adjustment_norm.py @@ -0,0 +1,71 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# Odoo, Open Source Management Solution +# Copyright (C) 2014- Sossia, Lda. () +# Copyright (C) 2004 OpenERP SA () +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## + +from openerp import api, models, fields +from openerp import exceptions + +# +# VAT Adjustment Norm (Fields 40/41 of the VAT Statement) +# + + +class account_vat_adjustment_norm(models.Model): + _name = "account.vat.adjustment_norm" + _description = "VAT Adjustment Norm" + + name = fields.Char( + string='Name', + required=True) + + active = fields.Boolean( + string='Active', + help="If the active field is set to False, it " + "will allow you to hide the adjustment norm without removing it.") + + note = fields.Text( + string='Description', + translate=True) + + out_refunds = fields.Boolean( + string='Use on company refunds', + help="If True, it will allow you to apply the adjustment" + "norm to your company refunds.") + + in_refunds = fields.Boolean( + string='Use on third party refunds', + help="If True, it will allow you to apply the adjustment" + "norm to third party companies refunds.") + + _defaults = { + 'active': True, + } + + @api.multi + def unlink(self): + inv_obj = self.env['account.invoice'] + rule_ranges = inv_obj.search( + [('vat_adjustment_norm_id', 'in', self.ids)]) + if rule_ranges: + raise exceptions.Warning("Couldn't delete the adjustment norms" + "because they are still referenced in" + "refunds.") + return super(account_vat_adjustment_norm, self).unlink() diff --git a/l10n_pt_vat/security/ir.model.access.csv b/l10n_pt_vat/security/ir.model.access.csv new file mode 100644 index 00000000..cf44198a --- /dev/null +++ b/l10n_pt_vat/security/ir.model.access.csv @@ -0,0 +1,3 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +access_account_vat_adjustment_norm,account.vat.adjustment_norm,model_account_vat_adjustment_norm,account.group_account_user,1,0,0,0 +access_account_vat_adjustment_norm_manager,account.vat.adjustment_norm,model_account_vat_adjustment_norm,account.group_account_manager,1,1,1,1 diff --git a/l10n_pt_vat/static/description/icon.png b/l10n_pt_vat/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..67ed24357f8e5c84b9cf23ee8753e27f85b6cabf GIT binary patch literal 3019 zcmV;+3pDhJP)Q_IH4n@={*P-&rV44(2*#=@-0LEL{K~HsQv%b=lGJe=D>%eswUPJQeP^*{42O zvpt3HANU=HPnrrFfw4B;iLEU#XhIw92wCDW*u==ArmkT{!j)Sj`TES<3&|M=v$IPN zq5RyF7g_@>#s*xhtga(nrCHiSBBK*zvzBZ=3(JX)FD?M%0?tRpTqd>R2GX4*rrx2a zEeeUja4+r)2LR7&aS(?3nCaO}@$-9sVuBhWePjxB#?^t*;T^f91{}B4bM zZ#J-pnGOO)QCR)q%mEfd2j5tvrt45bv-43WN{EcZ{ zCjfx+C>u0OTac2L2~enj_+g}W0000Zn>hf6svCfWE4MM�YM#JOBXybq5?jlK?#q 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 N002ovPDHLkV1jV0npFS* literal 0 HcmV?d00001 diff --git a/l10n_pt_vat/views/account_invoice_view.xml b/l10n_pt_vat/views/account_invoice_view.xml new file mode 100644 index 00000000..b4dbbae8 --- /dev/null +++ b/l10n_pt_vat/views/account_invoice_view.xml @@ -0,0 +1,42 @@ + + + + + + + Account Invoice + account.invoice + + + + + + + + + + + + + + Account Invoice + account.invoice + + + + + + + + + + + + + + + diff --git a/l10n_pt_vat/views/vat_adjustment_norm_view.xml b/l10n_pt_vat/views/vat_adjustment_norm_view.xml new file mode 100644 index 00000000..f5a2104b --- /dev/null +++ b/l10n_pt_vat/views/vat_adjustment_norm_view.xml @@ -0,0 +1,76 @@ + + + + + + + + account.vat.adjustment_norm.search + account.vat.adjustment_norm + + + + + + + + + account.vat.adjustment_norm.tree + account.vat.adjustment_norm + child_ids + 100 + + + + + + + + + account.vat.adjustment_norm.form + account.vat.adjustment_norm + +
+ + + + + + + + + +
+
+
+ + VAT Adjustment Norm + account.vat.adjustment_norm + form + tree,form + + + + + VAT Adjustment Norms + account.vat.adjustment_norm + form + tree,form + + + + + + + + +
+
+ + From f6d8cb10133eb4559e36cf97946d186a9ebf29f6 Mon Sep 17 00:00:00 2001 From: Pedro Castro Silva Date: Mon, 12 Oct 2015 18:16:48 +0100 Subject: [PATCH 002/157] [FIX] all the modifications that Daniel Reis kindly suggested --- l10n_pt_vat/README.rst | 2 +- l10n_pt_vat/__init__.py | 1 - l10n_pt_vat/__openerp__.py | 3 +- l10n_pt_vat/data/vat_adjustment_norm.xml | 76 +++++----- l10n_pt_vat/models/__init__.py | 1 - l10n_pt_vat/models/vat_adjustment_norm.py | 7 +- l10n_pt_vat/views/account_invoice_view.xml | 64 ++++----- .../views/vat_adjustment_norm_view.xml | 130 +++++++++--------- 8 files changed, 139 insertions(+), 145 deletions(-) diff --git a/l10n_pt_vat/README.rst b/l10n_pt_vat/README.rst index a552be99..8ea4ce04 100644 --- a/l10n_pt_vat/README.rst +++ b/l10n_pt_vat/README.rst @@ -16,7 +16,7 @@ Contributors ------------ - Pedro Castro Silva (Sossia) -- Odoo Community Association (OCA) + Maintainer ---------- diff --git a/l10n_pt_vat/__init__.py b/l10n_pt_vat/__init__.py index 77bbdbd3..cde864ba 100644 --- a/l10n_pt_vat/__init__.py +++ b/l10n_pt_vat/__init__.py @@ -1,4 +1,3 @@ # -*- coding: utf-8 -*- from . import models - diff --git a/l10n_pt_vat/__openerp__.py b/l10n_pt_vat/__openerp__.py index 5970514d..6e00248d 100644 --- a/l10n_pt_vat/__openerp__.py +++ b/l10n_pt_vat/__openerp__.py @@ -3,7 +3,6 @@ # # Odoo, Open Source Management Solution # Copyright (C) 2014- Sossia, Lda. () -# Copyright (C) 2004 OpenERP SA () # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as @@ -22,7 +21,7 @@ { "name": "Portugal - IVA", - "version": "0.2", + "version": "8.0.0.0.2", "depends": ['account', 'base_vat'], "author": "Sossia, Odoo Community Association (OCA)", "summary": "Portuguese VAT requirements extensions", diff --git a/l10n_pt_vat/data/vat_adjustment_norm.xml b/l10n_pt_vat/data/vat_adjustment_norm.xml index 1c5c4a08..803c14fe 100644 --- a/l10n_pt_vat/data/vat_adjustment_norm.xml +++ b/l10n_pt_vat/data/vat_adjustment_norm.xml @@ -6,95 +6,95 @@ VAT Adjustment Norm (Fields 40/41 of the VAT Statement) --> - Art. 78º, nº 2 + Art. 78º, nº 2 - Art. 78º, nº 3 + Art. 78º, nº 3 - Art. 78º, nº 4 + Art. 78º, nº 4 - Art. 78º, nº 6 + Art. 78º, nº 6 - Art. 78º, nº 7, alínea a) + Art. 78º, nº 7, alínea a) - Art. 78º, nº 7, alínea b) + Art. 78º, nº 7, alínea b) - Art. 78º, nº 7, alínea c) + Art. 78º, nº 7, alínea c) - Art. 78º, nº 7, alínea d) + Art. 78º, nº 7, alínea d) - Art. 78º, nº 8, alínea b) + Art. 78º, nº 8, alínea b) - Art. 78º, nº 8, alínea c) + Art. 78º, nº 8, alínea c) - - Art. 78º, nº 8, alínea d) - + + Art. 78º, nº 8, alínea d) + - - Art. 78º, nº 8, alínea e) + + Art. 78º, nº 8, alínea e) - - Art. 78º, nº 12 - + + Art. 78º, nº 12 + - - Art. 78º-A, nº 2, alínea a) - + + Art. 78º-A, nº 2, alínea a) + - - Art. 78º-A, nº 4, alínea a) + + Art. 78º-A, nº 4, alínea a) - - Art. 78º-A, nº 4, alínea b) + + Art. 78º-A, nº 4, alínea b) - - Art. 78º-A, nº 4, alínea c) + + Art. 78º-A, nº 4, alínea c) - - Art. 78º-A, nº 4, alínea d) + + Art. 78º-A, nº 4, alínea d) - - Art. 78º-B, nº 4 - + + Art. 78º-B, nº 4 + - - Art. 78º-C, nº 1 - + + Art. 78º-C, nº 1 + - - Art. 78º-C, nº 3 - + + Art. 78º-C, nº 3 + diff --git a/l10n_pt_vat/models/__init__.py b/l10n_pt_vat/models/__init__.py index bcaa4a81..91e02c69 100644 --- a/l10n_pt_vat/models/__init__.py +++ b/l10n_pt_vat/models/__init__.py @@ -3,7 +3,6 @@ # # Odoo, Open Source Management Solution # Copyright (C) 2014- Sossia, Lda. () -# Copyright (C) 2004 OpenERP SA () # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as diff --git a/l10n_pt_vat/models/vat_adjustment_norm.py b/l10n_pt_vat/models/vat_adjustment_norm.py index 5f8dd241..858f499a 100644 --- a/l10n_pt_vat/models/vat_adjustment_norm.py +++ b/l10n_pt_vat/models/vat_adjustment_norm.py @@ -23,12 +23,9 @@ from openerp import api, models, fields from openerp import exceptions -# -# VAT Adjustment Norm (Fields 40/41 of the VAT Statement) -# - - class account_vat_adjustment_norm(models.Model): + "VAT Adjustment Norm (Fields 40/41 of the VAT Statement)" + _name = "account.vat.adjustment_norm" _description = "VAT Adjustment Norm" diff --git a/l10n_pt_vat/views/account_invoice_view.xml b/l10n_pt_vat/views/account_invoice_view.xml index b4dbbae8..f46c2bfe 100644 --- a/l10n_pt_vat/views/account_invoice_view.xml +++ b/l10n_pt_vat/views/account_invoice_view.xml @@ -2,39 +2,39 @@ - - - Account Invoice - account.invoice - - - - - - - - - - + + + Account Invoice + account.invoice + + + + + + + + + + - - - Account Invoice - account.invoice - - - - - - - - - - + + + Account Invoice + account.invoice + + + + + + + + + + diff --git a/l10n_pt_vat/views/vat_adjustment_norm_view.xml b/l10n_pt_vat/views/vat_adjustment_norm_view.xml index f5a2104b..8ab0491b 100644 --- a/l10n_pt_vat/views/vat_adjustment_norm_view.xml +++ b/l10n_pt_vat/views/vat_adjustment_norm_view.xml @@ -2,73 +2,73 @@ - - - - account.vat.adjustment_norm.search - account.vat.adjustment_norm - - - - - - - - - account.vat.adjustment_norm.tree - account.vat.adjustment_norm - child_ids - 100 - - - - - - - - - account.vat.adjustment_norm.form - account.vat.adjustment_norm - -
- - - - - - - - - -
-
-
- - VAT Adjustment Norm - account.vat.adjustment_norm - form - tree,form - - - - - VAT Adjustment Norms - account.vat.adjustment_norm - form - tree,form - - - + + + + account.vat.adjustment_norm.search + account.vat.adjustment_norm + + + + + + + + + account.vat.adjustment_norm.tree + account.vat.adjustment_norm + child_ids + 100 + + + + + + + + + account.vat.adjustment_norm.form + account.vat.adjustment_norm + +
+ + + + + + + + + +
+
+
+ + VAT Adjustment Norm + account.vat.adjustment_norm + form + tree,form + + - + + VAT Adjustment Norms + account.vat.adjustment_norm + form + tree,form + + + - + + +
From d5315514ce2c3da3f3bb74bf34d8e7e6b7d7f7f5 Mon Sep 17 00:00:00 2001 From: Pedro Castro Silva Date: Mon, 12 Oct 2015 19:38:32 +0100 Subject: [PATCH 003/157] [FIX] replace deprecated col attribute --- l10n_pt_vat/views/vat_adjustment_norm_view.xml | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/l10n_pt_vat/views/vat_adjustment_norm_view.xml b/l10n_pt_vat/views/vat_adjustment_norm_view.xml index 8ab0491b..ed1849fb 100644 --- a/l10n_pt_vat/views/vat_adjustment_norm_view.xml +++ b/l10n_pt_vat/views/vat_adjustment_norm_view.xml @@ -31,14 +31,16 @@ account.vat.adjustment_norm
- - - - - - - + + + + + + + + +
From 387ae058ccd6fac895b9dd65afbb2113125c4882 Mon Sep 17 00:00:00 2001 From: Pedro Castro Silva Date: Tue, 13 Oct 2015 09:41:31 +0100 Subject: [PATCH 004/157] test_flake8 cleaning --- l10n_pt_vat/__openerp__.py | 33 ++++++++++++----------- l10n_pt_vat/models/vat_adjustment_norm.py | 2 +- 2 files changed, 18 insertions(+), 17 deletions(-) diff --git a/l10n_pt_vat/__openerp__.py b/l10n_pt_vat/__openerp__.py index 6e00248d..1130c59e 100644 --- a/l10n_pt_vat/__openerp__.py +++ b/l10n_pt_vat/__openerp__.py @@ -20,20 +20,21 @@ ############################################################################## { - "name": "Portugal - IVA", - "version": "8.0.0.0.2", - "depends": ['account', 'base_vat'], - "author": "Sossia, Odoo Community Association (OCA)", - "summary": "Portuguese VAT requirements extensions", - "website": "http://www.sossia.pt", - "category": "Accounting & Finance", - "data": [ - "security/ir.model.access.csv", - "data/vat_adjustment_norm.xml", - "views/vat_adjustment_norm_view.xml", - "views/account_invoice_view.xml", - ], - "installable": True, - "auto_install": False, - "application": False, + "name": "Portugal - IVA", + "version": "8.0.0.0.2", + "license": "AGPL-3", + "depends": ['account', 'base_vat'], + "author": "Sossia, Odoo Community Association (OCA)", + "summary": "Portuguese VAT requirements extensions", + "website": "http://www.sossia.pt", + "category": "Accounting & Finance", + "data": [ + "security/ir.model.access.csv", + "data/vat_adjustment_norm.xml", + "views/vat_adjustment_norm_view.xml", + "views/account_invoice_view.xml", + ], + "installable": True, + "auto_install": False, + "application": False, } diff --git a/l10n_pt_vat/models/vat_adjustment_norm.py b/l10n_pt_vat/models/vat_adjustment_norm.py index 858f499a..213f04fc 100644 --- a/l10n_pt_vat/models/vat_adjustment_norm.py +++ b/l10n_pt_vat/models/vat_adjustment_norm.py @@ -23,7 +23,7 @@ from openerp import api, models, fields from openerp import exceptions -class account_vat_adjustment_norm(models.Model): +class AccountVATAdjustmentNorm(models.Model): "VAT Adjustment Norm (Fields 40/41 of the VAT Statement)" _name = "account.vat.adjustment_norm" From 5d35d8ab4bb1940773d652c7234701017d8ade82 Mon Sep 17 00:00:00 2001 From: Pedro Castro Silva Date: Tue, 13 Oct 2015 10:46:30 +0100 Subject: [PATCH 005/157] test_flake8 cleaning --- l10n_pt_vat/__openerp__.py | 34 +++++++++++------------ l10n_pt_vat/models/vat_adjustment_norm.py | 4 +-- 2 files changed, 19 insertions(+), 19 deletions(-) diff --git a/l10n_pt_vat/__openerp__.py b/l10n_pt_vat/__openerp__.py index 1130c59e..ab0d69ca 100644 --- a/l10n_pt_vat/__openerp__.py +++ b/l10n_pt_vat/__openerp__.py @@ -20,21 +20,21 @@ ############################################################################## { - "name": "Portugal - IVA", - "version": "8.0.0.0.2", - "license": "AGPL-3", - "depends": ['account', 'base_vat'], - "author": "Sossia, Odoo Community Association (OCA)", - "summary": "Portuguese VAT requirements extensions", - "website": "http://www.sossia.pt", - "category": "Accounting & Finance", - "data": [ - "security/ir.model.access.csv", - "data/vat_adjustment_norm.xml", - "views/vat_adjustment_norm_view.xml", - "views/account_invoice_view.xml", - ], - "installable": True, - "auto_install": False, - "application": False, + "name": "Portugal - IVA", + "version": "8.0.0.0.2", + "license": "AGPL-3", + "depends": ['account', 'base_vat'], + "author": "Sossia, Odoo Community Association (OCA)", + "summary": "Portuguese VAT requirements extensions", + "website": "http://www.sossia.pt", + "category": "Accounting & Finance", + "data": [ + "security/ir.model.access.csv", + "data/vat_adjustment_norm.xml", + "views/vat_adjustment_norm_view.xml", + "views/account_invoice_view.xml", + ], + "installable": True, + "auto_install": False, + "application": False, } diff --git a/l10n_pt_vat/models/vat_adjustment_norm.py b/l10n_pt_vat/models/vat_adjustment_norm.py index 213f04fc..9a68d92f 100644 --- a/l10n_pt_vat/models/vat_adjustment_norm.py +++ b/l10n_pt_vat/models/vat_adjustment_norm.py @@ -24,7 +24,7 @@ from openerp import exceptions class AccountVATAdjustmentNorm(models.Model): - "VAT Adjustment Norm (Fields 40/41 of the VAT Statement)" + "Support fields 40/41 of the VAT Statement)" _name = "account.vat.adjustment_norm" _description = "VAT Adjustment Norm" @@ -65,4 +65,4 @@ def unlink(self): raise exceptions.Warning("Couldn't delete the adjustment norms" "because they are still referenced in" "refunds.") - return super(account_vat_adjustment_norm, self).unlink() + return super(AccountVATAdjustmentNorm, self).unlink() From d8918e8c9c59a20097f7bb9023d19bf6a6732051 Mon Sep 17 00:00:00 2001 From: Pedro Castro Silva Date: Tue, 13 Oct 2015 11:20:34 +0100 Subject: [PATCH 006/157] test_flake8 cleaning --- l10n_pt_vat/models/vat_adjustment_norm.py | 1 + 1 file changed, 1 insertion(+) diff --git a/l10n_pt_vat/models/vat_adjustment_norm.py b/l10n_pt_vat/models/vat_adjustment_norm.py index 9a68d92f..4a893178 100644 --- a/l10n_pt_vat/models/vat_adjustment_norm.py +++ b/l10n_pt_vat/models/vat_adjustment_norm.py @@ -23,6 +23,7 @@ from openerp import api, models, fields from openerp import exceptions + class AccountVATAdjustmentNorm(models.Model): "Support fields 40/41 of the VAT Statement)" From 6e7e774e169f8f48bfb0582bd10bf119648d9721 Mon Sep 17 00:00:00 2001 From: Pedro Castro Silva Date: Fri, 30 Oct 2015 02:17:06 +0000 Subject: [PATCH 007/157] [FIX] minor adjustments --- l10n_pt_vat/data/vat_adjustment_norm.xml | 4 ++-- l10n_pt_vat/models/account_invoice.py | 3 ++- l10n_pt_vat/models/vat_adjustment_norm.py | 16 +--------------- l10n_pt_vat/views/account_invoice_view.xml | 6 ++---- l10n_pt_vat/views/vat_adjustment_norm_view.xml | 5 ++--- 5 files changed, 9 insertions(+), 25 deletions(-) diff --git a/l10n_pt_vat/data/vat_adjustment_norm.xml b/l10n_pt_vat/data/vat_adjustment_norm.xml index 803c14fe..bc78bb04 100644 --- a/l10n_pt_vat/data/vat_adjustment_norm.xml +++ b/l10n_pt_vat/data/vat_adjustment_norm.xml @@ -1,5 +1,5 @@ - + @@ -37,6 +37,4 @@
- - - + diff --git a/l10n_pt_vat/views/vat_adjustment_norm_view.xml b/l10n_pt_vat/views/vat_adjustment_norm_view.xml index ed1849fb..503a1338 100644 --- a/l10n_pt_vat/views/vat_adjustment_norm_view.xml +++ b/l10n_pt_vat/views/vat_adjustment_norm_view.xml @@ -1,5 +1,5 @@ - + @@ -73,6 +73,5 @@ sequence="30"/> - - + From 73624c7165db0e0b6eb0a516e983097305c5dd0e Mon Sep 17 00:00:00 2001 From: Pedro Castro Silva Date: Fri, 30 Oct 2015 03:50:57 +0000 Subject: [PATCH 008/157] [FIX] minor adjustments --- l10n_pt_vat/data/vat_adjustment_norm.xml | 4 ++-- l10n_pt_vat/models/vat_adjustment_norm.py | 3 +-- l10n_pt_vat/views/account_invoice_view.xml | 4 ++-- l10n_pt_vat/views/vat_adjustment_norm_view.xml | 5 ++--- 4 files changed, 7 insertions(+), 9 deletions(-) diff --git a/l10n_pt_vat/data/vat_adjustment_norm.xml b/l10n_pt_vat/data/vat_adjustment_norm.xml index bc78bb04..803c14fe 100644 --- a/l10n_pt_vat/data/vat_adjustment_norm.xml +++ b/l10n_pt_vat/data/vat_adjustment_norm.xml @@ -1,5 +1,5 @@ - + @@ -37,4 +37,4 @@
- + diff --git a/l10n_pt_vat/views/vat_adjustment_norm_view.xml b/l10n_pt_vat/views/vat_adjustment_norm_view.xml index 503a1338..e19cf41a 100644 --- a/l10n_pt_vat/views/vat_adjustment_norm_view.xml +++ b/l10n_pt_vat/views/vat_adjustment_norm_view.xml @@ -1,5 +1,5 @@ - + @@ -73,5 +73,4 @@ sequence="30"/> - - + From 5ec9e960364e30c897f1b82a3b7559d5b1ab8d62 Mon Sep 17 00:00:00 2001 From: Pedro Castro Silva Date: Wed, 18 Nov 2015 15:11:52 +0000 Subject: [PATCH 009/157] portuguese translation --- l10n_pt_vat/README.rst | 2 +- l10n_pt_vat/__openerp__.py | 8 +- l10n_pt_vat/i18n/l10n_pt_vat.pot | 109 ++++++++++++++++++++++ l10n_pt_vat/i18n/pt.po | 109 ++++++++++++++++++++++ l10n_pt_vat/models/vat_adjustment_norm.py | 4 +- 5 files changed, 225 insertions(+), 7 deletions(-) create mode 100644 l10n_pt_vat/i18n/l10n_pt_vat.pot create mode 100644 l10n_pt_vat/i18n/pt.po diff --git a/l10n_pt_vat/README.rst b/l10n_pt_vat/README.rst index 8ea4ce04..60353ef4 100644 --- a/l10n_pt_vat/README.rst +++ b/l10n_pt_vat/README.rst @@ -15,7 +15,7 @@ Credits Contributors ------------ -- Pedro Castro Silva (Sossia) +- Pedro Castro Silva (`Sossia `_) Maintainer diff --git a/l10n_pt_vat/__openerp__.py b/l10n_pt_vat/__openerp__.py index ab0d69ca..34026077 100644 --- a/l10n_pt_vat/__openerp__.py +++ b/l10n_pt_vat/__openerp__.py @@ -21,18 +21,18 @@ { "name": "Portugal - IVA", - "version": "8.0.0.0.2", + "version": "8.0.0.0.3", "license": "AGPL-3", "depends": ['account', 'base_vat'], "author": "Sossia, Odoo Community Association (OCA)", "summary": "Portuguese VAT requirements extensions", - "website": "http://www.sossia.pt", - "category": "Accounting & Finance", + "website": "https://github.com/OCA/l10n-portugal", + "category": "Localisation/Europe", "data": [ "security/ir.model.access.csv", "data/vat_adjustment_norm.xml", "views/vat_adjustment_norm_view.xml", - "views/account_invoice_view.xml", + "views/account_invoice_view.xml", ], "installable": True, "auto_install": False, diff --git a/l10n_pt_vat/i18n/l10n_pt_vat.pot b/l10n_pt_vat/i18n/l10n_pt_vat.pot new file mode 100644 index 00000000..11fb8d66 --- /dev/null +++ b/l10n_pt_vat/i18n/l10n_pt_vat.pot @@ -0,0 +1,109 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * l10n_pt_vat +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 8.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-11-18 15:02+0000\n" +"PO-Revision-Date: 2015-11-18 15:02+0000\n" +"Last-Translator: <>\n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: l10n_pt_vat +#: field:account.vat.adjustment_norm,active:0 +msgid "Active" +msgstr "" + +#. module: l10n_pt_vat +#: field:account.vat.adjustment_norm,create_uid:0 +msgid "Created by" +msgstr "" + +#. module: l10n_pt_vat +#: field:account.vat.adjustment_norm,create_date:0 +msgid "Created on" +msgstr "" + +#. module: l10n_pt_vat +#: field:account.vat.adjustment_norm,note:0 +msgid "Description" +msgstr "" + +#. module: l10n_pt_vat +#: field:account.vat.adjustment_norm,id:0 +msgid "ID" +msgstr "" + +#. module: l10n_pt_vat +#: help:account.vat.adjustment_norm,in_refunds:0 +msgid "If True, it will allow you to apply the adjustment norm to third party companies refunds." +msgstr "" + +#. module: l10n_pt_vat +#: help:account.vat.adjustment_norm,out_refunds:0 +msgid "If True, it will allow you to apply the adjustment norm to your company refunds." +msgstr "" + +#. module: l10n_pt_vat +#: help:account.vat.adjustment_norm,active:0 +msgid "If the active field is set to False, it will allow you to hide the adjustment norm without removing it." +msgstr "" + +#. module: l10n_pt_vat +#: model:ir.model,name:l10n_pt_vat.model_account_invoice +msgid "Invoice" +msgstr "" + +#. module: l10n_pt_vat +#: field:account.vat.adjustment_norm,write_uid:0 +msgid "Last Updated by" +msgstr "" + +#. module: l10n_pt_vat +#: field:account.vat.adjustment_norm,write_date:0 +msgid "Last Updated on" +msgstr "" + +#. module: l10n_pt_vat +#: view:account.vat.adjustment_norm:l10n_pt_vat.vat_adjustment_norm_view_form +msgid "Legal Norm (ex: Art. 78º, nº 8, alínea b)) ..." +msgstr "" + +#. module: l10n_pt_vat +#: field:account.vat.adjustment_norm,name:0 +msgid "Name" +msgstr "" + +#. module: l10n_pt_vat +#: field:account.vat.adjustment_norm,out_refunds:0 +msgid "Use on company refunds" +msgstr "" + +#. module: l10n_pt_vat +#: field:account.vat.adjustment_norm,in_refunds:0 +msgid "Use on third party refunds" +msgstr "" + +#. module: l10n_pt_vat +#: field:account.invoice,vat_adjustment_norm_id:0 +#: view:account.vat.adjustment_norm:l10n_pt_vat.vat_adjustment_norm_view_form +#: view:account.vat.adjustment_norm:l10n_pt_vat.vat_adjustment_norm_view_search +#: view:account.vat.adjustment_norm:l10n_pt_vat.vat_adjustment_norm_view_tree +#: model:ir.actions.act_window,name:l10n_pt_vat.action_vat_adjustment_norm_form +#: model:ir.model,name:l10n_pt_vat.model_account_vat_adjustment_norm +#: model:ir.ui.menu,name:l10n_pt_vat.menu_action_vat_adjustment_norm_form +msgid "VAT Adjustment Norm" +msgstr "" + +#. module: l10n_pt_vat +#: model:ir.actions.act_window,name:l10n_pt_vat.vat_adjustment_norm_action_list +#: model:ir.ui.menu,name:l10n_pt_vat.menu_action_vat_adjustment_norm_list +msgid "VAT Adjustment Norms" +msgstr "" + diff --git a/l10n_pt_vat/i18n/pt.po b/l10n_pt_vat/i18n/pt.po new file mode 100644 index 00000000..28010030 --- /dev/null +++ b/l10n_pt_vat/i18n/pt.po @@ -0,0 +1,109 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * l10n_pt_vat +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 8.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-11-18 15:02+0000\n" +"PO-Revision-Date: 2015-11-18 15:02+0000\n" +"Last-Translator: <>\n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: l10n_pt_vat +#: field:account.vat.adjustment_norm,active:0 +msgid "Active" +msgstr "Ativo" + +#. module: l10n_pt_vat +#: field:account.vat.adjustment_norm,create_uid:0 +msgid "Created by" +msgstr "Criado por" + +#. module: l10n_pt_vat +#: field:account.vat.adjustment_norm,create_date:0 +msgid "Created on" +msgstr "Criado em" + +#. module: l10n_pt_vat +#: field:account.vat.adjustment_norm,note:0 +msgid "Description" +msgstr "Descrição" + +#. module: l10n_pt_vat +#: field:account.vat.adjustment_norm,id:0 +msgid "ID" +msgstr "ID" + +#. module: l10n_pt_vat +#: help:account.vat.adjustment_norm,in_refunds:0 +msgid "If True, it will allow you to apply the adjustment norm to third party companies refunds." +msgstr "Se assinalado, poderá aplicar a norma de regularização a notas de crédito de terceiros" + +#. module: l10n_pt_vat +#: help:account.vat.adjustment_norm,out_refunds:0 +msgid "If True, it will allow you to apply the adjustment norm to your company refunds." +msgstr "Se assinalado, poderá aplicar a norma de regularização às suas notas de crédito" + +#. module: l10n_pt_vat +#: help:account.vat.adjustment_norm,active:0 +msgid "If the active field is set to False, it will allow you to hide the adjustment norm without removing it." +msgstr "Se o campo Ativo não estiver assinalado, poderá esconder a norma de regularização sem a remover." + +#. module: l10n_pt_vat +#: model:ir.model,name:l10n_pt_vat.model_account_invoice +msgid "Invoice" +msgstr "Fatura" + +#. module: l10n_pt_vat +#: field:account.vat.adjustment_norm,write_uid:0 +msgid "Last Updated by" +msgstr "Atualizado pela últ. vez por" + +#. module: l10n_pt_vat +#: field:account.vat.adjustment_norm,write_date:0 +msgid "Last Updated on" +msgstr "Atualizado pela últ. vez em" + +#. module: l10n_pt_vat +#: view:account.vat.adjustment_norm:l10n_pt_vat.vat_adjustment_norm_view_form +msgid "Legal Norm (ex: Art. 78º, nº 8, alínea b)) ..." +msgstr "Norma de Regularização Legal (ex: Art. 78º, nº 8, alínea b)) ..." + +#. module: l10n_pt_vat +#: field:account.vat.adjustment_norm,name:0 +msgid "Name" +msgstr "Nome" + +#. module: l10n_pt_vat +#: field:account.vat.adjustment_norm,out_refunds:0 +msgid "Use on company refunds" +msgstr "Utilizar em notas de crédito próprias" + +#. module: l10n_pt_vat +#: field:account.vat.adjustment_norm,in_refunds:0 +msgid "Use on third party refunds" +msgstr "Utilizar em notas de crédito de terceiros" + +#. module: l10n_pt_vat +#: field:account.invoice,vat_adjustment_norm_id:0 +#: view:account.vat.adjustment_norm:l10n_pt_vat.vat_adjustment_norm_view_form +#: view:account.vat.adjustment_norm:l10n_pt_vat.vat_adjustment_norm_view_search +#: view:account.vat.adjustment_norm:l10n_pt_vat.vat_adjustment_norm_view_tree +#: model:ir.actions.act_window,name:l10n_pt_vat.action_vat_adjustment_norm_form +#: model:ir.model,name:l10n_pt_vat.model_account_vat_adjustment_norm +#: model:ir.ui.menu,name:l10n_pt_vat.menu_action_vat_adjustment_norm_form +msgid "VAT Adjustment Norm" +msgstr "" + +#. module: l10n_pt_vat +#: model:ir.actions.act_window,name:l10n_pt_vat.vat_adjustment_norm_action_list +#: model:ir.ui.menu,name:l10n_pt_vat.menu_action_vat_adjustment_norm_list +msgid "VAT Adjustment Norms" +msgstr "" + diff --git a/l10n_pt_vat/models/vat_adjustment_norm.py b/l10n_pt_vat/models/vat_adjustment_norm.py index 737ccf9f..a0fad23f 100644 --- a/l10n_pt_vat/models/vat_adjustment_norm.py +++ b/l10n_pt_vat/models/vat_adjustment_norm.py @@ -45,10 +45,10 @@ class AccountVATAdjustmentNorm(models.Model): out_refunds = fields.Boolean( string='Use on company refunds', - help="If True, it will allow you to apply the adjustment" + help="If True, it will allow you to apply the adjustment " "norm to your company refunds.") in_refunds = fields.Boolean( string='Use on third party refunds', - help="If True, it will allow you to apply the adjustment" + help="If True, it will allow you to apply the adjustment " "norm to third party companies refunds.") From 9290be3a7383407151689bf45f41fc3918f932fb Mon Sep 17 00:00:00 2001 From: Pedro Castro Silva Date: Wed, 18 Nov 2015 17:28:57 +0000 Subject: [PATCH 010/157] [FIX] new module category --- l10n_pt_vat/__openerp__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/l10n_pt_vat/__openerp__.py b/l10n_pt_vat/__openerp__.py index 34026077..e7511db2 100644 --- a/l10n_pt_vat/__openerp__.py +++ b/l10n_pt_vat/__openerp__.py @@ -27,7 +27,7 @@ "author": "Sossia, Odoo Community Association (OCA)", "summary": "Portuguese VAT requirements extensions", "website": "https://github.com/OCA/l10n-portugal", - "category": "Localisation/Europe", + "category": "Localization/Portugal", "data": [ "security/ir.model.access.csv", "data/vat_adjustment_norm.xml", From 29da4c1a5a7468deddf3784969b886014b333826 Mon Sep 17 00:00:00 2001 From: Pedro Castro Silva Date: Wed, 18 Nov 2015 18:53:38 +0000 Subject: [PATCH 011/157] module category correction --- l10n_pt_vat/__openerp__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/l10n_pt_vat/__openerp__.py b/l10n_pt_vat/__openerp__.py index e7511db2..102ea0c2 100644 --- a/l10n_pt_vat/__openerp__.py +++ b/l10n_pt_vat/__openerp__.py @@ -27,7 +27,7 @@ "author": "Sossia, Odoo Community Association (OCA)", "summary": "Portuguese VAT requirements extensions", "website": "https://github.com/OCA/l10n-portugal", - "category": "Localization/Portugal", + "category": "Localisation/Portugal", "data": [ "security/ir.model.access.csv", "data/vat_adjustment_norm.xml", From bb8e5c4035dd79deba05c1cbb38dde1adc3e7590 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Bidoul=20=28ACSONE=29?= Date: Fri, 15 Jun 2018 23:26:00 +0200 Subject: [PATCH 012/157] remove obsolete .pot files [ci skip] --- l10n_pt_vat/i18n/l10n_pt_vat.pot | 109 ------------------------------- 1 file changed, 109 deletions(-) delete mode 100644 l10n_pt_vat/i18n/l10n_pt_vat.pot diff --git a/l10n_pt_vat/i18n/l10n_pt_vat.pot b/l10n_pt_vat/i18n/l10n_pt_vat.pot deleted file mode 100644 index 11fb8d66..00000000 --- a/l10n_pt_vat/i18n/l10n_pt_vat.pot +++ /dev/null @@ -1,109 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * l10n_pt_vat -# -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server 8.0\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-11-18 15:02+0000\n" -"PO-Revision-Date: 2015-11-18 15:02+0000\n" -"Last-Translator: <>\n" -"Language-Team: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Plural-Forms: \n" - -#. module: l10n_pt_vat -#: field:account.vat.adjustment_norm,active:0 -msgid "Active" -msgstr "" - -#. module: l10n_pt_vat -#: field:account.vat.adjustment_norm,create_uid:0 -msgid "Created by" -msgstr "" - -#. module: l10n_pt_vat -#: field:account.vat.adjustment_norm,create_date:0 -msgid "Created on" -msgstr "" - -#. module: l10n_pt_vat -#: field:account.vat.adjustment_norm,note:0 -msgid "Description" -msgstr "" - -#. module: l10n_pt_vat -#: field:account.vat.adjustment_norm,id:0 -msgid "ID" -msgstr "" - -#. module: l10n_pt_vat -#: help:account.vat.adjustment_norm,in_refunds:0 -msgid "If True, it will allow you to apply the adjustment norm to third party companies refunds." -msgstr "" - -#. module: l10n_pt_vat -#: help:account.vat.adjustment_norm,out_refunds:0 -msgid "If True, it will allow you to apply the adjustment norm to your company refunds." -msgstr "" - -#. module: l10n_pt_vat -#: help:account.vat.adjustment_norm,active:0 -msgid "If the active field is set to False, it will allow you to hide the adjustment norm without removing it." -msgstr "" - -#. module: l10n_pt_vat -#: model:ir.model,name:l10n_pt_vat.model_account_invoice -msgid "Invoice" -msgstr "" - -#. module: l10n_pt_vat -#: field:account.vat.adjustment_norm,write_uid:0 -msgid "Last Updated by" -msgstr "" - -#. module: l10n_pt_vat -#: field:account.vat.adjustment_norm,write_date:0 -msgid "Last Updated on" -msgstr "" - -#. module: l10n_pt_vat -#: view:account.vat.adjustment_norm:l10n_pt_vat.vat_adjustment_norm_view_form -msgid "Legal Norm (ex: Art. 78º, nº 8, alínea b)) ..." -msgstr "" - -#. module: l10n_pt_vat -#: field:account.vat.adjustment_norm,name:0 -msgid "Name" -msgstr "" - -#. module: l10n_pt_vat -#: field:account.vat.adjustment_norm,out_refunds:0 -msgid "Use on company refunds" -msgstr "" - -#. module: l10n_pt_vat -#: field:account.vat.adjustment_norm,in_refunds:0 -msgid "Use on third party refunds" -msgstr "" - -#. module: l10n_pt_vat -#: field:account.invoice,vat_adjustment_norm_id:0 -#: view:account.vat.adjustment_norm:l10n_pt_vat.vat_adjustment_norm_view_form -#: view:account.vat.adjustment_norm:l10n_pt_vat.vat_adjustment_norm_view_search -#: view:account.vat.adjustment_norm:l10n_pt_vat.vat_adjustment_norm_view_tree -#: model:ir.actions.act_window,name:l10n_pt_vat.action_vat_adjustment_norm_form -#: model:ir.model,name:l10n_pt_vat.model_account_vat_adjustment_norm -#: model:ir.ui.menu,name:l10n_pt_vat.menu_action_vat_adjustment_norm_form -msgid "VAT Adjustment Norm" -msgstr "" - -#. module: l10n_pt_vat -#: model:ir.actions.act_window,name:l10n_pt_vat.vat_adjustment_norm_action_list -#: model:ir.ui.menu,name:l10n_pt_vat.menu_action_vat_adjustment_norm_list -msgid "VAT Adjustment Norms" -msgstr "" - From 6a87c74b823caa283d23227eb24509dd5b456d68 Mon Sep 17 00:00:00 2001 From: Daniel Reis Date: Tue, 4 Feb 2020 23:57:43 +0000 Subject: [PATCH 013/157] [MIG] Migrate to 12.0 --- l10n_pt_vat/README.rst | 45 ++---- l10n_pt_vat/__init__.py | 2 - l10n_pt_vat/__manifest__.py | 20 +++ l10n_pt_vat/__openerp__.py | 40 ----- l10n_pt_vat/data/vat_adjustment_norm.xml | 152 +++++++++--------- l10n_pt_vat/models/__init__.py | 21 --- l10n_pt_vat/models/account_invoice.py | 35 ++-- l10n_pt_vat/models/vat_adjustment_norm.py | 49 ++---- l10n_pt_vat/readme/CONTRIBUTORS.rst | 2 + l10n_pt_vat/readme/DESCRIPTION.rst | 3 + l10n_pt_vat/readme/USAGE.rst | 1 + l10n_pt_vat/views/account_invoice_view.xml | 75 ++++----- .../views/vat_adjustment_norm_view.xml | 134 ++++++++------- 13 files changed, 238 insertions(+), 341 deletions(-) create mode 100644 l10n_pt_vat/__manifest__.py delete mode 100644 l10n_pt_vat/__openerp__.py create mode 100644 l10n_pt_vat/readme/CONTRIBUTORS.rst create mode 100644 l10n_pt_vat/readme/DESCRIPTION.rst create mode 100644 l10n_pt_vat/readme/USAGE.rst diff --git a/l10n_pt_vat/README.rst b/l10n_pt_vat/README.rst index 60353ef4..21cd7854 100644 --- a/l10n_pt_vat/README.rst +++ b/l10n_pt_vat/README.rst @@ -1,34 +1,21 @@ -.. image:: https://img.shields.io/badge/licence-AGPL--3-blue.svg - :alt: License: AGPL-3 +**This file is going to be generated by oca-gen-addon-readme.** -Portugal - VAT -=================================== +*Manual changes will be overwritten.* -This modules extends the base localization modules with a few VAT specific functions that are required by the Portuguese Tax Authorities, including: +Please provide content in the ``readme`` directory: -* The use of pre-defined legally accepted reasons for issuing credit notes, as required for fields 40/41 of the VAT statement (Portaria nº 255/2013). +* **DESCRIPTION.rst** (required) +* INSTALL.rst (optional) +* CONFIGURE.rst (optional) +* **USAGE.rst** (optional, highly recommended) +* DEVELOP.rst (optional) +* ROADMAP.rst (optional) +* HISTORY.rst (optional, recommended) +* **CONTRIBUTORS.rst** (optional, highly recommended) +* CREDITS.rst (optional) +Content of this README will also be drawn from the addon manifest, +from keys such as name, authors, maintainers, development_status, +and license. -Credits -======== - -Contributors ------------- - -- Pedro Castro Silva (`Sossia `_) - - -Maintainer ----------- - -.. image:: https://odoo-community.org/logo.png - :alt: Odoo Community Association - :target: https://odoo-community.org - -This module is maintained by the OCA. - -OCA, or the Odoo Community Association, is a nonprofit organization whose -mission is to support the collaborative development of Odoo features and -promote its widespread use. - -To contribute to this module, please visit http://odoo-community.org. +A good, one sentence summary in the manifest is also highly recommended. diff --git a/l10n_pt_vat/__init__.py b/l10n_pt_vat/__init__.py index cde864ba..0650744f 100644 --- a/l10n_pt_vat/__init__.py +++ b/l10n_pt_vat/__init__.py @@ -1,3 +1 @@ -# -*- coding: utf-8 -*- - from . import models diff --git a/l10n_pt_vat/__manifest__.py b/l10n_pt_vat/__manifest__.py new file mode 100644 index 00000000..67fd50d1 --- /dev/null +++ b/l10n_pt_vat/__manifest__.py @@ -0,0 +1,20 @@ +# Copyright (C) 2014- Sossia, Lda. () +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +{ + "name": "Portugal - IVA", + "version": "12.0.0.0.0", + "license": "AGPL-3", + "depends": ["account", "l10n_pt"], + "author": "Sossia, Odoo Community Association (OCA)", + "summary": "Portuguese VAT requirements extensions", + "website": "https://github.com/OCA/l10n-portugal", + "category": "Localisation/Portugal", + "data": [ + "security/ir.model.access.csv", + "data/vat_adjustment_norm.xml", + "views/vat_adjustment_norm_view.xml", + "views/account_invoice_view.xml", + ], + "installable": True, + "auto_install": True, +} diff --git a/l10n_pt_vat/__openerp__.py b/l10n_pt_vat/__openerp__.py deleted file mode 100644 index 102ea0c2..00000000 --- a/l10n_pt_vat/__openerp__.py +++ /dev/null @@ -1,40 +0,0 @@ -# -*- coding: utf-8 -*- -############################################################################## -# -# Odoo, Open Source Management Solution -# Copyright (C) 2014- Sossia, Lda. () -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as -# published by the Free Software Foundation, either version 3 of the -# License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Affero General Public License for more details. -# -# You should have received a copy of the GNU Affero General Public License -# along with this program. If not, see . -# -############################################################################## - -{ - "name": "Portugal - IVA", - "version": "8.0.0.0.3", - "license": "AGPL-3", - "depends": ['account', 'base_vat'], - "author": "Sossia, Odoo Community Association (OCA)", - "summary": "Portuguese VAT requirements extensions", - "website": "https://github.com/OCA/l10n-portugal", - "category": "Localisation/Portugal", - "data": [ - "security/ir.model.access.csv", - "data/vat_adjustment_norm.xml", - "views/vat_adjustment_norm_view.xml", - "views/account_invoice_view.xml", - ], - "installable": True, - "auto_install": False, - "application": False, -} diff --git a/l10n_pt_vat/data/vat_adjustment_norm.xml b/l10n_pt_vat/data/vat_adjustment_norm.xml index 803c14fe..f2c0ca02 100644 --- a/l10n_pt_vat/data/vat_adjustment_norm.xml +++ b/l10n_pt_vat/data/vat_adjustment_norm.xml @@ -1,100 +1,96 @@ - - - - + - Art. 78º, nº 2 - + Art. 78º, nº 2 + - Art. 78º, nº 3 - - + Art. 78º, nº 3 + + - Art. 78º, nº 4 - + Art. 78º, nº 4 + - Art. 78º, nº 6 - - + Art. 78º, nº 6 + + - Art. 78º, nº 7, alínea a) - - + Art. 78º, nº 7, alínea a) + + - Art. 78º, nº 7, alínea b) - - + Art. 78º, nº 7, alínea b) + + - Art. 78º, nº 7, alínea c) - - + Art. 78º, nº 7, alínea c) + + - Art. 78º, nº 7, alínea d) - - + Art. 78º, nº 7, alínea d) + + - Art. 78º, nº 8, alínea b) - + Art. 78º, nº 8, alínea b) + - Art. 78º, nº 8, alínea c) - - - - Art. 78º, nº 8, alínea d) - - - - - Art. 78º, nº 8, alínea e) - - - - Art. 78º, nº 12 - - - - Art. 78º-A, nº 2, alínea a) - - - - Art. 78º-A, nº 4, alínea a) - - - - Art. 78º-A, nº 4, alínea b) - - - - Art. 78º-A, nº 4, alínea c) - - - - Art. 78º-A, nº 4, alínea d) - - - - Art. 78º-B, nº 4 - - - - Art. 78º-C, nº 1 - - - - Art. 78º-C, nº 3 - - - - + Art. 78º, nº 8, alínea c) + +
+ + Art. 78º, nº 8, alínea d) + + + + + Art. 78º, nº 8, alínea e) + + + + Art. 78º, nº 12 + + + + Art. 78º-A, nº 2, alínea a) + + + + Art. 78º-A, nº 4, alínea a) + + + + Art. 78º-A, nº 4, alínea b) + + + + Art. 78º-A, nº 4, alínea c) + + + + Art. 78º-A, nº 4, alínea d) + + + + Art. 78º-B, nº 4 + + + + Art. 78º-C, nº 1 + + + + Art. 78º-C, nº 3 + + + diff --git a/l10n_pt_vat/models/__init__.py b/l10n_pt_vat/models/__init__.py index 91e02c69..c98aeb26 100644 --- a/l10n_pt_vat/models/__init__.py +++ b/l10n_pt_vat/models/__init__.py @@ -1,23 +1,2 @@ -# -*- coding: utf-8 -*- -############################################################################## -# -# Odoo, Open Source Management Solution -# Copyright (C) 2014- Sossia, Lda. () -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as -# published by the Free Software Foundation, either version 3 of the -# License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Affero General Public License for more details. -# -# You should have received a copy of the GNU Affero General Public License -# along with this program. If not, see . -# -############################################################################## - from . import account_invoice from . import vat_adjustment_norm diff --git a/l10n_pt_vat/models/account_invoice.py b/l10n_pt_vat/models/account_invoice.py index 7eb78fed..ce5a0bc8 100644 --- a/l10n_pt_vat/models/account_invoice.py +++ b/l10n_pt_vat/models/account_invoice.py @@ -1,32 +1,15 @@ -# -*- coding: utf-8 -*- -############################################################################## -# -# Copyright (C) 2014- Sossia, Lda. () -# Copyright (C) 2004 OpenERP SA () -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as -# published by the Free Software Foundation, either version 3 of the -# License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Affero General Public License for more details. -# -# You should have received a copy of the GNU Affero General Public License -# along with this program. If not, see . -# -############################################################################## +# Copyright (C) 2014- Sossia, Lda. () +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). -from openerp import models, fields +from odoo import models, fields class AccountInvoice(models.Model): - _inherit = 'account.invoice' + _inherit = "account.invoice" - # VAT Adjustment Norm (Fields 40/41 of the VAT Statement) vat_adjustment_norm_id = fields.Many2one( - 'account.vat.adjustment_norm', - string='VAT Adjustment Norm', - ondelete='restrict') + "account.vat.adjustment_norm", + string="VAT Adjustment Norm", + ondelete="restrict", + help="Fields 40/41 of the VAT Statement", + ) diff --git a/l10n_pt_vat/models/vat_adjustment_norm.py b/l10n_pt_vat/models/vat_adjustment_norm.py index a0fad23f..574d7d39 100644 --- a/l10n_pt_vat/models/vat_adjustment_norm.py +++ b/l10n_pt_vat/models/vat_adjustment_norm.py @@ -1,24 +1,5 @@ -# -*- coding: utf-8 -*- -############################################################################## -# -# Odoo, Open Source Management Solution -# Copyright (C) 2014- Sossia, Lda. () -# Copyright (C) 2004 OpenERP SA () -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as -# published by the Free Software Foundation, either version 3 of the -# License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Affero General Public License for more details. -# -# You should have received a copy of the GNU Affero General Public License -# along with this program. If not, see . -# -############################################################################## +# Copyright (C) 2014- Sossia, Lda. () +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). from openerp import models, fields @@ -29,26 +10,20 @@ class AccountVATAdjustmentNorm(models.Model): _name = "account.vat.adjustment_norm" _description = "VAT Adjustment Norm" - name = fields.Char( - string='Name', - required=True) - + name = fields.Char(required=True) active = fields.Boolean( - string='Active', default=True, help="If the active field is set to False, it " - "will allow you to hide the adjustment norm without removing it.") - - note = fields.Text( - string='Description', - translate=True) - + "will allow you to hide the adjustment norm without removing it.", + ) + note = fields.Text(string="Description", translate=True) out_refunds = fields.Boolean( - string='Use on company refunds', + string="Use on company refunds", help="If True, it will allow you to apply the adjustment " - "norm to your company refunds.") - + "norm to your company refunds.", + ) in_refunds = fields.Boolean( - string='Use on third party refunds', + string="Use on third party refunds", help="If True, it will allow you to apply the adjustment " - "norm to third party companies refunds.") + "norm to third party companies refunds.", + ) diff --git a/l10n_pt_vat/readme/CONTRIBUTORS.rst b/l10n_pt_vat/readme/CONTRIBUTORS.rst new file mode 100644 index 00000000..c95b1d1c --- /dev/null +++ b/l10n_pt_vat/readme/CONTRIBUTORS.rst @@ -0,0 +1,2 @@ +* Daniel Reis (dreis@opensourceintegrators.com) +* Pedro Castro Silva (`Sossia `_) diff --git a/l10n_pt_vat/readme/DESCRIPTION.rst b/l10n_pt_vat/readme/DESCRIPTION.rst new file mode 100644 index 00000000..bde04af5 --- /dev/null +++ b/l10n_pt_vat/readme/DESCRIPTION.rst @@ -0,0 +1,3 @@ +This modules extends the base localization modules with a few VAT specific functions that are required by the Portuguese Tax Authorities, including: + +* The use of pre-defined legally accepted reasons for issuing credit notes, as required for fields 40/41 of the VAT statement (Portaria nº 255/2013). diff --git a/l10n_pt_vat/readme/USAGE.rst b/l10n_pt_vat/readme/USAGE.rst new file mode 100644 index 00000000..ea255611 --- /dev/null +++ b/l10n_pt_vat/readme/USAGE.rst @@ -0,0 +1 @@ +On an Invoice, the VAT adjustment reason is available for selection. diff --git a/l10n_pt_vat/views/account_invoice_view.xml b/l10n_pt_vat/views/account_invoice_view.xml index 64b31339..3f3c49a8 100644 --- a/l10n_pt_vat/views/account_invoice_view.xml +++ b/l10n_pt_vat/views/account_invoice_view.xml @@ -1,40 +1,41 @@ - - - + - - - Account Invoice - account.invoice - - - - - - - - - - + + + Account Invoice + account.invoice + + - - - Account Invoice - account.invoice - - - - - - - - - - + + + + + + - - +
+
+ + + + Account Invoice + account.invoice + + + + + + + + + + + + + + diff --git a/l10n_pt_vat/views/vat_adjustment_norm_view.xml b/l10n_pt_vat/views/vat_adjustment_norm_view.xml index e19cf41a..eaa75b88 100644 --- a/l10n_pt_vat/views/vat_adjustment_norm_view.xml +++ b/l10n_pt_vat/views/vat_adjustment_norm_view.xml @@ -1,76 +1,68 @@ - - - + - - - - account.vat.adjustment_norm.search - account.vat.adjustment_norm - - - - - - - - - account.vat.adjustment_norm.tree - account.vat.adjustment_norm - child_ids - 100 - - - - - - - - - account.vat.adjustment_norm.form - account.vat.adjustment_norm - -
- - - - - - - - - - - -
-
-
- - VAT Adjustment Norm - account.vat.adjustment_norm - form - tree,form - - + + + + account.vat.adjustment_norm.search + account.vat.adjustment_norm + - - VAT Adjustment Norms - account.vat.adjustment_norm - form - tree,form - - - + + + + - + + - + + account.vat.adjustment_norm.tree + account.vat.adjustment_norm + child_ids + 100 + -
-
+ + + + + +
+
+ + + account.vat.adjustment_norm.form + account.vat.adjustment_norm + + +
+ + + + + + + + + + + +
+ +
+
+ + + VAT Adjustment Norms + account.vat.adjustment_norm + tree,form + + + + + From b80bf7cb652484e39eca633d21ce521d23e31650 Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Sat, 3 Oct 2020 17:04:54 +0000 Subject: [PATCH 014/157] [UPD] README.rst --- l10n_pt_vat/README.rst | 92 ++++- l10n_pt_vat/static/description/index.html | 428 ++++++++++++++++++++++ 2 files changed, 504 insertions(+), 16 deletions(-) create mode 100644 l10n_pt_vat/static/description/index.html diff --git a/l10n_pt_vat/README.rst b/l10n_pt_vat/README.rst index 21cd7854..8efe37fc 100644 --- a/l10n_pt_vat/README.rst +++ b/l10n_pt_vat/README.rst @@ -1,21 +1,81 @@ -**This file is going to be generated by oca-gen-addon-readme.** +============== +Portugal - IVA +============== -*Manual changes will be overwritten.* +.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -Please provide content in the ``readme`` directory: +.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png + :target: https://odoo-community.org/page/development-status + :alt: Beta +.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fl10n--portugal-lightgray.png?logo=github + :target: https://github.com/OCA/l10n-portugal/tree/12.0/l10n_pt_vat + :alt: OCA/l10n-portugal +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/l10n-portugal-12-0/l10n-portugal-12-0-l10n_pt_vat + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png + :target: https://runbot.odoo-community.org/runbot/171/12.0 + :alt: Try me on Runbot -* **DESCRIPTION.rst** (required) -* INSTALL.rst (optional) -* CONFIGURE.rst (optional) -* **USAGE.rst** (optional, highly recommended) -* DEVELOP.rst (optional) -* ROADMAP.rst (optional) -* HISTORY.rst (optional, recommended) -* **CONTRIBUTORS.rst** (optional, highly recommended) -* CREDITS.rst (optional) +|badge1| |badge2| |badge3| |badge4| |badge5| -Content of this README will also be drawn from the addon manifest, -from keys such as name, authors, maintainers, development_status, -and license. +This modules extends the base localization modules with a few VAT specific functions that are required by the Portuguese Tax Authorities, including: -A good, one sentence summary in the manifest is also highly recommended. +* The use of pre-defined legally accepted reasons for issuing credit notes, as required for fields 40/41 of the VAT statement (Portaria nº 255/2013). + +**Table of contents** + +.. contents:: + :local: + +Usage +===== + +On an Invoice, the VAT adjustment reason is available for selection. + +Bug Tracker +=========== + +Bugs are tracked on `GitHub Issues `_. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us smashing it by providing a detailed and welcomed +`feedback `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +~~~~~~~ + +* Sossia + +Contributors +~~~~~~~~~~~~ + +* Daniel Reis (dreis@opensourceintegrators.com) +* Pedro Castro Silva (`Sossia `_) + +Maintainers +~~~~~~~~~~~ + +This module is maintained by the OCA. + +.. image:: https://odoo-community.org/logo.png + :alt: Odoo Community Association + :target: https://odoo-community.org + +OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use. + +This module is part of the `OCA/l10n-portugal `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/l10n_pt_vat/static/description/index.html b/l10n_pt_vat/static/description/index.html new file mode 100644 index 00000000..8e1899f0 --- /dev/null +++ b/l10n_pt_vat/static/description/index.html @@ -0,0 +1,428 @@ + + + + + + +Portugal - IVA + + + +
+

Portugal - IVA

+ + +

Beta License: AGPL-3 OCA/l10n-portugal Translate me on Weblate Try me on Runbot

+

This modules extends the base localization modules with a few VAT specific functions that are required by the Portuguese Tax Authorities, including:

+
    +
  • The use of pre-defined legally accepted reasons for issuing credit notes, as required for fields 40/41 of the VAT statement (Portaria nº 255/2013).
  • +
+

Table of contents

+ +
+

Usage

+

On an Invoice, the VAT adjustment reason is available for selection.

+
+
+

Bug Tracker

+

Bugs are tracked on GitHub Issues. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us smashing it by providing a detailed and welcomed +feedback.

+

Do not contact contributors directly about support or help with technical issues.

+
+
+

Credits

+
+

Authors

+
    +
  • Sossia
  • +
+
+
+

Contributors

+ +
+
+

Maintainers

+

This module is maintained by the OCA.

+Odoo Community Association +

OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use.

+

This module is part of the OCA/l10n-portugal project on GitHub.

+

You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

+
+
+
+ + From 1aa2a4d06f144cb6eec48367d17a7bbff3ee9387 Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Sat, 3 Oct 2020 17:04:54 +0000 Subject: [PATCH 015/157] l10n_pt_vat 12.0.0.1.0 --- l10n_pt_vat/__manifest__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/l10n_pt_vat/__manifest__.py b/l10n_pt_vat/__manifest__.py index 67fd50d1..6cd6a90e 100644 --- a/l10n_pt_vat/__manifest__.py +++ b/l10n_pt_vat/__manifest__.py @@ -2,7 +2,7 @@ # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). { "name": "Portugal - IVA", - "version": "12.0.0.0.0", + "version": "12.0.0.1.0", "license": "AGPL-3", "depends": ["account", "l10n_pt"], "author": "Sossia, Odoo Community Association (OCA)", From d5f244bbfe7965b05f976be27bd807d9d1daf353 Mon Sep 17 00:00:00 2001 From: Daniel Reis Date: Thu, 27 May 2021 20:52:28 +0100 Subject: [PATCH 016/157] [IMP] l10n_pt_vat: black, isort, prettier --- l10n_pt_vat/models/account_invoice.py | 2 +- l10n_pt_vat/models/vat_adjustment_norm.py | 2 +- l10n_pt_vat/views/account_invoice_view.xml | 20 +++++++++++------- .../views/vat_adjustment_norm_view.xml | 21 +++++++++++-------- 4 files changed, 26 insertions(+), 19 deletions(-) diff --git a/l10n_pt_vat/models/account_invoice.py b/l10n_pt_vat/models/account_invoice.py index ce5a0bc8..45c110a8 100644 --- a/l10n_pt_vat/models/account_invoice.py +++ b/l10n_pt_vat/models/account_invoice.py @@ -1,7 +1,7 @@ # Copyright (C) 2014- Sossia, Lda. () # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). -from odoo import models, fields +from odoo import fields, models class AccountInvoice(models.Model): diff --git a/l10n_pt_vat/models/vat_adjustment_norm.py b/l10n_pt_vat/models/vat_adjustment_norm.py index 574d7d39..60b91edc 100644 --- a/l10n_pt_vat/models/vat_adjustment_norm.py +++ b/l10n_pt_vat/models/vat_adjustment_norm.py @@ -1,7 +1,7 @@ # Copyright (C) 2014- Sossia, Lda. () # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). -from openerp import models, fields +from openerp import fields, models class AccountVATAdjustmentNorm(models.Model): diff --git a/l10n_pt_vat/views/account_invoice_view.xml b/l10n_pt_vat/views/account_invoice_view.xml index 3f3c49a8..01d4ea98 100644 --- a/l10n_pt_vat/views/account_invoice_view.xml +++ b/l10n_pt_vat/views/account_invoice_view.xml @@ -4,15 +4,17 @@ Account Invoice account.invoice - + - + @@ -23,15 +25,17 @@ Account Invoice account.invoice - + - + diff --git a/l10n_pt_vat/views/vat_adjustment_norm_view.xml b/l10n_pt_vat/views/vat_adjustment_norm_view.xml index eaa75b88..7cd40a6c 100644 --- a/l10n_pt_vat/views/vat_adjustment_norm_view.xml +++ b/l10n_pt_vat/views/vat_adjustment_norm_view.xml @@ -8,8 +8,8 @@ - - + + @@ -23,8 +23,8 @@ - - + + @@ -38,13 +38,16 @@
- - - - + + + + - +
From 623dfc073dc742fde7b8d4ccc0796aa3d1ae21e1 Mon Sep 17 00:00:00 2001 From: Daniel Reis Date: Sat, 3 Oct 2020 21:31:16 +0100 Subject: [PATCH 017/157] [ADD] l10n_pt_vat: Portuguese VAT taxes --- l10n_pt_vat/__manifest__.py | 1 + l10n_pt_vat/data/account_tax.xml | 150 +++++++++++++++++++++++++++++++ 2 files changed, 151 insertions(+) create mode 100644 l10n_pt_vat/data/account_tax.xml diff --git a/l10n_pt_vat/__manifest__.py b/l10n_pt_vat/__manifest__.py index 6cd6a90e..aaadd75f 100644 --- a/l10n_pt_vat/__manifest__.py +++ b/l10n_pt_vat/__manifest__.py @@ -12,6 +12,7 @@ "data": [ "security/ir.model.access.csv", "data/vat_adjustment_norm.xml", + "data/account_tax.xml", "views/vat_adjustment_norm_view.xml", "views/account_invoice_view.xml", ], diff --git a/l10n_pt_vat/data/account_tax.xml b/l10n_pt_vat/data/account_tax.xml new file mode 100644 index 00000000..68a61e57 --- /dev/null +++ b/l10n_pt_vat/data/account_tax.xml @@ -0,0 +1,150 @@ + + + + + VAT Regular + sale + 23 + + + VAT Intermediate + sale + 13 + + + VAT Reduced + sale + 6 + + + VAT + sale + 0 + + + + + 23% VAT Regular Mainland + sale + 23 + + + 22% VAT Regular Madeira + sale + 22 + + + 18% VAT Regular Azores + sale + 18 + + + 13% VAT Regular Mainland + sale + 13 + + + 12% VAT Regular Mainland + sale + 12 + + + 9% VAT Regular Mainland + sale + 9 + + + 6% VAT Regular Mainland + sale + 6 + + + 5% VAT Regular Mainland + sale + 5 + + + 4% VAT Regular Mainland + sale + 4 + + + + + PT Mainland + True + True + + True + 1000 + 8999 + + + PT Madeira + True + True + + True + 9000 + 9499 + + + PT Azores + True + True + + True + 9500 + 9999 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 2709aced1eae1a06e03293ec248b48bfc28d6b76 Mon Sep 17 00:00:00 2001 From: Daniel Reis Date: Fri, 28 May 2021 10:31:06 +0100 Subject: [PATCH 018/157] [MIG] l10n_pt_vat: port to 14.0 --- l10n_pt_vat/__manifest__.py | 4 +- l10n_pt_vat/models/__init__.py | 2 +- .../{account_invoice.py => account_move.py} | 7 +-- l10n_pt_vat/models/vat_adjustment_norm.py | 21 +++++++- ...-Aduaneira-ATA-420x420.png:Zone.Identifier | 4 ++ l10n_pt_vat/static/description/icon.png | Bin 3019 -> 69199 bytes l10n_pt_vat/views/account_invoice_view.xml | 45 ------------------ l10n_pt_vat/views/account_move_view.xml | 24 ++++++++++ 8 files changed, 55 insertions(+), 52 deletions(-) rename l10n_pt_vat/models/{account_invoice.py => account_move.py} (59%) create mode 100644 l10n_pt_vat/static/description/Autoridade-tributaria-e-Aduaneira-ATA-420x420.png:Zone.Identifier delete mode 100644 l10n_pt_vat/views/account_invoice_view.xml create mode 100644 l10n_pt_vat/views/account_move_view.xml diff --git a/l10n_pt_vat/__manifest__.py b/l10n_pt_vat/__manifest__.py index aaadd75f..f274f124 100644 --- a/l10n_pt_vat/__manifest__.py +++ b/l10n_pt_vat/__manifest__.py @@ -2,7 +2,7 @@ # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). { "name": "Portugal - IVA", - "version": "12.0.0.1.0", + "version": "14.0.0.1.0", "license": "AGPL-3", "depends": ["account", "l10n_pt"], "author": "Sossia, Odoo Community Association (OCA)", @@ -14,7 +14,7 @@ "data/vat_adjustment_norm.xml", "data/account_tax.xml", "views/vat_adjustment_norm_view.xml", - "views/account_invoice_view.xml", + "views/account_move_view.xml", ], "installable": True, "auto_install": True, diff --git a/l10n_pt_vat/models/__init__.py b/l10n_pt_vat/models/__init__.py index c98aeb26..6b81d055 100644 --- a/l10n_pt_vat/models/__init__.py +++ b/l10n_pt_vat/models/__init__.py @@ -1,2 +1,2 @@ -from . import account_invoice +from . import account_move from . import vat_adjustment_norm diff --git a/l10n_pt_vat/models/account_invoice.py b/l10n_pt_vat/models/account_move.py similarity index 59% rename from l10n_pt_vat/models/account_invoice.py rename to l10n_pt_vat/models/account_move.py index 45c110a8..5818c0ab 100644 --- a/l10n_pt_vat/models/account_invoice.py +++ b/l10n_pt_vat/models/account_move.py @@ -1,11 +1,12 @@ -# Copyright (C) 2014- Sossia, Lda. () +# Copyright (C) 2014 Sossia, Lda. () +# Copyright (C) 2021 Open SOurce Integrators () # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). from odoo import fields, models -class AccountInvoice(models.Model): - _inherit = "account.invoice" +class AccountMove(models.Model): + _inherit = "account.move" vat_adjustment_norm_id = fields.Many2one( "account.vat.adjustment_norm", diff --git a/l10n_pt_vat/models/vat_adjustment_norm.py b/l10n_pt_vat/models/vat_adjustment_norm.py index 60b91edc..d2625998 100644 --- a/l10n_pt_vat/models/vat_adjustment_norm.py +++ b/l10n_pt_vat/models/vat_adjustment_norm.py @@ -1,7 +1,8 @@ # Copyright (C) 2014- Sossia, Lda. () +# Copyright (C) 2021 Open SOurce Integrators () # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). -from openerp import fields, models +from odoo import api, fields, models class AccountVATAdjustmentNorm(models.Model): @@ -27,3 +28,21 @@ class AccountVATAdjustmentNorm(models.Model): help="If True, it will allow you to apply the adjustment " "norm to third party companies refunds.", ) + move_type = fields.Selection( + selection=[ + ("out_refund", "Customer Credit Note"), + ("in_refund", "Vendor Credit Note"), + ], + compute="_compute_move_type", + store=True, + ) + + @api.depends("out_refunds", "in_refunds") + def _compute_move_type(self): + for norm in self: + if norm.out_refunds: + norm.move_type = "out_refund" + elif norm.in_refunds: + norm.move_type = "in_refund" + else: + norm.move_type = False diff --git a/l10n_pt_vat/static/description/Autoridade-tributaria-e-Aduaneira-ATA-420x420.png:Zone.Identifier b/l10n_pt_vat/static/description/Autoridade-tributaria-e-Aduaneira-ATA-420x420.png:Zone.Identifier new file mode 100644 index 00000000..e71467da --- /dev/null +++ b/l10n_pt_vat/static/description/Autoridade-tributaria-e-Aduaneira-ATA-420x420.png:Zone.Identifier @@ -0,0 +1,4 @@ +[ZoneTransfer] +ZoneId=3 +ReferrerUrl=https://www.google.pt/ +HostUrl=https://static.computerworld.com.pt/media/2015/05/Autoridade-tributaria-e-Aduaneira-ATA-420x420.png diff --git a/l10n_pt_vat/static/description/icon.png b/l10n_pt_vat/static/description/icon.png index 67ed24357f8e5c84b9cf23ee8753e27f85b6cabf..8d80177998627f4ceb5821d72b0d7f5995ed456d 100644 GIT binary patch literal 69199 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 z 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 literal 3019 zcmV;+3pDhJP)Q_IH4n@={*P-&rV44(2*#=@-0LEL{K~HsQv%b=lGJe=D>%eswUPJQeP^*{42O zvpt3HANU=HPnrrFfw4B;iLEU#XhIw92wCDW*u==ArmkT{!j)Sj`TES<3&|M=v$IPN zq5RyF7g_@>#s*xhtga(nrCHiSBBK*zvzBZ=3(JX)FD?M%0?tRpTqd>R2GX4*rrx2a zEeeUja4+r)2LR7&aS(?3nCaO}@$-9sVuBhWePjxB#?^t*;T^f91{}B4bM zZ#J-pnGOO)QCR)q%mEfd2j5tvrt45bv-43WN{EcZ{ zCjfx+C>u0OTac2L2~enj_+g}W0000Zn>hf6svCfWE4MM�YM#JOBXybq5?jlK?#q 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 N002ovPDHLkV1jV0npFS* diff --git a/l10n_pt_vat/views/account_invoice_view.xml b/l10n_pt_vat/views/account_invoice_view.xml deleted file mode 100644 index 01d4ea98..00000000 --- a/l10n_pt_vat/views/account_invoice_view.xml +++ /dev/null @@ -1,45 +0,0 @@ - - - - - Account Invoice - account.invoice - - - - - - - - - - - - - - - - Account Invoice - account.invoice - - - - - - - - - - - - - - diff --git a/l10n_pt_vat/views/account_move_view.xml b/l10n_pt_vat/views/account_move_view.xml new file mode 100644 index 00000000..4a5152c1 --- /dev/null +++ b/l10n_pt_vat/views/account_move_view.xml @@ -0,0 +1,24 @@ + + + + Invoice: add l10_pt + account.move + + + + + + + + + + + + + + + From e30d753451c1191051139ac2a6e252b0df22721d Mon Sep 17 00:00:00 2001 From: Daniel Reis Date: Fri, 28 May 2021 12:33:14 +0100 Subject: [PATCH 019/157] [FIX] l10n_pt_vat: fix fiscal position data --- l10n_pt_vat/data/account_tax.xml | 170 ++++++++++++++++-------- l10n_pt_vat/views/account_move_view.xml | 1 + 2 files changed, 119 insertions(+), 52 deletions(-) diff --git a/l10n_pt_vat/data/account_tax.xml b/l10n_pt_vat/data/account_tax.xml index 68a61e57..d99d906a 100644 --- a/l10n_pt_vat/data/account_tax.xml +++ b/l10n_pt_vat/data/account_tax.xml @@ -17,134 +17,200 @@ 6 - VAT + VAT Exempt sale 0 - - - - 23% VAT Regular Mainland + + VAT Exempt EU sale - 23 + 0 - - 22% VAT Regular Madeira + + VAT Exempt Others sale - 22 + 0 - - 18% VAT Regular Azores + + + + + IVA22 sale - 18 + 22 - - 13% VAT Regular Mainland + + IVA18 sale - 13 + 18 - - 12% VAT Regular Mainland + + + IVA12 sale 12 - - 9% VAT Regular Mainland + + IVA9 sale 9 - - 6% VAT Regular Mainland - sale - 6 - - - 5% VAT Regular Mainland + + + IVA5 sale 5 - - 4% VAT Regular Mainland + + IVA4 sale 4 - + + PT Mainland True True - True 1000 8999 PT Madeira + 1 True True - True 9000 9499 PT Azores + 1 True True - True 9500 9999 - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/l10n_pt_vat/views/account_move_view.xml b/l10n_pt_vat/views/account_move_view.xml index 4a5152c1..519c2ba5 100644 --- a/l10n_pt_vat/views/account_move_view.xml +++ b/l10n_pt_vat/views/account_move_view.xml @@ -1,5 +1,6 @@ + Invoice: add l10_pt account.move From 8d98705300f455306a9baa5134f345456fd6d274 Mon Sep 17 00:00:00 2001 From: oca-travis Date: Mon, 31 May 2021 09:31:23 +0000 Subject: [PATCH 020/157] [UPD] Update l10n_pt_vat.pot --- l10n_pt_vat/i18n/l10n_pt_vat.pot | 147 +++++++++++++++++++++++++++++++ l10n_pt_vat/i18n/pt.po | 115 +++++++++++++++++------- 2 files changed, 230 insertions(+), 32 deletions(-) create mode 100644 l10n_pt_vat/i18n/l10n_pt_vat.pot diff --git a/l10n_pt_vat/i18n/l10n_pt_vat.pot b/l10n_pt_vat/i18n/l10n_pt_vat.pot new file mode 100644 index 00000000..7b393ef0 --- /dev/null +++ b/l10n_pt_vat/i18n/l10n_pt_vat.pot @@ -0,0 +1,147 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * l10n_pt_vat +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 14.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: l10n_pt_vat +#: model:ir.model.fields,field_description:l10n_pt_vat.field_account_vat_adjustment_norm__active +msgid "Active" +msgstr "" + +#. module: l10n_pt_vat +#: model:ir.model.fields,field_description:l10n_pt_vat.field_account_vat_adjustment_norm__create_uid +msgid "Created by" +msgstr "" + +#. module: l10n_pt_vat +#: model:ir.model.fields,field_description:l10n_pt_vat.field_account_vat_adjustment_norm__create_date +msgid "Created on" +msgstr "" + +#. module: l10n_pt_vat +#: model:ir.model.fields.selection,name:l10n_pt_vat.selection__account_vat_adjustment_norm__move_type__out_refund +msgid "Customer Credit Note" +msgstr "" + +#. module: l10n_pt_vat +#: model:ir.model.fields,field_description:l10n_pt_vat.field_account_vat_adjustment_norm__note +msgid "Description" +msgstr "" + +#. module: l10n_pt_vat +#: model:ir.model.fields,field_description:l10n_pt_vat.field_account_move__display_name +#: model:ir.model.fields,field_description:l10n_pt_vat.field_account_vat_adjustment_norm__display_name +msgid "Display Name" +msgstr "" + +#. module: l10n_pt_vat +#: model:ir.model.fields,help:l10n_pt_vat.field_account_bank_statement_line__vat_adjustment_norm_id +#: model:ir.model.fields,help:l10n_pt_vat.field_account_move__vat_adjustment_norm_id +#: model:ir.model.fields,help:l10n_pt_vat.field_account_payment__vat_adjustment_norm_id +msgid "Fields 40/41 of the VAT Statement" +msgstr "" + +#. module: l10n_pt_vat +#: model:ir.model.fields,field_description:l10n_pt_vat.field_account_move__id +#: model:ir.model.fields,field_description:l10n_pt_vat.field_account_vat_adjustment_norm__id +msgid "ID" +msgstr "" + +#. module: l10n_pt_vat +#: model:ir.model.fields,help:l10n_pt_vat.field_account_vat_adjustment_norm__in_refunds +msgid "" +"If True, it will allow you to apply the adjustment norm to third party " +"companies refunds." +msgstr "" + +#. module: l10n_pt_vat +#: model:ir.model.fields,help:l10n_pt_vat.field_account_vat_adjustment_norm__out_refunds +msgid "" +"If True, it will allow you to apply the adjustment norm to your company " +"refunds." +msgstr "" + +#. module: l10n_pt_vat +#: model:ir.model.fields,help:l10n_pt_vat.field_account_vat_adjustment_norm__active +msgid "" +"If the active field is set to False, it will allow you to hide the " +"adjustment norm without removing it." +msgstr "" + +#. module: l10n_pt_vat +#: model:ir.model,name:l10n_pt_vat.model_account_move +msgid "Journal Entry" +msgstr "" + +#. module: l10n_pt_vat +#: model:ir.model.fields,field_description:l10n_pt_vat.field_account_move____last_update +#: model:ir.model.fields,field_description:l10n_pt_vat.field_account_vat_adjustment_norm____last_update +msgid "Last Modified on" +msgstr "" + +#. module: l10n_pt_vat +#: model:ir.model.fields,field_description:l10n_pt_vat.field_account_vat_adjustment_norm__write_uid +msgid "Last Updated by" +msgstr "" + +#. module: l10n_pt_vat +#: model:ir.model.fields,field_description:l10n_pt_vat.field_account_vat_adjustment_norm__write_date +msgid "Last Updated on" +msgstr "" + +#. module: l10n_pt_vat +#: model_terms:ir.ui.view,arch_db:l10n_pt_vat.vat_adjustment_norm_view_form +msgid "Legal Norm (ex: Art. 78º, nº 8, alínea b)) ..." +msgstr "" + +#. module: l10n_pt_vat +#: model:ir.model.fields,field_description:l10n_pt_vat.field_account_vat_adjustment_norm__move_type +msgid "Move Type" +msgstr "" + +#. module: l10n_pt_vat +#: model:ir.model.fields,field_description:l10n_pt_vat.field_account_vat_adjustment_norm__name +msgid "Name" +msgstr "" + +#. module: l10n_pt_vat +#: model:ir.model.fields,field_description:l10n_pt_vat.field_account_vat_adjustment_norm__out_refunds +msgid "Use on company refunds" +msgstr "" + +#. module: l10n_pt_vat +#: model:ir.model.fields,field_description:l10n_pt_vat.field_account_vat_adjustment_norm__in_refunds +msgid "Use on third party refunds" +msgstr "" + +#. module: l10n_pt_vat +#: model:ir.model,name:l10n_pt_vat.model_account_vat_adjustment_norm +#: model:ir.model.fields,field_description:l10n_pt_vat.field_account_bank_statement_line__vat_adjustment_norm_id +#: model:ir.model.fields,field_description:l10n_pt_vat.field_account_move__vat_adjustment_norm_id +#: model:ir.model.fields,field_description:l10n_pt_vat.field_account_payment__vat_adjustment_norm_id +#: model_terms:ir.ui.view,arch_db:l10n_pt_vat.vat_adjustment_norm_view_form +#: model_terms:ir.ui.view,arch_db:l10n_pt_vat.vat_adjustment_norm_view_search +#: model_terms:ir.ui.view,arch_db:l10n_pt_vat.vat_adjustment_norm_view_tree +msgid "VAT Adjustment Norm" +msgstr "" + +#. module: l10n_pt_vat +#: model:ir.actions.act_window,name:l10n_pt_vat.vat_adjustment_norm_action +#: model:ir.ui.menu,name:l10n_pt_vat.menu_action_vat_adjustment_norm +msgid "VAT Adjustment Norms" +msgstr "" + +#. module: l10n_pt_vat +#: model:ir.model.fields.selection,name:l10n_pt_vat.selection__account_vat_adjustment_norm__move_type__in_refund +msgid "Vendor Credit Note" +msgstr "" diff --git a/l10n_pt_vat/i18n/pt.po b/l10n_pt_vat/i18n/pt.po index 28010030..deb34489 100644 --- a/l10n_pt_vat/i18n/pt.po +++ b/l10n_pt_vat/i18n/pt.po @@ -1,6 +1,6 @@ # Translation of Odoo Server. # This file contains the translation of the following modules: -# * l10n_pt_vat +# * l10n_pt_vat # msgid "" msgstr "" @@ -10,100 +10,151 @@ msgstr "" "PO-Revision-Date: 2015-11-18 15:02+0000\n" "Last-Translator: <>\n" "Language-Team: \n" +"Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: \n" "Plural-Forms: \n" #. module: l10n_pt_vat -#: field:account.vat.adjustment_norm,active:0 +#: model:ir.model.fields,field_description:l10n_pt_vat.field_account_vat_adjustment_norm__active msgid "Active" msgstr "Ativo" #. module: l10n_pt_vat -#: field:account.vat.adjustment_norm,create_uid:0 +#: model:ir.model.fields,field_description:l10n_pt_vat.field_account_vat_adjustment_norm__create_uid msgid "Created by" msgstr "Criado por" #. module: l10n_pt_vat -#: field:account.vat.adjustment_norm,create_date:0 +#: model:ir.model.fields,field_description:l10n_pt_vat.field_account_vat_adjustment_norm__create_date msgid "Created on" msgstr "Criado em" #. module: l10n_pt_vat -#: field:account.vat.adjustment_norm,note:0 +#: model:ir.model.fields.selection,name:l10n_pt_vat.selection__account_vat_adjustment_norm__move_type__out_refund +msgid "Customer Credit Note" +msgstr "" + +#. module: l10n_pt_vat +#: model:ir.model.fields,field_description:l10n_pt_vat.field_account_vat_adjustment_norm__note msgid "Description" msgstr "Descrição" #. module: l10n_pt_vat -#: field:account.vat.adjustment_norm,id:0 +#: model:ir.model.fields,field_description:l10n_pt_vat.field_account_move__display_name +#: model:ir.model.fields,field_description:l10n_pt_vat.field_account_vat_adjustment_norm__display_name +msgid "Display Name" +msgstr "" + +#. module: l10n_pt_vat +#: model:ir.model.fields,help:l10n_pt_vat.field_account_bank_statement_line__vat_adjustment_norm_id +#: model:ir.model.fields,help:l10n_pt_vat.field_account_move__vat_adjustment_norm_id +#: model:ir.model.fields,help:l10n_pt_vat.field_account_payment__vat_adjustment_norm_id +msgid "Fields 40/41 of the VAT Statement" +msgstr "" + +#. module: l10n_pt_vat +#: model:ir.model.fields,field_description:l10n_pt_vat.field_account_move__id +#: model:ir.model.fields,field_description:l10n_pt_vat.field_account_vat_adjustment_norm__id msgid "ID" msgstr "ID" #. module: l10n_pt_vat -#: help:account.vat.adjustment_norm,in_refunds:0 -msgid "If True, it will allow you to apply the adjustment norm to third party companies refunds." -msgstr "Se assinalado, poderá aplicar a norma de regularização a notas de crédito de terceiros" +#: model:ir.model.fields,help:l10n_pt_vat.field_account_vat_adjustment_norm__in_refunds +msgid "" +"If True, it will allow you to apply the adjustment norm to third party " +"companies refunds." +msgstr "" +"Se assinalado, poderá aplicar a norma de regularização a notas de crédito de " +"terceiros" #. module: l10n_pt_vat -#: help:account.vat.adjustment_norm,out_refunds:0 -msgid "If True, it will allow you to apply the adjustment norm to your company refunds." -msgstr "Se assinalado, poderá aplicar a norma de regularização às suas notas de crédito" +#: model:ir.model.fields,help:l10n_pt_vat.field_account_vat_adjustment_norm__out_refunds +msgid "" +"If True, it will allow you to apply the adjustment norm to your company " +"refunds." +msgstr "" +"Se assinalado, poderá aplicar a norma de regularização às suas notas de " +"crédito" #. module: l10n_pt_vat -#: help:account.vat.adjustment_norm,active:0 -msgid "If the active field is set to False, it will allow you to hide the adjustment norm without removing it." -msgstr "Se o campo Ativo não estiver assinalado, poderá esconder a norma de regularização sem a remover." +#: model:ir.model.fields,help:l10n_pt_vat.field_account_vat_adjustment_norm__active +msgid "" +"If the active field is set to False, it will allow you to hide the " +"adjustment norm without removing it." +msgstr "" +"Se o campo Ativo não estiver assinalado, poderá esconder a norma de " +"regularização sem a remover." + +#. module: l10n_pt_vat +#: model:ir.model,name:l10n_pt_vat.model_account_move +msgid "Journal Entry" +msgstr "" #. module: l10n_pt_vat -#: model:ir.model,name:l10n_pt_vat.model_account_invoice -msgid "Invoice" -msgstr "Fatura" +#: model:ir.model.fields,field_description:l10n_pt_vat.field_account_move____last_update +#: model:ir.model.fields,field_description:l10n_pt_vat.field_account_vat_adjustment_norm____last_update +#, fuzzy +msgid "Last Modified on" +msgstr "Atualizado pela últ. vez em" #. module: l10n_pt_vat -#: field:account.vat.adjustment_norm,write_uid:0 +#: model:ir.model.fields,field_description:l10n_pt_vat.field_account_vat_adjustment_norm__write_uid msgid "Last Updated by" msgstr "Atualizado pela últ. vez por" #. module: l10n_pt_vat -#: field:account.vat.adjustment_norm,write_date:0 +#: model:ir.model.fields,field_description:l10n_pt_vat.field_account_vat_adjustment_norm__write_date msgid "Last Updated on" msgstr "Atualizado pela últ. vez em" #. module: l10n_pt_vat -#: view:account.vat.adjustment_norm:l10n_pt_vat.vat_adjustment_norm_view_form +#: model_terms:ir.ui.view,arch_db:l10n_pt_vat.vat_adjustment_norm_view_form msgid "Legal Norm (ex: Art. 78º, nº 8, alínea b)) ..." msgstr "Norma de Regularização Legal (ex: Art. 78º, nº 8, alínea b)) ..." #. module: l10n_pt_vat -#: field:account.vat.adjustment_norm,name:0 +#: model:ir.model.fields,field_description:l10n_pt_vat.field_account_vat_adjustment_norm__move_type +msgid "Move Type" +msgstr "" + +#. module: l10n_pt_vat +#: model:ir.model.fields,field_description:l10n_pt_vat.field_account_vat_adjustment_norm__name msgid "Name" msgstr "Nome" #. module: l10n_pt_vat -#: field:account.vat.adjustment_norm,out_refunds:0 +#: model:ir.model.fields,field_description:l10n_pt_vat.field_account_vat_adjustment_norm__out_refunds msgid "Use on company refunds" msgstr "Utilizar em notas de crédito próprias" #. module: l10n_pt_vat -#: field:account.vat.adjustment_norm,in_refunds:0 +#: model:ir.model.fields,field_description:l10n_pt_vat.field_account_vat_adjustment_norm__in_refunds msgid "Use on third party refunds" msgstr "Utilizar em notas de crédito de terceiros" #. module: l10n_pt_vat -#: field:account.invoice,vat_adjustment_norm_id:0 -#: view:account.vat.adjustment_norm:l10n_pt_vat.vat_adjustment_norm_view_form -#: view:account.vat.adjustment_norm:l10n_pt_vat.vat_adjustment_norm_view_search -#: view:account.vat.adjustment_norm:l10n_pt_vat.vat_adjustment_norm_view_tree -#: model:ir.actions.act_window,name:l10n_pt_vat.action_vat_adjustment_norm_form #: model:ir.model,name:l10n_pt_vat.model_account_vat_adjustment_norm -#: model:ir.ui.menu,name:l10n_pt_vat.menu_action_vat_adjustment_norm_form +#: model:ir.model.fields,field_description:l10n_pt_vat.field_account_bank_statement_line__vat_adjustment_norm_id +#: model:ir.model.fields,field_description:l10n_pt_vat.field_account_move__vat_adjustment_norm_id +#: model:ir.model.fields,field_description:l10n_pt_vat.field_account_payment__vat_adjustment_norm_id +#: model_terms:ir.ui.view,arch_db:l10n_pt_vat.vat_adjustment_norm_view_form +#: model_terms:ir.ui.view,arch_db:l10n_pt_vat.vat_adjustment_norm_view_search +#: model_terms:ir.ui.view,arch_db:l10n_pt_vat.vat_adjustment_norm_view_tree msgid "VAT Adjustment Norm" msgstr "" #. module: l10n_pt_vat -#: model:ir.actions.act_window,name:l10n_pt_vat.vat_adjustment_norm_action_list -#: model:ir.ui.menu,name:l10n_pt_vat.menu_action_vat_adjustment_norm_list +#: model:ir.actions.act_window,name:l10n_pt_vat.vat_adjustment_norm_action +#: model:ir.ui.menu,name:l10n_pt_vat.menu_action_vat_adjustment_norm msgid "VAT Adjustment Norms" msgstr "" +#. module: l10n_pt_vat +#: model:ir.model.fields.selection,name:l10n_pt_vat.selection__account_vat_adjustment_norm__move_type__in_refund +msgid "Vendor Credit Note" +msgstr "" + +#~ msgid "Invoice" +#~ msgstr "Fatura" From 88d5b4c1026efd76cb271629f174a0ee2ffa2dd2 Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Mon, 31 May 2021 09:40:05 +0000 Subject: [PATCH 021/157] [UPD] README.rst --- l10n_pt_vat/README.rst | 10 +++++----- l10n_pt_vat/static/description/index.html | 6 +++--- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/l10n_pt_vat/README.rst b/l10n_pt_vat/README.rst index 8efe37fc..4ffffaf9 100644 --- a/l10n_pt_vat/README.rst +++ b/l10n_pt_vat/README.rst @@ -14,13 +14,13 @@ Portugal - IVA :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html :alt: License: AGPL-3 .. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fl10n--portugal-lightgray.png?logo=github - :target: https://github.com/OCA/l10n-portugal/tree/12.0/l10n_pt_vat + :target: https://github.com/OCA/l10n-portugal/tree/14.0/l10n_pt_vat :alt: OCA/l10n-portugal .. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png - :target: https://translation.odoo-community.org/projects/l10n-portugal-12-0/l10n-portugal-12-0-l10n_pt_vat + :target: https://translation.odoo-community.org/projects/l10n-portugal-14-0/l10n-portugal-14-0-l10n_pt_vat :alt: Translate me on Weblate .. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png - :target: https://runbot.odoo-community.org/runbot/171/12.0 + :target: https://runbot.odoo-community.org/runbot/171/14.0 :alt: Try me on Runbot |badge1| |badge2| |badge3| |badge4| |badge5| @@ -45,7 +45,7 @@ Bug Tracker Bugs are tracked on `GitHub Issues `_. In case of trouble, please check there if your issue has already been reported. If you spotted it first, help us smashing it by providing a detailed and welcomed -`feedback `_. +`feedback `_. Do not contact contributors directly about support or help with technical issues. @@ -76,6 +76,6 @@ OCA, or the Odoo Community Association, is a nonprofit organization whose mission is to support the collaborative development of Odoo features and promote its widespread use. -This module is part of the `OCA/l10n-portugal `_ project on GitHub. +This module is part of the `OCA/l10n-portugal `_ project on GitHub. You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/l10n_pt_vat/static/description/index.html b/l10n_pt_vat/static/description/index.html index 8e1899f0..93a565e5 100644 --- a/l10n_pt_vat/static/description/index.html +++ b/l10n_pt_vat/static/description/index.html @@ -367,7 +367,7 @@

Portugal - IVA

!! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! --> -

Beta License: AGPL-3 OCA/l10n-portugal Translate me on Weblate Try me on Runbot

+

Beta License: AGPL-3 OCA/l10n-portugal Translate me on Weblate Try me on Runbot

This modules extends the base localization modules with a few VAT specific functions that are required by the Portuguese Tax Authorities, including:

  • The use of pre-defined legally accepted reasons for issuing credit notes, as required for fields 40/41 of the VAT statement (Portaria nº 255/2013).
  • @@ -394,7 +394,7 @@

    Bug Tracker

    Bugs are tracked on GitHub Issues. In case of trouble, please check there if your issue has already been reported. If you spotted it first, help us smashing it by providing a detailed and welcomed -feedback.

    +feedback.

    Do not contact contributors directly about support or help with technical issues.

    @@ -419,7 +419,7 @@

    Maintainers

    OCA, or the Odoo Community Association, is a nonprofit organization whose mission is to support the collaborative development of Odoo features and promote its widespread use.

    -

    This module is part of the OCA/l10n-portugal project on GitHub.

    +

    This module is part of the OCA/l10n-portugal project on GitHub.

    You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

    From 98e98144385c8547aac5b2f24889da8c9234bb5f Mon Sep 17 00:00:00 2001 From: Daniel Reis Date: Fri, 4 Jun 2021 11:36:34 +0100 Subject: [PATCH 022/157] [IMP] l10n_pt_vat: add exempt reasons and fiscal zones --- l10n_pt_vat/__manifest__.py | 13 +++++-- .../account.l10n_pt.vat.exempt.reason.csv | 19 ++++++++++ l10n_pt_vat/data/account_tax.xml | 11 ++++++ l10n_pt_vat/models/__init__.py | 3 ++ l10n_pt_vat/models/account_journal.py | 12 ++++++ l10n_pt_vat/models/account_move.py | 34 ++++++++++++++++- l10n_pt_vat/models/account_tax.py | 13 +++++++ .../models/l10n_pt_vat_exempt_reason.py | 37 +++++++++++++++++++ l10n_pt_vat/readme/CONFIGURATION.rst | 4 ++ l10n_pt_vat/readme/CONTRIBUTORS.rst | 5 ++- l10n_pt_vat/readme/USAGE.rst | 4 ++ l10n_pt_vat/security/ir.model.access.csv | 1 + l10n_pt_vat/views/account_journal_view.xml | 21 +++++++++++ l10n_pt_vat/views/account_move_view.xml | 12 ++++-- l10n_pt_vat/views/account_tax_view.xml | 12 ++++++ .../views/l10n_pt_vat_exempt_reason_view.xml | 15 ++++++++ 16 files changed, 206 insertions(+), 10 deletions(-) create mode 100644 l10n_pt_vat/data/account.l10n_pt.vat.exempt.reason.csv create mode 100644 l10n_pt_vat/models/account_journal.py create mode 100644 l10n_pt_vat/models/account_tax.py create mode 100644 l10n_pt_vat/models/l10n_pt_vat_exempt_reason.py create mode 100644 l10n_pt_vat/readme/CONFIGURATION.rst create mode 100644 l10n_pt_vat/views/account_journal_view.xml create mode 100644 l10n_pt_vat/views/account_tax_view.xml create mode 100644 l10n_pt_vat/views/l10n_pt_vat_exempt_reason_view.xml diff --git a/l10n_pt_vat/__manifest__.py b/l10n_pt_vat/__manifest__.py index f274f124..e47aa17d 100644 --- a/l10n_pt_vat/__manifest__.py +++ b/l10n_pt_vat/__manifest__.py @@ -1,20 +1,25 @@ -# Copyright (C) 2014- Sossia, Lda. () +# Copyright (C) 2021 Open Source Integrators () +# Copyright (C) 2014 Sossia, Lda. () # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). { "name": "Portugal - IVA", "version": "14.0.0.1.0", "license": "AGPL-3", "depends": ["account", "l10n_pt"], - "author": "Sossia, Odoo Community Association (OCA)", + "author": "Open Source Integrators, Sossia, Odoo Community Association (OCA)", "summary": "Portuguese VAT requirements extensions", "website": "https://github.com/OCA/l10n-portugal", "category": "Localisation/Portugal", "data": [ "security/ir.model.access.csv", - "data/vat_adjustment_norm.xml", + "data/account.l10n_pt.vat.exempt.reason.csv", "data/account_tax.xml", - "views/vat_adjustment_norm_view.xml", + "data/vat_adjustment_norm.xml", + "views/account_journal_view.xml", "views/account_move_view.xml", + "views/account_tax_view.xml", + "views/l10n_pt_vat_exempt_reason_view.xml", + "views/vat_adjustment_norm_view.xml", ], "installable": True, "auto_install": True, diff --git a/l10n_pt_vat/data/account.l10n_pt.vat.exempt.reason.csv b/l10n_pt_vat/data/account.l10n_pt.vat.exempt.reason.csv new file mode 100644 index 00000000..e2082254 --- /dev/null +++ b/l10n_pt_vat/data/account.l10n_pt.vat.exempt.reason.csv @@ -0,0 +1,19 @@ +id,code,name,note +M01,M01,Artigo 16.º n.º 6 do CIVA,Artigo 16.º n.º 6 alíneas a) a d) do CIVA +M02,M02,"Artigo 6.º do Decreto-Lei n.º 198/90, de 19 de Junho ", +M03,M03,Exigibilidade de caixa,"Decreto-Lei n.º 204/97, de 9 de Agosto Decreto-Lei n.º 418/99, de 21 de Outubro Lei n.º 15/2009, de 1 de Abril " +M04,M04,Isento Artigo 13.º do CIVA, +M05,M05,Isento Artigo 14.º do CIVA, +M06,M06,Isento Artigo 15.º do CIVA, +M07,M07,Isento Artigo 9.º do CIVA, +M08,M08,IVA - Autoliquidação,"Artigo 2.º n.º 1 alínea i), j) ou l) do CIVA Artigo 6.º do CIVA Decreto-Lei n.º 21/2007, de 29 de Janeiro Decreto-Lei n.º 362/99, de 16 de Setembro" +M09,M09,IVA - Não confere direito a dedução,"Artigo 60.º CIVA Artigo 72.º n.º 4 do CIVA " +M10,M10,IVA - Regime de isenção,Artigo 53.º do CIVA +M11,M11,Regime particular do tabaco,"Decreto-Lei n.º 346/85, de 23 de Agosto " +M12,M12,Regime da margem de lucro - Agências de viagens,"Decreto-Lei n.º 221/85, de 3 de Julho " +M13,M13,Regime da margem de lucro - Bens em segunda mão,"Decreto-Lei n.º 199/96, de 18 de Outubro " +M14,M14,Regime da margem de lucro - Objectos de arte,"Decreto-Lei n.º 199/96, de 18 de Outubro " +M15,M15,Regime da margem de lucro - Objectos de colecção e antiguidades,"Decreto-Lei n.º 199/96, de 18 de Outubro " +M16,M16,Isento Artigo 14.º do RITI, +M20,M20,IVA - Regime forfetário,Artigo 59.º-B do CIVA +M99,M99,"Não sujeito, não tributado","Outras situações de não liquidação do imposto (exemplos: artigo 2.º, n.º 2; artigo 3.º, n.º 4, 6 e 7; artigo 4.º, n.º 5, todos do CIVA). " diff --git a/l10n_pt_vat/data/account_tax.xml b/l10n_pt_vat/data/account_tax.xml index d99d906a..e7dcca92 100644 --- a/l10n_pt_vat/data/account_tax.xml +++ b/l10n_pt_vat/data/account_tax.xml @@ -33,38 +33,49 @@ + IVA22 sale 22 + PT-MA IVA18 sale 18 + PT-AC IVA12 sale 12 + PT-MA IVA9 sale 9 + PT-AC IVA5 sale 5 + PT-MA IVA4 sale 4 + PT-AC diff --git a/l10n_pt_vat/models/__init__.py b/l10n_pt_vat/models/__init__.py index 6b81d055..3057c8c8 100644 --- a/l10n_pt_vat/models/__init__.py +++ b/l10n_pt_vat/models/__init__.py @@ -1,2 +1,5 @@ +from . import l10n_pt_vat_exempt_reason +from . import account_journal from . import account_move +from . import account_tax from . import vat_adjustment_norm diff --git a/l10n_pt_vat/models/account_journal.py b/l10n_pt_vat/models/account_journal.py new file mode 100644 index 00000000..89932a05 --- /dev/null +++ b/l10n_pt_vat/models/account_journal.py @@ -0,0 +1,12 @@ +# Copyright (C) 2021 Open SOurce Integrators () +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import fields, models + + +class AccountJournal(models.Model): + _inherit = "account.journal" + + l10npt_vat_exempt_reason = fields.Many2one( + "account.l10n_pt.vat.exempt.reason", string="VAT Exempt Reason" + ) diff --git a/l10n_pt_vat/models/account_move.py b/l10n_pt_vat/models/account_move.py index 5818c0ab..c8e36e90 100644 --- a/l10n_pt_vat/models/account_move.py +++ b/l10n_pt_vat/models/account_move.py @@ -2,7 +2,7 @@ # Copyright (C) 2021 Open SOurce Integrators () # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). -from odoo import fields, models +from odoo import _, api, exceptions, fields, models class AccountMove(models.Model): @@ -14,3 +14,35 @@ class AccountMove(models.Model): ondelete="restrict", help="Fields 40/41 of the VAT Statement", ) + l10npt_vat_exempt_reason = fields.Many2one( + "account.l10n_pt.vat.exempt.reason", + string="VAT Exempt Reason", + compute="_compute_l10npt_vat_exempt_reason", + store=True, + readonly=False, + ) + + @api.depends("journal_id", "company_id") + def _compute_l10npt_vat_exempt_reason(self): + for invoice in self.filtered( + lambda x: x.country_code == "PT" and x.is_sale_document() + ): + invoice.l10npt_vat_exempt_reason = ( + invoice.journal_id.l10npt_vat_exempt_reason + ) + + @api.constrains("l10npt_vat_exempt_reason") + def _constrain_l10npt_vat_exempt_reason(self): + """ + VAT Exemption reason is required if an exempt tax is used + """ + for invoice in self.filtered( + lambda x: x.country_code == "PT" and x.is_sale_document() + ): + exempt_lines = invoice.invoice_line_ids.filtered( + lambda x: not x.tax_ids.filtered("amount") + ) + if exempt_lines and not invoice.l10npt_vat_exempt_reason: + raise exceptions.ValidationError( + _("A tax exemption reason must be provided.") + ) diff --git a/l10n_pt_vat/models/account_tax.py b/l10n_pt_vat/models/account_tax.py new file mode 100644 index 00000000..759c747b --- /dev/null +++ b/l10n_pt_vat/models/account_tax.py @@ -0,0 +1,13 @@ +# Copyright (C) 2021 Open SOurce Integrators () +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import fields, models + + +class AccountTax(models.Model): + _inherit = "account.tax" + + l10n_pt_fiscal_zone = fields.Selection( + [("PT", "Portugal Continental"), ("PT-AC", "Açores"), ("PT-MA", "Madeira")], + string="Fiscal Zone", + ) diff --git a/l10n_pt_vat/models/l10n_pt_vat_exempt_reason.py b/l10n_pt_vat/models/l10n_pt_vat_exempt_reason.py new file mode 100644 index 00000000..e0809541 --- /dev/null +++ b/l10n_pt_vat/models/l10n_pt_vat_exempt_reason.py @@ -0,0 +1,37 @@ +# Copyright (C) 2021 Open Source Integrators () +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import api, fields, models +from odoo.osv import expression + + +class VatExemptReason(models.Model): + _name = "account.l10n_pt.vat.exempt.reason" + _description = "VAT Exemption Reason" + _order = "code" + + name = fields.Char(required=True, translate=True) + code = fields.Char(required=True) + active = fields.Boolean(default=True) + note = fields.Text(string="Description") + + def name_get(self): + return [(x.id, "[%s] %s" % (x.code, x.name)) for x in self] + + @api.model + def _name_search( + self, name, args=None, operator="ilike", limit=100, name_get_uid=None + ): + """ + Returns a list of tuples containing id, name, as internally it is called {def name_get} + result format: {[(id, name), (id, name), ...]} + """ + args = args or [] + if operator == "ilike" and not (name or "").strip(): + domain = [] + else: + connector = "&" if operator in expression.NEGATIVE_TERM_OPERATORS else "|" + domain = [connector, ("code", operator, name), ("name", operator, name)] + return self._search( + expression.AND([domain, args]), limit=limit, access_rights_uid=name_get_uid + ) diff --git a/l10n_pt_vat/readme/CONFIGURATION.rst b/l10n_pt_vat/readme/CONFIGURATION.rst new file mode 100644 index 00000000..10c2726f --- /dev/null +++ b/l10n_pt_vat/readme/CONFIGURATION.rst @@ -0,0 +1,4 @@ +On Accounting Taxes, the "Fiscal Zone" can be set, to identify the VAT zone: +Continental Portugal, Madeira or Azores. + +A default VAT exception reason can be set on the Sales journal. diff --git a/l10n_pt_vat/readme/CONTRIBUTORS.rst b/l10n_pt_vat/readme/CONTRIBUTORS.rst index c95b1d1c..c4868862 100644 --- a/l10n_pt_vat/readme/CONTRIBUTORS.rst +++ b/l10n_pt_vat/readme/CONTRIBUTORS.rst @@ -1,2 +1,5 @@ -* Daniel Reis (dreis@opensourceintegrators.com) * Pedro Castro Silva (`Sossia `_) + +* `Open Source Integrators `_ + + * Daniel Reis (dreis@opensourceintegrators.com) diff --git a/l10n_pt_vat/readme/USAGE.rst b/l10n_pt_vat/readme/USAGE.rst index ea255611..439967c3 100644 --- a/l10n_pt_vat/readme/USAGE.rst +++ b/l10n_pt_vat/readme/USAGE.rst @@ -1 +1,5 @@ On an Invoice, the VAT adjustment reason is available for selection. + +The Fiscal Position can be used to automatically map VAT tax level +(regular, intermediate, reduced or exempt) to the actual tax percentages, +according to the client's region (Portugal, European Union, or others). diff --git a/l10n_pt_vat/security/ir.model.access.csv b/l10n_pt_vat/security/ir.model.access.csv index cf44198a..c6400e86 100644 --- a/l10n_pt_vat/security/ir.model.access.csv +++ b/l10n_pt_vat/security/ir.model.access.csv @@ -1,3 +1,4 @@ id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink access_account_vat_adjustment_norm,account.vat.adjustment_norm,model_account_vat_adjustment_norm,account.group_account_user,1,0,0,0 access_account_vat_adjustment_norm_manager,account.vat.adjustment_norm,model_account_vat_adjustment_norm,account.group_account_manager,1,1,1,1 +access_account_vat_exempt_reason,account.l10n_pt.vat.exempt.reason,model_account_l10n_pt_vat_exempt_reason,account.group_account_user,1,0,0,0 diff --git a/l10n_pt_vat/views/account_journal_view.xml b/l10n_pt_vat/views/account_journal_view.xml new file mode 100644 index 00000000..b0f482ac --- /dev/null +++ b/l10n_pt_vat/views/account_journal_view.xml @@ -0,0 +1,21 @@ + + + + Account Journal: add l10_pt_vat + account.journal + + + + + + + + + + + + + diff --git a/l10n_pt_vat/views/account_move_view.xml b/l10n_pt_vat/views/account_move_view.xml index 519c2ba5..ddc33dd8 100644 --- a/l10n_pt_vat/views/account_move_view.xml +++ b/l10n_pt_vat/views/account_move_view.xml @@ -9,14 +9,18 @@ - - +
    + + - +
    diff --git a/l10n_pt_vat/views/account_tax_view.xml b/l10n_pt_vat/views/account_tax_view.xml new file mode 100644 index 00000000..6c01553d --- /dev/null +++ b/l10n_pt_vat/views/account_tax_view.xml @@ -0,0 +1,12 @@ + + + Account Tax: add Fiscal Zone + account.tax + + + + + + + + diff --git a/l10n_pt_vat/views/l10n_pt_vat_exempt_reason_view.xml b/l10n_pt_vat/views/l10n_pt_vat_exempt_reason_view.xml new file mode 100644 index 00000000..2d8389ce --- /dev/null +++ b/l10n_pt_vat/views/l10n_pt_vat_exempt_reason_view.xml @@ -0,0 +1,15 @@ + + + + VAT Exempt Reason List + account.l10n_pt.vat.exempt.reason + + + + + + + + + + From a8e3daaf0293d868b430fe69318d21ed0dc561b7 Mon Sep 17 00:00:00 2001 From: oca-travis Date: Sat, 12 Jun 2021 18:53:13 +0000 Subject: [PATCH 023/157] [UPD] Update l10n_pt_vat.pot --- l10n_pt_vat/i18n/l10n_pt_vat.pot | 160 +++++++++++++++++++++++++++++++ 1 file changed, 160 insertions(+) diff --git a/l10n_pt_vat/i18n/l10n_pt_vat.pot b/l10n_pt_vat/i18n/l10n_pt_vat.pot index 7b393ef0..edc5eea2 100644 --- a/l10n_pt_vat/i18n/l10n_pt_vat.pot +++ b/l10n_pt_vat/i18n/l10n_pt_vat.pot @@ -14,16 +14,45 @@ msgstr "" "Plural-Forms: \n" #. module: l10n_pt_vat +#: code:addons/l10n_pt_vat/models/account_move.py:0 +#, python-format +msgid "A tax exemption reason must be provided." +msgstr "" + +#. module: l10n_pt_vat +#: model:ir.model.fields,field_description:l10n_pt_vat.field_account_l10n_pt_vat_exempt_reason__active #: model:ir.model.fields,field_description:l10n_pt_vat.field_account_vat_adjustment_norm__active msgid "Active" msgstr "" #. module: l10n_pt_vat +#: model:account.l10n_pt.vat.exempt.reason,name:l10n_pt_vat.M01 +msgid "Artigo 16.º n.º 6 do CIVA" +msgstr "" + +#. module: l10n_pt_vat +#: model:account.l10n_pt.vat.exempt.reason,name:l10n_pt_vat.M02 +msgid "Artigo 6.º do Decreto-Lei n.º 198/90, de 19 de Junho " +msgstr "" + +#. module: l10n_pt_vat +#: model:ir.model.fields.selection,name:l10n_pt_vat.selection__account_tax__l10n_pt_fiscal_zone__pt-ac +msgid "Açores" +msgstr "" + +#. module: l10n_pt_vat +#: model:ir.model.fields,field_description:l10n_pt_vat.field_account_l10n_pt_vat_exempt_reason__code +msgid "Code" +msgstr "" + +#. module: l10n_pt_vat +#: model:ir.model.fields,field_description:l10n_pt_vat.field_account_l10n_pt_vat_exempt_reason__create_uid #: model:ir.model.fields,field_description:l10n_pt_vat.field_account_vat_adjustment_norm__create_uid msgid "Created by" msgstr "" #. module: l10n_pt_vat +#: model:ir.model.fields,field_description:l10n_pt_vat.field_account_l10n_pt_vat_exempt_reason__create_date #: model:ir.model.fields,field_description:l10n_pt_vat.field_account_vat_adjustment_norm__create_date msgid "Created on" msgstr "" @@ -34,16 +63,25 @@ msgid "Customer Credit Note" msgstr "" #. module: l10n_pt_vat +#: model:ir.model.fields,field_description:l10n_pt_vat.field_account_l10n_pt_vat_exempt_reason__note #: model:ir.model.fields,field_description:l10n_pt_vat.field_account_vat_adjustment_norm__note msgid "Description" msgstr "" #. module: l10n_pt_vat +#: model:ir.model.fields,field_description:l10n_pt_vat.field_account_journal__display_name +#: model:ir.model.fields,field_description:l10n_pt_vat.field_account_l10n_pt_vat_exempt_reason__display_name #: model:ir.model.fields,field_description:l10n_pt_vat.field_account_move__display_name +#: model:ir.model.fields,field_description:l10n_pt_vat.field_account_tax__display_name #: model:ir.model.fields,field_description:l10n_pt_vat.field_account_vat_adjustment_norm__display_name msgid "Display Name" msgstr "" +#. module: l10n_pt_vat +#: model:account.l10n_pt.vat.exempt.reason,name:l10n_pt_vat.M03 +msgid "Exigibilidade de caixa" +msgstr "" + #. module: l10n_pt_vat #: model:ir.model.fields,help:l10n_pt_vat.field_account_bank_statement_line__vat_adjustment_norm_id #: model:ir.model.fields,help:l10n_pt_vat.field_account_move__vat_adjustment_norm_id @@ -52,11 +90,39 @@ msgid "Fields 40/41 of the VAT Statement" msgstr "" #. module: l10n_pt_vat +#: model:ir.model.fields,field_description:l10n_pt_vat.field_account_tax__l10n_pt_fiscal_zone +msgid "Fiscal Zone" +msgstr "" + +#. module: l10n_pt_vat +#: model:ir.model.fields,field_description:l10n_pt_vat.field_account_journal__id +#: model:ir.model.fields,field_description:l10n_pt_vat.field_account_l10n_pt_vat_exempt_reason__id #: model:ir.model.fields,field_description:l10n_pt_vat.field_account_move__id +#: model:ir.model.fields,field_description:l10n_pt_vat.field_account_tax__id #: model:ir.model.fields,field_description:l10n_pt_vat.field_account_vat_adjustment_norm__id msgid "ID" msgstr "" +#. module: l10n_pt_vat +#: model:account.l10n_pt.vat.exempt.reason,name:l10n_pt_vat.M08 +msgid "IVA - Autoliquidação" +msgstr "" + +#. module: l10n_pt_vat +#: model:account.l10n_pt.vat.exempt.reason,name:l10n_pt_vat.M09 +msgid "IVA - Não confere direito a dedução" +msgstr "" + +#. module: l10n_pt_vat +#: model:account.l10n_pt.vat.exempt.reason,name:l10n_pt_vat.M10 +msgid "IVA - Regime de isenção" +msgstr "" + +#. module: l10n_pt_vat +#: model:account.l10n_pt.vat.exempt.reason,name:l10n_pt_vat.M20 +msgid "IVA - Regime forfetário" +msgstr "" + #. module: l10n_pt_vat #: model:ir.model.fields,help:l10n_pt_vat.field_account_vat_adjustment_norm__in_refunds msgid "" @@ -78,23 +144,58 @@ msgid "" "adjustment norm without removing it." msgstr "" +#. module: l10n_pt_vat +#: model:account.l10n_pt.vat.exempt.reason,name:l10n_pt_vat.M04 +msgid "Isento Artigo 13.º do CIVA" +msgstr "" + +#. module: l10n_pt_vat +#: model:account.l10n_pt.vat.exempt.reason,name:l10n_pt_vat.M05 +msgid "Isento Artigo 14.º do CIVA" +msgstr "" + +#. module: l10n_pt_vat +#: model:account.l10n_pt.vat.exempt.reason,name:l10n_pt_vat.M16 +msgid "Isento Artigo 14.º do RITI" +msgstr "" + +#. module: l10n_pt_vat +#: model:account.l10n_pt.vat.exempt.reason,name:l10n_pt_vat.M06 +msgid "Isento Artigo 15.º do CIVA" +msgstr "" + +#. module: l10n_pt_vat +#: model:account.l10n_pt.vat.exempt.reason,name:l10n_pt_vat.M07 +msgid "Isento Artigo 9.º do CIVA" +msgstr "" + +#. module: l10n_pt_vat +#: model:ir.model,name:l10n_pt_vat.model_account_journal +msgid "Journal" +msgstr "" + #. module: l10n_pt_vat #: model:ir.model,name:l10n_pt_vat.model_account_move msgid "Journal Entry" msgstr "" #. module: l10n_pt_vat +#: model:ir.model.fields,field_description:l10n_pt_vat.field_account_journal____last_update +#: model:ir.model.fields,field_description:l10n_pt_vat.field_account_l10n_pt_vat_exempt_reason____last_update #: model:ir.model.fields,field_description:l10n_pt_vat.field_account_move____last_update +#: model:ir.model.fields,field_description:l10n_pt_vat.field_account_tax____last_update #: model:ir.model.fields,field_description:l10n_pt_vat.field_account_vat_adjustment_norm____last_update msgid "Last Modified on" msgstr "" #. module: l10n_pt_vat +#: model:ir.model.fields,field_description:l10n_pt_vat.field_account_l10n_pt_vat_exempt_reason__write_uid #: model:ir.model.fields,field_description:l10n_pt_vat.field_account_vat_adjustment_norm__write_uid msgid "Last Updated by" msgstr "" #. module: l10n_pt_vat +#: model:ir.model.fields,field_description:l10n_pt_vat.field_account_l10n_pt_vat_exempt_reason__write_date #: model:ir.model.fields,field_description:l10n_pt_vat.field_account_vat_adjustment_norm__write_date msgid "Last Updated on" msgstr "" @@ -104,16 +205,62 @@ msgstr "" msgid "Legal Norm (ex: Art. 78º, nº 8, alínea b)) ..." msgstr "" +#. module: l10n_pt_vat +#: model:ir.model.fields.selection,name:l10n_pt_vat.selection__account_tax__l10n_pt_fiscal_zone__pt-ma +msgid "Madeira" +msgstr "" + #. module: l10n_pt_vat #: model:ir.model.fields,field_description:l10n_pt_vat.field_account_vat_adjustment_norm__move_type msgid "Move Type" msgstr "" #. module: l10n_pt_vat +#: model:ir.model.fields,field_description:l10n_pt_vat.field_account_l10n_pt_vat_exempt_reason__name #: model:ir.model.fields,field_description:l10n_pt_vat.field_account_vat_adjustment_norm__name msgid "Name" msgstr "" +#. module: l10n_pt_vat +#: model:account.l10n_pt.vat.exempt.reason,name:l10n_pt_vat.M99 +msgid "Não sujeito, não tributado" +msgstr "" + +#. module: l10n_pt_vat +#: model:ir.model.fields.selection,name:l10n_pt_vat.selection__account_tax__l10n_pt_fiscal_zone__pt +msgid "Portugal Continental" +msgstr "" + +#. module: l10n_pt_vat +#: model:account.l10n_pt.vat.exempt.reason,name:l10n_pt_vat.M12 +msgid "Regime da margem de lucro - Agências de viagens" +msgstr "" + +#. module: l10n_pt_vat +#: model:account.l10n_pt.vat.exempt.reason,name:l10n_pt_vat.M13 +msgid "Regime da margem de lucro - Bens em segunda mão" +msgstr "" + +#. module: l10n_pt_vat +#: model:account.l10n_pt.vat.exempt.reason,name:l10n_pt_vat.M14 +msgid "Regime da margem de lucro - Objectos de arte" +msgstr "" + +#. module: l10n_pt_vat +#: model:account.l10n_pt.vat.exempt.reason,name:l10n_pt_vat.M15 +msgid "Regime da margem de lucro - Objectos de colecção e antiguidades" +msgstr "" + +#. module: l10n_pt_vat +#: model:account.l10n_pt.vat.exempt.reason,name:l10n_pt_vat.M11 +msgid "Regime particular do tabaco" +msgstr "" + +#. module: l10n_pt_vat +#: model:ir.model,name:l10n_pt_vat.model_account_tax +msgid "Tax" +msgstr "" + #. module: l10n_pt_vat #: model:ir.model.fields,field_description:l10n_pt_vat.field_account_vat_adjustment_norm__out_refunds msgid "Use on company refunds" @@ -141,6 +288,19 @@ msgstr "" msgid "VAT Adjustment Norms" msgstr "" +#. module: l10n_pt_vat +#: model:ir.model.fields,field_description:l10n_pt_vat.field_account_bank_statement_line__l10npt_vat_exempt_reason +#: model:ir.model.fields,field_description:l10n_pt_vat.field_account_journal__l10npt_vat_exempt_reason +#: model:ir.model.fields,field_description:l10n_pt_vat.field_account_move__l10npt_vat_exempt_reason +#: model:ir.model.fields,field_description:l10n_pt_vat.field_account_payment__l10npt_vat_exempt_reason +msgid "VAT Exempt Reason" +msgstr "" + +#. module: l10n_pt_vat +#: model:ir.model,name:l10n_pt_vat.model_account_l10n_pt_vat_exempt_reason +msgid "VAT Exemption Reason" +msgstr "" + #. module: l10n_pt_vat #: model:ir.model.fields.selection,name:l10n_pt_vat.selection__account_vat_adjustment_norm__move_type__in_refund msgid "Vendor Credit Note" From 03fe49aa47cc16cc4fa5de74f9cd219c8d8d9e83 Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Sat, 12 Jun 2021 18:57:03 +0000 Subject: [PATCH 024/157] [UPD] README.rst --- l10n_pt_vat/README.rst | 10 +++++++++- l10n_pt_vat/static/description/index.html | 13 ++++++++++++- 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/l10n_pt_vat/README.rst b/l10n_pt_vat/README.rst index 4ffffaf9..d53805dc 100644 --- a/l10n_pt_vat/README.rst +++ b/l10n_pt_vat/README.rst @@ -39,6 +39,10 @@ Usage On an Invoice, the VAT adjustment reason is available for selection. +The Fiscal Position can be used to automatically map VAT tax level +(regular, intermediate, reduced or exempt) to the actual tax percentages, +according to the client's region (Portugal, European Union, or others). + Bug Tracker =========== @@ -55,14 +59,18 @@ Credits Authors ~~~~~~~ +* Open Source Integrators * Sossia Contributors ~~~~~~~~~~~~ -* Daniel Reis (dreis@opensourceintegrators.com) * Pedro Castro Silva (`Sossia `_) +* `Open Source Integrators `_ + + * Daniel Reis (dreis@opensourceintegrators.com) + Maintainers ~~~~~~~~~~~ diff --git a/l10n_pt_vat/static/description/index.html b/l10n_pt_vat/static/description/index.html index 93a565e5..bb0828c1 100644 --- a/l10n_pt_vat/static/description/index.html +++ b/l10n_pt_vat/static/description/index.html @@ -388,6 +388,9 @@

    Portugal - IVA

    Usage

    On an Invoice, the VAT adjustment reason is available for selection.

    +

    The Fiscal Position can be used to automatically map VAT tax level +(regular, intermediate, reduced or exempt) to the actual tax percentages, +according to the client’s region (Portugal, European Union, or others).

    Bug Tracker

    @@ -402,14 +405,22 @@

    Credits

    Authors

      +
    • Open Source Integrators
    • Sossia

    Contributors

    +
    From 5ded4b6242c20462216848a23ebce86d299fa084 Mon Sep 17 00:00:00 2001 From: OCA Transbot Date: Sat, 12 Jun 2021 18:57:13 +0000 Subject: [PATCH 025/157] Update translation files Updated by "Update PO files to match POT (msgmerge)" hook in Weblate. Translation: l10n-portugal-14.0/l10n-portugal-14.0-l10n_pt_vat Translate-URL: https://translation.odoo-community.org/projects/l10n-portugal-14-0/l10n-portugal-14-0-l10n_pt_vat/ --- l10n_pt_vat/i18n/pt.po | 160 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 160 insertions(+) diff --git a/l10n_pt_vat/i18n/pt.po b/l10n_pt_vat/i18n/pt.po index deb34489..5fed2f7e 100644 --- a/l10n_pt_vat/i18n/pt.po +++ b/l10n_pt_vat/i18n/pt.po @@ -17,16 +17,45 @@ msgstr "" "Plural-Forms: \n" #. module: l10n_pt_vat +#: code:addons/l10n_pt_vat/models/account_move.py:0 +#, python-format +msgid "A tax exemption reason must be provided." +msgstr "" + +#. module: l10n_pt_vat +#: model:ir.model.fields,field_description:l10n_pt_vat.field_account_l10n_pt_vat_exempt_reason__active #: model:ir.model.fields,field_description:l10n_pt_vat.field_account_vat_adjustment_norm__active msgid "Active" msgstr "Ativo" #. module: l10n_pt_vat +#: model:account.l10n_pt.vat.exempt.reason,name:l10n_pt_vat.M01 +msgid "Artigo 16.º n.º 6 do CIVA" +msgstr "" + +#. module: l10n_pt_vat +#: model:account.l10n_pt.vat.exempt.reason,name:l10n_pt_vat.M02 +msgid "Artigo 6.º do Decreto-Lei n.º 198/90, de 19 de Junho " +msgstr "" + +#. module: l10n_pt_vat +#: model:ir.model.fields.selection,name:l10n_pt_vat.selection__account_tax__l10n_pt_fiscal_zone__pt-ac +msgid "Açores" +msgstr "" + +#. module: l10n_pt_vat +#: model:ir.model.fields,field_description:l10n_pt_vat.field_account_l10n_pt_vat_exempt_reason__code +msgid "Code" +msgstr "" + +#. module: l10n_pt_vat +#: model:ir.model.fields,field_description:l10n_pt_vat.field_account_l10n_pt_vat_exempt_reason__create_uid #: model:ir.model.fields,field_description:l10n_pt_vat.field_account_vat_adjustment_norm__create_uid msgid "Created by" msgstr "Criado por" #. module: l10n_pt_vat +#: model:ir.model.fields,field_description:l10n_pt_vat.field_account_l10n_pt_vat_exempt_reason__create_date #: model:ir.model.fields,field_description:l10n_pt_vat.field_account_vat_adjustment_norm__create_date msgid "Created on" msgstr "Criado em" @@ -37,16 +66,25 @@ msgid "Customer Credit Note" msgstr "" #. module: l10n_pt_vat +#: model:ir.model.fields,field_description:l10n_pt_vat.field_account_l10n_pt_vat_exempt_reason__note #: model:ir.model.fields,field_description:l10n_pt_vat.field_account_vat_adjustment_norm__note msgid "Description" msgstr "Descrição" #. module: l10n_pt_vat +#: model:ir.model.fields,field_description:l10n_pt_vat.field_account_journal__display_name +#: model:ir.model.fields,field_description:l10n_pt_vat.field_account_l10n_pt_vat_exempt_reason__display_name #: model:ir.model.fields,field_description:l10n_pt_vat.field_account_move__display_name +#: model:ir.model.fields,field_description:l10n_pt_vat.field_account_tax__display_name #: model:ir.model.fields,field_description:l10n_pt_vat.field_account_vat_adjustment_norm__display_name msgid "Display Name" msgstr "" +#. module: l10n_pt_vat +#: model:account.l10n_pt.vat.exempt.reason,name:l10n_pt_vat.M03 +msgid "Exigibilidade de caixa" +msgstr "" + #. module: l10n_pt_vat #: model:ir.model.fields,help:l10n_pt_vat.field_account_bank_statement_line__vat_adjustment_norm_id #: model:ir.model.fields,help:l10n_pt_vat.field_account_move__vat_adjustment_norm_id @@ -55,11 +93,39 @@ msgid "Fields 40/41 of the VAT Statement" msgstr "" #. module: l10n_pt_vat +#: model:ir.model.fields,field_description:l10n_pt_vat.field_account_tax__l10n_pt_fiscal_zone +msgid "Fiscal Zone" +msgstr "" + +#. module: l10n_pt_vat +#: model:ir.model.fields,field_description:l10n_pt_vat.field_account_journal__id +#: model:ir.model.fields,field_description:l10n_pt_vat.field_account_l10n_pt_vat_exempt_reason__id #: model:ir.model.fields,field_description:l10n_pt_vat.field_account_move__id +#: model:ir.model.fields,field_description:l10n_pt_vat.field_account_tax__id #: model:ir.model.fields,field_description:l10n_pt_vat.field_account_vat_adjustment_norm__id msgid "ID" msgstr "ID" +#. module: l10n_pt_vat +#: model:account.l10n_pt.vat.exempt.reason,name:l10n_pt_vat.M08 +msgid "IVA - Autoliquidação" +msgstr "" + +#. module: l10n_pt_vat +#: model:account.l10n_pt.vat.exempt.reason,name:l10n_pt_vat.M09 +msgid "IVA - Não confere direito a dedução" +msgstr "" + +#. module: l10n_pt_vat +#: model:account.l10n_pt.vat.exempt.reason,name:l10n_pt_vat.M10 +msgid "IVA - Regime de isenção" +msgstr "" + +#. module: l10n_pt_vat +#: model:account.l10n_pt.vat.exempt.reason,name:l10n_pt_vat.M20 +msgid "IVA - Regime forfetário" +msgstr "" + #. module: l10n_pt_vat #: model:ir.model.fields,help:l10n_pt_vat.field_account_vat_adjustment_norm__in_refunds msgid "" @@ -87,24 +153,59 @@ msgstr "" "Se o campo Ativo não estiver assinalado, poderá esconder a norma de " "regularização sem a remover." +#. module: l10n_pt_vat +#: model:account.l10n_pt.vat.exempt.reason,name:l10n_pt_vat.M04 +msgid "Isento Artigo 13.º do CIVA" +msgstr "" + +#. module: l10n_pt_vat +#: model:account.l10n_pt.vat.exempt.reason,name:l10n_pt_vat.M05 +msgid "Isento Artigo 14.º do CIVA" +msgstr "" + +#. module: l10n_pt_vat +#: model:account.l10n_pt.vat.exempt.reason,name:l10n_pt_vat.M16 +msgid "Isento Artigo 14.º do RITI" +msgstr "" + +#. module: l10n_pt_vat +#: model:account.l10n_pt.vat.exempt.reason,name:l10n_pt_vat.M06 +msgid "Isento Artigo 15.º do CIVA" +msgstr "" + +#. module: l10n_pt_vat +#: model:account.l10n_pt.vat.exempt.reason,name:l10n_pt_vat.M07 +msgid "Isento Artigo 9.º do CIVA" +msgstr "" + +#. module: l10n_pt_vat +#: model:ir.model,name:l10n_pt_vat.model_account_journal +msgid "Journal" +msgstr "" + #. module: l10n_pt_vat #: model:ir.model,name:l10n_pt_vat.model_account_move msgid "Journal Entry" msgstr "" #. module: l10n_pt_vat +#: model:ir.model.fields,field_description:l10n_pt_vat.field_account_journal____last_update +#: model:ir.model.fields,field_description:l10n_pt_vat.field_account_l10n_pt_vat_exempt_reason____last_update #: model:ir.model.fields,field_description:l10n_pt_vat.field_account_move____last_update +#: model:ir.model.fields,field_description:l10n_pt_vat.field_account_tax____last_update #: model:ir.model.fields,field_description:l10n_pt_vat.field_account_vat_adjustment_norm____last_update #, fuzzy msgid "Last Modified on" msgstr "Atualizado pela últ. vez em" #. module: l10n_pt_vat +#: model:ir.model.fields,field_description:l10n_pt_vat.field_account_l10n_pt_vat_exempt_reason__write_uid #: model:ir.model.fields,field_description:l10n_pt_vat.field_account_vat_adjustment_norm__write_uid msgid "Last Updated by" msgstr "Atualizado pela últ. vez por" #. module: l10n_pt_vat +#: model:ir.model.fields,field_description:l10n_pt_vat.field_account_l10n_pt_vat_exempt_reason__write_date #: model:ir.model.fields,field_description:l10n_pt_vat.field_account_vat_adjustment_norm__write_date msgid "Last Updated on" msgstr "Atualizado pela últ. vez em" @@ -114,16 +215,62 @@ msgstr "Atualizado pela últ. vez em" msgid "Legal Norm (ex: Art. 78º, nº 8, alínea b)) ..." msgstr "Norma de Regularização Legal (ex: Art. 78º, nº 8, alínea b)) ..." +#. module: l10n_pt_vat +#: model:ir.model.fields.selection,name:l10n_pt_vat.selection__account_tax__l10n_pt_fiscal_zone__pt-ma +msgid "Madeira" +msgstr "" + #. module: l10n_pt_vat #: model:ir.model.fields,field_description:l10n_pt_vat.field_account_vat_adjustment_norm__move_type msgid "Move Type" msgstr "" #. module: l10n_pt_vat +#: model:ir.model.fields,field_description:l10n_pt_vat.field_account_l10n_pt_vat_exempt_reason__name #: model:ir.model.fields,field_description:l10n_pt_vat.field_account_vat_adjustment_norm__name msgid "Name" msgstr "Nome" +#. module: l10n_pt_vat +#: model:account.l10n_pt.vat.exempt.reason,name:l10n_pt_vat.M99 +msgid "Não sujeito, não tributado" +msgstr "" + +#. module: l10n_pt_vat +#: model:ir.model.fields.selection,name:l10n_pt_vat.selection__account_tax__l10n_pt_fiscal_zone__pt +msgid "Portugal Continental" +msgstr "" + +#. module: l10n_pt_vat +#: model:account.l10n_pt.vat.exempt.reason,name:l10n_pt_vat.M12 +msgid "Regime da margem de lucro - Agências de viagens" +msgstr "" + +#. module: l10n_pt_vat +#: model:account.l10n_pt.vat.exempt.reason,name:l10n_pt_vat.M13 +msgid "Regime da margem de lucro - Bens em segunda mão" +msgstr "" + +#. module: l10n_pt_vat +#: model:account.l10n_pt.vat.exempt.reason,name:l10n_pt_vat.M14 +msgid "Regime da margem de lucro - Objectos de arte" +msgstr "" + +#. module: l10n_pt_vat +#: model:account.l10n_pt.vat.exempt.reason,name:l10n_pt_vat.M15 +msgid "Regime da margem de lucro - Objectos de colecção e antiguidades" +msgstr "" + +#. module: l10n_pt_vat +#: model:account.l10n_pt.vat.exempt.reason,name:l10n_pt_vat.M11 +msgid "Regime particular do tabaco" +msgstr "" + +#. module: l10n_pt_vat +#: model:ir.model,name:l10n_pt_vat.model_account_tax +msgid "Tax" +msgstr "" + #. module: l10n_pt_vat #: model:ir.model.fields,field_description:l10n_pt_vat.field_account_vat_adjustment_norm__out_refunds msgid "Use on company refunds" @@ -151,6 +298,19 @@ msgstr "" msgid "VAT Adjustment Norms" msgstr "" +#. module: l10n_pt_vat +#: model:ir.model.fields,field_description:l10n_pt_vat.field_account_bank_statement_line__l10npt_vat_exempt_reason +#: model:ir.model.fields,field_description:l10n_pt_vat.field_account_journal__l10npt_vat_exempt_reason +#: model:ir.model.fields,field_description:l10n_pt_vat.field_account_move__l10npt_vat_exempt_reason +#: model:ir.model.fields,field_description:l10n_pt_vat.field_account_payment__l10npt_vat_exempt_reason +msgid "VAT Exempt Reason" +msgstr "" + +#. module: l10n_pt_vat +#: model:ir.model,name:l10n_pt_vat.model_account_l10n_pt_vat_exempt_reason +msgid "VAT Exemption Reason" +msgstr "" + #. module: l10n_pt_vat #: model:ir.model.fields.selection,name:l10n_pt_vat.selection__account_vat_adjustment_norm__move_type__in_refund msgid "Vendor Credit Note" From a1202af2fddb95e38c441821288607624758246d Mon Sep 17 00:00:00 2001 From: Daniel Reis Date: Tue, 15 Jun 2021 11:48:24 +0100 Subject: [PATCH 026/157] [FIX] l10n_pt_vat: updatable Taxes and Fiscal Positions --- l10n_pt_vat/data/account_tax.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/l10n_pt_vat/data/account_tax.xml b/l10n_pt_vat/data/account_tax.xml index e7dcca92..6deb0d9c 100644 --- a/l10n_pt_vat/data/account_tax.xml +++ b/l10n_pt_vat/data/account_tax.xml @@ -1,4 +1,4 @@ - + From 9ce31779ad86f9919ee1d23238bcdc16832b9f66 Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Wed, 16 Jun 2021 08:09:37 +0000 Subject: [PATCH 027/157] l10n_pt_vat 14.0.0.2.0 --- l10n_pt_vat/__manifest__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/l10n_pt_vat/__manifest__.py b/l10n_pt_vat/__manifest__.py index e47aa17d..024bcea3 100644 --- a/l10n_pt_vat/__manifest__.py +++ b/l10n_pt_vat/__manifest__.py @@ -3,7 +3,7 @@ # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). { "name": "Portugal - IVA", - "version": "14.0.0.1.0", + "version": "14.0.0.2.0", "license": "AGPL-3", "depends": ["account", "l10n_pt"], "author": "Open Source Integrators, Sossia, Odoo Community Association (OCA)", From e2d381982686e09bedeb64aa588cd10269258d03 Mon Sep 17 00:00:00 2001 From: Daniel Reis Date: Mon, 5 Jul 2021 09:44:30 +0100 Subject: [PATCH 028/157] [FIX] l10n_pt_vat: fix islands VAT taxes, only set exemption reason when having exempt taxes --- l10n_pt_vat/__manifest__.py | 2 +- l10n_pt_vat/data/account_tax.xml | 64 +----------------------------- l10n_pt_vat/models/account_move.py | 38 +++++++++++++----- 3 files changed, 31 insertions(+), 73 deletions(-) diff --git a/l10n_pt_vat/__manifest__.py b/l10n_pt_vat/__manifest__.py index 024bcea3..e47aa17d 100644 --- a/l10n_pt_vat/__manifest__.py +++ b/l10n_pt_vat/__manifest__.py @@ -3,7 +3,7 @@ # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). { "name": "Portugal - IVA", - "version": "14.0.0.2.0", + "version": "14.0.0.1.0", "license": "AGPL-3", "depends": ["account", "l10n_pt"], "author": "Open Source Integrators, Sossia, Odoo Community Association (OCA)", diff --git a/l10n_pt_vat/data/account_tax.xml b/l10n_pt_vat/data/account_tax.xml index 6deb0d9c..fdc4e1d1 100644 --- a/l10n_pt_vat/data/account_tax.xml +++ b/l10n_pt_vat/data/account_tax.xml @@ -21,6 +21,8 @@ sale 0 + + VAT Exempt EU sale @@ -32,7 +34,6 @@ 0 - - - PT Mainland - True - True - - 1000 - 8999 - - - PT Madeira - 1 - True - True - - 9000 - 9499 - - - PT Azores - 1 - True - True - - 9500 - 9999 - @@ -127,38 +99,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/l10n_pt_vat/models/account_move.py b/l10n_pt_vat/models/account_move.py index c8e36e90..a914998c 100644 --- a/l10n_pt_vat/models/account_move.py +++ b/l10n_pt_vat/models/account_move.py @@ -14,6 +14,9 @@ class AccountMove(models.Model): ondelete="restrict", help="Fields 40/41 of the VAT Statement", ) + l10npt_has_tax_exempt_lines = fields.Boolean( + compute="_compute_l10npt_has_tax_exempt_lines" + ) l10npt_vat_exempt_reason = fields.Many2one( "account.l10n_pt.vat.exempt.reason", string="VAT Exempt Reason", @@ -22,19 +25,33 @@ class AccountMove(models.Model): readonly=False, ) - @api.depends("journal_id", "company_id") - def _compute_l10npt_vat_exempt_reason(self): - for invoice in self.filtered( - lambda x: x.country_code == "PT" and x.is_sale_document() - ): - invoice.l10npt_vat_exempt_reason = ( - invoice.journal_id.l10npt_vat_exempt_reason + @api.depends("country_code", "move_type", "invoice_line_ids.tax_ids") + def _compute_l10npt_has_tax_exempt_lines(self): + for invoice in self: + invoice.l10npt_has_tax_exempt_lines = ( + invoice.country_code == "PT" + and invoice.is_sale_document() + and invoice.invoice_line_ids.filtered( + lambda x: not x.tax_ids.filtered("amount") + ) ) - @api.constrains("l10npt_vat_exempt_reason") - def _constrain_l10npt_vat_exempt_reason(self): + @api.depends( + "l10npt_has_tax_exempt_lines", "journal_id", "company_id", "amount_total" + ) + def _compute_l10npt_vat_exempt_reason(self): + for invoice in self: + if ( + invoice.l10npt_has_tax_exempt_lines + and not invoice.l10npt_vat_exempt_reason + ): + invoice.l10npt_vat_exempt_reason = ( + invoice.journal_id.l10npt_vat_exempt_reason + ) + + def action_post(self): """ - VAT Exemption reason is required if an exempt tax is used + VAT Exemption reason is required if there are lines without tax """ for invoice in self.filtered( lambda x: x.country_code == "PT" and x.is_sale_document() @@ -46,3 +63,4 @@ def _constrain_l10npt_vat_exempt_reason(self): raise exceptions.ValidationError( _("A tax exemption reason must be provided.") ) + return super().action_post() From f7a7b9247798ec845c073b85012506e2fc945346 Mon Sep 17 00:00:00 2001 From: oca-travis Date: Mon, 5 Jul 2021 12:26:46 +0000 Subject: [PATCH 029/157] [UPD] Update l10n_pt_vat.pot --- l10n_pt_vat/i18n/l10n_pt_vat.pot | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/l10n_pt_vat/i18n/l10n_pt_vat.pot b/l10n_pt_vat/i18n/l10n_pt_vat.pot index edc5eea2..1cc5558b 100644 --- a/l10n_pt_vat/i18n/l10n_pt_vat.pot +++ b/l10n_pt_vat/i18n/l10n_pt_vat.pot @@ -179,6 +179,13 @@ msgstr "" msgid "Journal Entry" msgstr "" +#. module: l10n_pt_vat +#: model:ir.model.fields,field_description:l10n_pt_vat.field_account_bank_statement_line__l10npt_has_tax_exempt_lines +#: model:ir.model.fields,field_description:l10n_pt_vat.field_account_move__l10npt_has_tax_exempt_lines +#: model:ir.model.fields,field_description:l10n_pt_vat.field_account_payment__l10npt_has_tax_exempt_lines +msgid "L10Npt Has Tax Exempt Lines" +msgstr "" + #. module: l10n_pt_vat #: model:ir.model.fields,field_description:l10n_pt_vat.field_account_journal____last_update #: model:ir.model.fields,field_description:l10n_pt_vat.field_account_l10n_pt_vat_exempt_reason____last_update From 47b453f39d61421d5244ec5ac5981c74e1b3f084 Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Mon, 5 Jul 2021 12:49:12 +0000 Subject: [PATCH 030/157] l10n_pt_vat 14.0.0.2.0 --- l10n_pt_vat/__manifest__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/l10n_pt_vat/__manifest__.py b/l10n_pt_vat/__manifest__.py index e47aa17d..024bcea3 100644 --- a/l10n_pt_vat/__manifest__.py +++ b/l10n_pt_vat/__manifest__.py @@ -3,7 +3,7 @@ # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). { "name": "Portugal - IVA", - "version": "14.0.0.1.0", + "version": "14.0.0.2.0", "license": "AGPL-3", "depends": ["account", "l10n_pt"], "author": "Open Source Integrators, Sossia, Odoo Community Association (OCA)", From fabdd5e6100da3d157d0d92aee719ab81da51961 Mon Sep 17 00:00:00 2001 From: OCA Transbot Date: Mon, 5 Jul 2021 12:49:19 +0000 Subject: [PATCH 031/157] Update translation files Updated by "Update PO files to match POT (msgmerge)" hook in Weblate. Translation: l10n-portugal-14.0/l10n-portugal-14.0-l10n_pt_vat Translate-URL: https://translation.odoo-community.org/projects/l10n-portugal-14-0/l10n-portugal-14-0-l10n_pt_vat/ --- l10n_pt_vat/i18n/pt.po | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/l10n_pt_vat/i18n/pt.po b/l10n_pt_vat/i18n/pt.po index 5fed2f7e..048fc6c0 100644 --- a/l10n_pt_vat/i18n/pt.po +++ b/l10n_pt_vat/i18n/pt.po @@ -188,6 +188,13 @@ msgstr "" msgid "Journal Entry" msgstr "" +#. module: l10n_pt_vat +#: model:ir.model.fields,field_description:l10n_pt_vat.field_account_bank_statement_line__l10npt_has_tax_exempt_lines +#: model:ir.model.fields,field_description:l10n_pt_vat.field_account_move__l10npt_has_tax_exempt_lines +#: model:ir.model.fields,field_description:l10n_pt_vat.field_account_payment__l10npt_has_tax_exempt_lines +msgid "L10Npt Has Tax Exempt Lines" +msgstr "" + #. module: l10n_pt_vat #: model:ir.model.fields,field_description:l10n_pt_vat.field_account_journal____last_update #: model:ir.model.fields,field_description:l10n_pt_vat.field_account_l10n_pt_vat_exempt_reason____last_update From 0f356d9400fd93ee3948c65edcd62f504bce786e Mon Sep 17 00:00:00 2001 From: Daniel Reis Date: Fri, 9 Jul 2021 11:04:38 +0100 Subject: [PATCH 032/157] [FIX] l10_pt_vat: remove tax configuration from tax tables (should be in templates) --- l10n_pt_vat/__manifest__.py | 3 +- l10n_pt_vat/data/account_tax.xml | 167 -------------------------- l10n_pt_vat/models/account_journal.py | 2 +- l10n_pt_vat/models/account_tax.py | 1 + l10n_pt_vat/readme/CONFIGURATION.rst | 4 +- l10n_pt_vat/readme/USAGE.rst | 4 - 6 files changed, 6 insertions(+), 175 deletions(-) delete mode 100644 l10n_pt_vat/data/account_tax.xml diff --git a/l10n_pt_vat/__manifest__.py b/l10n_pt_vat/__manifest__.py index 024bcea3..18072ca1 100644 --- a/l10n_pt_vat/__manifest__.py +++ b/l10n_pt_vat/__manifest__.py @@ -9,11 +9,10 @@ "author": "Open Source Integrators, Sossia, Odoo Community Association (OCA)", "summary": "Portuguese VAT requirements extensions", "website": "https://github.com/OCA/l10n-portugal", - "category": "Localisation/Portugal", + "category": "Accounting/Localizations", "data": [ "security/ir.model.access.csv", "data/account.l10n_pt.vat.exempt.reason.csv", - "data/account_tax.xml", "data/vat_adjustment_norm.xml", "views/account_journal_view.xml", "views/account_move_view.xml", diff --git a/l10n_pt_vat/data/account_tax.xml b/l10n_pt_vat/data/account_tax.xml deleted file mode 100644 index fdc4e1d1..00000000 --- a/l10n_pt_vat/data/account_tax.xml +++ /dev/null @@ -1,167 +0,0 @@ - - - - - VAT Regular - sale - 23 - - - VAT Intermediate - sale - 13 - - - VAT Reduced - sale - 6 - - - VAT Exempt - sale - 0 - - - - - VAT Exempt EU - sale - 0 - - - VAT Exempt Others - sale - 0 - - - - - - IVA22 - sale - 22 - PT-MA - - - IVA18 - sale - 18 - PT-AC - - - - IVA12 - sale - 12 - PT-MA - - - IVA9 - sale - 9 - PT-AC - - - - IVA5 - sale - 5 - PT-MA - - - IVA4 - sale - 4 - PT-AC - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/l10n_pt_vat/models/account_journal.py b/l10n_pt_vat/models/account_journal.py index 89932a05..c69ad354 100644 --- a/l10n_pt_vat/models/account_journal.py +++ b/l10n_pt_vat/models/account_journal.py @@ -1,4 +1,4 @@ -# Copyright (C) 2021 Open SOurce Integrators () +# Copyright (C) 2021 Open Source Integrators () # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). from odoo import fields, models diff --git a/l10n_pt_vat/models/account_tax.py b/l10n_pt_vat/models/account_tax.py index 759c747b..5a478a00 100644 --- a/l10n_pt_vat/models/account_tax.py +++ b/l10n_pt_vat/models/account_tax.py @@ -10,4 +10,5 @@ class AccountTax(models.Model): l10n_pt_fiscal_zone = fields.Selection( [("PT", "Portugal Continental"), ("PT-AC", "Açores"), ("PT-MA", "Madeira")], string="Fiscal Zone", + default="PT", ) diff --git a/l10n_pt_vat/readme/CONFIGURATION.rst b/l10n_pt_vat/readme/CONFIGURATION.rst index 10c2726f..66711f33 100644 --- a/l10n_pt_vat/readme/CONFIGURATION.rst +++ b/l10n_pt_vat/readme/CONFIGURATION.rst @@ -1,4 +1,6 @@ On Accounting Taxes, the "Fiscal Zone" can be set, to identify the VAT zone: Continental Portugal, Madeira or Azores. -A default VAT exception reason can be set on the Sales journal. +The default VAT Exemption reason can be set on the Sales Journal: + +- Go to *Accounting/Invoicing > Configuration > Accounting / Journals* diff --git a/l10n_pt_vat/readme/USAGE.rst b/l10n_pt_vat/readme/USAGE.rst index 439967c3..ea255611 100644 --- a/l10n_pt_vat/readme/USAGE.rst +++ b/l10n_pt_vat/readme/USAGE.rst @@ -1,5 +1 @@ On an Invoice, the VAT adjustment reason is available for selection. - -The Fiscal Position can be used to automatically map VAT tax level -(regular, intermediate, reduced or exempt) to the actual tax percentages, -according to the client's region (Portugal, European Union, or others). From 3588a0b81ced10de51f306202c12e087a6682a4a Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Mon, 26 Jul 2021 10:10:39 +0000 Subject: [PATCH 033/157] [UPD] README.rst --- l10n_pt_vat/README.rst | 4 ---- l10n_pt_vat/static/description/index.html | 3 --- 2 files changed, 7 deletions(-) diff --git a/l10n_pt_vat/README.rst b/l10n_pt_vat/README.rst index d53805dc..1bcde522 100644 --- a/l10n_pt_vat/README.rst +++ b/l10n_pt_vat/README.rst @@ -39,10 +39,6 @@ Usage On an Invoice, the VAT adjustment reason is available for selection. -The Fiscal Position can be used to automatically map VAT tax level -(regular, intermediate, reduced or exempt) to the actual tax percentages, -according to the client's region (Portugal, European Union, or others). - Bug Tracker =========== diff --git a/l10n_pt_vat/static/description/index.html b/l10n_pt_vat/static/description/index.html index bb0828c1..e4fcffce 100644 --- a/l10n_pt_vat/static/description/index.html +++ b/l10n_pt_vat/static/description/index.html @@ -388,9 +388,6 @@

    Portugal - IVA

    Usage

    On an Invoice, the VAT adjustment reason is available for selection.

    -

    The Fiscal Position can be used to automatically map VAT tax level -(regular, intermediate, reduced or exempt) to the actual tax percentages, -according to the client’s region (Portugal, European Union, or others).

    Bug Tracker

    From 32d8375cc9b7e141437a9e501970368669314930 Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Mon, 26 Jul 2021 10:10:39 +0000 Subject: [PATCH 034/157] l10n_pt_vat 14.0.1.0.0 --- l10n_pt_vat/__manifest__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/l10n_pt_vat/__manifest__.py b/l10n_pt_vat/__manifest__.py index 18072ca1..1b2152f7 100644 --- a/l10n_pt_vat/__manifest__.py +++ b/l10n_pt_vat/__manifest__.py @@ -3,7 +3,7 @@ # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). { "name": "Portugal - IVA", - "version": "14.0.0.2.0", + "version": "14.0.1.0.0", "license": "AGPL-3", "depends": ["account", "l10n_pt"], "author": "Open Source Integrators, Sossia, Odoo Community Association (OCA)", From 66ab97bfca81e0a56543e9770d4216fc5d113968 Mon Sep 17 00:00:00 2001 From: Daniel Reis Date: Tue, 3 Aug 2021 09:12:10 +0000 Subject: [PATCH 035/157] Translated using Weblate (Portuguese) Currently translated at 61.5% (32 of 52 strings) Translation: l10n-portugal-14.0/l10n-portugal-14.0-l10n_pt_vat Translate-URL: https://translation.odoo-community.org/projects/l10n-portugal-14-0/l10n-portugal-14-0-l10n_pt_vat/pt/ --- l10n_pt_vat/i18n/pt.po | 50 +++++++++++++++++++++--------------------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/l10n_pt_vat/i18n/pt.po b/l10n_pt_vat/i18n/pt.po index 048fc6c0..e9f43643 100644 --- a/l10n_pt_vat/i18n/pt.po +++ b/l10n_pt_vat/i18n/pt.po @@ -7,14 +7,15 @@ msgstr "" "Project-Id-Version: Odoo Server 8.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-11-18 15:02+0000\n" -"PO-Revision-Date: 2015-11-18 15:02+0000\n" -"Last-Translator: <>\n" +"PO-Revision-Date: 2021-08-03 11:49+0000\n" +"Last-Translator: Daniel Reis \n" "Language-Team: \n" -"Language: \n" +"Language: pt\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: \n" -"Plural-Forms: \n" +"Plural-Forms: nplurals=2; plural=n > 1;\n" +"X-Generator: Weblate 4.3.2\n" #. module: l10n_pt_vat #: code:addons/l10n_pt_vat/models/account_move.py:0 @@ -41,12 +42,12 @@ msgstr "" #. module: l10n_pt_vat #: model:ir.model.fields.selection,name:l10n_pt_vat.selection__account_tax__l10n_pt_fiscal_zone__pt-ac msgid "Açores" -msgstr "" +msgstr "Açores" #. module: l10n_pt_vat #: model:ir.model.fields,field_description:l10n_pt_vat.field_account_l10n_pt_vat_exempt_reason__code msgid "Code" -msgstr "" +msgstr "Código" #. module: l10n_pt_vat #: model:ir.model.fields,field_description:l10n_pt_vat.field_account_l10n_pt_vat_exempt_reason__create_uid @@ -63,7 +64,7 @@ msgstr "Criado em" #. module: l10n_pt_vat #: model:ir.model.fields.selection,name:l10n_pt_vat.selection__account_vat_adjustment_norm__move_type__out_refund msgid "Customer Credit Note" -msgstr "" +msgstr "Nota de Crédito de Cliente" #. module: l10n_pt_vat #: model:ir.model.fields,field_description:l10n_pt_vat.field_account_l10n_pt_vat_exempt_reason__note @@ -78,24 +79,24 @@ msgstr "Descrição" #: model:ir.model.fields,field_description:l10n_pt_vat.field_account_tax__display_name #: model:ir.model.fields,field_description:l10n_pt_vat.field_account_vat_adjustment_norm__display_name msgid "Display Name" -msgstr "" +msgstr "Nome a Exibir" #. module: l10n_pt_vat #: model:account.l10n_pt.vat.exempt.reason,name:l10n_pt_vat.M03 msgid "Exigibilidade de caixa" -msgstr "" +msgstr "Exigibilidade de caixa" #. module: l10n_pt_vat #: model:ir.model.fields,help:l10n_pt_vat.field_account_bank_statement_line__vat_adjustment_norm_id #: model:ir.model.fields,help:l10n_pt_vat.field_account_move__vat_adjustment_norm_id #: model:ir.model.fields,help:l10n_pt_vat.field_account_payment__vat_adjustment_norm_id msgid "Fields 40/41 of the VAT Statement" -msgstr "" +msgstr "Campo 40/41 da Declaração de IVA" #. module: l10n_pt_vat #: model:ir.model.fields,field_description:l10n_pt_vat.field_account_tax__l10n_pt_fiscal_zone msgid "Fiscal Zone" -msgstr "" +msgstr "Zona Fiscal" #. module: l10n_pt_vat #: model:ir.model.fields,field_description:l10n_pt_vat.field_account_journal__id @@ -133,7 +134,7 @@ msgid "" "companies refunds." msgstr "" "Se assinalado, poderá aplicar a norma de regularização a notas de crédito de " -"terceiros" +"terceiros." #. module: l10n_pt_vat #: model:ir.model.fields,help:l10n_pt_vat.field_account_vat_adjustment_norm__out_refunds @@ -142,7 +143,7 @@ msgid "" "refunds." msgstr "" "Se assinalado, poderá aplicar a norma de regularização às suas notas de " -"crédito" +"crédito." #. module: l10n_pt_vat #: model:ir.model.fields,help:l10n_pt_vat.field_account_vat_adjustment_norm__active @@ -181,12 +182,12 @@ msgstr "" #. module: l10n_pt_vat #: model:ir.model,name:l10n_pt_vat.model_account_journal msgid "Journal" -msgstr "" +msgstr "Diário" #. module: l10n_pt_vat #: model:ir.model,name:l10n_pt_vat.model_account_move msgid "Journal Entry" -msgstr "" +msgstr "Lançamento de Diário" #. module: l10n_pt_vat #: model:ir.model.fields,field_description:l10n_pt_vat.field_account_bank_statement_line__l10npt_has_tax_exempt_lines @@ -201,9 +202,8 @@ msgstr "" #: model:ir.model.fields,field_description:l10n_pt_vat.field_account_move____last_update #: model:ir.model.fields,field_description:l10n_pt_vat.field_account_tax____last_update #: model:ir.model.fields,field_description:l10n_pt_vat.field_account_vat_adjustment_norm____last_update -#, fuzzy msgid "Last Modified on" -msgstr "Atualizado pela últ. vez em" +msgstr "Última Modificação em" #. module: l10n_pt_vat #: model:ir.model.fields,field_description:l10n_pt_vat.field_account_l10n_pt_vat_exempt_reason__write_uid @@ -230,7 +230,7 @@ msgstr "" #. module: l10n_pt_vat #: model:ir.model.fields,field_description:l10n_pt_vat.field_account_vat_adjustment_norm__move_type msgid "Move Type" -msgstr "" +msgstr "Tipo de Lançamento" #. module: l10n_pt_vat #: model:ir.model.fields,field_description:l10n_pt_vat.field_account_l10n_pt_vat_exempt_reason__name @@ -246,7 +246,7 @@ msgstr "" #. module: l10n_pt_vat #: model:ir.model.fields.selection,name:l10n_pt_vat.selection__account_tax__l10n_pt_fiscal_zone__pt msgid "Portugal Continental" -msgstr "" +msgstr "Portugal Continental" #. module: l10n_pt_vat #: model:account.l10n_pt.vat.exempt.reason,name:l10n_pt_vat.M12 @@ -276,7 +276,7 @@ msgstr "" #. module: l10n_pt_vat #: model:ir.model,name:l10n_pt_vat.model_account_tax msgid "Tax" -msgstr "" +msgstr "Imposto" #. module: l10n_pt_vat #: model:ir.model.fields,field_description:l10n_pt_vat.field_account_vat_adjustment_norm__out_refunds @@ -297,13 +297,13 @@ msgstr "Utilizar em notas de crédito de terceiros" #: model_terms:ir.ui.view,arch_db:l10n_pt_vat.vat_adjustment_norm_view_search #: model_terms:ir.ui.view,arch_db:l10n_pt_vat.vat_adjustment_norm_view_tree msgid "VAT Adjustment Norm" -msgstr "" +msgstr "Norma de Regularização de IVA" #. module: l10n_pt_vat #: model:ir.actions.act_window,name:l10n_pt_vat.vat_adjustment_norm_action #: model:ir.ui.menu,name:l10n_pt_vat.menu_action_vat_adjustment_norm msgid "VAT Adjustment Norms" -msgstr "" +msgstr "Normas de Regularização de IVA" #. module: l10n_pt_vat #: model:ir.model.fields,field_description:l10n_pt_vat.field_account_bank_statement_line__l10npt_vat_exempt_reason @@ -311,17 +311,17 @@ msgstr "" #: model:ir.model.fields,field_description:l10n_pt_vat.field_account_move__l10npt_vat_exempt_reason #: model:ir.model.fields,field_description:l10n_pt_vat.field_account_payment__l10npt_vat_exempt_reason msgid "VAT Exempt Reason" -msgstr "" +msgstr "Motivo de Isenção de IVA" #. module: l10n_pt_vat #: model:ir.model,name:l10n_pt_vat.model_account_l10n_pt_vat_exempt_reason msgid "VAT Exemption Reason" -msgstr "" +msgstr "Motivo de Isenção de IVA" #. module: l10n_pt_vat #: model:ir.model.fields.selection,name:l10n_pt_vat.selection__account_vat_adjustment_norm__move_type__in_refund msgid "Vendor Credit Note" -msgstr "" +msgstr "Nota de Crédito de Fornecedor" #~ msgid "Invoice" #~ msgstr "Fatura" From 9968738ff01ec7bc5c86b31be328092874b70d72 Mon Sep 17 00:00:00 2001 From: Daniel Reis Date: Fri, 24 Sep 2021 11:07:26 +0000 Subject: [PATCH 036/157] Translated using Weblate (Portuguese) Currently translated at 67.3% (35 of 52 strings) Translation: l10n-portugal-14.0/l10n-portugal-14.0-l10n_pt_vat Translate-URL: https://translation.odoo-community.org/projects/l10n-portugal-14-0/l10n-portugal-14-0-l10n_pt_vat/pt/ --- l10n_pt_vat/i18n/pt.po | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/l10n_pt_vat/i18n/pt.po b/l10n_pt_vat/i18n/pt.po index e9f43643..39423552 100644 --- a/l10n_pt_vat/i18n/pt.po +++ b/l10n_pt_vat/i18n/pt.po @@ -7,7 +7,7 @@ msgstr "" "Project-Id-Version: Odoo Server 8.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-11-18 15:02+0000\n" -"PO-Revision-Date: 2021-08-03 11:49+0000\n" +"PO-Revision-Date: 2021-09-24 13:34+0000\n" "Last-Translator: Daniel Reis \n" "Language-Team: \n" "Language: pt\n" @@ -21,7 +21,7 @@ msgstr "" #: code:addons/l10n_pt_vat/models/account_move.py:0 #, python-format msgid "A tax exemption reason must be provided." -msgstr "" +msgstr "O motivo de isenção é obrigatório." #. module: l10n_pt_vat #: model:ir.model.fields,field_description:l10n_pt_vat.field_account_l10n_pt_vat_exempt_reason__active @@ -31,13 +31,14 @@ msgstr "Ativo" #. module: l10n_pt_vat #: model:account.l10n_pt.vat.exempt.reason,name:l10n_pt_vat.M01 +#, fuzzy msgid "Artigo 16.º n.º 6 do CIVA" -msgstr "" +msgstr "Artigo 16.º n.º 6 do CIVA" #. module: l10n_pt_vat #: model:account.l10n_pt.vat.exempt.reason,name:l10n_pt_vat.M02 msgid "Artigo 6.º do Decreto-Lei n.º 198/90, de 19 de Junho " -msgstr "" +msgstr "Artigo 6.º do Decreto-Lei n.º 198/90, de 19 de Junho " #. module: l10n_pt_vat #: model:ir.model.fields.selection,name:l10n_pt_vat.selection__account_tax__l10n_pt_fiscal_zone__pt-ac @@ -110,7 +111,7 @@ msgstr "ID" #. module: l10n_pt_vat #: model:account.l10n_pt.vat.exempt.reason,name:l10n_pt_vat.M08 msgid "IVA - Autoliquidação" -msgstr "" +msgstr "IVA - Autoliquidação" #. module: l10n_pt_vat #: model:account.l10n_pt.vat.exempt.reason,name:l10n_pt_vat.M09 From 7835ae1693bbdb725eec1e5ea83e02a3661cffca Mon Sep 17 00:00:00 2001 From: Daniel Reis Date: Thu, 10 Mar 2022 18:17:53 +0000 Subject: [PATCH 037/157] [FIX] l10n_pt_vat: tax exempt computation ignore section lines --- l10n_pt_vat/models/account_move.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/l10n_pt_vat/models/account_move.py b/l10n_pt_vat/models/account_move.py index a914998c..beba7f1d 100644 --- a/l10n_pt_vat/models/account_move.py +++ b/l10n_pt_vat/models/account_move.py @@ -25,14 +25,14 @@ class AccountMove(models.Model): readonly=False, ) - @api.depends("country_code", "move_type", "invoice_line_ids.tax_ids") + @api.depends("country_code", "move_type", "invoice_line_ids") def _compute_l10npt_has_tax_exempt_lines(self): for invoice in self: - invoice.l10npt_has_tax_exempt_lines = ( + invoice.l10npt_has_tax_exempt_lines = bool( invoice.country_code == "PT" and invoice.is_sale_document() and invoice.invoice_line_ids.filtered( - lambda x: not x.tax_ids.filtered("amount") + lambda x: not x.display_type and not x.tax_ids.filtered("amount") ) ) From 5eeced762e688e2be2efed14e7b1173f8451d127 Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Mon, 14 Mar 2022 07:30:50 +0000 Subject: [PATCH 038/157] l10n_pt_vat 14.0.1.0.1 --- l10n_pt_vat/__manifest__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/l10n_pt_vat/__manifest__.py b/l10n_pt_vat/__manifest__.py index 1b2152f7..27c077ae 100644 --- a/l10n_pt_vat/__manifest__.py +++ b/l10n_pt_vat/__manifest__.py @@ -3,7 +3,7 @@ # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). { "name": "Portugal - IVA", - "version": "14.0.1.0.0", + "version": "14.0.1.0.1", "license": "AGPL-3", "depends": ["account", "l10n_pt"], "author": "Open Source Integrators, Sossia, Odoo Community Association (OCA)", From 451366ae7ef1471c2171247d5566f4a86a448e8b Mon Sep 17 00:00:00 2001 From: heliaktiv Date: Mon, 25 Jul 2022 16:54:13 +0530 Subject: [PATCH 039/157] [MIG] l10n_pt_vat: Migration to 15.0 --- l10n_pt_vat/__manifest__.py | 2 +- l10n_pt_vat/data/vat_adjustment_norm.xml | 190 +++++++++--------- l10n_pt_vat/i18n/l10n_pt_vat.pot | 2 +- l10n_pt_vat/i18n/pt.po | 2 +- l10n_pt_vat/views/account_journal_view.xml | 4 - l10n_pt_vat/views/account_move_view.xml | 4 - .../views/l10n_pt_vat_exempt_reason_view.xml | 2 - .../views/vat_adjustment_norm_view.xml | 16 +- 8 files changed, 100 insertions(+), 122 deletions(-) diff --git a/l10n_pt_vat/__manifest__.py b/l10n_pt_vat/__manifest__.py index 27c077ae..38086714 100644 --- a/l10n_pt_vat/__manifest__.py +++ b/l10n_pt_vat/__manifest__.py @@ -3,7 +3,7 @@ # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). { "name": "Portugal - IVA", - "version": "14.0.1.0.1", + "version": "15.0.1.0.0", "license": "AGPL-3", "depends": ["account", "l10n_pt"], "author": "Open Source Integrators, Sossia, Odoo Community Association (OCA)", diff --git a/l10n_pt_vat/data/vat_adjustment_norm.xml b/l10n_pt_vat/data/vat_adjustment_norm.xml index f2c0ca02..5ae596ba 100644 --- a/l10n_pt_vat/data/vat_adjustment_norm.xml +++ b/l10n_pt_vat/data/vat_adjustment_norm.xml @@ -1,96 +1,96 @@ - - - - Art. 78º, nº 2 - - - - Art. 78º, nº 3 - - - - - Art. 78º, nº 4 - - - - Art. 78º, nº 6 - - - - - Art. 78º, nº 7, alínea a) - - - - - Art. 78º, nº 7, alínea b) - - - - - Art. 78º, nº 7, alínea c) - - - - - Art. 78º, nº 7, alínea d) - - - - - Art. 78º, nº 8, alínea b) - - - - Art. 78º, nº 8, alínea c) - - - - Art. 78º, nº 8, alínea d) - - - - - Art. 78º, nº 8, alínea e) - - - - Art. 78º, nº 12 - - - - Art. 78º-A, nº 2, alínea a) - - - - Art. 78º-A, nº 4, alínea a) - - - - Art. 78º-A, nº 4, alínea b) - - - - Art. 78º-A, nº 4, alínea c) - - - - Art. 78º-A, nº 4, alínea d) - - - - Art. 78º-B, nº 4 - - - - Art. 78º-C, nº 1 - - - - Art. 78º-C, nº 3 - - + + + + Art. 78º, nº 2 + + + + Art. 78º, nº 3 + + + + + Art. 78º, nº 4 + + + + Art. 78º, nº 6 + + + + + Art. 78º, nº 7, alínea a) + + + + + Art. 78º, nº 7, alínea b) + + + + + Art. 78º, nº 7, alínea c) + + + + + Art. 78º, nº 7, alínea d) + + + + + Art. 78º, nº 8, alínea b) + + + + Art. 78º, nº 8, alínea c) + + + + Art. 78º, nº 8, alínea d) + + + + + Art. 78º, nº 8, alínea e) + + + + Art. 78º, nº 12 + + + + Art. 78º-A, nº 2, alínea a) + + + + Art. 78º-A, nº 4, alínea a) + + + + Art. 78º-A, nº 4, alínea b) + + + + Art. 78º-A, nº 4, alínea c) + + + + Art. 78º-A, nº 4, alínea d) + + + + Art. 78º-B, nº 4 + + + + Art. 78º-C, nº 1 + + + + Art. 78º-C, nº 3 + + diff --git a/l10n_pt_vat/i18n/l10n_pt_vat.pot b/l10n_pt_vat/i18n/l10n_pt_vat.pot index 1cc5558b..ebed16ff 100644 --- a/l10n_pt_vat/i18n/l10n_pt_vat.pot +++ b/l10n_pt_vat/i18n/l10n_pt_vat.pot @@ -4,7 +4,7 @@ # msgid "" msgstr "" -"Project-Id-Version: Odoo Server 14.0\n" +"Project-Id-Version: Odoo Server 15.0\n" "Report-Msgid-Bugs-To: \n" "Last-Translator: \n" "Language-Team: \n" diff --git a/l10n_pt_vat/i18n/pt.po b/l10n_pt_vat/i18n/pt.po index 39423552..027e36c3 100644 --- a/l10n_pt_vat/i18n/pt.po +++ b/l10n_pt_vat/i18n/pt.po @@ -4,7 +4,7 @@ # msgid "" msgstr "" -"Project-Id-Version: Odoo Server 8.0\n" +"Project-Id-Version: Odoo Server 15.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-11-18 15:02+0000\n" "PO-Revision-Date: 2021-09-24 13:34+0000\n" diff --git a/l10n_pt_vat/views/account_journal_view.xml b/l10n_pt_vat/views/account_journal_view.xml index b0f482ac..c4f7504e 100644 --- a/l10n_pt_vat/views/account_journal_view.xml +++ b/l10n_pt_vat/views/account_journal_view.xml @@ -1,11 +1,9 @@ - Account Journal: add l10_pt_vat account.journal - - - diff --git a/l10n_pt_vat/views/account_move_view.xml b/l10n_pt_vat/views/account_move_view.xml index ddc33dd8..a5c0a62c 100644 --- a/l10n_pt_vat/views/account_move_view.xml +++ b/l10n_pt_vat/views/account_move_view.xml @@ -1,12 +1,10 @@ - Invoice: add l10_pt account.move -
    @@ -22,8 +20,6 @@ />
    -
    -
    diff --git a/l10n_pt_vat/views/l10n_pt_vat_exempt_reason_view.xml b/l10n_pt_vat/views/l10n_pt_vat_exempt_reason_view.xml index 2d8389ce..0ce295d9 100644 --- a/l10n_pt_vat/views/l10n_pt_vat_exempt_reason_view.xml +++ b/l10n_pt_vat/views/l10n_pt_vat_exempt_reason_view.xml @@ -1,5 +1,4 @@ - VAT Exempt Reason List account.l10n_pt.vat.exempt.reason @@ -11,5 +10,4 @@ - diff --git a/l10n_pt_vat/views/vat_adjustment_norm_view.xml b/l10n_pt_vat/views/vat_adjustment_norm_view.xml index 7cd40a6c..f750f85f 100644 --- a/l10n_pt_vat/views/vat_adjustment_norm_view.xml +++ b/l10n_pt_vat/views/vat_adjustment_norm_view.xml @@ -1,41 +1,33 @@ - account.vat.adjustment_norm.search account.vat.adjustment_norm - - - account.vat.adjustment_norm.tree account.vat.adjustment_norm child_ids 100 - - + - - account.vat.adjustment_norm.form account.vat.adjustment_norm - -
    + -
    - VAT Adjustment Norms account.vat.adjustment_norm tree,form - -
    From b05444e6a8b47b0d92a117d3b4aa4c3f68b48560 Mon Sep 17 00:00:00 2001 From: oca-ci Date: Wed, 10 Aug 2022 20:16:51 +0000 Subject: [PATCH 040/157] [UPD] Update l10n_pt_vat.pot --- l10n_pt_vat/i18n/l10n_pt_vat.pot | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/l10n_pt_vat/i18n/l10n_pt_vat.pot b/l10n_pt_vat/i18n/l10n_pt_vat.pot index ebed16ff..a57bf6fc 100644 --- a/l10n_pt_vat/i18n/l10n_pt_vat.pot +++ b/l10n_pt_vat/i18n/l10n_pt_vat.pot @@ -69,10 +69,7 @@ msgid "Description" msgstr "" #. module: l10n_pt_vat -#: model:ir.model.fields,field_description:l10n_pt_vat.field_account_journal__display_name #: model:ir.model.fields,field_description:l10n_pt_vat.field_account_l10n_pt_vat_exempt_reason__display_name -#: model:ir.model.fields,field_description:l10n_pt_vat.field_account_move__display_name -#: model:ir.model.fields,field_description:l10n_pt_vat.field_account_tax__display_name #: model:ir.model.fields,field_description:l10n_pt_vat.field_account_vat_adjustment_norm__display_name msgid "Display Name" msgstr "" @@ -95,10 +92,7 @@ msgid "Fiscal Zone" msgstr "" #. module: l10n_pt_vat -#: model:ir.model.fields,field_description:l10n_pt_vat.field_account_journal__id #: model:ir.model.fields,field_description:l10n_pt_vat.field_account_l10n_pt_vat_exempt_reason__id -#: model:ir.model.fields,field_description:l10n_pt_vat.field_account_move__id -#: model:ir.model.fields,field_description:l10n_pt_vat.field_account_tax__id #: model:ir.model.fields,field_description:l10n_pt_vat.field_account_vat_adjustment_norm__id msgid "ID" msgstr "" @@ -187,10 +181,7 @@ msgid "L10Npt Has Tax Exempt Lines" msgstr "" #. module: l10n_pt_vat -#: model:ir.model.fields,field_description:l10n_pt_vat.field_account_journal____last_update #: model:ir.model.fields,field_description:l10n_pt_vat.field_account_l10n_pt_vat_exempt_reason____last_update -#: model:ir.model.fields,field_description:l10n_pt_vat.field_account_move____last_update -#: model:ir.model.fields,field_description:l10n_pt_vat.field_account_tax____last_update #: model:ir.model.fields,field_description:l10n_pt_vat.field_account_vat_adjustment_norm____last_update msgid "Last Modified on" msgstr "" @@ -283,9 +274,7 @@ msgstr "" #: model:ir.model.fields,field_description:l10n_pt_vat.field_account_bank_statement_line__vat_adjustment_norm_id #: model:ir.model.fields,field_description:l10n_pt_vat.field_account_move__vat_adjustment_norm_id #: model:ir.model.fields,field_description:l10n_pt_vat.field_account_payment__vat_adjustment_norm_id -#: model_terms:ir.ui.view,arch_db:l10n_pt_vat.vat_adjustment_norm_view_form #: model_terms:ir.ui.view,arch_db:l10n_pt_vat.vat_adjustment_norm_view_search -#: model_terms:ir.ui.view,arch_db:l10n_pt_vat.vat_adjustment_norm_view_tree msgid "VAT Adjustment Norm" msgstr "" From 470cefd00f98aa192014674baacc406d579cdea2 Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Wed, 10 Aug 2022 20:19:13 +0000 Subject: [PATCH 041/157] [UPD] README.rst --- l10n_pt_vat/README.rst | 10 +++++----- l10n_pt_vat/static/description/index.html | 6 +++--- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/l10n_pt_vat/README.rst b/l10n_pt_vat/README.rst index 1bcde522..1509dc70 100644 --- a/l10n_pt_vat/README.rst +++ b/l10n_pt_vat/README.rst @@ -14,13 +14,13 @@ Portugal - IVA :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html :alt: License: AGPL-3 .. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fl10n--portugal-lightgray.png?logo=github - :target: https://github.com/OCA/l10n-portugal/tree/14.0/l10n_pt_vat + :target: https://github.com/OCA/l10n-portugal/tree/15.0/l10n_pt_vat :alt: OCA/l10n-portugal .. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png - :target: https://translation.odoo-community.org/projects/l10n-portugal-14-0/l10n-portugal-14-0-l10n_pt_vat + :target: https://translation.odoo-community.org/projects/l10n-portugal-15-0/l10n-portugal-15-0-l10n_pt_vat :alt: Translate me on Weblate .. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png - :target: https://runbot.odoo-community.org/runbot/171/14.0 + :target: https://runbot.odoo-community.org/runbot/171/15.0 :alt: Try me on Runbot |badge1| |badge2| |badge3| |badge4| |badge5| @@ -45,7 +45,7 @@ Bug Tracker Bugs are tracked on `GitHub Issues `_. In case of trouble, please check there if your issue has already been reported. If you spotted it first, help us smashing it by providing a detailed and welcomed -`feedback `_. +`feedback `_. Do not contact contributors directly about support or help with technical issues. @@ -80,6 +80,6 @@ OCA, or the Odoo Community Association, is a nonprofit organization whose mission is to support the collaborative development of Odoo features and promote its widespread use. -This module is part of the `OCA/l10n-portugal `_ project on GitHub. +This module is part of the `OCA/l10n-portugal `_ project on GitHub. You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/l10n_pt_vat/static/description/index.html b/l10n_pt_vat/static/description/index.html index e4fcffce..f4f06945 100644 --- a/l10n_pt_vat/static/description/index.html +++ b/l10n_pt_vat/static/description/index.html @@ -367,7 +367,7 @@

    Portugal - IVA

    !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! --> -

    Beta License: AGPL-3 OCA/l10n-portugal Translate me on Weblate Try me on Runbot

    +

    Beta License: AGPL-3 OCA/l10n-portugal Translate me on Weblate Try me on Runbot

    This modules extends the base localization modules with a few VAT specific functions that are required by the Portuguese Tax Authorities, including:

    • The use of pre-defined legally accepted reasons for issuing credit notes, as required for fields 40/41 of the VAT statement (Portaria nº 255/2013).
    • @@ -394,7 +394,7 @@

      Bug Tracker

      Bugs are tracked on GitHub Issues. In case of trouble, please check there if your issue has already been reported. If you spotted it first, help us smashing it by providing a detailed and welcomed -feedback.

      +feedback.

      Do not contact contributors directly about support or help with technical issues.

    @@ -427,7 +427,7 @@

    Maintainers

    OCA, or the Odoo Community Association, is a nonprofit organization whose mission is to support the collaborative development of Odoo features and promote its widespread use.

    -

    This module is part of the OCA/l10n-portugal project on GitHub.

    +

    This module is part of the OCA/l10n-portugal project on GitHub.

    You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

    From b47e4b38396f52d2b98d1f253ecb7b119dc3430b Mon Sep 17 00:00:00 2001 From: Francisco Martins Date: Thu, 3 Nov 2022 09:42:09 +0000 Subject: [PATCH 042/157] [IMP] l10n_pt_vat: pre-commit stuff --- l10n_pt_vat/__manifest__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/l10n_pt_vat/__manifest__.py b/l10n_pt_vat/__manifest__.py index 38086714..1d824c93 100644 --- a/l10n_pt_vat/__manifest__.py +++ b/l10n_pt_vat/__manifest__.py @@ -3,7 +3,7 @@ # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). { "name": "Portugal - IVA", - "version": "15.0.1.0.0", + "version": "16.0.1.0.0", "license": "AGPL-3", "depends": ["account", "l10n_pt"], "author": "Open Source Integrators, Sossia, Odoo Community Association (OCA)", From fd44e47054fef44617ac21876be84a87e7b459c2 Mon Sep 17 00:00:00 2001 From: Francisco Martins Date: Thu, 3 Nov 2022 09:51:30 +0000 Subject: [PATCH 043/157] [MIG] l10n_pt_vat: Migration to 16.0 --- l10n_pt_vat/views/account_move_view.xml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/l10n_pt_vat/views/account_move_view.xml b/l10n_pt_vat/views/account_move_view.xml index a5c0a62c..e43f3401 100644 --- a/l10n_pt_vat/views/account_move_view.xml +++ b/l10n_pt_vat/views/account_move_view.xml @@ -15,7 +15,8 @@
    From 351f7f2abf2a36dd724b5d02061d2cfa79eb2e2b Mon Sep 17 00:00:00 2001 From: oca-ci Date: Wed, 28 Dec 2022 15:28:51 +0000 Subject: [PATCH 044/157] [UPD] Update l10n_pt_vat.pot --- l10n_pt_vat/i18n/l10n_pt_vat.pot | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/l10n_pt_vat/i18n/l10n_pt_vat.pot b/l10n_pt_vat/i18n/l10n_pt_vat.pot index a57bf6fc..5b437469 100644 --- a/l10n_pt_vat/i18n/l10n_pt_vat.pot +++ b/l10n_pt_vat/i18n/l10n_pt_vat.pot @@ -4,7 +4,7 @@ # msgid "" msgstr "" -"Project-Id-Version: Odoo Server 15.0\n" +"Project-Id-Version: Odoo Server 16.0\n" "Report-Msgid-Bugs-To: \n" "Last-Translator: \n" "Language-Team: \n" @@ -14,6 +14,7 @@ msgstr "" "Plural-Forms: \n" #. module: l10n_pt_vat +#. odoo-python #: code:addons/l10n_pt_vat/models/account_move.py:0 #, python-format msgid "A tax exemption reason must be provided." From a9193d0fe016b04735cc252118803a1ba267d428 Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Wed, 28 Dec 2022 15:31:53 +0000 Subject: [PATCH 045/157] [UPD] README.rst --- l10n_pt_vat/README.rst | 10 +++++----- l10n_pt_vat/static/description/index.html | 6 +++--- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/l10n_pt_vat/README.rst b/l10n_pt_vat/README.rst index 1509dc70..5061b980 100644 --- a/l10n_pt_vat/README.rst +++ b/l10n_pt_vat/README.rst @@ -14,13 +14,13 @@ Portugal - IVA :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html :alt: License: AGPL-3 .. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fl10n--portugal-lightgray.png?logo=github - :target: https://github.com/OCA/l10n-portugal/tree/15.0/l10n_pt_vat + :target: https://github.com/OCA/l10n-portugal/tree/16.0/l10n_pt_vat :alt: OCA/l10n-portugal .. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png - :target: https://translation.odoo-community.org/projects/l10n-portugal-15-0/l10n-portugal-15-0-l10n_pt_vat + :target: https://translation.odoo-community.org/projects/l10n-portugal-16-0/l10n-portugal-16-0-l10n_pt_vat :alt: Translate me on Weblate .. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png - :target: https://runbot.odoo-community.org/runbot/171/15.0 + :target: https://runbot.odoo-community.org/runbot/171/16.0 :alt: Try me on Runbot |badge1| |badge2| |badge3| |badge4| |badge5| @@ -45,7 +45,7 @@ Bug Tracker Bugs are tracked on `GitHub Issues `_. In case of trouble, please check there if your issue has already been reported. If you spotted it first, help us smashing it by providing a detailed and welcomed -`feedback `_. +`feedback `_. Do not contact contributors directly about support or help with technical issues. @@ -80,6 +80,6 @@ OCA, or the Odoo Community Association, is a nonprofit organization whose mission is to support the collaborative development of Odoo features and promote its widespread use. -This module is part of the `OCA/l10n-portugal `_ project on GitHub. +This module is part of the `OCA/l10n-portugal `_ project on GitHub. You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/l10n_pt_vat/static/description/index.html b/l10n_pt_vat/static/description/index.html index f4f06945..ab38966a 100644 --- a/l10n_pt_vat/static/description/index.html +++ b/l10n_pt_vat/static/description/index.html @@ -367,7 +367,7 @@

    Portugal - IVA

    !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! --> -

    Beta License: AGPL-3 OCA/l10n-portugal Translate me on Weblate Try me on Runbot

    +

    Beta License: AGPL-3 OCA/l10n-portugal Translate me on Weblate Try me on Runbot

    This modules extends the base localization modules with a few VAT specific functions that are required by the Portuguese Tax Authorities, including:

    • The use of pre-defined legally accepted reasons for issuing credit notes, as required for fields 40/41 of the VAT statement (Portaria nº 255/2013).
    • @@ -394,7 +394,7 @@

      Bug Tracker

      Bugs are tracked on GitHub Issues. In case of trouble, please check there if your issue has already been reported. If you spotted it first, help us smashing it by providing a detailed and welcomed -feedback.

      +feedback.

      Do not contact contributors directly about support or help with technical issues.

      @@ -427,7 +427,7 @@

      Maintainers

      OCA, or the Odoo Community Association, is a nonprofit organization whose mission is to support the collaborative development of Odoo features and promote its widespread use.

      -

      This module is part of the OCA/l10n-portugal project on GitHub.

      +

      This module is part of the OCA/l10n-portugal project on GitHub.

      You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

      From 7c8c86307dedc3a5f325d15286455f2929af48ff Mon Sep 17 00:00:00 2001 From: Weblate Date: Wed, 28 Dec 2022 15:36:15 +0000 Subject: [PATCH 046/157] Update translation files Updated by "Update PO files to match POT (msgmerge)" hook in Weblate. Translation: l10n-portugal-16.0/l10n-portugal-16.0-l10n_pt_vat Translate-URL: https://translation.odoo-community.org/projects/l10n-portugal-16-0/l10n-portugal-16-0-l10n_pt_vat/ --- l10n_pt_vat/i18n/pt.po | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/l10n_pt_vat/i18n/pt.po b/l10n_pt_vat/i18n/pt.po index 027e36c3..c66eb7bb 100644 --- a/l10n_pt_vat/i18n/pt.po +++ b/l10n_pt_vat/i18n/pt.po @@ -18,6 +18,7 @@ msgstr "" "X-Generator: Weblate 4.3.2\n" #. module: l10n_pt_vat +#. odoo-python #: code:addons/l10n_pt_vat/models/account_move.py:0 #, python-format msgid "A tax exemption reason must be provided." @@ -74,10 +75,7 @@ msgid "Description" msgstr "Descrição" #. module: l10n_pt_vat -#: model:ir.model.fields,field_description:l10n_pt_vat.field_account_journal__display_name #: model:ir.model.fields,field_description:l10n_pt_vat.field_account_l10n_pt_vat_exempt_reason__display_name -#: model:ir.model.fields,field_description:l10n_pt_vat.field_account_move__display_name -#: model:ir.model.fields,field_description:l10n_pt_vat.field_account_tax__display_name #: model:ir.model.fields,field_description:l10n_pt_vat.field_account_vat_adjustment_norm__display_name msgid "Display Name" msgstr "Nome a Exibir" @@ -100,10 +98,7 @@ msgid "Fiscal Zone" msgstr "Zona Fiscal" #. module: l10n_pt_vat -#: model:ir.model.fields,field_description:l10n_pt_vat.field_account_journal__id #: model:ir.model.fields,field_description:l10n_pt_vat.field_account_l10n_pt_vat_exempt_reason__id -#: model:ir.model.fields,field_description:l10n_pt_vat.field_account_move__id -#: model:ir.model.fields,field_description:l10n_pt_vat.field_account_tax__id #: model:ir.model.fields,field_description:l10n_pt_vat.field_account_vat_adjustment_norm__id msgid "ID" msgstr "ID" @@ -198,10 +193,7 @@ msgid "L10Npt Has Tax Exempt Lines" msgstr "" #. module: l10n_pt_vat -#: model:ir.model.fields,field_description:l10n_pt_vat.field_account_journal____last_update #: model:ir.model.fields,field_description:l10n_pt_vat.field_account_l10n_pt_vat_exempt_reason____last_update -#: model:ir.model.fields,field_description:l10n_pt_vat.field_account_move____last_update -#: model:ir.model.fields,field_description:l10n_pt_vat.field_account_tax____last_update #: model:ir.model.fields,field_description:l10n_pt_vat.field_account_vat_adjustment_norm____last_update msgid "Last Modified on" msgstr "Última Modificação em" @@ -294,9 +286,7 @@ msgstr "Utilizar em notas de crédito de terceiros" #: model:ir.model.fields,field_description:l10n_pt_vat.field_account_bank_statement_line__vat_adjustment_norm_id #: model:ir.model.fields,field_description:l10n_pt_vat.field_account_move__vat_adjustment_norm_id #: model:ir.model.fields,field_description:l10n_pt_vat.field_account_payment__vat_adjustment_norm_id -#: model_terms:ir.ui.view,arch_db:l10n_pt_vat.vat_adjustment_norm_view_form #: model_terms:ir.ui.view,arch_db:l10n_pt_vat.vat_adjustment_norm_view_search -#: model_terms:ir.ui.view,arch_db:l10n_pt_vat.vat_adjustment_norm_view_tree msgid "VAT Adjustment Norm" msgstr "Norma de Regularização de IVA" From bc9236e48d99b90a8ed3f7379d8e75ef13b2c0bc Mon Sep 17 00:00:00 2001 From: Daniel Reis Date: Wed, 28 Dec 2022 18:50:27 +0000 Subject: [PATCH 047/157] [REF] l10n_pt_vat: update development status --- l10n_pt_vat/__manifest__.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/l10n_pt_vat/__manifest__.py b/l10n_pt_vat/__manifest__.py index 1d824c93..a8154b0e 100644 --- a/l10n_pt_vat/__manifest__.py +++ b/l10n_pt_vat/__manifest__.py @@ -5,11 +5,13 @@ "name": "Portugal - IVA", "version": "16.0.1.0.0", "license": "AGPL-3", - "depends": ["account", "l10n_pt"], "author": "Open Source Integrators, Sossia, Odoo Community Association (OCA)", "summary": "Portuguese VAT requirements extensions", "website": "https://github.com/OCA/l10n-portugal", "category": "Accounting/Localizations", + "maintainers": ["dreispt"], + "development_status": "Production/Stable", + "depends": ["account", "l10n_pt"], "data": [ "security/ir.model.access.csv", "data/account.l10n_pt.vat.exempt.reason.csv", From 93ed2483eb232a094d5cad5826c26623dfb46c41 Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Thu, 29 Dec 2022 12:19:44 +0000 Subject: [PATCH 048/157] [UPD] README.rst --- l10n_pt_vat/README.rst | 12 ++++++++++-- l10n_pt_vat/static/description/index.html | 4 +++- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/l10n_pt_vat/README.rst b/l10n_pt_vat/README.rst index 5061b980..91c53035 100644 --- a/l10n_pt_vat/README.rst +++ b/l10n_pt_vat/README.rst @@ -7,9 +7,9 @@ Portugal - IVA !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png +.. |badge1| image:: https://img.shields.io/badge/maturity-Production%2FStable-green.png :target: https://odoo-community.org/page/development-status - :alt: Beta + :alt: Production/Stable .. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html :alt: License: AGPL-3 @@ -80,6 +80,14 @@ OCA, or the Odoo Community Association, is a nonprofit organization whose mission is to support the collaborative development of Odoo features and promote its widespread use. +.. |maintainer-dreispt| image:: https://github.com/dreispt.png?size=40px + :target: https://github.com/dreispt + :alt: dreispt + +Current `maintainer `__: + +|maintainer-dreispt| + This module is part of the `OCA/l10n-portugal `_ project on GitHub. You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/l10n_pt_vat/static/description/index.html b/l10n_pt_vat/static/description/index.html index ab38966a..f175af1a 100644 --- a/l10n_pt_vat/static/description/index.html +++ b/l10n_pt_vat/static/description/index.html @@ -367,7 +367,7 @@

      Portugal - IVA

      !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! --> -

      Beta License: AGPL-3 OCA/l10n-portugal Translate me on Weblate Try me on Runbot

      +

      Production/Stable License: AGPL-3 OCA/l10n-portugal Translate me on Weblate Try me on Runbot

      This modules extends the base localization modules with a few VAT specific functions that are required by the Portuguese Tax Authorities, including:

      • The use of pre-defined legally accepted reasons for issuing credit notes, as required for fields 40/41 of the VAT statement (Portaria nº 255/2013).
      • @@ -427,6 +427,8 @@

        Maintainers

        OCA, or the Odoo Community Association, is a nonprofit organization whose mission is to support the collaborative development of Odoo features and promote its widespread use.

        +

        Current maintainer:

        +

        dreispt

        This module is part of the OCA/l10n-portugal project on GitHub.

        You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

        From fd165a2b4874172c7601fff3ea6a8ad275d1eabd Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Sun, 3 Sep 2023 13:52:23 +0000 Subject: [PATCH 049/157] [UPD] README.rst --- l10n_pt_vat/README.rst | 15 +++++---- l10n_pt_vat/static/description/index.html | 40 ++++++++++++----------- 2 files changed, 30 insertions(+), 25 deletions(-) diff --git a/l10n_pt_vat/README.rst b/l10n_pt_vat/README.rst index 91c53035..55ec394b 100644 --- a/l10n_pt_vat/README.rst +++ b/l10n_pt_vat/README.rst @@ -2,10 +2,13 @@ Portugal - IVA ============== -.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:012fa46c7a2c8d6b6b8f9ebe39a877bd13e702a20614c46601fe298222e6f5ba + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Production%2FStable-green.png :target: https://odoo-community.org/page/development-status @@ -19,11 +22,11 @@ Portugal - IVA .. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png :target: https://translation.odoo-community.org/projects/l10n-portugal-16-0/l10n-portugal-16-0-l10n_pt_vat :alt: Translate me on Weblate -.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png - :target: https://runbot.odoo-community.org/runbot/171/16.0 - :alt: Try me on Runbot +.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png + :target: https://runboat.odoo-community.org/builds?repo=OCA/l10n-portugal&target_branch=16.0 + :alt: Try me on Runboat -|badge1| |badge2| |badge3| |badge4| |badge5| +|badge1| |badge2| |badge3| |badge4| |badge5| This modules extends the base localization modules with a few VAT specific functions that are required by the Portuguese Tax Authorities, including: @@ -44,7 +47,7 @@ Bug Tracker Bugs are tracked on `GitHub Issues `_. In case of trouble, please check there if your issue has already been reported. -If you spotted it first, help us smashing it by providing a detailed and welcomed +If you spotted it first, help us to smash it by providing a detailed and welcomed `feedback `_. Do not contact contributors directly about support or help with technical issues. diff --git a/l10n_pt_vat/static/description/index.html b/l10n_pt_vat/static/description/index.html index f175af1a..254b3d10 100644 --- a/l10n_pt_vat/static/description/index.html +++ b/l10n_pt_vat/static/description/index.html @@ -1,20 +1,20 @@ - + - + Portugal - IVA + + +
        +

        Portugal InvoiceXpress Integration

        + + +

        Production/Stable License: AGPL-3 OCA/l10n-portugal Translate me on Weblate Try me on Runbot

        +

        Generate Portuguese tax authority legal Invoices (“Faturas”) using InvoiceXpress.

        +

        Table of contents

        + +
        +

        Usage

        +

        On an Invoice use the “Create InvoiceXpress” +button to generate an invoice on the InvoiceXpress service.

        +

        The “Email InvoiceXpress” button requests the InvoiceXpress service to send an email with a +copy of the legal document.

        +
        +
        +

        Bug Tracker

        +

        Bugs are tracked on GitHub Issues. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us smashing it by providing a detailed and welcomed +feedback.

        +

        Do not contact contributors directly about support or help with technical issues.

        +
        +
        +

        Credits

        +
        +

        Authors

        +
          +
        • Open Source Integrators
        • +
        +
        +
        +

        Maintainers

        +

        This module is maintained by the OCA.

        +Odoo Community Association +

        OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use.

        +

        Current maintainer:

        +

        dreispt

        +

        This module is part of the OCA/l10n-portugal project on GitHub.

        +

        You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

        +
        +
        +
        + + From e42d6e20b558ead62ed43a4816241ccea16ba453 Mon Sep 17 00:00:00 2001 From: Daniel Reis Date: Tue, 15 Jun 2021 12:49:37 +0100 Subject: [PATCH 069/157] [FIX] l10n_pt_account_invoicexpress,l10n_pt_stock_invoicexpress: send email error --- .../models/account_move.py | 30 +++++++++++-------- 1 file changed, 18 insertions(+), 12 deletions(-) diff --git a/l10n_pt_account_invoicexpress/models/account_move.py b/l10n_pt_account_invoicexpress/models/account_move.py index 52643296..f8379268 100644 --- a/l10n_pt_account_invoicexpress/models/account_move.py +++ b/l10n_pt_account_invoicexpress/models/account_move.py @@ -2,7 +2,7 @@ # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). from odoo import _, exceptions, fields, models -from odoo.tools import safe_eval +from odoo.tools.safe_eval import safe_eval class AccountMove(models.Model): @@ -119,16 +119,13 @@ def action_create_invoicexpress_invoice(self): def _prepare_invoicexpress_email_vals(self): self.ensure_one() ICPSudo = self.env["ir.config_parameter"].sudo() - eval_context = {"self": self} - email_to = safe_eval( - ICPSudo.get_param( - "invoicexpress.invoice_email_to", "self.partner_id.email" - ), - eval_context, - ) - email_cc = safe_eval( - ICPSudo.get_param("invoicexpress.invoice_email_cc", ""), eval_context + eval_email_to = ICPSudo.get_param( + "invoicexpress.invoice_email_to", "self.partner_id.email" ) + eval_email_cc = ICPSudo.get_param("invoicexpress.invoice_email_cc") + eval_context = {"self": self} + email_to = safe_eval(eval_email_to, eval_context) + email_cc = eval_email_cc and safe_eval(eval_email_cc, eval_context) if not email_to: raise exceptions.UserError( _("Kindly Configure the customer email address.") @@ -145,11 +142,20 @@ def _prepare_invoicexpress_email_vals(self): def action_send_invoicexpress_email(self): InvoiceXpress = self.env["account.invoicexpress"] - for invoice in self.filtered(lambda x: not x.invoicexpress_id): + for invoice in self: + if not invoice.invoicexpress_id: + raise exceptions.UserError( + _("Invoice %s is not registerd in InvoiceXpress yet."), invoice.name + ) endpoint = "invoices/{}/email-document.json".format( invoice.invoicexpress_id ) payload = invoice._prepare_invoicexpress_email_vals() InvoiceXpress.call(endpoint, "PUT", payload=payload) - msg = "InvoiceXpress document has been sent successfully" + msg = _( + "Email sent by InvoiceXpress:
        • To: {}
        • Cc: {}
        " + ).format( + payload["message"]["client"]["email"], + payload["message"]["cc"] or _("None"), + ) invoice.message_post(body=msg) From 813ac67f5078d6ecf60b16b8fba4103108c43637 Mon Sep 17 00:00:00 2001 From: oca-travis Date: Wed, 16 Jun 2021 08:16:49 +0000 Subject: [PATCH 070/157] [UPD] Update l10n_pt_account_invoicexpress.pot --- .../i18n/l10n_pt_account_invoicexpress.pot | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/l10n_pt_account_invoicexpress/i18n/l10n_pt_account_invoicexpress.pot b/l10n_pt_account_invoicexpress/i18n/l10n_pt_account_invoicexpress.pot index 8137af94..7c0f340b 100644 --- a/l10n_pt_account_invoicexpress/i18n/l10n_pt_account_invoicexpress.pot +++ b/l10n_pt_account_invoicexpress/i18n/l10n_pt_account_invoicexpress.pot @@ -68,6 +68,12 @@ msgstr "" msgid "Email InvoiceXpress" msgstr "" +#. module: l10n_pt_account_invoicexpress +#: code:addons/l10n_pt_account_invoicexpress/models/account_move.py:0 +#, python-format +msgid "Email sent by InvoiceXpress:
        • To: {}
        • Cc: {}
        " +msgstr "" + #. module: l10n_pt_account_invoicexpress #: code:addons/l10n_pt_account_invoicexpress/models/account_invoicexpress.py:0 #, python-format @@ -83,6 +89,12 @@ msgstr "" msgid "ID" msgstr "" +#. module: l10n_pt_account_invoicexpress +#: code:addons/l10n_pt_account_invoicexpress/models/account_move.py:0 +#, python-format +msgid "Invoice %s is not registerd in InvoiceXpress yet." +msgstr "" + #. module: l10n_pt_account_invoicexpress #: code:addons/l10n_pt_account_invoicexpress/models/account_move.py:0 #, python-format @@ -177,6 +189,12 @@ msgstr "" msgid "Last Modified on" msgstr "" +#. module: l10n_pt_account_invoicexpress +#: code:addons/l10n_pt_account_invoicexpress/models/account_move.py:0 +#, python-format +msgid "None" +msgstr "" + #. module: l10n_pt_account_invoicexpress #: model:ir.model.fields,help:l10n_pt_account_invoicexpress.field_account_bank_statement_line__journal_type #: model:ir.model.fields,help:l10n_pt_account_invoicexpress.field_account_move__journal_type From a128934794c9b38c0e3fc286a0b7d54978b23240 Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Wed, 16 Jun 2021 08:20:44 +0000 Subject: [PATCH 071/157] l10n_pt_account_invoicexpress 14.0.1.1.0 --- l10n_pt_account_invoicexpress/__manifest__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/l10n_pt_account_invoicexpress/__manifest__.py b/l10n_pt_account_invoicexpress/__manifest__.py index 4a30cbda..a009400f 100644 --- a/l10n_pt_account_invoicexpress/__manifest__.py +++ b/l10n_pt_account_invoicexpress/__manifest__.py @@ -4,7 +4,7 @@ { "name": "Portugal InvoiceXpress Integration", "summary": "Legal invoices with InvoiceXpress", - "version": "14.0.1.0.0", + "version": "14.0.1.1.0", "author": "Open Source Integrators, Odoo Community Association (OCA)", "license": "AGPL-3", "website": "https://github.com/OCA/l10n-portugal", From 887fd49cf3defe0feb733c954c7e65d772e64e5a Mon Sep 17 00:00:00 2001 From: Daniel Reis Date: Mon, 5 Jul 2021 09:47:40 +0100 Subject: [PATCH 072/157] [FIX] l10n_pt_account_invoicexpress: multicompany support, foreign country support --- l10n_pt_account_invoicexpress/__manifest__.py | 3 +- .../data/country_mapping.txt | 43 ++++ .../data/ir_config_parameter.xml | 10 - .../data/mail_template.xml | 28 +++ .../data/res.country.csv | 234 ++++++++++++++++++ .../i18n/l10n_pt_account_invoicexpress.pot | 18 -- .../models/__init__.py | 6 +- .../models/account_invoicexpress.py | 15 +- .../models/account_move.py | 96 ++++--- .../models/account_tax.py | 12 +- .../models/res_company.py | 21 ++ .../models/res_config_settings.py | 45 ++-- .../models/res_country.py | 10 + .../models/res_partner.py | 2 +- .../tests/test_invoicexpress.py | 13 +- .../views/account_move_view.xml | 21 +- .../views/res_config_settings.xml | 12 +- .../views/res_country_view.xml | 12 + 18 files changed, 483 insertions(+), 118 deletions(-) create mode 100644 l10n_pt_account_invoicexpress/data/country_mapping.txt delete mode 100644 l10n_pt_account_invoicexpress/data/ir_config_parameter.xml create mode 100644 l10n_pt_account_invoicexpress/data/mail_template.xml create mode 100644 l10n_pt_account_invoicexpress/data/res.country.csv create mode 100644 l10n_pt_account_invoicexpress/models/res_company.py create mode 100644 l10n_pt_account_invoicexpress/models/res_country.py create mode 100644 l10n_pt_account_invoicexpress/views/res_country_view.xml diff --git a/l10n_pt_account_invoicexpress/__manifest__.py b/l10n_pt_account_invoicexpress/__manifest__.py index a009400f..1e0a7a34 100644 --- a/l10n_pt_account_invoicexpress/__manifest__.py +++ b/l10n_pt_account_invoicexpress/__manifest__.py @@ -13,10 +13,11 @@ "development_status": "Production/Stable", "depends": ["l10n_pt_vat", "account"], "data": [ - "data/ir_config_parameter.xml", "views/res_config_settings.xml", "views/account_tax_view.xml", "views/account_move_view.xml", + "data/mail_template.xml", + "data/res.country.csv", ], "application": True, "installable": True, diff --git a/l10n_pt_account_invoicexpress/data/country_mapping.txt b/l10n_pt_account_invoicexpress/data/country_mapping.txt new file mode 100644 index 00000000..43456f0a --- /dev/null +++ b/l10n_pt_account_invoicexpress/data/country_mapping.txt @@ -0,0 +1,43 @@ +Odoo country list was mapped to the InvoiceXpress names as documented at +https://invoicexpress.com/api-v2/documentation/appendix + +These InvoiceXpress country names found no macth in Odoo: + +Burma +Canton and Enderbury Islands +Dronning Maud Land +East Timor +International Monetary Fund +Ivory Coast +Johnston Island +Kampuchea +Midway Islands +Netherlands Antilles +Samoa (America) +Tahiti +Upper Volta +Vatican +Wake Island +Western Samoa +Zaïre + +These Odoo countries found no match in the InvoiceXpress list: + +id,name +base.aq,Antarctica +base.bq,Bonaire, Sint Eustatius and Saba +base.bv,Bouvet Island +base.tf,French Southern Territories +base.va,Holy See (Vatican City State) +base.xk,Kosovo +base.bl,Saint Barthélémy +base.mf,Saint Martin (French part) +base.pm,Saint Pierre and Miquelon +base.sx,Sint Maarten (Dutch part) +base.gs,South Georgia and the South Sandwich Islands +base.ss,South Sudan +base.tk,Tokelau +base.to,Tonga +base.um,USA Minor Outlying Islands +base.vi,Virgin Islands (USA) +base.ax,Åland Islands diff --git a/l10n_pt_account_invoicexpress/data/ir_config_parameter.xml b/l10n_pt_account_invoicexpress/data/ir_config_parameter.xml deleted file mode 100644 index 4219a158..00000000 --- a/l10n_pt_account_invoicexpress/data/ir_config_parameter.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - invoicexpress.invoice_email_to - self.partner_id.email - - - invoicexpress.invoice_email_cc - - - diff --git a/l10n_pt_account_invoicexpress/data/mail_template.xml b/l10n_pt_account_invoicexpress/data/mail_template.xml new file mode 100644 index 00000000..9210f121 --- /dev/null +++ b/l10n_pt_account_invoicexpress/data/mail_template.xml @@ -0,0 +1,28 @@ + + + InvoiceXpress: Send Invoice by Email + + Sua Fatura ${object.name | safe} + ${object.partner_id.email | safe} + ${object.env.user.email | safe} + +

        +Olá, +
        +Enviamos em anexo a fatura ${object.name | safe} +% if object.ref: + relativa à sua encomenda ${object.ref | safe} +% endif +. +

        +Obrigado +% if user.signature: +
        + ${user.signature | safe} +% endif +

        +
        + ${object.partner_id.lang} + +
        +
        diff --git a/l10n_pt_account_invoicexpress/data/res.country.csv b/l10n_pt_account_invoicexpress/data/res.country.csv new file mode 100644 index 00000000..ce9d31ca --- /dev/null +++ b/l10n_pt_account_invoicexpress/data/res.country.csv @@ -0,0 +1,234 @@ +id,invoicexpress_name +base.af,Afghanistan +base.al,Albania +base.dz,Algeria +base.as,American Samoa +base.ad,Andorra +base.ao,Angola +base.ai,Anguilla +base.ag,Antigua and Barbuda +base.ar,Argentina +base.am,Armenia +base.aw,Aruba +base.au,Australia +base.at,Austria +base.az,Azerbaijan +base.bs,Bahamas +base.bh,Bahrain +base.bd,Bangladesh +base.bb,Barbados +base.by,Belarus +base.be,Belgium +base.bz,Belize +base.bj,Benin +base.bm,Bermuda +base.bt,Bhutan +base.bo,Bolivia +base.ba,Bosnia-Herzegovina +base.bw,Botswana +base.br,Brazil +base.io,British Indian Ocean Territory +base.bn,Brunei +base.bg,Bulgaria +base.bf,Burkina Faso +base.bi,Burundi +base.kh,Cambodia +base.cm,Cameroon +base.ca,Canada +base.cv,Cape Verde +base.ky,Cayman Islands +base.cf,Central African Republic +base.td,Chad +base.cl,Chile +base.cn,China +base.cx,Christmas Island +base.cc,Cocos (Keeling) Islands +base.co,Colombia +base.km,Comoros +base.cg,Congo +base.ck,Cook Islands +base.cr,Costa Rica +base.hr,Croatia +base.cu,Cuba +base.cw,Curaçao +base.cy,Cyprus +base.cz,Czech Republic +base.ci,Côte d’Ivoire +base.cd,"Congo, Democratic Republic" +base.dk,Denmark +base.dj,Djibouti +base.dm,Dominica +base.do,Dominican Republic +base.ec,Ecuador +base.eg,Egypt +base.sv,El Salvador +base.gq,Equatorial Guinea +base.er,Eritrea +base.ee,Estonia +base.et,Ethiopia +base.fk,Faeroe Islands (Føroyar) +base.fo,Falkland Islands +base.fj,Fiji +base.fi,Finland +base.fr,France +base.gf,French Guiana +base.pf,French Polynesia +base.ga,Gabon +base.gm,Gambia +base.ge,Georgia +base.de,Germany +base.gh,Ghana +base.gi,Gibraltar +base.gr,Greece +base.gl,Greenland +base.gd,Grenada +base.gp,Guadeloupe +base.gu,Guam +base.gt,Guatemala +base.gg,Guernsey +base.gn,Guinea +base.gw,Guinea-Bissau +base.gy,Guyana +base.ht,Haiti +base.hm,Heard and McDonald Islands +base.hn,Honduras +base.hk,Hong Kong +base.hu,Hungary +base.is,Iceland +base.in,India +base.id,Indonesia +base.ir,Iran +base.iq,Iraq +base.ie,Ireland +base.im,Isle of Man +base.il,Israel +base.it,Italy +base.jm,Jamaica +base.jp,Japan +base.je,Jersey +base.jo,Jordan +base.kz,Kazakhstan +base.ke,Kenya +base.ki,Kiribati +base.kw,Kuwait +base.kg,Kyrgyzstan +base.la,Laos +base.lv,Latvia +base.lb,Lebanon +base.ls,Lesotho +base.lr,Liberia +base.ly,Libya +base.li,Liechtenstein +base.lt,Lithuania +base.lu,Luxembourg +base.mo,Macau +base.mg,Madagascar +base.mw,Malawi +base.my,Malaysia +base.mv,Maldives +base.ml,Mali +base.mt,Malta +base.mh,Marshall Islands +base.mq,Martinique +base.mr,Mauritania +base.mu,Mauritius +base.yt,Mayotte +base.mx,Mexico +base.fm,Micronesia +base.md,Moldova +base.mc,Monaco +base.mn,Mongolia +base.me,Montenegro +base.ms,Montserrat +base.ma,Morocco +base.mz,Mozambique +base.mm,Myanmar +base.na,Nauru +base.nr,Namibia +base.np,Nepal +base.nl,Netherlands +base.nc,New Caledonia +base.nz,New Zealand +base.ni,Nicaragua +base.ne,Niger +base.ng,Nigeria +base.nu,Niue +base.nf,Norfolk Island +base.kp,"Korea, North" +base.mk,Macedonia (Former Yug. Rep.) +base.mp,Northern Mariana Islands +base.no,Norway +base.om,Oman +base.pk,Pakistan +base.pw,Palau +base.pa,Panama +base.pg,Papua New Guinea +base.py,Paraguay +base.pe,Peru +base.ph,Philippines +base.pn,Pitcairn Island +base.pl,Poland +base.pt,Portugal +base.pr,Puerto Rico +base.qa,Qatar +base.ro,Romania +base.ru,Russia +base.rw,Rwanda +base.re,Reunion +base.sh,St. Helena +base.kn,St. Kitts and Nevis +base.lc,St. Lucia +base.vc,St. Vincent and the Grenadines +base.ws,Samoa (Western) +base.sm,San Marino +base.sa,Saudi Arabia +base.sn,Sénégal +base.rs,Serbia +base.sc,Seychelles +base.sl,Sierra Leone +base.sg,Singapore +base.sk,Slovakia +base.si,Slovenia +base.sb,Solomon Islands +base.so,Somalia +base.za,South Africa +base.kr,"Korea, South" +base.es,Spain +base.lk,Sri Lanka +base.ps,Palestine +base.sd,Sudan +base.sr,Suriname +base.sj,Svalbard and Jan Mayen Islands +base.sz,Swaziland +base.se,Sweden +base.ch,Switzerland +base.sy,Syria +base.st,São Tomé and Príncipe +base.tw,Taiwan +base.tj,Tajikistan +base.tz,Tanzania +base.th,Thailand +base.tl,Timor-Leste +base.tg,Togo +base.tt,Trinidad and Tobago +base.tn,Tunisia +base.tr,Turkey +base.tm,Turkmenistan +base.tc,Turks and Caicos Islands +base.tv,Tuvalu +base.ug,Uganda +base.ua,Ukraine +base.ae,United Arab Emirates +base.uk,Great Britain +base.us,United States +base.uy,Uruguay +base.uz,Uzbekistan +base.vu,Vanuatu +base.ve,Venezuela +base.vn,Vietnam +base.vg,Virgin Islands +base.wf,Wallis and Futuna Islands +base.eh,Western Sahara +base.ye,Yemen +base.zm,Zambia +base.zw,Zimbabwe diff --git a/l10n_pt_account_invoicexpress/i18n/l10n_pt_account_invoicexpress.pot b/l10n_pt_account_invoicexpress/i18n/l10n_pt_account_invoicexpress.pot index 7c0f340b..8137af94 100644 --- a/l10n_pt_account_invoicexpress/i18n/l10n_pt_account_invoicexpress.pot +++ b/l10n_pt_account_invoicexpress/i18n/l10n_pt_account_invoicexpress.pot @@ -68,12 +68,6 @@ msgstr "" msgid "Email InvoiceXpress" msgstr "" -#. module: l10n_pt_account_invoicexpress -#: code:addons/l10n_pt_account_invoicexpress/models/account_move.py:0 -#, python-format -msgid "Email sent by InvoiceXpress:
        • To: {}
        • Cc: {}
        " -msgstr "" - #. module: l10n_pt_account_invoicexpress #: code:addons/l10n_pt_account_invoicexpress/models/account_invoicexpress.py:0 #, python-format @@ -89,12 +83,6 @@ msgstr "" msgid "ID" msgstr "" -#. module: l10n_pt_account_invoicexpress -#: code:addons/l10n_pt_account_invoicexpress/models/account_move.py:0 -#, python-format -msgid "Invoice %s is not registerd in InvoiceXpress yet." -msgstr "" - #. module: l10n_pt_account_invoicexpress #: code:addons/l10n_pt_account_invoicexpress/models/account_move.py:0 #, python-format @@ -189,12 +177,6 @@ msgstr "" msgid "Last Modified on" msgstr "" -#. module: l10n_pt_account_invoicexpress -#: code:addons/l10n_pt_account_invoicexpress/models/account_move.py:0 -#, python-format -msgid "None" -msgstr "" - #. module: l10n_pt_account_invoicexpress #: model:ir.model.fields,help:l10n_pt_account_invoicexpress.field_account_bank_statement_line__journal_type #: model:ir.model.fields,help:l10n_pt_account_invoicexpress.field_account_move__journal_type diff --git a/l10n_pt_account_invoicexpress/models/__init__.py b/l10n_pt_account_invoicexpress/models/__init__.py index 68c88cda..34341b04 100644 --- a/l10n_pt_account_invoicexpress/models/__init__.py +++ b/l10n_pt_account_invoicexpress/models/__init__.py @@ -1,8 +1,10 @@ # Copyright (C) 2021 Open Source Integrators # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). -from . import res_config_settings from . import account_invoicexpress +from . import account_move from . import account_tax +from . import res_company +from . import res_config_settings +from . import res_country from . import res_partner -from . import account_move diff --git a/l10n_pt_account_invoicexpress/models/account_invoicexpress.py b/l10n_pt_account_invoicexpress/models/account_invoicexpress.py index cf84337f..dbdfcf52 100644 --- a/l10n_pt_account_invoicexpress/models/account_invoicexpress.py +++ b/l10n_pt_account_invoicexpress/models/account_invoicexpress.py @@ -9,7 +9,7 @@ import requests from werkzeug.urls import url_join -from odoo import _, exceptions, fields, models +from odoo import _, exceptions, models _logger = logging.getLogger(__name__) @@ -18,13 +18,9 @@ class InvoiceXpress(models.AbstractModel): _name = "account.invoicexpress" _description = "InvoiceXpress connector" - account_name = fields.Char(compute="_compute_config") - api_key = fields.Char(compute="_compute_config") - - def _get_config(self): - ICPSudo = self.env["ir.config_parameter"].sudo() - account_name = ICPSudo.get_param("invoicexpress.account_name") - api_key = ICPSudo.get_param("invoicexpress.api_key") + def _get_config(self, company): + account_name = company.invoicexpress_account_name + api_key = company.invoicexpress_api_key if not account_name or not api_key: error_msg = _( """Something went wrong on API key. You should check the field @@ -70,6 +66,7 @@ def _check_http_status(self, response): def call( self, + company, endpoint, verb="GET", headers=None, @@ -77,7 +74,7 @@ def call( payload=None, raise_errors=True, ): - config = self._get_config() + config = self._get_config(company) request_url = self._build_url(config, endpoint) request_headers = self._build_headers(config, headers) request_params = self._build_params(config, params) diff --git a/l10n_pt_account_invoicexpress/models/account_move.py b/l10n_pt_account_invoicexpress/models/account_move.py index f8379268..90745c1b 100644 --- a/l10n_pt_account_invoicexpress/models/account_move.py +++ b/l10n_pt_account_invoicexpress/models/account_move.py @@ -1,8 +1,7 @@ # Copyright (C) 2021 Open Source Integrators # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). -from odoo import _, exceptions, fields, models -from odoo.tools.safe_eval import safe_eval +from odoo import _, api, exceptions, fields, models class AccountMove(models.Model): @@ -15,6 +14,23 @@ class AccountMove(models.Model): invoicexpress_permalink = fields.Char( "InvoiceXpress Doc Link", copy=False, readonly=True ) + can_invoicexpress = fields.Boolean(compute="_compute_can_invoicexpress") + can_invoicexpress_email = fields.Boolean(compute="_compute_can_invoicexpress_email") + + @api.depends("move_type", "journal_id", "company_id.invoicexpress_api_key") + def _compute_can_invoicexpress(self): + for invoice in self: + invoice.can_invoicexpress = ( + invoice.is_sale_document() and invoice.company_id.invoicexpress_api_key + ) + + @api.depends("can_invoicexpress", "company_id.invoicexpress_template_id") + def _compute_can_invoicexpress_email(self): + for invoice in self: + invoice.can_invoicexpress_email = ( + invoice.can_invoicexpress + and invoice.company_id.invoicexpress_template_id + ) def _get_invoicexpress_doctype(self): """ @@ -67,10 +83,12 @@ def _prepare_invoicexpress_vals(self): "reference": self.ref or "", "client": customer, "items": items, - "tax_exemption_reason": self.l10npt_vat_exempt_reason.code or "M00", }, - "proprietary_uid": self.name, + "proprietary_uid": "%s.%s" % (self.name, self.env.cr.dbname), } + exempt_code = self.l10npt_vat_exempt_reason.code + if exempt_code: + invoice_data["invoice"]["tax_exemption"] = exempt_code if self.company_id.currency_id != self.currency_id: currency_rate = self.env["res.currency"]._get_conversion_rate( self.company_id.currency_id, @@ -101,16 +119,19 @@ def _update_invoicexpress_status(self, result): def action_create_invoicexpress_invoice(self): InvoiceXpress = self.env["account.invoicexpress"] - for invoice in self.filtered(lambda x: not x.invoicexpress_id): + for invoice in self.filtered("can_invoicexpress"): doctype = invoice._get_invoicexpress_doctype() payload = invoice._prepare_invoicexpress_vals() response = InvoiceXpress.call( - "{}.json".format(doctype), "POST", payload=payload + invoice.company_id, "{}.json".format(doctype), "POST", payload=payload + ) + values = response.json().get("invoice") or response.json().get( + "credit_note" ) - values = response.json().get("invoice") if values: invoice._update_invoicexpress_status(values) InvoiceXpress.call( + invoice.company_id, "{}/{}/change-state.json".format(doctype, values["id"]), "PUT", payload={"invoice": {"state": "finalized"}}, @@ -118,31 +139,30 @@ def action_create_invoicexpress_invoice(self): def _prepare_invoicexpress_email_vals(self): self.ensure_one() - ICPSudo = self.env["ir.config_parameter"].sudo() - eval_email_to = ICPSudo.get_param( - "invoicexpress.invoice_email_to", "self.partner_id.email" + template_id = self.company_id.invoicexpress_template_id + values = template_id.generate_email( + self.id, ["subject", "body_html", "email_to", "email_cc"] ) - eval_email_cc = ICPSudo.get_param("invoicexpress.invoice_email_cc") - eval_context = {"self": self} - email_to = safe_eval(eval_email_to, eval_context) - email_cc = eval_email_cc and safe_eval(eval_email_cc, eval_context) - if not email_to: + if not template_id: raise exceptions.UserError( - _("Kindly Configure the customer email address.") + _( + "Please configure the InvoiceXpress email template" + " at Settings > General Setting, InvoiceXpress section" + ) ) email_data = { "message": { - "client": {"email": email_to, "save": "0"}, - "cc": email_cc, - "subject": _("Invoice from InvoiceXpress"), - "body": _("InvoiceXpress Documents"), + "client": {"email": values["email_to"], "save": "0"}, + "cc": values["email_cc"], + "subject": values["subject"], + "body": values["body_html"], } } return email_data def action_send_invoicexpress_email(self): InvoiceXpress = self.env["account.invoicexpress"] - for invoice in self: + for invoice in self.filtered("can_invoicexpress_email"): if not invoice.invoicexpress_id: raise exceptions.UserError( _("Invoice %s is not registerd in InvoiceXpress yet."), invoice.name @@ -151,11 +171,29 @@ def action_send_invoicexpress_email(self): invoice.invoicexpress_id ) payload = invoice._prepare_invoicexpress_email_vals() - InvoiceXpress.call(endpoint, "PUT", payload=payload) - msg = _( - "Email sent by InvoiceXpress:
        • To: {}
        • Cc: {}
        " - ).format( - payload["message"]["client"]["email"], - payload["message"]["cc"] or _("None"), - ) - invoice.message_post(body=msg) + if not payload["message"]["client"]["email"]: + invoice.message_post( + body=_("No email to send the InvoiceXpress document to.") + ) + else: + InvoiceXpress.call(invoice.company_id, endpoint, "PUT", payload=payload) + msg = _( + "Email sent by InvoiceXpress:
        • To: {}
        • Cc: {}
        " + ).format( + payload["message"]["client"]["email"], + payload["message"]["cc"] or _("None"), + ) + invoice.message_post(body=msg) + + @api.depends("restrict_mode_hash_table", "state") + def _compute_show_reset_to_draft_button(self): + super()._compute_show_reset_to_draft_button() + self.filtered("invoicexpress_id").write({"show_reset_to_draft_button": False}) + + def action_post(self): + res = super().action_post() + for invoice in self: + if not invoice.invoicexpress_id: + invoice.action_create_invoicexpress_invoice() + invoice.action_send_invoicexpress_email() + return res diff --git a/l10n_pt_account_invoicexpress/models/account_tax.py b/l10n_pt_account_invoicexpress/models/account_tax.py index 7bb7d6ec..7fad5ecb 100644 --- a/l10n_pt_account_invoicexpress/models/account_tax.py +++ b/l10n_pt_account_invoicexpress/models/account_tax.py @@ -10,15 +10,17 @@ class AccountTax(models.Model): invoicexpress_id = fields.Char("InvoiceXpress ID", copy=False, readonly=True) @api.model - def _map_invoicexpress_taxes(self): + def _map_invoicexpress_taxes(self, company): """ Retrieves all InvoiceXpress taxes, an maps them to the existing Odoo taxes """ InvoiceXpress = self.env["account.invoicexpress"] - response = InvoiceXpress.call("taxes.json", "GET") + response = InvoiceXpress.call(company, "taxes.json", "GET") invx_taxes_dict = {x["name"]: x for x in response.json().get("taxes", [])} - odoo_taxes = self.search([("type_tax_use", "=", "sale")]) + odoo_taxes = self.search( + [("type_tax_use", "=", "sale"), ("company_id", "=", company.id)] + ) for odoo_tax in odoo_taxes: invx_tax_vals = invx_taxes_dict.get(odoo_tax.name) if invx_tax_vals: @@ -45,11 +47,11 @@ def action_invoicexpress_tax_create(self): for tax in self.filtered(lambda x: not x.invoicexpress_id): payload = tax._prepare_invoicexpress_vals() response = InvoiceXpress.call( - endpoint, verb, payload=payload, raise_errors=False + tax.company_id, endpoint, verb, payload=payload, raise_errors=False ) if response.status_code == 422: # Tax name already exists, map missing invoicexpress_ids - self._map_invoicexpress_taxes() + self._map_invoicexpress_taxes(tax.company_id) else: InvoiceXpress._check_http_status(response) response_json = response.json() diff --git a/l10n_pt_account_invoicexpress/models/res_company.py b/l10n_pt_account_invoicexpress/models/res_company.py new file mode 100644 index 00000000..5491e23e --- /dev/null +++ b/l10n_pt_account_invoicexpress/models/res_company.py @@ -0,0 +1,21 @@ +# Copyright (C) 2021 Open Source Integrators +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import fields, models + + +class Company(models.Model): + _inherit = "res.company" + + invoicexpress_account_name = fields.Char(string="InvoiceXpress Account Name") + invoicexpress_api_key = fields.Char(string="InvoiceXpress API Key") + invoicexpress_template_id = fields.Many2one( + "mail.template", + "InvoiceXpress Email Template", + domain="[('model', '=', 'account.move')]", + default=lambda self: self.env.ref( + "l10n_pt_account_invoicexpress.email_template_invoice", False + ), + help="Used to generate the To, Cc, Subject and Body" + " for the email sent by the InvoiceXpress service", + ) diff --git a/l10n_pt_account_invoicexpress/models/res_config_settings.py b/l10n_pt_account_invoicexpress/models/res_config_settings.py index 547b6051..eed120fc 100644 --- a/l10n_pt_account_invoicexpress/models/res_config_settings.py +++ b/l10n_pt_account_invoicexpress/models/res_config_settings.py @@ -1,34 +1,25 @@ # Copyright (C) 2021 Open Source Integrators -from odoo import api, fields, models +from odoo import fields, models class ResConfigSettings(models.TransientModel): _inherit = "res.config.settings" - invoicexpress_account_name = fields.Char(string="InvoiceXpress Account Name") - invoicexpress_api_key = fields.Char(string="InvoiceXpress Api Key") - - def set_values(self): - super(ResConfigSettings, self).set_values() - ICPSudo = self.env["ir.config_parameter"].sudo() - - ICPSudo.set_param("invoicexpress.account_name", self.invoicexpress_account_name) - ICPSudo.set_param("invoicexpress.api_key", self.invoicexpress_api_key) - - @api.model - def get_values(self): - res = super(ResConfigSettings, self).get_values() - ICPSudo = self.env["ir.config_parameter"].sudo() - - res.update( - { - "invoicexpress_account_name": ICPSudo.get_param( - "invoicexpress.account_name", default="" - ), - "invoicexpress_api_key": ICPSudo.get_param( - "invoicexpress.api_key", default="" - ), - } - ) - return res + invoicexpress_account_name = fields.Char( + related="company_id.invoicexpress_account_name", + readonly=False, + default=lambda s: s.env["ir.config_parameter"] + .sudo() + .get_param("invoicexpress.account_name", default=""), + ) + invoicexpress_api_key = fields.Char( + related="company_id.invoicexpress_api_key", + readonly=False, + default=lambda s: s.env["ir.config_parameter"] + .sudo() + .get_param("invoicexpress.api_key", default=""), + ) + invoicexpress_template_id = fields.Many2one( + related="company_id.invoicexpress_template_id", readonly=False + ) diff --git a/l10n_pt_account_invoicexpress/models/res_country.py b/l10n_pt_account_invoicexpress/models/res_country.py new file mode 100644 index 00000000..80cb9683 --- /dev/null +++ b/l10n_pt_account_invoicexpress/models/res_country.py @@ -0,0 +1,10 @@ +# Copyright (C) 2021 Open Source Integrators +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import fields, models + + +class Country(models.Model): + _inherit = "res.country" + + invoicexpress_name = fields.Char() diff --git a/l10n_pt_account_invoicexpress/models/res_partner.py b/l10n_pt_account_invoicexpress/models/res_partner.py index 5e01a335..60658ae0 100644 --- a/l10n_pt_account_invoicexpress/models/res_partner.py +++ b/l10n_pt_account_invoicexpress/models/res_partner.py @@ -16,7 +16,7 @@ def _prepare_invoicexpress_vals(self): "address": ", ".join(filter(None, [self.street, self.street2])), "city": self.city, "postal_code": self.zip, - "country": self.country_id.name, + "country": self.country_id.invoicexpress_name, "language": self.lang[:2], "fiscal_id": self.vat, "website": self.website, diff --git a/l10n_pt_account_invoicexpress/tests/test_invoicexpress.py b/l10n_pt_account_invoicexpress/tests/test_invoicexpress.py index 27f1968e..e81af862 100644 --- a/l10n_pt_account_invoicexpress/tests/test_invoicexpress.py +++ b/l10n_pt_account_invoicexpress/tests/test_invoicexpress.py @@ -18,9 +18,14 @@ def mock_response(json, status_code=200): class TestInvoiceXpress(common.TransactionCase): def setUp(self): super().setUp() - self.ConfigParameter = self.env["ir.config_parameter"] - self.ConfigParameter.set_param("invoicexpress.account_name", "ACCOUNT") - self.ConfigParameter.set_param("invoicexpress.api_key", "APIKEY") + + self.company = self.env.company + self.company.write( + { + "invoicexpress_account_name": "ACCOUNT", + "invoicexpress_api_key": "APIKEY", + } + ) self.AccountMove = self.env["account.move"] self.ProductProduct = self.env["product.product"] @@ -46,7 +51,7 @@ def setUp(self): def test_010_get_config_and_base_url(self): API = self.env["account.invoicexpress"] - url = API._build_url(API._get_config(), "dummy.json") + url = API._build_url(API._get_config(self.company), "dummy.json") self.assertEqual(url, "https://ACCOUNT.app.invoicexpress.com/dummy.json") @patch.object(requests, "request") diff --git a/l10n_pt_account_invoicexpress/views/account_move_view.xml b/l10n_pt_account_invoicexpress/views/account_move_view.xml index 040fccfc..aa442284 100644 --- a/l10n_pt_account_invoicexpress/views/account_move_view.xml +++ b/l10n_pt_account_invoicexpress/views/account_move_view.xml @@ -6,8 +6,9 @@ account.move - - + + + - + + diff --git a/l10n_pt_account_invoicexpress/views/res_config_settings.xml b/l10n_pt_account_invoicexpress/views/res_config_settings.xml index 522c53a5..de603abf 100644 --- a/l10n_pt_account_invoicexpress/views/res_config_settings.xml +++ b/l10n_pt_account_invoicexpress/views/res_config_settings.xml @@ -18,7 +18,10 @@ > Generate an API key -
        +
        +
        +
        diff --git a/l10n_pt_account_invoicexpress/views/res_country_view.xml b/l10n_pt_account_invoicexpress/views/res_country_view.xml new file mode 100644 index 00000000..041e65ec --- /dev/null +++ b/l10n_pt_account_invoicexpress/views/res_country_view.xml @@ -0,0 +1,12 @@ + + + Country: add InvoiceXpress name + res.country + + + + + + + + From 023de5759a3229260365ab85ef56f902c4c1957b Mon Sep 17 00:00:00 2001 From: oca-travis Date: Mon, 5 Jul 2021 13:54:20 +0000 Subject: [PATCH 073/157] [UPD] Update l10n_pt_account_invoicexpress.pot --- .../i18n/l10n_pt_account_invoicexpress.pot | 120 +++++++++++++++--- 1 file changed, 101 insertions(+), 19 deletions(-) diff --git a/l10n_pt_account_invoicexpress/i18n/l10n_pt_account_invoicexpress.pot b/l10n_pt_account_invoicexpress/i18n/l10n_pt_account_invoicexpress.pot index 8137af94..b6922ce6 100644 --- a/l10n_pt_account_invoicexpress/i18n/l10n_pt_account_invoicexpress.pot +++ b/l10n_pt_account_invoicexpress/i18n/l10n_pt_account_invoicexpress.pot @@ -24,19 +24,49 @@ msgstr "" msgid " Generate an API key" msgstr "" +#. module: l10n_pt_account_invoicexpress +#: model:mail.template,body_html:l10n_pt_account_invoicexpress.email_template_invoice +msgid "" +"

        \n" +"Olá,\n" +"
        \n" +"Enviamos em anexo a fatura ${object.name | safe}\n" +"% if object.ref:\n" +" relativa à sua encomenda ${object.ref | safe}\n" +"% endif\n" +".\n" +"

        \n" +"Obrigado\n" +"% if user.signature:\n" +"
        \n" +" ${user.signature | safe}\n" +"% endif\n" +"

        \n" +" " +msgstr "" + #. module: l10n_pt_account_invoicexpress #: model_terms:ir.ui.view,arch_db:l10n_pt_account_invoicexpress.res_config_settings_view_form msgid "Account InvoiceXpress" msgstr "" #. module: l10n_pt_account_invoicexpress -#: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_account_invoicexpress__account_name -msgid "Account Name" +#: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_account_bank_statement_line__can_invoicexpress +#: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_account_move__can_invoicexpress +#: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_account_payment__can_invoicexpress +msgid "Can Invoicexpress" msgstr "" #. module: l10n_pt_account_invoicexpress -#: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_account_invoicexpress__api_key -msgid "Api Key" +#: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_account_bank_statement_line__can_invoicexpress_email +#: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_account_move__can_invoicexpress_email +#: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_account_payment__can_invoicexpress_email +msgid "Can Invoicexpress Email" +msgstr "" + +#. module: l10n_pt_account_invoicexpress +#: model:ir.model,name:l10n_pt_account_invoicexpress.model_res_company +msgid "Companies" msgstr "" #. module: l10n_pt_account_invoicexpress @@ -49,6 +79,11 @@ msgstr "" msgid "Contact" msgstr "" +#. module: l10n_pt_account_invoicexpress +#: model:ir.model,name:l10n_pt_account_invoicexpress.model_res_country +msgid "Country" +msgstr "" + #. module: l10n_pt_account_invoicexpress #: model_terms:ir.ui.view,arch_db:l10n_pt_account_invoicexpress.view_account_move_form msgid "Create InvoiceXpress" @@ -58,7 +93,9 @@ msgstr "" #: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_account_invoicexpress__display_name #: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_account_move__display_name #: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_account_tax__display_name +#: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_res_company__display_name #: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_res_config_settings__display_name +#: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_res_country__display_name #: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_res_partner__display_name msgid "Display Name" msgstr "" @@ -68,6 +105,12 @@ msgstr "" msgid "Email InvoiceXpress" msgstr "" +#. module: l10n_pt_account_invoicexpress +#: code:addons/l10n_pt_account_invoicexpress/models/account_move.py:0 +#, python-format +msgid "Email sent by InvoiceXpress:
        • To: {}
        • Cc: {}
        " +msgstr "" + #. module: l10n_pt_account_invoicexpress #: code:addons/l10n_pt_account_invoicexpress/models/account_invoicexpress.py:0 #, python-format @@ -78,7 +121,9 @@ msgstr "" #: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_account_invoicexpress__id #: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_account_move__id #: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_account_tax__id +#: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_res_company__id #: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_res_config_settings__id +#: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_res_country__id #: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_res_partner__id msgid "ID" msgstr "" @@ -86,7 +131,7 @@ msgstr "" #. module: l10n_pt_account_invoicexpress #: code:addons/l10n_pt_account_invoicexpress/models/account_move.py:0 #, python-format -msgid "Invoice from InvoiceXpress" +msgid "Invoice %s is not registerd in InvoiceXpress yet." msgstr "" #. module: l10n_pt_account_invoicexpress @@ -94,22 +139,24 @@ msgstr "" msgid "InvoiceXpress" msgstr "" +#. module: l10n_pt_account_invoicexpress +#: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_res_company__invoicexpress_api_key +#: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_res_config_settings__invoicexpress_api_key +msgid "InvoiceXpress API Key" +msgstr "" + #. module: l10n_pt_account_invoicexpress #: model_terms:ir.ui.view,arch_db:l10n_pt_account_invoicexpress.res_config_settings_view_form msgid "InvoiceXpress API key" msgstr "" #. module: l10n_pt_account_invoicexpress +#: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_res_company__invoicexpress_account_name #: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_res_config_settings__invoicexpress_account_name #: model_terms:ir.ui.view,arch_db:l10n_pt_account_invoicexpress.res_config_settings_view_form msgid "InvoiceXpress Account Name" msgstr "" -#. module: l10n_pt_account_invoicexpress -#: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_res_config_settings__invoicexpress_api_key -msgid "InvoiceXpress Api Key" -msgstr "" - #. module: l10n_pt_account_invoicexpress #: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_account_bank_statement_line__invoicexpress_permalink #: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_account_move__invoicexpress_permalink @@ -118,9 +165,10 @@ msgid "InvoiceXpress Doc Link" msgstr "" #. module: l10n_pt_account_invoicexpress -#: code:addons/l10n_pt_account_invoicexpress/models/account_move.py:0 -#, python-format -msgid "InvoiceXpress Documents" +#: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_res_company__invoicexpress_template_id +#: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_res_config_settings__invoicexpress_template_id +#: model_terms:ir.ui.view,arch_db:l10n_pt_account_invoicexpress.res_config_settings_view_form +msgid "InvoiceXpress Email Template" msgstr "" #. module: l10n_pt_account_invoicexpress @@ -144,6 +192,11 @@ msgid "" " Id: {inv_xpress_id}
      • {inv_xpress_link}
      " msgstr "" +#. module: l10n_pt_account_invoicexpress +#: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_res_country__invoicexpress_name +msgid "Invoicexpress Name" +msgstr "" + #. module: l10n_pt_account_invoicexpress #: model:ir.model,name:l10n_pt_account_invoicexpress.model_account_move msgid "Journal Entry" @@ -156,12 +209,6 @@ msgstr "" msgid "Journal Type" msgstr "" -#. module: l10n_pt_account_invoicexpress -#: code:addons/l10n_pt_account_invoicexpress/models/account_move.py:0 -#, python-format -msgid "Kindly Configure the customer email address." -msgstr "" - #. module: l10n_pt_account_invoicexpress #: code:addons/l10n_pt_account_invoicexpress/models/account_move.py:0 #, python-format @@ -172,11 +219,33 @@ msgstr "" #: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_account_invoicexpress____last_update #: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_account_move____last_update #: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_account_tax____last_update +#: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_res_company____last_update #: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_res_config_settings____last_update +#: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_res_country____last_update #: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_res_partner____last_update msgid "Last Modified on" msgstr "" +#. module: l10n_pt_account_invoicexpress +#: code:addons/l10n_pt_account_invoicexpress/models/account_move.py:0 +#, python-format +msgid "No email to send the InvoiceXpress document to." +msgstr "" + +#. module: l10n_pt_account_invoicexpress +#: code:addons/l10n_pt_account_invoicexpress/models/account_move.py:0 +#, python-format +msgid "None" +msgstr "" + +#. module: l10n_pt_account_invoicexpress +#: code:addons/l10n_pt_account_invoicexpress/models/account_move.py:0 +#, python-format +msgid "" +"Please configure the InvoiceXpress email template at Settings > General " +"Setting, InvoiceXpress section" +msgstr "" + #. module: l10n_pt_account_invoicexpress #: model:ir.model.fields,help:l10n_pt_account_invoicexpress.field_account_bank_statement_line__journal_type #: model:ir.model.fields,help:l10n_pt_account_invoicexpress.field_account_move__journal_type @@ -197,7 +266,20 @@ msgid "" " %(menu:base_setup.menu_config)s." msgstr "" +#. module: l10n_pt_account_invoicexpress +#: model:mail.template,subject:l10n_pt_account_invoicexpress.email_template_invoice +msgid "Sua Fatura ${object.name | safe}" +msgstr "" + #. module: l10n_pt_account_invoicexpress #: model:ir.model,name:l10n_pt_account_invoicexpress.model_account_tax msgid "Tax" msgstr "" + +#. module: l10n_pt_account_invoicexpress +#: model:ir.model.fields,help:l10n_pt_account_invoicexpress.field_res_company__invoicexpress_template_id +#: model:ir.model.fields,help:l10n_pt_account_invoicexpress.field_res_config_settings__invoicexpress_template_id +msgid "" +"Used to generate the To, Cc, Subject and Body for the email sent by the " +"InvoiceXpress service" +msgstr "" From 666ffd3883911c0e803e647e22db9b776cf99c34 Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Mon, 5 Jul 2021 14:02:17 +0000 Subject: [PATCH 074/157] l10n_pt_account_invoicexpress 14.0.2.0.0 --- l10n_pt_account_invoicexpress/__manifest__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/l10n_pt_account_invoicexpress/__manifest__.py b/l10n_pt_account_invoicexpress/__manifest__.py index 1e0a7a34..879f41e7 100644 --- a/l10n_pt_account_invoicexpress/__manifest__.py +++ b/l10n_pt_account_invoicexpress/__manifest__.py @@ -4,7 +4,7 @@ { "name": "Portugal InvoiceXpress Integration", "summary": "Legal invoices with InvoiceXpress", - "version": "14.0.1.1.0", + "version": "14.0.2.0.0", "author": "Open Source Integrators, Odoo Community Association (OCA)", "license": "AGPL-3", "website": "https://github.com/OCA/l10n-portugal", From a9b1009a13da2793868fd97b602c65bc57c74939 Mon Sep 17 00:00:00 2001 From: Daniel Reis Date: Thu, 8 Jul 2021 15:47:47 +0100 Subject: [PATCH 075/157] [IMP] l10n_pt_account_invoicexpress: set the InvoiceXpress number in Odoo --- l10n_pt_account_invoicexpress/__manifest__.py | 2 +- .../models/account_move.py | 34 ++++++++++--------- .../tests/test_invoicexpress.py | 4 ++- 3 files changed, 22 insertions(+), 18 deletions(-) diff --git a/l10n_pt_account_invoicexpress/__manifest__.py b/l10n_pt_account_invoicexpress/__manifest__.py index 879f41e7..b2dca1d9 100644 --- a/l10n_pt_account_invoicexpress/__manifest__.py +++ b/l10n_pt_account_invoicexpress/__manifest__.py @@ -8,7 +8,7 @@ "author": "Open Source Integrators, Odoo Community Association (OCA)", "license": "AGPL-3", "website": "https://github.com/OCA/l10n-portugal", - "category": "Accounting/Localizations/Account Charts", + "category": "Accounting/Localizations/EDI", "maintainers": ["dreispt"], "development_status": "Production/Stable", "depends": ["l10n_pt_vat", "account"], diff --git a/l10n_pt_account_invoicexpress/models/account_move.py b/l10n_pt_account_invoicexpress/models/account_move.py index 90745c1b..d1f01924 100644 --- a/l10n_pt_account_invoicexpress/models/account_move.py +++ b/l10n_pt_account_invoicexpress/models/account_move.py @@ -101,20 +101,15 @@ def _prepare_invoicexpress_vals(self): ) return invoice_data - def _update_invoicexpress_status(self, result): - vals = { - "invoicexpress_id": result.get("id"), - "invoicexpress_permalink": result.get("permalink"), - } - self.update(vals) + def _update_invoicexpress_status(self): inv_xpress_link = _( " View Document" - ).format(result.get("permalink")) + ).format(self.invoicexpress_permalink) msg = _( "InvoiceXpress record has been created for this invoice:" "
      • InvoiceXpress Id: {inv_xpress_id}
      • " "
      • {inv_xpress_link}
      " - ).format(inv_xpress_id=result.get("id"), inv_xpress_link=inv_xpress_link) + ).format(inv_xpress_id=self.invoicexpress_id, inv_xpress_link=inv_xpress_link) self.message_post(body=msg) def action_create_invoicexpress_invoice(self): @@ -124,18 +119,25 @@ def action_create_invoicexpress_invoice(self): payload = invoice._prepare_invoicexpress_vals() response = InvoiceXpress.call( invoice.company_id, "{}.json".format(doctype), "POST", payload=payload - ) - values = response.json().get("invoice") or response.json().get( - "credit_note" - ) + ).json() + values = response.get("invoice") or response.get("credit_note") if values: - invoice._update_invoicexpress_status(values) - InvoiceXpress.call( + invoice.invoicexpress_id = values.get("id") + invoice.invoicexpress_permalink = values.get("permalink") + response1 = InvoiceXpress.call( invoice.company_id, - "{}/{}/change-state.json".format(doctype, values["id"]), + "{}/{}/change-state.json".format(doctype, invoice.invoicexpress_id), "PUT", payload={"invoice": {"state": "finalized"}}, - ) + raise_errors=False, + ).json() + values1 = response1.get("invoice") or response1.get("credit_note") + invx_number = values1 and values1["inverted_sequence_number"] + if invx_number: + if invoice.payment_reference == invoice.name: + invoice.payment_reference = invx_number + invoice.name = invx_number + invoice._update_invoicexpress_status() def _prepare_invoicexpress_email_vals(self): self.ensure_one() diff --git a/l10n_pt_account_invoicexpress/tests/test_invoicexpress.py b/l10n_pt_account_invoicexpress/tests/test_invoicexpress.py index e81af862..b765eeea 100644 --- a/l10n_pt_account_invoicexpress/tests/test_invoicexpress.py +++ b/l10n_pt_account_invoicexpress/tests/test_invoicexpress.py @@ -80,7 +80,9 @@ def test_100_create_invoicexpress_tax(self, mock_request): @patch.object(requests, "request") def test_101_create_invoicexpress_invoice(self, mock_request): - mock_request.return_value = mock_response({"invoice": {"id": 2137287}}) + mock_request.return_value = mock_response( + {"invoice": {"id": 2137287, "inverted_sequence_number": "MYSEQ/123"}} + ) move_form = Form(self.AccountMove.with_context(default_move_type="out_invoice")) move_form.invoice_date = fields.Date.today() From 979e48fa7634a9ee527718875ce3e81521020c9c Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Mon, 26 Jul 2021 09:15:11 +0000 Subject: [PATCH 076/157] l10n_pt_account_invoicexpress 14.0.2.0.1 --- l10n_pt_account_invoicexpress/__manifest__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/l10n_pt_account_invoicexpress/__manifest__.py b/l10n_pt_account_invoicexpress/__manifest__.py index b2dca1d9..65afd254 100644 --- a/l10n_pt_account_invoicexpress/__manifest__.py +++ b/l10n_pt_account_invoicexpress/__manifest__.py @@ -4,7 +4,7 @@ { "name": "Portugal InvoiceXpress Integration", "summary": "Legal invoices with InvoiceXpress", - "version": "14.0.2.0.0", + "version": "14.0.2.0.1", "author": "Open Source Integrators, Odoo Community Association (OCA)", "license": "AGPL-3", "website": "https://github.com/OCA/l10n-portugal", From ba54f8f1e540046ff2e9550dc574ccbaa9a41032 Mon Sep 17 00:00:00 2001 From: Daniel Reis Date: Tue, 3 Aug 2021 09:12:38 +0000 Subject: [PATCH 077/157] Added translation using Weblate (Portuguese) --- l10n_pt_account_invoicexpress/i18n/pt.po | 286 +++++++++++++++++++++++ 1 file changed, 286 insertions(+) create mode 100644 l10n_pt_account_invoicexpress/i18n/pt.po diff --git a/l10n_pt_account_invoicexpress/i18n/pt.po b/l10n_pt_account_invoicexpress/i18n/pt.po new file mode 100644 index 00000000..dd2f5f8c --- /dev/null +++ b/l10n_pt_account_invoicexpress/i18n/pt.po @@ -0,0 +1,286 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * l10n_pt_account_invoicexpress +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 14.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: Automatically generated\n" +"Language-Team: none\n" +"Language: pt\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n > 1;\n" + +#. module: l10n_pt_account_invoicexpress +#: code:addons/l10n_pt_account_invoicexpress/models/account_move.py:0 +#, python-format +msgid " View Document" +msgstr "" + +#. module: l10n_pt_account_invoicexpress +#: model_terms:ir.ui.view,arch_db:l10n_pt_account_invoicexpress.res_config_settings_view_form +msgid " Generate an API key" +msgstr "" + +#. module: l10n_pt_account_invoicexpress +#: model:mail.template,body_html:l10n_pt_account_invoicexpress.email_template_invoice +msgid "" +"

      \n" +"Olá,\n" +"
      \n" +"Enviamos em anexo a fatura ${object.name | safe}\n" +"% if object.ref:\n" +" relativa à sua encomenda ${object.ref | safe}\n" +"% endif\n" +".\n" +"

      \n" +"Obrigado\n" +"% if user.signature:\n" +"
      \n" +" ${user.signature | safe}\n" +"% endif\n" +"

      \n" +" " +msgstr "" + +#. module: l10n_pt_account_invoicexpress +#: model_terms:ir.ui.view,arch_db:l10n_pt_account_invoicexpress.res_config_settings_view_form +msgid "Account InvoiceXpress" +msgstr "" + +#. module: l10n_pt_account_invoicexpress +#: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_account_bank_statement_line__can_invoicexpress +#: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_account_move__can_invoicexpress +#: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_account_payment__can_invoicexpress +msgid "Can Invoicexpress" +msgstr "" + +#. module: l10n_pt_account_invoicexpress +#: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_account_bank_statement_line__can_invoicexpress_email +#: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_account_move__can_invoicexpress_email +#: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_account_payment__can_invoicexpress_email +msgid "Can Invoicexpress Email" +msgstr "" + +#. module: l10n_pt_account_invoicexpress +#: model:ir.model,name:l10n_pt_account_invoicexpress.model_res_company +msgid "Companies" +msgstr "" + +#. module: l10n_pt_account_invoicexpress +#: model:ir.model,name:l10n_pt_account_invoicexpress.model_res_config_settings +msgid "Config Settings" +msgstr "" + +#. module: l10n_pt_account_invoicexpress +#: model:ir.model,name:l10n_pt_account_invoicexpress.model_res_partner +msgid "Contact" +msgstr "" + +#. module: l10n_pt_account_invoicexpress +#: model:ir.model,name:l10n_pt_account_invoicexpress.model_res_country +msgid "Country" +msgstr "" + +#. module: l10n_pt_account_invoicexpress +#: model_terms:ir.ui.view,arch_db:l10n_pt_account_invoicexpress.view_account_move_form +msgid "Create InvoiceXpress" +msgstr "" + +#. module: l10n_pt_account_invoicexpress +#: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_account_invoicexpress__display_name +#: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_account_move__display_name +#: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_account_tax__display_name +#: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_res_company__display_name +#: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_res_config_settings__display_name +#: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_res_country__display_name +#: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_res_partner__display_name +msgid "Display Name" +msgstr "" + +#. module: l10n_pt_account_invoicexpress +#: model_terms:ir.ui.view,arch_db:l10n_pt_account_invoicexpress.view_account_move_form +msgid "Email InvoiceXpress" +msgstr "" + +#. module: l10n_pt_account_invoicexpress +#: code:addons/l10n_pt_account_invoicexpress/models/account_move.py:0 +#, python-format +msgid "Email sent by InvoiceXpress:
      • To: {}
      • Cc: {}
      " +msgstr "" + +#. module: l10n_pt_account_invoicexpress +#: code:addons/l10n_pt_account_invoicexpress/models/account_invoicexpress.py:0 +#, python-format +msgid "Error running API request ({} {}): {}" +msgstr "" + +#. module: l10n_pt_account_invoicexpress +#: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_account_invoicexpress__id +#: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_account_move__id +#: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_account_tax__id +#: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_res_company__id +#: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_res_config_settings__id +#: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_res_country__id +#: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_res_partner__id +msgid "ID" +msgstr "" + +#. module: l10n_pt_account_invoicexpress +#: code:addons/l10n_pt_account_invoicexpress/models/account_move.py:0 +#, python-format +msgid "Invoice %s is not registerd in InvoiceXpress yet." +msgstr "" + +#. module: l10n_pt_account_invoicexpress +#: model_terms:ir.ui.view,arch_db:l10n_pt_account_invoicexpress.view_account_move_form +msgid "InvoiceXpress" +msgstr "" + +#. module: l10n_pt_account_invoicexpress +#: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_res_company__invoicexpress_api_key +#: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_res_config_settings__invoicexpress_api_key +msgid "InvoiceXpress API Key" +msgstr "" + +#. module: l10n_pt_account_invoicexpress +#: model_terms:ir.ui.view,arch_db:l10n_pt_account_invoicexpress.res_config_settings_view_form +msgid "InvoiceXpress API key" +msgstr "" + +#. module: l10n_pt_account_invoicexpress +#: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_res_company__invoicexpress_account_name +#: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_res_config_settings__invoicexpress_account_name +#: model_terms:ir.ui.view,arch_db:l10n_pt_account_invoicexpress.res_config_settings_view_form +msgid "InvoiceXpress Account Name" +msgstr "" + +#. module: l10n_pt_account_invoicexpress +#: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_account_bank_statement_line__invoicexpress_permalink +#: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_account_move__invoicexpress_permalink +#: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_account_payment__invoicexpress_permalink +msgid "InvoiceXpress Doc Link" +msgstr "" + +#. module: l10n_pt_account_invoicexpress +#: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_res_company__invoicexpress_template_id +#: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_res_config_settings__invoicexpress_template_id +#: model_terms:ir.ui.view,arch_db:l10n_pt_account_invoicexpress.res_config_settings_view_form +msgid "InvoiceXpress Email Template" +msgstr "" + +#. module: l10n_pt_account_invoicexpress +#: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_account_bank_statement_line__invoicexpress_id +#: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_account_move__invoicexpress_id +#: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_account_payment__invoicexpress_id +#: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_account_tax__invoicexpress_id +msgid "InvoiceXpress ID" +msgstr "" + +#. module: l10n_pt_account_invoicexpress +#: model:ir.model,name:l10n_pt_account_invoicexpress.model_account_invoicexpress +msgid "InvoiceXpress connector" +msgstr "" + +#. module: l10n_pt_account_invoicexpress +#: code:addons/l10n_pt_account_invoicexpress/models/account_move.py:0 +#, python-format +msgid "" +"InvoiceXpress record has been created for this invoice:
      • InvoiceXpress" +" Id: {inv_xpress_id}
      • {inv_xpress_link}
      " +msgstr "" + +#. module: l10n_pt_account_invoicexpress +#: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_res_country__invoicexpress_name +msgid "Invoicexpress Name" +msgstr "" + +#. module: l10n_pt_account_invoicexpress +#: model:ir.model,name:l10n_pt_account_invoicexpress.model_account_move +msgid "Journal Entry" +msgstr "" + +#. module: l10n_pt_account_invoicexpress +#: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_account_bank_statement_line__journal_type +#: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_account_move__journal_type +#: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_account_payment__journal_type +msgid "Journal Type" +msgstr "" + +#. module: l10n_pt_account_invoicexpress +#: code:addons/l10n_pt_account_invoicexpress/models/account_move.py:0 +#, python-format +msgid "Kindly add the invoice date and invoice due date." +msgstr "" + +#. module: l10n_pt_account_invoicexpress +#: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_account_invoicexpress____last_update +#: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_account_move____last_update +#: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_account_tax____last_update +#: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_res_company____last_update +#: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_res_config_settings____last_update +#: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_res_country____last_update +#: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_res_partner____last_update +msgid "Last Modified on" +msgstr "" + +#. module: l10n_pt_account_invoicexpress +#: code:addons/l10n_pt_account_invoicexpress/models/account_move.py:0 +#, python-format +msgid "No email to send the InvoiceXpress document to." +msgstr "" + +#. module: l10n_pt_account_invoicexpress +#: code:addons/l10n_pt_account_invoicexpress/models/account_move.py:0 +#, python-format +msgid "None" +msgstr "" + +#. module: l10n_pt_account_invoicexpress +#: code:addons/l10n_pt_account_invoicexpress/models/account_move.py:0 +#, python-format +msgid "" +"Please configure the InvoiceXpress email template at Settings > General " +"Setting, InvoiceXpress section" +msgstr "" + +#. module: l10n_pt_account_invoicexpress +#: model:ir.model.fields,help:l10n_pt_account_invoicexpress.field_account_bank_statement_line__journal_type +#: model:ir.model.fields,help:l10n_pt_account_invoicexpress.field_account_move__journal_type +#: model:ir.model.fields,help:l10n_pt_account_invoicexpress.field_account_payment__journal_type +msgid "" +"Select 'Sale' for customer invoices journals.\n" +"Select 'Purchase' for vendor bills journals.\n" +"Select 'Cash' or 'Bank' for journals that are used in customer or vendor payments.\n" +"Select 'General' for miscellaneous operations journals." +msgstr "" + +#. module: l10n_pt_account_invoicexpress +#: code:addons/l10n_pt_account_invoicexpress/models/account_invoicexpress.py:0 +#, python-format +msgid "" +"Something went wrong on API key. You should check the field\n" +" %(field:res.config.settings.invoicexpress_account_name)s in\n" +" %(menu:base_setup.menu_config)s." +msgstr "" + +#. module: l10n_pt_account_invoicexpress +#: model:mail.template,subject:l10n_pt_account_invoicexpress.email_template_invoice +msgid "Sua Fatura ${object.name | safe}" +msgstr "" + +#. module: l10n_pt_account_invoicexpress +#: model:ir.model,name:l10n_pt_account_invoicexpress.model_account_tax +msgid "Tax" +msgstr "" + +#. module: l10n_pt_account_invoicexpress +#: model:ir.model.fields,help:l10n_pt_account_invoicexpress.field_res_company__invoicexpress_template_id +#: model:ir.model.fields,help:l10n_pt_account_invoicexpress.field_res_config_settings__invoicexpress_template_id +msgid "" +"Used to generate the To, Cc, Subject and Body for the email sent by the " +"InvoiceXpress service" +msgstr "" From 642fa30c4a8b2d28f1fbc0c70426393ff247408f Mon Sep 17 00:00:00 2001 From: Daniel Reis Date: Sun, 12 Sep 2021 20:12:44 +0100 Subject: [PATCH 078/157] [IMP] l10n_pt_account_invoicexpress: tolerate customer with no email --- .../models/account_move.py | 34 +++++++++---------- .../views/account_move_view.xml | 2 ++ 2 files changed, 19 insertions(+), 17 deletions(-) diff --git a/l10n_pt_account_invoicexpress/models/account_move.py b/l10n_pt_account_invoicexpress/models/account_move.py index d1f01924..16f083e8 100644 --- a/l10n_pt_account_invoicexpress/models/account_move.py +++ b/l10n_pt_account_invoicexpress/models/account_move.py @@ -139,30 +139,34 @@ def action_create_invoicexpress_invoice(self): invoice.name = invx_number invoice._update_invoicexpress_status() - def _prepare_invoicexpress_email_vals(self): + def _prepare_invoicexpress_email_vals(self, ignore_no_config=False): self.ensure_one() template_id = self.company_id.invoicexpress_template_id values = template_id.generate_email( self.id, ["subject", "body_html", "email_to", "email_cc"] ) - if not template_id: + if not template_id and not ignore_no_config: raise exceptions.UserError( _( "Please configure the InvoiceXpress email template" " at Settings > General Setting, InvoiceXpress section" ) ) - email_data = { - "message": { - "client": {"email": values["email_to"], "save": "0"}, - "cc": values["email_cc"], - "subject": values["subject"], - "body": values["body_html"], + if not values.get("email_to") and not ignore_no_config: + raise exceptions.UserError(_("No address to send invoice email to.")) + email_data = None + if template_id and values["email_to"]: + email_data = { + "message": { + "client": {"email": values["email_to"], "save": "0"}, + "cc": values["email_cc"], + "subject": values["subject"], + "body": values["body_html"], + } } - } return email_data - def action_send_invoicexpress_email(self): + def action_send_invoicexpress_email(self, ignore_no_config=False): InvoiceXpress = self.env["account.invoicexpress"] for invoice in self.filtered("can_invoicexpress_email"): if not invoice.invoicexpress_id: @@ -172,12 +176,8 @@ def action_send_invoicexpress_email(self): endpoint = "invoices/{}/email-document.json".format( invoice.invoicexpress_id ) - payload = invoice._prepare_invoicexpress_email_vals() - if not payload["message"]["client"]["email"]: - invoice.message_post( - body=_("No email to send the InvoiceXpress document to.") - ) - else: + payload = invoice._prepare_invoicexpress_email_vals(ignore_no_config) + if payload: InvoiceXpress.call(invoice.company_id, endpoint, "PUT", payload=payload) msg = _( "Email sent by InvoiceXpress:
      • To: {}
      • Cc: {}
      " @@ -197,5 +197,5 @@ def action_post(self): for invoice in self: if not invoice.invoicexpress_id: invoice.action_create_invoicexpress_invoice() - invoice.action_send_invoicexpress_email() + invoice.action_send_invoicexpress_email(ignore_no_config=True) return res diff --git a/l10n_pt_account_invoicexpress/views/account_move_view.xml b/l10n_pt_account_invoicexpress/views/account_move_view.xml index aa442284..88bd6ad7 100644 --- a/l10n_pt_account_invoicexpress/views/account_move_view.xml +++ b/l10n_pt_account_invoicexpress/views/account_move_view.xml @@ -27,6 +27,7 @@ True
    " msgstr "" +#. module: l10n_pt_account_invoicexpress +#: model_terms:ir.ui.view,arch_db:l10n_pt_account_invoicexpress.view_account_journal_form +msgid "Invoicexpress" +msgstr "" + #. module: l10n_pt_account_invoicexpress #: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_res_country__invoicexpress_name msgid "Invoicexpress Name" msgstr "" +#. module: l10n_pt_account_invoicexpress +#: model:ir.model.fields,help:l10n_pt_account_invoicexpress.field_account_journal__use_invoicexpress +msgid "" +"Invoicexpress service is only used if checked. Only relevant for Sales " +"journals." +msgstr "" + +#. module: l10n_pt_account_invoicexpress +#: model:ir.model,name:l10n_pt_account_invoicexpress.model_account_journal +msgid "Journal" +msgstr "" + #. module: l10n_pt_account_invoicexpress #: model:ir.model,name:l10n_pt_account_invoicexpress.model_account_move msgid "Journal Entry" @@ -217,6 +236,7 @@ msgstr "" #. module: l10n_pt_account_invoicexpress #: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_account_invoicexpress____last_update +#: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_account_journal____last_update #: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_account_move____last_update #: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_account_tax____last_update #: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_res_company____last_update @@ -276,6 +296,11 @@ msgstr "" msgid "Tax" msgstr "" +#. module: l10n_pt_account_invoicexpress +#: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_account_journal__use_invoicexpress +msgid "Use Invoicexpress" +msgstr "" + #. module: l10n_pt_account_invoicexpress #: model:ir.model.fields,help:l10n_pt_account_invoicexpress.field_res_company__invoicexpress_template_id #: model:ir.model.fields,help:l10n_pt_account_invoicexpress.field_res_config_settings__invoicexpress_template_id From 63c445bc7461d8e66b8e25ae69349e351e7f9573 Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Thu, 23 Sep 2021 11:36:05 +0000 Subject: [PATCH 088/157] l10n_pt_account_invoicexpress 14.0.2.3.0 --- l10n_pt_account_invoicexpress/__manifest__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/l10n_pt_account_invoicexpress/__manifest__.py b/l10n_pt_account_invoicexpress/__manifest__.py index 850ee76e..a6b3214f 100644 --- a/l10n_pt_account_invoicexpress/__manifest__.py +++ b/l10n_pt_account_invoicexpress/__manifest__.py @@ -4,7 +4,7 @@ { "name": "Portugal InvoiceXpress Integration", "summary": "Legal invoices with InvoiceXpress", - "version": "14.0.2.2.0", + "version": "14.0.2.3.0", "author": "Open Source Integrators, Odoo Community Association (OCA)", "license": "AGPL-3", "website": "https://github.com/OCA/l10n-portugal", From 0ca6506a8c589a8f433923c267a6705ac48ccead Mon Sep 17 00:00:00 2001 From: OCA Transbot Date: Thu, 23 Sep 2021 11:36:13 +0000 Subject: [PATCH 089/157] Update translation files Updated by "Update PO files to match POT (msgmerge)" hook in Weblate. Translation: l10n-portugal-14.0/l10n-portugal-14.0-l10n_pt_account_invoicexpress Translate-URL: https://translation.odoo-community.org/projects/l10n-portugal-14-0/l10n-portugal-14-0-l10n_pt_account_invoicexpress/ --- l10n_pt_account_invoicexpress/i18n/pt.po | 25 ++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/l10n_pt_account_invoicexpress/i18n/pt.po b/l10n_pt_account_invoicexpress/i18n/pt.po index fb4fc99e..a725d84d 100644 --- a/l10n_pt_account_invoicexpress/i18n/pt.po +++ b/l10n_pt_account_invoicexpress/i18n/pt.po @@ -87,6 +87,7 @@ msgstr "" #. module: l10n_pt_account_invoicexpress #: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_account_invoicexpress__display_name +#: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_account_journal__display_name #: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_account_move__display_name #: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_account_tax__display_name #: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_res_company__display_name @@ -115,6 +116,7 @@ msgstr "" #. module: l10n_pt_account_invoicexpress #: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_account_invoicexpress__id +#: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_account_journal__id #: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_account_move__id #: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_account_tax__id #: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_res_company__id @@ -193,11 +195,28 @@ msgid "" "Id: {inv_xpress_id}
  • {inv_xpress_link}
" msgstr "" +#. module: l10n_pt_account_invoicexpress +#: model_terms:ir.ui.view,arch_db:l10n_pt_account_invoicexpress.view_account_journal_form +msgid "Invoicexpress" +msgstr "" + #. module: l10n_pt_account_invoicexpress #: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_res_country__invoicexpress_name msgid "Invoicexpress Name" msgstr "" +#. module: l10n_pt_account_invoicexpress +#: model:ir.model.fields,help:l10n_pt_account_invoicexpress.field_account_journal__use_invoicexpress +msgid "" +"Invoicexpress service is only used if checked. Only relevant for Sales " +"journals." +msgstr "" + +#. module: l10n_pt_account_invoicexpress +#: model:ir.model,name:l10n_pt_account_invoicexpress.model_account_journal +msgid "Journal" +msgstr "" + #. module: l10n_pt_account_invoicexpress #: model:ir.model,name:l10n_pt_account_invoicexpress.model_account_move msgid "Journal Entry" @@ -218,6 +237,7 @@ msgstr "" #. module: l10n_pt_account_invoicexpress #: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_account_invoicexpress____last_update +#: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_account_journal____last_update #: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_account_move____last_update #: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_account_tax____last_update #: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_res_company____last_update @@ -278,6 +298,11 @@ msgstr "" msgid "Tax" msgstr "" +#. module: l10n_pt_account_invoicexpress +#: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_account_journal__use_invoicexpress +msgid "Use Invoicexpress" +msgstr "" + #. module: l10n_pt_account_invoicexpress #: model:ir.model.fields,help:l10n_pt_account_invoicexpress.field_res_company__invoicexpress_template_id #: model:ir.model.fields,help:l10n_pt_account_invoicexpress.field_res_config_settings__invoicexpress_template_id From c0b0c85b264ded18007f7a558891621e3d6948bd Mon Sep 17 00:00:00 2001 From: Daniel Reis Date: Thu, 23 Sep 2021 12:47:13 +0100 Subject: [PATCH 090/157] [IMP] l10n_pt_account_invoicexpress: better module description --- l10n_pt_account_invoicexpress/__manifest__.py | 3 +- .../readme/CONFIGURATION.rst | 3 -- .../readme/CONFIGURE.rst | 34 ++++++++++++++++++ .../readme/DESCRIPTION.rst | 18 ++++++++++ .../readme/USAGE.rst | 7 ++-- .../static/description/cover.png | Bin 0 -> 189880 bytes .../views/account_move_view.xml | 1 - .../views/res_config_settings.xml | 6 ++-- 8 files changed, 62 insertions(+), 10 deletions(-) delete mode 100644 l10n_pt_account_invoicexpress/readme/CONFIGURATION.rst create mode 100644 l10n_pt_account_invoicexpress/readme/CONFIGURE.rst create mode 100644 l10n_pt_account_invoicexpress/static/description/cover.png diff --git a/l10n_pt_account_invoicexpress/__manifest__.py b/l10n_pt_account_invoicexpress/__manifest__.py index a6b3214f..d846e03e 100644 --- a/l10n_pt_account_invoicexpress/__manifest__.py +++ b/l10n_pt_account_invoicexpress/__manifest__.py @@ -3,7 +3,7 @@ { "name": "Portugal InvoiceXpress Integration", - "summary": "Legal invoices with InvoiceXpress", + "summary": "Portuguese certified invoices using InvoiceXpress", "version": "14.0.2.3.0", "author": "Open Source Integrators, Odoo Community Association (OCA)", "license": "AGPL-3", @@ -21,6 +21,7 @@ "data/mail_template.xml", "data/res.country.csv", ], + "images": ["static/description/cover.png"], "application": True, "installable": True, } diff --git a/l10n_pt_account_invoicexpress/readme/CONFIGURATION.rst b/l10n_pt_account_invoicexpress/readme/CONFIGURATION.rst deleted file mode 100644 index 43791a39..00000000 --- a/l10n_pt_account_invoicexpress/readme/CONFIGURATION.rst +++ /dev/null @@ -1,3 +0,0 @@ -- Enable the Developer Mode -- Configure the InvoiceXpress Account name and API under Settings/General Setting. -- Configure the email recipients in the Settings/Technical/System Parameters diff --git a/l10n_pt_account_invoicexpress/readme/CONFIGURE.rst b/l10n_pt_account_invoicexpress/readme/CONFIGURE.rst new file mode 100644 index 00000000..e0d75c98 --- /dev/null +++ b/l10n_pt_account_invoicexpress/readme/CONFIGURE.rst @@ -0,0 +1,34 @@ +To configure: + +- Navigate to Settings/General Settings. +- In the "General Settings" configuration section, locate the "InvoiceXpress" subsection: + There you can set: + + - InvoiceXpress Account Name + - InvoiceXpress API Key + - InvoiceXpress Invoice Email Template + +The email template is used to prepare the details for the email the InvoiceXpress +service sends with the invoice: + +- "To" email address +- "Cc" email address +- Subject +- Body + +Translations are supported, and the customer language is used to render +the email details. + +The InvoiceXpress configuration is per company, +and can also be modified directly on the Company form, +if the Developer Mode is enabled. + +On the Journal form, for sales journals, a flag is available to allow disabling +the InvoiceXpress integration. This can be useful for a journal that was used temporarily +to import invoice history, for reporting purposes, ond was then disabled, +or to allow that journal to use a different legal invoicing system. + +Note that all invoices generated MUST use a certified invoicing system. +For a portuguese company, you cannot have some of the invoices being generated by Odoo +itself. So use this option at your own risk, and only in the cases you are sure +to be compliant with TPortugues Tax Authority invoicing regulations. diff --git a/l10n_pt_account_invoicexpress/readme/DESCRIPTION.rst b/l10n_pt_account_invoicexpress/readme/DESCRIPTION.rst index 1f7597f1..d586c9fa 100644 --- a/l10n_pt_account_invoicexpress/readme/DESCRIPTION.rst +++ b/l10n_pt_account_invoicexpress/readme/DESCRIPTION.rst @@ -1 +1,19 @@ Generate Portuguese tax authority legal Invoices ("Faturas") using InvoiceXpress. + +InvoiceXpress is a paid service, although free trials are available. +Visit https://invoicexpress.com for more details. + +Once the InvoiceXpress connection is configured, +the invoice CONFIRM button automatically generates the InvoiceXpress invoice. + +If the InvoiceXpress Invoice email template is configured, +the InvoiceXpress service will also send the invoice by email, +using the details in Odoo configured email template. + +This replaces the Odoo SEND & PRINT button, +since only the InvoiceXpress generated document should be used. +Having other print layouts for the invoice is not allowed +by the Portuguese Tax Authority. + +Legal transport documents ("Guias de Transporte") are also supported +through the extension module "l10n_pt_stock_invoicexpress". diff --git a/l10n_pt_account_invoicexpress/readme/USAGE.rst b/l10n_pt_account_invoicexpress/readme/USAGE.rst index 7bd2e151..2c82212d 100644 --- a/l10n_pt_account_invoicexpress/readme/USAGE.rst +++ b/l10n_pt_account_invoicexpress/readme/USAGE.rst @@ -1,5 +1,8 @@ -On an Invoice use the "Create InvoiceXpress" -button to generate an invoice on the InvoiceXpress service. +On an Invoice, the CONFIRM button automatically generates +an invoice on the InvoiceXpress service. The "Email InvoiceXpress" button requests the InvoiceXpress service to send an email with a copy of the legal document. + +The Invoice form shows an "InvoiceXpress" tab containing details for +the corresponding InvoiceXpress document. diff --git a/l10n_pt_account_invoicexpress/static/description/cover.png b/l10n_pt_account_invoicexpress/static/description/cover.png new file mode 100644 index 0000000000000000000000000000000000000000..ae9b85eac5453ec6906465f0bb2377697847350e GIT binary patch literal 189880 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

;4!JZ8i5?1!t=#K0)p35@%Q}Cs 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 literal 0 HcmV?d00001 diff --git a/l10n_pt_account_invoicexpress/views/account_move_view.xml b/l10n_pt_account_invoicexpress/views/account_move_view.xml index 88bd6ad7..2b0abbe1 100644 --- a/l10n_pt_account_invoicexpress/views/account_move_view.xml +++ b/l10n_pt_account_invoicexpress/views/account_move_view.xml @@ -15,7 +15,6 @@ name="invoicexpress" string="InvoiceXpress" attrs="{'invisible': [('invoicexpress_id', '=', False)]}" - groups="base.group_no_one" > diff --git a/l10n_pt_account_invoicexpress/views/res_config_settings.xml b/l10n_pt_account_invoicexpress/views/res_config_settings.xml index de603abf..a8ef0a88 100644 --- a/l10n_pt_account_invoicexpress/views/res_config_settings.xml +++ b/l10n_pt_account_invoicexpress/views/res_config_settings.xml @@ -8,7 +8,7 @@

-

Account InvoiceXpress

+

InvoiceXpress

@@ -32,14 +32,14 @@
From 9d1953a6b6a830b2f6fc7f06d647d948a616a3aa Mon Sep 17 00:00:00 2001 From: oca-travis Date: Thu, 23 Sep 2021 14:36:20 +0000 Subject: [PATCH 091/157] [UPD] Update l10n_pt_account_invoicexpress.pot --- .../i18n/l10n_pt_account_invoicexpress.pot | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/l10n_pt_account_invoicexpress/i18n/l10n_pt_account_invoicexpress.pot b/l10n_pt_account_invoicexpress/i18n/l10n_pt_account_invoicexpress.pot index 72fc9deb..66158126 100644 --- a/l10n_pt_account_invoicexpress/i18n/l10n_pt_account_invoicexpress.pot +++ b/l10n_pt_account_invoicexpress/i18n/l10n_pt_account_invoicexpress.pot @@ -45,11 +45,6 @@ msgid "" " " msgstr "" -#. module: l10n_pt_account_invoicexpress -#: model_terms:ir.ui.view,arch_db:l10n_pt_account_invoicexpress.res_config_settings_view_form -msgid "Account InvoiceXpress" -msgstr "" - #. module: l10n_pt_account_invoicexpress #: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_account_bank_statement_line__can_invoicexpress #: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_account_move__can_invoicexpress @@ -132,6 +127,7 @@ msgid "Invoice %s is not registerd in InvoiceXpress yet." msgstr "" #. module: l10n_pt_account_invoicexpress +#: model_terms:ir.ui.view,arch_db:l10n_pt_account_invoicexpress.res_config_settings_view_form #: model_terms:ir.ui.view,arch_db:l10n_pt_account_invoicexpress.view_account_move_form msgid "InvoiceXpress" msgstr "" @@ -139,12 +135,8 @@ msgstr "" #. module: l10n_pt_account_invoicexpress #: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_res_company__invoicexpress_api_key #: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_res_config_settings__invoicexpress_api_key -msgid "InvoiceXpress API Key" -msgstr "" - -#. module: l10n_pt_account_invoicexpress #: model_terms:ir.ui.view,arch_db:l10n_pt_account_invoicexpress.res_config_settings_view_form -msgid "InvoiceXpress API key" +msgid "InvoiceXpress API Key" msgstr "" #. module: l10n_pt_account_invoicexpress @@ -169,7 +161,6 @@ msgstr "" #. module: l10n_pt_account_invoicexpress #: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_res_company__invoicexpress_template_id #: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_res_config_settings__invoicexpress_template_id -#: model_terms:ir.ui.view,arch_db:l10n_pt_account_invoicexpress.res_config_settings_view_form msgid "InvoiceXpress Email Template" msgstr "" @@ -181,6 +172,11 @@ msgstr "" msgid "InvoiceXpress ID" msgstr "" +#. module: l10n_pt_account_invoicexpress +#: model_terms:ir.ui.view,arch_db:l10n_pt_account_invoicexpress.res_config_settings_view_form +msgid "InvoiceXpress Invoice Email Template" +msgstr "" + #. module: l10n_pt_account_invoicexpress #: model:ir.model,name:l10n_pt_account_invoicexpress.model_account_invoicexpress msgid "InvoiceXpress connector" From 913b8358c55cdfca3d70b1ad7c6340d871e9fc67 Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Thu, 23 Sep 2021 15:07:37 +0000 Subject: [PATCH 092/157] [UPD] README.rst --- l10n_pt_account_invoicexpress/README.rst | 63 +++++++++++++++- .../static/description/index.html | 75 ++++++++++++++++--- 2 files changed, 124 insertions(+), 14 deletions(-) diff --git a/l10n_pt_account_invoicexpress/README.rst b/l10n_pt_account_invoicexpress/README.rst index 35d68414..ce12a028 100644 --- a/l10n_pt_account_invoicexpress/README.rst +++ b/l10n_pt_account_invoicexpress/README.rst @@ -27,20 +27,79 @@ Portugal InvoiceXpress Integration Generate Portuguese tax authority legal Invoices ("Faturas") using InvoiceXpress. +InvoiceXpress is a paid service, although free trials are available. +Visit https://invoicexpress.com for more details. + +Once the InvoiceXpress connection is configured, +the invoice CONFIRM button automatically generates the InvoiceXpress invoice. + +If the InvoiceXpress Invoice email template is configured, +the InvoiceXpress service will also send the invoice by email, +using the details in Odoo configured email template. + +This replaces the Odoo SEND & PRINT button, +since only the InvoiceXpress generated document should be used. +Having other print layouts for the invoice is not allowed +by the Portuguese Tax Authority. + +Legal transport documents ("Guias de Transporte") are also supported +through the extension module "l10n_pt_stock_invoicexpress". + **Table of contents** .. contents:: :local: +Configuration +============= + +To configure: + +- Navigate to Settings/General Settings. +- In the "General Settings" configuration section, locate the "InvoiceXpress" subsection: + There you can set: + + - InvoiceXpress Account Name + - InvoiceXpress API Key + - InvoiceXpress Invoice Email Template + +The email template is used to prepare the details for the email the InvoiceXpress +service sends with the invoice: + +- "To" email address +- "Cc" email address +- Subject +- Body + +Translations are supported, and the customer language is used to render +the email details. + +The InvoiceXpress configuration is per company, +and can also be modified directly on the Company form, +if the Developer Mode is enabled. + +On the Journal form, for sales journals, a flag is available to allow disabling +the InvoiceXpress integration. This can be useful for a journal that was used temporarily +to import invoice history, for reporting purposes, ond was then disabled, +or to allow that journal to use a different legal invoicing system. + +Note that all invoices generated MUST use a certified invoicing system. +For a portuguese company, you cannot have some of the invoices being generated by Odoo +itself. So use this option at your own risk, and only in the cases you are sure +to be compliant with TPortugues Tax Authority invoicing regulations. + Usage ===== -On an Invoice use the "Create InvoiceXpress" -button to generate an invoice on the InvoiceXpress service. +On an Invoice, the CONFIRM button automatically generates +an invoice on the InvoiceXpress service. The "Email InvoiceXpress" button requests the InvoiceXpress service to send an email with a copy of the legal document. +The Invoice form shows an "InvoiceXpress" tab containing details for +the corresponding InvoiceXpress document. + Bug Tracker =========== diff --git a/l10n_pt_account_invoicexpress/static/description/index.html b/l10n_pt_account_invoicexpress/static/description/index.html index 6a3c0dd8..9dd781ad 100644 --- a/l10n_pt_account_invoicexpress/static/description/index.html +++ b/l10n_pt_account_invoicexpress/static/description/index.html @@ -369,27 +369,78 @@

Portugal InvoiceXpress Integration

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->

Production/Stable License: AGPL-3 OCA/l10n-portugal Translate me on Weblate Try me on Runbot

Generate Portuguese tax authority legal Invoices (“Faturas”) using InvoiceXpress.

+

InvoiceXpress is a paid service, although free trials are available. +Visit https://invoicexpress.com for more details.

+

Once the InvoiceXpress connection is configured, +the invoice CONFIRM button automatically generates the InvoiceXpress invoice.

+

If the InvoiceXpress Invoice email template is configured, +the InvoiceXpress service will also send the invoice by email, +using the details in Odoo configured email template.

+

This replaces the Odoo SEND & PRINT button, +since only the InvoiceXpress generated document should be used. +Having other print layouts for the invoice is not allowed +by the Portuguese Tax Authority.

+

Legal transport documents (“Guias de Transporte”) are also supported +through the extension module “l10n_pt_stock_invoicexpress”.

Table of contents

+
+

Configuration

+

To configure:

+
    +
  • Navigate to Settings/General Settings.
  • +
  • In the “General Settings” configuration section, locate the “InvoiceXpress” subsection: +There you can set:
      +
    • InvoiceXpress Account Name
    • +
    • InvoiceXpress API Key
    • +
    • InvoiceXpress Invoice Email Template
    • +
    +
  • +
+

The email template is used to prepare the details for the email the InvoiceXpress +service sends with the invoice:

+
    +
  • “To” email address
  • +
  • “Cc” email address
  • +
  • Subject
  • +
  • Body
  • +
+

Translations are supported, and the customer language is used to render +the email details.

+

The InvoiceXpress configuration is per company, +and can also be modified directly on the Company form, +if the Developer Mode is enabled.

+

On the Journal form, for sales journals, a flag is available to allow disabling +the InvoiceXpress integration. This can be useful for a journal that was used temporarily +to import invoice history, for reporting purposes, ond was then disabled, +or to allow that journal to use a different legal invoicing system.

+

Note that all invoices generated MUST use a certified invoicing system. +For a portuguese company, you cannot have some of the invoices being generated by Odoo +itself. So use this option at your own risk, and only in the cases you are sure +to be compliant with TPortugues Tax Authority invoicing regulations.

+
-

Usage

-

On an Invoice use the “Create InvoiceXpress” -button to generate an invoice on the InvoiceXpress service.

+

Usage

+

On an Invoice, the CONFIRM button automatically generates +an invoice on the InvoiceXpress service.

The “Email InvoiceXpress” button requests the InvoiceXpress service to send an email with a copy of the legal document.

+

The Invoice form shows an “InvoiceXpress” tab containing details for +the corresponding InvoiceXpress document.

-

Bug Tracker

+

Bug Tracker

Bugs are tracked on GitHub Issues. In case of trouble, please check there if your issue has already been reported. If you spotted it first, help us smashing it by providing a detailed and welcomed @@ -397,15 +448,15 @@

Bug Tracker

Do not contact contributors directly about support or help with technical issues.

-

Credits

+

Credits

-

Authors

+

Authors

  • Open Source Integrators
-

Maintainers

+

Maintainers

This module is maintained by the OCA.

Odoo Community Association

OCA, or the Odoo Community Association, is a nonprofit organization whose From 3de48d72164e69f5aa12cd40751a3d3415b96b0f Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Thu, 23 Sep 2021 15:07:38 +0000 Subject: [PATCH 093/157] l10n_pt_account_invoicexpress 14.0.2.3.1 --- l10n_pt_account_invoicexpress/__manifest__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/l10n_pt_account_invoicexpress/__manifest__.py b/l10n_pt_account_invoicexpress/__manifest__.py index d846e03e..656adf14 100644 --- a/l10n_pt_account_invoicexpress/__manifest__.py +++ b/l10n_pt_account_invoicexpress/__manifest__.py @@ -4,7 +4,7 @@ { "name": "Portugal InvoiceXpress Integration", "summary": "Portuguese certified invoices using InvoiceXpress", - "version": "14.0.2.3.0", + "version": "14.0.2.3.1", "author": "Open Source Integrators, Odoo Community Association (OCA)", "license": "AGPL-3", "website": "https://github.com/OCA/l10n-portugal", From 74dd2f36bbc52bbb26b7c6c556dd494008948cf5 Mon Sep 17 00:00:00 2001 From: OCA Transbot Date: Thu, 23 Sep 2021 15:07:45 +0000 Subject: [PATCH 094/157] Update translation files Updated by "Update PO files to match POT (msgmerge)" hook in Weblate. Translation: l10n-portugal-14.0/l10n-portugal-14.0-l10n_pt_account_invoicexpress Translate-URL: https://translation.odoo-community.org/projects/l10n-portugal-14-0/l10n-portugal-14-0-l10n_pt_account_invoicexpress/ --- l10n_pt_account_invoicexpress/i18n/pt.po | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/l10n_pt_account_invoicexpress/i18n/pt.po b/l10n_pt_account_invoicexpress/i18n/pt.po index a725d84d..f5000546 100644 --- a/l10n_pt_account_invoicexpress/i18n/pt.po +++ b/l10n_pt_account_invoicexpress/i18n/pt.po @@ -46,11 +46,6 @@ msgid "" " " msgstr "" -#. module: l10n_pt_account_invoicexpress -#: model_terms:ir.ui.view,arch_db:l10n_pt_account_invoicexpress.res_config_settings_view_form -msgid "Account InvoiceXpress" -msgstr "" - #. module: l10n_pt_account_invoicexpress #: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_account_bank_statement_line__can_invoicexpress #: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_account_move__can_invoicexpress @@ -133,6 +128,7 @@ msgid "Invoice %s is not registerd in InvoiceXpress yet." msgstr "" #. module: l10n_pt_account_invoicexpress +#: model_terms:ir.ui.view,arch_db:l10n_pt_account_invoicexpress.res_config_settings_view_form #: model_terms:ir.ui.view,arch_db:l10n_pt_account_invoicexpress.view_account_move_form msgid "InvoiceXpress" msgstr "" @@ -140,12 +136,8 @@ msgstr "" #. module: l10n_pt_account_invoicexpress #: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_res_company__invoicexpress_api_key #: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_res_config_settings__invoicexpress_api_key -msgid "InvoiceXpress API Key" -msgstr "" - -#. module: l10n_pt_account_invoicexpress #: model_terms:ir.ui.view,arch_db:l10n_pt_account_invoicexpress.res_config_settings_view_form -msgid "InvoiceXpress API key" +msgid "InvoiceXpress API Key" msgstr "" #. module: l10n_pt_account_invoicexpress @@ -170,7 +162,6 @@ msgstr "" #. module: l10n_pt_account_invoicexpress #: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_res_company__invoicexpress_template_id #: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_res_config_settings__invoicexpress_template_id -#: model_terms:ir.ui.view,arch_db:l10n_pt_account_invoicexpress.res_config_settings_view_form msgid "InvoiceXpress Email Template" msgstr "" @@ -182,6 +173,11 @@ msgstr "" msgid "InvoiceXpress ID" msgstr "" +#. module: l10n_pt_account_invoicexpress +#: model_terms:ir.ui.view,arch_db:l10n_pt_account_invoicexpress.res_config_settings_view_form +msgid "InvoiceXpress Invoice Email Template" +msgstr "" + #. module: l10n_pt_account_invoicexpress #: model:ir.model,name:l10n_pt_account_invoicexpress.model_account_invoicexpress msgid "InvoiceXpress connector" From 183e5135fe26377051b147354ca17fd63c60dfab Mon Sep 17 00:00:00 2001 From: Daniel Reis Date: Fri, 12 Nov 2021 14:37:22 +0000 Subject: [PATCH 095/157] [IMP] l10n_pt_account_invoicexpress: add support for other document types --- .../models/account_invoicexpress.py | 7 +- .../models/account_journal.py | 23 ++- .../models/account_move.py | 192 +++++++++++++----- .../models/res_company.py | 16 +- .../readme/CONTRIBUTORS.rst | 1 + .../readme/DESCRIPTION.rst | 18 +- .../tests/test_invoicexpress.py | 25 ++- .../views/account_journal_view.xml | 3 +- .../views/account_move_view.xml | 11 +- .../views/res_company_view.xml | 3 +- 10 files changed, 226 insertions(+), 73 deletions(-) create mode 100644 l10n_pt_account_invoicexpress/readme/CONTRIBUTORS.rst diff --git a/l10n_pt_account_invoicexpress/models/account_invoicexpress.py b/l10n_pt_account_invoicexpress/models/account_invoicexpress.py index dbdfcf52..fc6292b1 100644 --- a/l10n_pt_account_invoicexpress/models/account_invoicexpress.py +++ b/l10n_pt_account_invoicexpress/models/account_invoicexpress.py @@ -79,7 +79,12 @@ def call( request_headers = self._build_headers(config, headers) request_params = self._build_params(config, params) request_data = payload and json.dumps(payload) or "" - _logger.debug("\nRequest for %s %s:\n%s", request_url, verb, request_data) + _logger.debug( + "\nRequest for %s %s:\n%s", + request_url, + verb, + pprint.pformat(payload, indent=1), + ) response = requests.request( verb, request_url, diff --git a/l10n_pt_account_invoicexpress/models/account_journal.py b/l10n_pt_account_invoicexpress/models/account_journal.py index 2cc868b6..19d0428c 100644 --- a/l10n_pt_account_invoicexpress/models/account_journal.py +++ b/l10n_pt_account_invoicexpress/models/account_journal.py @@ -1,14 +1,33 @@ # Copyright (C) 2021 Open Source Integrators # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). -from odoo import fields, models +from odoo import api, fields, models class AccountJournal(models.Model): _inherit = "account.journal" + @api.depends("invoicexpress_doc_type") + def _compute_use_invoicexpress(self): + for journal in self: + journal.use_invoicexpress = ( + journal.invoicexpress_doc_type + and journal.invoicexpress_doc_type != "none" + and journal.company_id.has_invoicexpress + ) + + invoicexpress_doc_type = fields.Selection( + [ + ("invoice", "Invoice"), + ("invoice_receipt", "Invoices Receipt"), + ("simplified_invoice", "Simplified Invoice"), + ("none", "No InvoiceXpress document"), + ], + help="Select the type of legal invoice document" + " to be created by InvoiceXpress.", + ) use_invoicexpress = fields.Boolean( - default=True, + compute="_compute_use_invoicexpress", help="Invoicexpress service is only used if checked." " Only relevant for Sales journals.", ) diff --git a/l10n_pt_account_invoicexpress/models/account_move.py b/l10n_pt_account_invoicexpress/models/account_move.py index f9a891c2..f57d12af 100644 --- a/l10n_pt_account_invoicexpress/models/account_move.py +++ b/l10n_pt_account_invoicexpress/models/account_move.py @@ -7,23 +7,17 @@ class AccountMove(models.Model): _inherit = "account.move" - journal_type = fields.Selection( - related="journal_id.type", string="Journal Type", readonly=True - ) - invoicexpress_id = fields.Char("InvoiceXpress ID", copy=False, readonly=True) - invoicexpress_permalink = fields.Char( - "InvoiceXpress Doc Link", copy=False, readonly=True - ) - can_invoicexpress = fields.Boolean(compute="_compute_can_invoicexpress") - can_invoicexpress_email = fields.Boolean(compute="_compute_can_invoicexpress_email") + @api.depends("restrict_mode_hash_table", "state") + def _compute_show_reset_to_draft_button(self): + super()._compute_show_reset_to_draft_button() + # InvoiceXpress generated invoices can't be set to Draft + self.filtered("invoicexpress_id").write({"show_reset_to_draft_button": False}) - @api.depends("move_type", "journal_id", "company_id.invoicexpress_api_key") + @api.depends("move_type", "journal_id.use_invoicexpress") def _compute_can_invoicexpress(self): for invoice in self: invoice.can_invoicexpress = ( - invoice.journal_id.use_invoicexpress - and invoice.is_sale_document() - and invoice.company_id.invoicexpress_api_key + invoice.journal_id.use_invoicexpress and invoice.is_sale_document() ) @api.depends("can_invoicexpress", "company_id.invoicexpress_template_id") @@ -34,15 +28,82 @@ def _compute_can_invoicexpress_email(self): and invoice.company_id.invoicexpress_template_id ) - def _get_invoicexpress_doctype(self): + @api.depends("move_type", "journal_id", "partner_shipping_id") + def _compute_invoicexpress_doc_type(self): """ - The type of document you wish to send by email: invoices, invoice_receipts, + The type of document to create: invoices, invoice_receipts, simplified_invoices, vat_moss_invoices, credit_notes or debit_notes. """ - doctype = "invoices" - if self.move_type == "out_refund": - doctype = "credit_notes" - return doctype + invoices = self.filtered("journal_id.use_invoicexpress") + for invoice in invoices: + doctype = invoice.journal_id.invoicexpress_doc_type + europe = self.env.ref("base.europe") + country = invoice.partner_shipping_id.country_id + if not doctype or doctype == "none": + invoice.invoicexpress_doc_type = None + elif invoice.move_type == "out_refund": + invoice.invoicexpress_doc_type = "credit_note" + elif country and country.code != "PT" and country in europe.country_ids: + invoice.invoicexpress_doc_type = "vat_moss_invoice" + else: + invoice.invoicexpress_doc_type = doctype + + journal_type = fields.Selection( + related="journal_id.type", string="Journal Type", readonly=True + ) + invoicexpress_id = fields.Char("InvoiceXpress ID", copy=False, readonly=True) + invoicexpress_permalink = fields.Char( + "InvoiceXpress Doc Link", copy=False, readonly=True + ) + can_invoicexpress = fields.Boolean(compute="_compute_can_invoicexpress") + can_invoicexpress_email = fields.Boolean(compute="_compute_can_invoicexpress_email") + + invoicexpress_doc_type = fields.Selection( + [ + ("invoice", "Invoice"), + ("invoice_receipt", "Invoice and Receipt"), + ("simplified_invoice", "Simplified Invoice"), + ("vat_moss_invoice", "Europe VAT MOSS Invoice"), + ("debit_note", "Debit Note"), + ("credit_note", "Credit Note"), + ], + compute="_compute_invoicexpress_doc_type", + store=True, + readonly=False, + copy=False, + help="Select the type of legal invoice document" + " to be created by InvoiceXpress." + " If unset, InvoiceXpress will not be used.", + ) + + @api.constrains("journal_id", "company_id") + def _check_invoicexpress_doctype_config(self): + """ + Ensure Journal configuration was not forgotten. + """ + sale_invoices = self.filtered(lambda x: x.journal_id.type == "sale") + for invoice in sale_invoices: + journal_doctype = invoice.journal_id.invoicexpress_doc_type + has_invoicexpress = invoice.company_id.has_invoicexpress + if not journal_doctype and has_invoicexpress: + raise exceptions.UserError( + _( + "Journal %s is missing the InvoiceXpress" + " document type configuration!" + ) + % invoice.journal_id.display_name + ) + + @api.model + def _get_invoicexpress_prefix(self, doctype): + return { + "invoice": "FT", + "invoice_receipt": "FR", + "simplified_invoice": "FS", + "vat_moss_invoice": "FVM", + "credit_note": "NC", + "debit_note": "ND", + }.get(doctype) def _prepare_invoicexpress_lines(self): # FIXME: set user lang, based on country? @@ -76,17 +137,19 @@ def _prepare_invoicexpress_vals(self): _("Kindly add the invoice date and invoice due date.") ) - customer = self.partner_id._prepare_invoicexpress_vals() + customer = self.commercial_partner_id._prepare_invoicexpress_vals() items = self._prepare_invoicexpress_lines() + proprietary_uid = ("%s.%s" % (self.name, self.env.cr.dbname)).replace(" ", "-") invoice_data = { "invoice": { "date": self.invoice_date.strftime("%d/%m/%Y"), "due_date": self.invoice_date_due.strftime("%d/%m/%Y"), "reference": self.ref or "", "client": customer, + "observations": self.narration or "", "items": items, }, - "proprietary_uid": "%s.%s" % (self.name, self.env.cr.dbname), + "proprietary_uid": proprietary_uid, } exempt_code = self.l10npt_vat_exempt_reason.code if exempt_code: @@ -98,15 +161,21 @@ def _prepare_invoicexpress_vals(self): self.company_id, self.invoice_date, ) - invoice_data.update( + invoice_data["invoice"].update( {"currency_code": self.currency_id.name, "rate": str(currency_rate)} ) + doctype = self.invoicexpress_doc_type + if doctype in ("credit_note", "debit_note"): + owner_invoice_num = self.reversed_entry_id.invoicexpress_id + if owner_invoice_num: + invoice_data["invoice"]["owner_invoice_id"] = owner_invoice_num return invoice_data def _update_invoicexpress_status(self): - inv_xpress_link = _( - " View Document" - ).format(self.invoicexpress_permalink) + inv_xpress_link_name = _("View Document") + inv_xpress_link = ( + "{}" + ).format(self.invoicexpress_permalink, inv_xpress_link_name) msg = _( "InvoiceXpress record has been created for this invoice:" "

  • InvoiceXpress Id: {inv_xpress_id}
  • " @@ -117,29 +186,44 @@ def _update_invoicexpress_status(self): def action_create_invoicexpress_invoice(self): InvoiceXpress = self.env["account.invoicexpress"] for invoice in self.filtered("can_invoicexpress"): - doctype = invoice._get_invoicexpress_doctype() + doctype = invoice.invoicexpress_doc_type + if not doctype: + raise exceptions.UserError( + _("Invoice is missing the InvoiceXpress document type!") + ) payload = invoice._prepare_invoicexpress_vals() response = InvoiceXpress.call( - invoice.company_id, "{}.json".format(doctype), "POST", payload=payload + invoice.company_id, "{}s.json".format(doctype), "POST", payload=payload ).json() - values = response.get("invoice") or response.get("credit_note") - if values: - invoice.invoicexpress_id = values.get("id") - invoice.invoicexpress_permalink = values.get("permalink") - response1 = InvoiceXpress.call( - invoice.company_id, - "{}/{}/change-state.json".format(doctype, invoice.invoicexpress_id), - "PUT", - payload={"invoice": {"state": "finalized"}}, - raise_errors=False, - ).json() - values1 = response1.get("invoice") or response1.get("credit_note") - invx_number = values1 and values1["inverted_sequence_number"] - if invx_number: - if invoice.payment_reference == invoice.name: - invoice.payment_reference = invx_number - invoice.name = invx_number - invoice._update_invoicexpress_status() + values = response.get(doctype) + if not values: + raise exceptions.UserError( + _("Something went wrong: the InvoiceXpress response looks empty.") + ) + invoice.invoicexpress_id = values.get("id") + invoice.invoicexpress_permalink = values.get("permalink") + response1 = InvoiceXpress.call( + invoice.company_id, + "{}s/{}/change-state.json".format(doctype, invoice.invoicexpress_id), + "PUT", + payload={"invoice": {"state": "finalized"}}, + raise_errors=True, + ).json() + values1 = response1.get(doctype) + seqnum = values1 and values1.get("inverted_sequence_number") + if not seqnum: + raise exceptions.UserError( + _( + "Something went wrong: the InvoiceXpress response" + " is missing a sequence number." + ) + ) + prefix = self._get_invoicexpress_prefix(doctype) + invx_number = "%s %s" % (prefix, seqnum) + if invoice.payment_reference == invoice.name: + invoice.payment_reference = invx_number + invoice.name = invx_number + invoice._update_invoicexpress_status() def _prepare_invoicexpress_email_vals(self, ignore_no_config=False): self.ensure_one() @@ -173,10 +257,12 @@ def action_send_invoicexpress_email(self, ignore_no_config=False): for invoice in self.filtered("can_invoicexpress_email"): if not invoice.invoicexpress_id: raise exceptions.UserError( - _("Invoice %s is not registerd in InvoiceXpress yet."), invoice.name + _("Invoice %s is not registered in InvoiceXpress yet.") + % invoice.name ) - endpoint = "invoices/{}/email-document.json".format( - invoice.invoicexpress_id + doctype = invoice.invoicexpress_doc_type + endpoint = "{}s/{}/email-document.json".format( + doctype, invoice.invoicexpress_id ) payload = invoice._prepare_invoicexpress_email_vals(ignore_no_config) if payload: @@ -189,15 +275,11 @@ def action_send_invoicexpress_email(self, ignore_no_config=False): ) invoice.message_post(body=msg) - @api.depends("restrict_mode_hash_table", "state") - def _compute_show_reset_to_draft_button(self): - super()._compute_show_reset_to_draft_button() - self.filtered("invoicexpress_id").write({"show_reset_to_draft_button": False}) - - def action_post(self): - res = super().action_post() + def _post(self, soft=False): + res = super()._post(soft=soft) for invoice in self: if not invoice.invoicexpress_id: + invoice._check_invoicexpress_doctype_config() invoice.action_create_invoicexpress_invoice() invoice.action_send_invoicexpress_email(ignore_no_config=True) return res diff --git a/l10n_pt_account_invoicexpress/models/res_company.py b/l10n_pt_account_invoicexpress/models/res_company.py index 5491e23e..8c6a0d05 100644 --- a/l10n_pt_account_invoicexpress/models/res_company.py +++ b/l10n_pt_account_invoicexpress/models/res_company.py @@ -1,14 +1,28 @@ # Copyright (C) 2021 Open Source Integrators # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). -from odoo import fields, models +from odoo import api, fields, models class Company(models.Model): _inherit = "res.company" + @api.depends("country_code", "invoicexpress_account_name", "invoicexpress_api_key") + def _compute_has_invoicexpress(self): + for company in self: + company.has_invoicexpress = ( + company.country_code == "PT" + and company.invoicexpress_account_name + and company.invoicexpress_api_key + ) + invoicexpress_account_name = fields.Char(string="InvoiceXpress Account Name") invoicexpress_api_key = fields.Char(string="InvoiceXpress API Key") + has_invoicexpress = fields.Boolean( + compute="_compute_has_invoicexpress", + help="Easy to use indicator if InvoiceXpress is enabled and can be used", + ) + invoicexpress_template_id = fields.Many2one( "mail.template", "InvoiceXpress Email Template", diff --git a/l10n_pt_account_invoicexpress/readme/CONTRIBUTORS.rst b/l10n_pt_account_invoicexpress/readme/CONTRIBUTORS.rst new file mode 100644 index 00000000..331bd0eb --- /dev/null +++ b/l10n_pt_account_invoicexpress/readme/CONTRIBUTORS.rst @@ -0,0 +1 @@ +* Daniel Reis , `Open Source Integrators `_ diff --git a/l10n_pt_account_invoicexpress/readme/DESCRIPTION.rst b/l10n_pt_account_invoicexpress/readme/DESCRIPTION.rst index d586c9fa..fb2124f9 100644 --- a/l10n_pt_account_invoicexpress/readme/DESCRIPTION.rst +++ b/l10n_pt_account_invoicexpress/readme/DESCRIPTION.rst @@ -1,6 +1,20 @@ Generate Portuguese tax authority legal Invoices ("Faturas") using InvoiceXpress. -InvoiceXpress is a paid service, although free trials are available. +**UPDATE November/2021:** + +Invoices: + +- Added support to the different documents types: + Invoice, Invoice Receipt, Simplified Invoice and VAT MOSS. + The default document type is set on the Journal, + and can be changed on the Invoice form. +- Use the invoice commercial partner for the name and address, + instead of the invoice contact. +- Added support for the Terms and Conditions/Observations field +- Added to Credit Notes the link to the source Invoice + + +InvoiceXpress is a paid service. Visit https://invoicexpress.com for more details. Once the InvoiceXpress connection is configured, @@ -15,5 +29,5 @@ since only the InvoiceXpress generated document should be used. Having other print layouts for the invoice is not allowed by the Portuguese Tax Authority. -Legal transport documents ("Guias de Transporte") are also supported +Legal transport documents ("Guias de Transporte" e "Guias de Remessa) are also supported through the extension module "l10n_pt_stock_invoicexpress". diff --git a/l10n_pt_account_invoicexpress/tests/test_invoicexpress.py b/l10n_pt_account_invoicexpress/tests/test_invoicexpress.py index b765eeea..1cf8b5c9 100644 --- a/l10n_pt_account_invoicexpress/tests/test_invoicexpress.py +++ b/l10n_pt_account_invoicexpress/tests/test_invoicexpress.py @@ -24,8 +24,11 @@ def setUp(self): { "invoicexpress_account_name": "ACCOUNT", "invoicexpress_api_key": "APIKEY", + "country_id": self.env.ref("base.pt").id, } ) + Journal = self.env["account.journal"] + self.sale_journals = Journal.search([("type", "=", "sale")]) self.AccountMove = self.env["account.move"] self.ProductProduct = self.env["product.product"] @@ -59,7 +62,7 @@ def test_100_create_invoicexpress_tax(self, mock_request): mock_request.return_value = mock_response( { "tax": { - "id": 31540, + "id": 12345, "name": "IVA23", "value": 23.0, "region": "PT", @@ -76,18 +79,24 @@ def test_100_create_invoicexpress_tax(self, mock_request): } ) taxA.action_invoicexpress_tax_create() - self.assertEqual(taxA.invoicexpress_id, "31540") + self.assertEqual(taxA.invoicexpress_id, "12345") @patch.object(requests, "request") def test_101_create_invoicexpress_invoice(self, mock_request): mock_request.return_value = mock_response( - {"invoice": {"id": 2137287, "inverted_sequence_number": "MYSEQ/123"}} + { + "invoice_receipt": { + "id": 12345678, + "inverted_sequence_number": "MYSEQ/123", + } + } ) - + # Ensure Journal is configured + self.sale_journals.write({"invoicexpress_doc_type": "invoice_receipt"}) + # Create the Invoice move_form = Form(self.AccountMove.with_context(default_move_type="out_invoice")) move_form.invoice_date = fields.Date.today() move_form.partner_id = self.partnerA - products = [self.productA, self.productB] for product in products: @@ -95,6 +104,6 @@ def test_101_create_invoicexpress_invoice(self, mock_request): line_form.product_id = product invoice = move_form.save() invoice.action_post() - - invoice.action_create_invoicexpress_invoice() - self.assertTrue(invoice.invoicexpress_id) + self.assertEqual(invoice.invoicexpress_doc_type, "invoice_receipt") + self.assertEqual(invoice.invoicexpress_id, "12345678") + self.assertEqual(invoice.name, "FR MYSEQ/123") diff --git a/l10n_pt_account_invoicexpress/views/account_journal_view.xml b/l10n_pt_account_invoicexpress/views/account_journal_view.xml index c9d072f5..fdbfd993 100644 --- a/l10n_pt_account_invoicexpress/views/account_journal_view.xml +++ b/l10n_pt_account_invoicexpress/views/account_journal_view.xml @@ -12,7 +12,8 @@ string="Invoicexpress" attrs="{'invisible': [('type', '!=', 'sale')]}" > - + + diff --git a/l10n_pt_account_invoicexpress/views/account_move_view.xml b/l10n_pt_account_invoicexpress/views/account_move_view.xml index 2b0abbe1..5408c392 100644 --- a/l10n_pt_account_invoicexpress/views/account_move_view.xml +++ b/l10n_pt_account_invoicexpress/views/account_move_view.xml @@ -6,10 +6,16 @@ account.move - + +
    - + +
    +
    diff --git a/l10n_pt_account_invoicexpress/views/res_company_view.xml b/l10n_pt_account_invoicexpress/views/res_company_view.xml index f4c68e50..fe13fb5c 100644 --- a/l10n_pt_account_invoicexpress/views/res_company_view.xml +++ b/l10n_pt_account_invoicexpress/views/res_company_view.xml @@ -8,10 +8,11 @@ - + + From 15af1af267236883d47c2fddb7b20f84b8dcc347 Mon Sep 17 00:00:00 2001 From: Daniel Reis Date: Thu, 18 Nov 2021 12:15:41 +0000 Subject: [PATCH 096/157] [IMP] l10n_pt_account_invoicexpress: remove redundant product ref from invoice lines --- .../models/account_move.py | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/l10n_pt_account_invoicexpress/models/account_move.py b/l10n_pt_account_invoicexpress/models/account_move.py index f57d12af..e43e2252 100644 --- a/l10n_pt_account_invoicexpress/models/account_move.py +++ b/l10n_pt_account_invoicexpress/models/account_move.py @@ -121,7 +121,7 @@ def _prepare_invoicexpress_lines(self): { "name": line.product_id.default_code or line.product_id.display_name, - "description": line.name, + "description": line._get_invoicexpress_descr(), "unit_price": line.price_unit, "quantity": line.quantity, "discount": line.discount, @@ -283,3 +283,19 @@ def _post(self, soft=False): invoice.action_create_invoicexpress_invoice() invoice.action_send_invoicexpress_email(ignore_no_config=True) return res + + +class AccountMoveLine(models.Model): + _inherit = "account.move.line" + + def _get_invoicexpress_descr(self): + """ + Remove Odoo product code from description, + since it is already presneted in a the Code column + """ + res = self.name + ref = self.product_id.default_code + prefix = "[%s] " % ref + if ref and self.name.startswith(prefix): + res = self.name[len(prefix) :] + return res From ffebe48a6df2f6eaa4696cfaf18f5bb612dc9f91 Mon Sep 17 00:00:00 2001 From: oca-travis Date: Thu, 18 Nov 2021 16:29:43 +0000 Subject: [PATCH 097/157] [UPD] Update l10n_pt_account_invoicexpress.pot --- .../i18n/l10n_pt_account_invoicexpress.pot | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/l10n_pt_account_invoicexpress/i18n/l10n_pt_account_invoicexpress.pot b/l10n_pt_account_invoicexpress/i18n/l10n_pt_account_invoicexpress.pot index 66158126..426e98c8 100644 --- a/l10n_pt_account_invoicexpress/i18n/l10n_pt_account_invoicexpress.pot +++ b/l10n_pt_account_invoicexpress/i18n/l10n_pt_account_invoicexpress.pot @@ -83,6 +83,7 @@ msgstr "" #: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_account_invoicexpress__display_name #: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_account_journal__display_name #: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_account_move__display_name +#: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_account_move_line__display_name #: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_account_tax__display_name #: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_res_company__display_name #: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_res_config_settings__display_name @@ -112,6 +113,7 @@ msgstr "" #: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_account_invoicexpress__id #: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_account_journal__id #: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_account_move__id +#: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_account_move_line__id #: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_account_tax__id #: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_res_company__id #: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_res_config_settings__id @@ -217,6 +219,11 @@ msgstr "" msgid "Journal Entry" msgstr "" +#. module: l10n_pt_account_invoicexpress +#: model:ir.model,name:l10n_pt_account_invoicexpress.model_account_move_line +msgid "Journal Item" +msgstr "" + #. module: l10n_pt_account_invoicexpress #: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_account_bank_statement_line__journal_type #: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_account_move__journal_type @@ -234,6 +241,7 @@ msgstr "" #: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_account_invoicexpress____last_update #: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_account_journal____last_update #: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_account_move____last_update +#: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_account_move_line____last_update #: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_account_tax____last_update #: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_res_company____last_update #: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_res_config_settings____last_update From db362974f160785290d168e0691b41d2e8f5d5a4 Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Thu, 18 Nov 2021 16:33:52 +0000 Subject: [PATCH 098/157] l10n_pt_account_invoicexpress 14.0.2.3.2 --- l10n_pt_account_invoicexpress/__manifest__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/l10n_pt_account_invoicexpress/__manifest__.py b/l10n_pt_account_invoicexpress/__manifest__.py index 656adf14..9fc7b43e 100644 --- a/l10n_pt_account_invoicexpress/__manifest__.py +++ b/l10n_pt_account_invoicexpress/__manifest__.py @@ -4,7 +4,7 @@ { "name": "Portugal InvoiceXpress Integration", "summary": "Portuguese certified invoices using InvoiceXpress", - "version": "14.0.2.3.1", + "version": "14.0.2.3.2", "author": "Open Source Integrators, Odoo Community Association (OCA)", "license": "AGPL-3", "website": "https://github.com/OCA/l10n-portugal", From 8ccabb0cec310390da0e41376fcc698ff8633313 Mon Sep 17 00:00:00 2001 From: OCA Transbot Date: Thu, 18 Nov 2021 16:33:59 +0000 Subject: [PATCH 099/157] Update translation files Updated by "Update PO files to match POT (msgmerge)" hook in Weblate. Translation: l10n-portugal-14.0/l10n-portugal-14.0-l10n_pt_account_invoicexpress Translate-URL: https://translation.odoo-community.org/projects/l10n-portugal-14-0/l10n-portugal-14-0-l10n_pt_account_invoicexpress/ --- l10n_pt_account_invoicexpress/i18n/pt.po | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/l10n_pt_account_invoicexpress/i18n/pt.po b/l10n_pt_account_invoicexpress/i18n/pt.po index f5000546..1479b180 100644 --- a/l10n_pt_account_invoicexpress/i18n/pt.po +++ b/l10n_pt_account_invoicexpress/i18n/pt.po @@ -84,6 +84,7 @@ msgstr "" #: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_account_invoicexpress__display_name #: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_account_journal__display_name #: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_account_move__display_name +#: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_account_move_line__display_name #: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_account_tax__display_name #: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_res_company__display_name #: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_res_config_settings__display_name @@ -113,6 +114,7 @@ msgstr "" #: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_account_invoicexpress__id #: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_account_journal__id #: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_account_move__id +#: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_account_move_line__id #: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_account_tax__id #: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_res_company__id #: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_res_config_settings__id @@ -218,6 +220,11 @@ msgstr "" msgid "Journal Entry" msgstr "" +#. module: l10n_pt_account_invoicexpress +#: model:ir.model,name:l10n_pt_account_invoicexpress.model_account_move_line +msgid "Journal Item" +msgstr "" + #. module: l10n_pt_account_invoicexpress #: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_account_bank_statement_line__journal_type #: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_account_move__journal_type @@ -235,6 +242,7 @@ msgstr "" #: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_account_invoicexpress____last_update #: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_account_journal____last_update #: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_account_move____last_update +#: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_account_move_line____last_update #: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_account_tax____last_update #: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_res_company____last_update #: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_res_config_settings____last_update From 94c8ce7012d91727c91daba29469b08b7796b409 Mon Sep 17 00:00:00 2001 From: Daniel Reis Date: Thu, 18 Nov 2021 18:07:30 +0000 Subject: [PATCH 100/157] Translated using Weblate (Portuguese) Currently translated at 48.8% (21 of 43 strings) Translation: l10n-portugal-14.0/l10n-portugal-14.0-l10n_pt_account_invoicexpress Translate-URL: https://translation.odoo-community.org/projects/l10n-portugal-14-0/l10n-portugal-14-0-l10n_pt_account_invoicexpress/pt/ --- l10n_pt_account_invoicexpress/i18n/pt.po | 46 +++++++++++++----------- 1 file changed, 26 insertions(+), 20 deletions(-) diff --git a/l10n_pt_account_invoicexpress/i18n/pt.po b/l10n_pt_account_invoicexpress/i18n/pt.po index 1479b180..d6da022b 100644 --- a/l10n_pt_account_invoicexpress/i18n/pt.po +++ b/l10n_pt_account_invoicexpress/i18n/pt.po @@ -6,24 +6,26 @@ msgid "" msgstr "" "Project-Id-Version: Odoo Server 14.0\n" "Report-Msgid-Bugs-To: \n" -"Last-Translator: Automatically generated\n" +"PO-Revision-Date: 2021-11-18 20:36+0000\n" +"Last-Translator: Daniel Reis \n" "Language-Team: none\n" "Language: pt\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: \n" "Plural-Forms: nplurals=2; plural=n > 1;\n" +"X-Generator: Weblate 4.3.2\n" #. module: l10n_pt_account_invoicexpress #: code:addons/l10n_pt_account_invoicexpress/models/account_move.py:0 #, python-format msgid " View Document" -msgstr "" +msgstr " Ver Documento" #. module: l10n_pt_account_invoicexpress #: model_terms:ir.ui.view,arch_db:l10n_pt_account_invoicexpress.res_config_settings_view_form msgid " Generate an API key" -msgstr "" +msgstr " Gerar uma chave de API" #. module: l10n_pt_account_invoicexpress #: model:mail.template,body_html:l10n_pt_account_invoicexpress.email_template_invoice @@ -51,34 +53,34 @@ msgstr "" #: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_account_move__can_invoicexpress #: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_account_payment__can_invoicexpress msgid "Can Invoicexpress" -msgstr "" +msgstr "Pode usar InvoiceXpress" #. module: l10n_pt_account_invoicexpress #: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_account_bank_statement_line__can_invoicexpress_email #: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_account_move__can_invoicexpress_email #: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_account_payment__can_invoicexpress_email msgid "Can Invoicexpress Email" -msgstr "" +msgstr "Pode enviar email InvoiceXpress" #. module: l10n_pt_account_invoicexpress #: model:ir.model,name:l10n_pt_account_invoicexpress.model_res_company msgid "Companies" -msgstr "" +msgstr "Empresas" #. module: l10n_pt_account_invoicexpress #: model:ir.model,name:l10n_pt_account_invoicexpress.model_res_config_settings msgid "Config Settings" -msgstr "" +msgstr "Configurações" #. module: l10n_pt_account_invoicexpress #: model:ir.model,name:l10n_pt_account_invoicexpress.model_res_partner msgid "Contact" -msgstr "" +msgstr "Contacto" #. module: l10n_pt_account_invoicexpress #: model:ir.model,name:l10n_pt_account_invoicexpress.model_res_country msgid "Country" -msgstr "" +msgstr "País" #. module: l10n_pt_account_invoicexpress #: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_account_invoicexpress__display_name @@ -91,24 +93,24 @@ msgstr "" #: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_res_country__display_name #: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_res_partner__display_name msgid "Display Name" -msgstr "" +msgstr "Nome de apresentação" #. module: l10n_pt_account_invoicexpress #: model_terms:ir.ui.view,arch_db:l10n_pt_account_invoicexpress.view_account_move_form msgid "Email InvoiceXpress" -msgstr "" +msgstr "Email InvoiceXpress" #. module: l10n_pt_account_invoicexpress #: code:addons/l10n_pt_account_invoicexpress/models/account_move.py:0 #, python-format msgid "Email sent by InvoiceXpress:
    • To: {}
    • Cc: {}
    " -msgstr "" +msgstr "Email enviado por InvoiceXpress:
    • To: {}
    • Cc: {}
    " #. module: l10n_pt_account_invoicexpress #: code:addons/l10n_pt_account_invoicexpress/models/account_invoicexpress.py:0 #, python-format msgid "Error running API request ({} {}): {}" -msgstr "" +msgstr "Erro na chamada à API ({} {}): {}" #. module: l10n_pt_account_invoicexpress #: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_account_invoicexpress__id @@ -127,7 +129,7 @@ msgstr "" #: code:addons/l10n_pt_account_invoicexpress/models/account_move.py:0 #, python-format msgid "Invoice %s is not registerd in InvoiceXpress yet." -msgstr "" +msgstr "Fatura %s não está registada no InvoiceXpress." #. module: l10n_pt_account_invoicexpress #: model_terms:ir.ui.view,arch_db:l10n_pt_account_invoicexpress.res_config_settings_view_form @@ -140,19 +142,19 @@ msgstr "" #: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_res_config_settings__invoicexpress_api_key #: model_terms:ir.ui.view,arch_db:l10n_pt_account_invoicexpress.res_config_settings_view_form msgid "InvoiceXpress API Key" -msgstr "" +msgstr "InvoiceXpress Chave API" #. module: l10n_pt_account_invoicexpress #: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_res_company__invoicexpress_account_name #: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_res_config_settings__invoicexpress_account_name #: model_terms:ir.ui.view,arch_db:l10n_pt_account_invoicexpress.res_config_settings_view_form msgid "InvoiceXpress Account Name" -msgstr "" +msgstr "InvoiceXpress Nome da Conta" #. module: l10n_pt_account_invoicexpress #: model_terms:ir.ui.view,arch_db:l10n_pt_account_invoicexpress.res_compnay_form_invoicexpress msgid "InvoiceXpress Configuration" -msgstr "" +msgstr "Configuração InvoiceXpress" #. module: l10n_pt_account_invoicexpress #: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_account_bank_statement_line__invoicexpress_permalink @@ -183,7 +185,7 @@ msgstr "" #. module: l10n_pt_account_invoicexpress #: model:ir.model,name:l10n_pt_account_invoicexpress.model_account_invoicexpress msgid "InvoiceXpress connector" -msgstr "" +msgstr "Conector InvoiceXpress" #. module: l10n_pt_account_invoicexpress #: code:addons/l10n_pt_account_invoicexpress/models/account_move.py:0 @@ -192,6 +194,8 @@ msgid "" "InvoiceXpress record has been created for this invoice:
    • InvoiceXpress " "Id: {inv_xpress_id}
    • {inv_xpress_link}
    " msgstr "" +"O registo InvoiceXpress foi criado para esta fatura:
    • InvoiceXpress Id:" +" {inv_xpress_id}
    • {inv_xpress_link}
    " #. module: l10n_pt_account_invoicexpress #: model_terms:ir.ui.view,arch_db:l10n_pt_account_invoicexpress.view_account_journal_form @@ -201,7 +205,7 @@ msgstr "" #. module: l10n_pt_account_invoicexpress #: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_res_country__invoicexpress_name msgid "Invoicexpress Name" -msgstr "" +msgstr "Nome Invoicexpress" #. module: l10n_pt_account_invoicexpress #: model:ir.model.fields,help:l10n_pt_account_invoicexpress.field_account_journal__use_invoicexpress @@ -209,11 +213,13 @@ msgid "" "Invoicexpress service is only used if checked. Only relevant for Sales " "journals." msgstr "" +"Serviço InvoiceXpress só será usado se estiver assinalado. Relevante apenas " +"para Diários de Vendas." #. module: l10n_pt_account_invoicexpress #: model:ir.model,name:l10n_pt_account_invoicexpress.model_account_journal msgid "Journal" -msgstr "" +msgstr "Diário" #. module: l10n_pt_account_invoicexpress #: model:ir.model,name:l10n_pt_account_invoicexpress.model_account_move From c4a4ec6d687c9b4e092434f8765219e5a81bdba1 Mon Sep 17 00:00:00 2001 From: oca-travis Date: Fri, 19 Nov 2021 17:22:03 +0000 Subject: [PATCH 101/157] [UPD] Update l10n_pt_account_invoicexpress.pot --- .../i18n/l10n_pt_account_invoicexpress.pot | 115 ++++++++++++++++-- 1 file changed, 108 insertions(+), 7 deletions(-) diff --git a/l10n_pt_account_invoicexpress/i18n/l10n_pt_account_invoicexpress.pot b/l10n_pt_account_invoicexpress/i18n/l10n_pt_account_invoicexpress.pot index 426e98c8..4d433b1f 100644 --- a/l10n_pt_account_invoicexpress/i18n/l10n_pt_account_invoicexpress.pot +++ b/l10n_pt_account_invoicexpress/i18n/l10n_pt_account_invoicexpress.pot @@ -13,12 +13,6 @@ msgstr "" "Content-Transfer-Encoding: \n" "Plural-Forms: \n" -#. module: l10n_pt_account_invoicexpress -#: code:addons/l10n_pt_account_invoicexpress/models/account_move.py:0 -#, python-format -msgid " View Document" -msgstr "" - #. module: l10n_pt_account_invoicexpress #: model_terms:ir.ui.view,arch_db:l10n_pt_account_invoicexpress.res_config_settings_view_form msgid " Generate an API key" @@ -79,6 +73,16 @@ msgstr "" msgid "Country" msgstr "" +#. module: l10n_pt_account_invoicexpress +#: model:ir.model.fields.selection,name:l10n_pt_account_invoicexpress.selection__account_move__invoicexpress_doc_type__credit_note +msgid "Credit Note" +msgstr "" + +#. module: l10n_pt_account_invoicexpress +#: model:ir.model.fields.selection,name:l10n_pt_account_invoicexpress.selection__account_move__invoicexpress_doc_type__debit_note +msgid "Debit Note" +msgstr "" + #. module: l10n_pt_account_invoicexpress #: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_account_invoicexpress__display_name #: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_account_journal__display_name @@ -92,6 +96,11 @@ msgstr "" msgid "Display Name" msgstr "" +#. module: l10n_pt_account_invoicexpress +#: model:ir.model.fields,help:l10n_pt_account_invoicexpress.field_res_company__has_invoicexpress +msgid "Easy to use indicator if InvoiceXpress is enabled and can be used" +msgstr "" + #. module: l10n_pt_account_invoicexpress #: model_terms:ir.ui.view,arch_db:l10n_pt_account_invoicexpress.view_account_move_form msgid "Email InvoiceXpress" @@ -109,6 +118,16 @@ msgstr "" msgid "Error running API request ({} {}): {}" msgstr "" +#. module: l10n_pt_account_invoicexpress +#: model:ir.model.fields.selection,name:l10n_pt_account_invoicexpress.selection__account_move__invoicexpress_doc_type__vat_moss_invoice +msgid "Europe VAT MOSS Invoice" +msgstr "" + +#. module: l10n_pt_account_invoicexpress +#: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_res_company__has_invoicexpress +msgid "Has Invoicexpress" +msgstr "" + #. module: l10n_pt_account_invoicexpress #: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_account_invoicexpress__id #: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_account_journal__id @@ -122,10 +141,27 @@ msgstr "" msgid "ID" msgstr "" +#. module: l10n_pt_account_invoicexpress +#: model:ir.model.fields.selection,name:l10n_pt_account_invoicexpress.selection__account_journal__invoicexpress_doc_type__invoice +#: model:ir.model.fields.selection,name:l10n_pt_account_invoicexpress.selection__account_move__invoicexpress_doc_type__invoice +msgid "Invoice" +msgstr "" + +#. module: l10n_pt_account_invoicexpress +#: code:addons/l10n_pt_account_invoicexpress/models/account_move.py:0 +#, python-format +msgid "Invoice %s is not registered in InvoiceXpress yet." +msgstr "" + +#. module: l10n_pt_account_invoicexpress +#: model:ir.model.fields.selection,name:l10n_pt_account_invoicexpress.selection__account_move__invoicexpress_doc_type__invoice_receipt +msgid "Invoice and Receipt" +msgstr "" + #. module: l10n_pt_account_invoicexpress #: code:addons/l10n_pt_account_invoicexpress/models/account_move.py:0 #, python-format -msgid "Invoice %s is not registerd in InvoiceXpress yet." +msgid "Invoice is missing the InvoiceXpress document type!" msgstr "" #. module: l10n_pt_account_invoicexpress @@ -192,11 +228,24 @@ msgid "" " Id: {inv_xpress_id}
  • {inv_xpress_link}
" msgstr "" +#. module: l10n_pt_account_invoicexpress +#: model:ir.model.fields.selection,name:l10n_pt_account_invoicexpress.selection__account_journal__invoicexpress_doc_type__invoice_receipt +msgid "Invoices Receipt" +msgstr "" + #. module: l10n_pt_account_invoicexpress #: model_terms:ir.ui.view,arch_db:l10n_pt_account_invoicexpress.view_account_journal_form msgid "Invoicexpress" msgstr "" +#. module: l10n_pt_account_invoicexpress +#: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_account_bank_statement_line__invoicexpress_doc_type +#: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_account_journal__invoicexpress_doc_type +#: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_account_move__invoicexpress_doc_type +#: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_account_payment__invoicexpress_doc_type +msgid "Invoicexpress Doc Type" +msgstr "" + #. module: l10n_pt_account_invoicexpress #: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_res_country__invoicexpress_name msgid "Invoicexpress Name" @@ -214,6 +263,12 @@ msgstr "" msgid "Journal" msgstr "" +#. module: l10n_pt_account_invoicexpress +#: code:addons/l10n_pt_account_invoicexpress/models/account_move.py:0 +#, python-format +msgid "Journal %s is missing the InvoiceXpress document type configuration!" +msgstr "" + #. module: l10n_pt_account_invoicexpress #: model:ir.model,name:l10n_pt_account_invoicexpress.model_account_move msgid "Journal Entry" @@ -250,6 +305,11 @@ msgstr "" msgid "Last Modified on" msgstr "" +#. module: l10n_pt_account_invoicexpress +#: model:ir.model.fields.selection,name:l10n_pt_account_invoicexpress.selection__account_journal__invoicexpress_doc_type__none +msgid "No InvoiceXpress document" +msgstr "" + #. module: l10n_pt_account_invoicexpress #: code:addons/l10n_pt_account_invoicexpress/models/account_move.py:0 #, python-format @@ -281,6 +341,27 @@ msgid "" "Select 'General' for miscellaneous operations journals." msgstr "" +#. module: l10n_pt_account_invoicexpress +#: model:ir.model.fields,help:l10n_pt_account_invoicexpress.field_account_journal__invoicexpress_doc_type +msgid "" +"Select the type of legal invoice document to be created by InvoiceXpress." +msgstr "" + +#. module: l10n_pt_account_invoicexpress +#: model:ir.model.fields,help:l10n_pt_account_invoicexpress.field_account_bank_statement_line__invoicexpress_doc_type +#: model:ir.model.fields,help:l10n_pt_account_invoicexpress.field_account_move__invoicexpress_doc_type +#: model:ir.model.fields,help:l10n_pt_account_invoicexpress.field_account_payment__invoicexpress_doc_type +msgid "" +"Select the type of legal invoice document to be created by InvoiceXpress. If" +" unset, InvoiceXpress will not be used." +msgstr "" + +#. module: l10n_pt_account_invoicexpress +#: model:ir.model.fields.selection,name:l10n_pt_account_invoicexpress.selection__account_journal__invoicexpress_doc_type__simplified_invoice +#: model:ir.model.fields.selection,name:l10n_pt_account_invoicexpress.selection__account_move__invoicexpress_doc_type__simplified_invoice +msgid "Simplified Invoice" +msgstr "" + #. module: l10n_pt_account_invoicexpress #: code:addons/l10n_pt_account_invoicexpress/models/account_invoicexpress.py:0 #, python-format @@ -290,6 +371,20 @@ msgid "" " %(menu:base_setup.menu_config)s." msgstr "" +#. module: l10n_pt_account_invoicexpress +#: code:addons/l10n_pt_account_invoicexpress/models/account_move.py:0 +#, python-format +msgid "" +"Something went wrong: the InvoiceXpress response is missing a sequence " +"number." +msgstr "" + +#. module: l10n_pt_account_invoicexpress +#: code:addons/l10n_pt_account_invoicexpress/models/account_move.py:0 +#, python-format +msgid "Something went wrong: the InvoiceXpress response looks empty." +msgstr "" + #. module: l10n_pt_account_invoicexpress #: model:mail.template,subject:l10n_pt_account_invoicexpress.email_template_invoice msgid "Sua Fatura ${object.name | safe}" @@ -312,3 +407,9 @@ msgid "" "Used to generate the To, Cc, Subject and Body for the email sent by the " "InvoiceXpress service" msgstr "" + +#. module: l10n_pt_account_invoicexpress +#: code:addons/l10n_pt_account_invoicexpress/models/account_move.py:0 +#, python-format +msgid "View Document" +msgstr "" From fbc8b7fd3ed15be74882cac0f2def8243fd6aa08 Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Fri, 19 Nov 2021 17:28:57 +0000 Subject: [PATCH 102/157] [UPD] README.rst --- l10n_pt_account_invoicexpress/README.rst | 23 ++++++++++++++-- .../static/description/index.html | 27 ++++++++++++++++--- 2 files changed, 44 insertions(+), 6 deletions(-) diff --git a/l10n_pt_account_invoicexpress/README.rst b/l10n_pt_account_invoicexpress/README.rst index ce12a028..63ef68b6 100644 --- a/l10n_pt_account_invoicexpress/README.rst +++ b/l10n_pt_account_invoicexpress/README.rst @@ -27,7 +27,21 @@ Portugal InvoiceXpress Integration Generate Portuguese tax authority legal Invoices ("Faturas") using InvoiceXpress. -InvoiceXpress is a paid service, although free trials are available. +**UPDATE November/2021:** + +Invoices: + +- Added support to the different documents types: + Invoice, Invoice Receipt, Simplified Invoice and VAT MOSS. + The default document type is set on the Journal, + and can be changed on the Invoice form. +- Use the invoice commercial partner for the name and address, + instead of the invoice contact. +- Added support for the Terms and Conditions/Observations field +- Added to Credit Notes the link to the source Invoice + + +InvoiceXpress is a paid service. Visit https://invoicexpress.com for more details. Once the InvoiceXpress connection is configured, @@ -42,7 +56,7 @@ since only the InvoiceXpress generated document should be used. Having other print layouts for the invoice is not allowed by the Portuguese Tax Authority. -Legal transport documents ("Guias de Transporte") are also supported +Legal transport documents ("Guias de Transporte" e "Guias de Remessa) are also supported through the extension module "l10n_pt_stock_invoicexpress". **Table of contents** @@ -118,6 +132,11 @@ Authors * Open Source Integrators +Contributors +~~~~~~~~~~~~ + +* Daniel Reis , `Open Source Integrators `_ + Maintainers ~~~~~~~~~~~ diff --git a/l10n_pt_account_invoicexpress/static/description/index.html b/l10n_pt_account_invoicexpress/static/description/index.html index 9dd781ad..512c4c9f 100644 --- a/l10n_pt_account_invoicexpress/static/description/index.html +++ b/l10n_pt_account_invoicexpress/static/description/index.html @@ -369,7 +369,19 @@

Portugal InvoiceXpress Integration

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->

Production/Stable License: AGPL-3 OCA/l10n-portugal Translate me on Weblate Try me on Runbot

Generate Portuguese tax authority legal Invoices (“Faturas”) using InvoiceXpress.

-

InvoiceXpress is a paid service, although free trials are available. +

UPDATE November/2021:

+

Invoices:

+
    +
  • Added support to the different documents types: +Invoice, Invoice Receipt, Simplified Invoice and VAT MOSS. +The default document type is set on the Journal, +and can be changed on the Invoice form.
  • +
  • Use the invoice commercial partner for the name and address, +instead of the invoice contact.
  • +
  • Added support for the Terms and Conditions/Observations field
  • +
  • Added to Credit Notes the link to the source Invoice
  • +
+

InvoiceXpress is a paid service. Visit https://invoicexpress.com for more details.

Once the InvoiceXpress connection is configured, the invoice CONFIRM button automatically generates the InvoiceXpress invoice.

@@ -380,7 +392,7 @@

Portugal InvoiceXpress Integration

since only the InvoiceXpress generated document should be used. Having other print layouts for the invoice is not allowed by the Portuguese Tax Authority.

-

Legal transport documents (“Guias de Transporte”) are also supported +

Legal transport documents (“Guias de Transporte” e “Guias de Remessa) are also supported through the extension module “l10n_pt_stock_invoicexpress”.

Table of contents

@@ -390,7 +402,8 @@

Portugal InvoiceXpress Integration

  • Bug Tracker
  • Credits
  • @@ -455,8 +468,14 @@

    Authors

  • Open Source Integrators
  • +
    -

    Maintainers

    +

    Maintainers

    This module is maintained by the OCA.

    Odoo Community Association

    OCA, or the Odoo Community Association, is a nonprofit organization whose From b12c4a626bb5e55108a700bd15ef836dd08c15e5 Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Fri, 19 Nov 2021 17:28:57 +0000 Subject: [PATCH 103/157] l10n_pt_account_invoicexpress 14.0.3.0.0 --- l10n_pt_account_invoicexpress/__manifest__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/l10n_pt_account_invoicexpress/__manifest__.py b/l10n_pt_account_invoicexpress/__manifest__.py index 9fc7b43e..1c0b3181 100644 --- a/l10n_pt_account_invoicexpress/__manifest__.py +++ b/l10n_pt_account_invoicexpress/__manifest__.py @@ -4,7 +4,7 @@ { "name": "Portugal InvoiceXpress Integration", "summary": "Portuguese certified invoices using InvoiceXpress", - "version": "14.0.2.3.2", + "version": "14.0.3.0.0", "author": "Open Source Integrators, Odoo Community Association (OCA)", "license": "AGPL-3", "website": "https://github.com/OCA/l10n-portugal", From 157478dc54620be56e05e054de14c9f8bf4e69bf Mon Sep 17 00:00:00 2001 From: OCA Transbot Date: Fri, 19 Nov 2021 17:29:04 +0000 Subject: [PATCH 104/157] Update translation files Updated by "Update PO files to match POT (msgmerge)" hook in Weblate. Translation: l10n-portugal-14.0/l10n-portugal-14.0-l10n_pt_account_invoicexpress Translate-URL: https://translation.odoo-community.org/projects/l10n-portugal-14-0/l10n-portugal-14-0-l10n_pt_account_invoicexpress/ --- l10n_pt_account_invoicexpress/i18n/pt.po | 130 +++++++++++++++++++++-- 1 file changed, 119 insertions(+), 11 deletions(-) diff --git a/l10n_pt_account_invoicexpress/i18n/pt.po b/l10n_pt_account_invoicexpress/i18n/pt.po index d6da022b..c253be8e 100644 --- a/l10n_pt_account_invoicexpress/i18n/pt.po +++ b/l10n_pt_account_invoicexpress/i18n/pt.po @@ -16,12 +16,6 @@ msgstr "" "Plural-Forms: nplurals=2; plural=n > 1;\n" "X-Generator: Weblate 4.3.2\n" -#. module: l10n_pt_account_invoicexpress -#: code:addons/l10n_pt_account_invoicexpress/models/account_move.py:0 -#, python-format -msgid " View Document" -msgstr " Ver Documento" - #. module: l10n_pt_account_invoicexpress #: model_terms:ir.ui.view,arch_db:l10n_pt_account_invoicexpress.res_config_settings_view_form msgid " Generate an API key" @@ -82,6 +76,16 @@ msgstr "Contacto" msgid "Country" msgstr "País" +#. module: l10n_pt_account_invoicexpress +#: model:ir.model.fields.selection,name:l10n_pt_account_invoicexpress.selection__account_move__invoicexpress_doc_type__credit_note +msgid "Credit Note" +msgstr "" + +#. module: l10n_pt_account_invoicexpress +#: model:ir.model.fields.selection,name:l10n_pt_account_invoicexpress.selection__account_move__invoicexpress_doc_type__debit_note +msgid "Debit Note" +msgstr "" + #. module: l10n_pt_account_invoicexpress #: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_account_invoicexpress__display_name #: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_account_journal__display_name @@ -95,6 +99,11 @@ msgstr "País" msgid "Display Name" msgstr "Nome de apresentação" +#. module: l10n_pt_account_invoicexpress +#: model:ir.model.fields,help:l10n_pt_account_invoicexpress.field_res_company__has_invoicexpress +msgid "Easy to use indicator if InvoiceXpress is enabled and can be used" +msgstr "" + #. module: l10n_pt_account_invoicexpress #: model_terms:ir.ui.view,arch_db:l10n_pt_account_invoicexpress.view_account_move_form msgid "Email InvoiceXpress" @@ -104,7 +113,8 @@ msgstr "Email InvoiceXpress" #: code:addons/l10n_pt_account_invoicexpress/models/account_move.py:0 #, python-format msgid "Email sent by InvoiceXpress:

    • To: {}
    • Cc: {}
    " -msgstr "Email enviado por InvoiceXpress:
    • To: {}
    • Cc: {}
    " +msgstr "" +"Email enviado por InvoiceXpress:
    • To: {}
    • Cc: {}
    " #. module: l10n_pt_account_invoicexpress #: code:addons/l10n_pt_account_invoicexpress/models/account_invoicexpress.py:0 @@ -112,6 +122,16 @@ msgstr "Email enviado por InvoiceXpress:
    • To: {}
    • Cc: {}
    " msgid "Error running API request ({} {}): {}" msgstr "Erro na chamada à API ({} {}): {}" +#. module: l10n_pt_account_invoicexpress +#: model:ir.model.fields.selection,name:l10n_pt_account_invoicexpress.selection__account_move__invoicexpress_doc_type__vat_moss_invoice +msgid "Europe VAT MOSS Invoice" +msgstr "" + +#. module: l10n_pt_account_invoicexpress +#: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_res_company__has_invoicexpress +msgid "Has Invoicexpress" +msgstr "" + #. module: l10n_pt_account_invoicexpress #: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_account_invoicexpress__id #: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_account_journal__id @@ -125,11 +145,28 @@ msgstr "Erro na chamada à API ({} {}): {}" msgid "ID" msgstr "" +#. module: l10n_pt_account_invoicexpress +#: model:ir.model.fields.selection,name:l10n_pt_account_invoicexpress.selection__account_journal__invoicexpress_doc_type__invoice +#: model:ir.model.fields.selection,name:l10n_pt_account_invoicexpress.selection__account_move__invoicexpress_doc_type__invoice +msgid "Invoice" +msgstr "" + #. module: l10n_pt_account_invoicexpress #: code:addons/l10n_pt_account_invoicexpress/models/account_move.py:0 #, python-format -msgid "Invoice %s is not registerd in InvoiceXpress yet." -msgstr "Fatura %s não está registada no InvoiceXpress." +msgid "Invoice %s is not registered in InvoiceXpress yet." +msgstr "" + +#. module: l10n_pt_account_invoicexpress +#: model:ir.model.fields.selection,name:l10n_pt_account_invoicexpress.selection__account_move__invoicexpress_doc_type__invoice_receipt +msgid "Invoice and Receipt" +msgstr "" + +#. module: l10n_pt_account_invoicexpress +#: code:addons/l10n_pt_account_invoicexpress/models/account_move.py:0 +#, python-format +msgid "Invoice is missing the InvoiceXpress document type!" +msgstr "" #. module: l10n_pt_account_invoicexpress #: model_terms:ir.ui.view,arch_db:l10n_pt_account_invoicexpress.res_config_settings_view_form @@ -194,14 +231,27 @@ msgid "" "InvoiceXpress record has been created for this invoice:
    • InvoiceXpress " "Id: {inv_xpress_id}
    • {inv_xpress_link}
    " msgstr "" -"O registo InvoiceXpress foi criado para esta fatura:
    • InvoiceXpress Id:" -" {inv_xpress_id}
    • {inv_xpress_link}
    " +"O registo InvoiceXpress foi criado para esta fatura:
    • InvoiceXpress " +"Id: {inv_xpress_id}
    • {inv_xpress_link}
    " + +#. module: l10n_pt_account_invoicexpress +#: model:ir.model.fields.selection,name:l10n_pt_account_invoicexpress.selection__account_journal__invoicexpress_doc_type__invoice_receipt +msgid "Invoices Receipt" +msgstr "" #. module: l10n_pt_account_invoicexpress #: model_terms:ir.ui.view,arch_db:l10n_pt_account_invoicexpress.view_account_journal_form msgid "Invoicexpress" msgstr "" +#. module: l10n_pt_account_invoicexpress +#: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_account_bank_statement_line__invoicexpress_doc_type +#: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_account_journal__invoicexpress_doc_type +#: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_account_move__invoicexpress_doc_type +#: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_account_payment__invoicexpress_doc_type +msgid "Invoicexpress Doc Type" +msgstr "" + #. module: l10n_pt_account_invoicexpress #: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_res_country__invoicexpress_name msgid "Invoicexpress Name" @@ -221,6 +271,12 @@ msgstr "" msgid "Journal" msgstr "Diário" +#. module: l10n_pt_account_invoicexpress +#: code:addons/l10n_pt_account_invoicexpress/models/account_move.py:0 +#, python-format +msgid "Journal %s is missing the InvoiceXpress document type configuration!" +msgstr "" + #. module: l10n_pt_account_invoicexpress #: model:ir.model,name:l10n_pt_account_invoicexpress.model_account_move msgid "Journal Entry" @@ -257,6 +313,11 @@ msgstr "" msgid "Last Modified on" msgstr "" +#. module: l10n_pt_account_invoicexpress +#: model:ir.model.fields.selection,name:l10n_pt_account_invoicexpress.selection__account_journal__invoicexpress_doc_type__none +msgid "No InvoiceXpress document" +msgstr "" + #. module: l10n_pt_account_invoicexpress #: code:addons/l10n_pt_account_invoicexpress/models/account_move.py:0 #, python-format @@ -289,6 +350,27 @@ msgid "" "Select 'General' for miscellaneous operations journals." msgstr "" +#. module: l10n_pt_account_invoicexpress +#: model:ir.model.fields,help:l10n_pt_account_invoicexpress.field_account_journal__invoicexpress_doc_type +msgid "" +"Select the type of legal invoice document to be created by InvoiceXpress." +msgstr "" + +#. module: l10n_pt_account_invoicexpress +#: model:ir.model.fields,help:l10n_pt_account_invoicexpress.field_account_bank_statement_line__invoicexpress_doc_type +#: model:ir.model.fields,help:l10n_pt_account_invoicexpress.field_account_move__invoicexpress_doc_type +#: model:ir.model.fields,help:l10n_pt_account_invoicexpress.field_account_payment__invoicexpress_doc_type +msgid "" +"Select the type of legal invoice document to be created by InvoiceXpress. If " +"unset, InvoiceXpress will not be used." +msgstr "" + +#. module: l10n_pt_account_invoicexpress +#: model:ir.model.fields.selection,name:l10n_pt_account_invoicexpress.selection__account_journal__invoicexpress_doc_type__simplified_invoice +#: model:ir.model.fields.selection,name:l10n_pt_account_invoicexpress.selection__account_move__invoicexpress_doc_type__simplified_invoice +msgid "Simplified Invoice" +msgstr "" + #. module: l10n_pt_account_invoicexpress #: code:addons/l10n_pt_account_invoicexpress/models/account_invoicexpress.py:0 #, python-format @@ -298,6 +380,20 @@ msgid "" " %(menu:base_setup.menu_config)s." msgstr "" +#. module: l10n_pt_account_invoicexpress +#: code:addons/l10n_pt_account_invoicexpress/models/account_move.py:0 +#, python-format +msgid "" +"Something went wrong: the InvoiceXpress response is missing a sequence " +"number." +msgstr "" + +#. module: l10n_pt_account_invoicexpress +#: code:addons/l10n_pt_account_invoicexpress/models/account_move.py:0 +#, python-format +msgid "Something went wrong: the InvoiceXpress response looks empty." +msgstr "" + #. module: l10n_pt_account_invoicexpress #: model:mail.template,subject:l10n_pt_account_invoicexpress.email_template_invoice msgid "Sua Fatura ${object.name | safe}" @@ -320,3 +416,15 @@ msgid "" "Used to generate the To, Cc, Subject and Body for the email sent by the " "InvoiceXpress service" msgstr "" + +#. module: l10n_pt_account_invoicexpress +#: code:addons/l10n_pt_account_invoicexpress/models/account_move.py:0 +#, python-format +msgid "View Document" +msgstr "" + +#~ msgid " View Document" +#~ msgstr " Ver Documento" + +#~ msgid "Invoice %s is not registerd in InvoiceXpress yet." +#~ msgstr "Fatura %s não está registada no InvoiceXpress." From c8fab35dddc4f2d2fa3b8c0f91ca2ca1c5c255ef Mon Sep 17 00:00:00 2001 From: Daniel Reis Date: Fri, 19 Nov 2021 17:44:56 +0000 Subject: [PATCH 105/157] [FIX]l10n_pt_account_invoicexpress: add missing Country view file --- l10n_pt_account_invoicexpress/__manifest__.py | 1 + 1 file changed, 1 insertion(+) diff --git a/l10n_pt_account_invoicexpress/__manifest__.py b/l10n_pt_account_invoicexpress/__manifest__.py index 1c0b3181..4d2005b0 100644 --- a/l10n_pt_account_invoicexpress/__manifest__.py +++ b/l10n_pt_account_invoicexpress/__manifest__.py @@ -18,6 +18,7 @@ "views/account_tax_view.xml", "views/account_move_view.xml", "views/res_company_view.xml", + "views/res_country_view.xml", "data/mail_template.xml", "data/res.country.csv", ], From c6abcc670c3d18bc2c608102220339eb0bfb7ebc Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Fri, 19 Nov 2021 21:54:03 +0000 Subject: [PATCH 106/157] l10n_pt_account_invoicexpress 14.0.3.0.1 --- l10n_pt_account_invoicexpress/__manifest__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/l10n_pt_account_invoicexpress/__manifest__.py b/l10n_pt_account_invoicexpress/__manifest__.py index 4d2005b0..663cb914 100644 --- a/l10n_pt_account_invoicexpress/__manifest__.py +++ b/l10n_pt_account_invoicexpress/__manifest__.py @@ -4,7 +4,7 @@ { "name": "Portugal InvoiceXpress Integration", "summary": "Portuguese certified invoices using InvoiceXpress", - "version": "14.0.3.0.0", + "version": "14.0.3.0.1", "author": "Open Source Integrators, Odoo Community Association (OCA)", "license": "AGPL-3", "website": "https://github.com/OCA/l10n-portugal", From 74808a0c96563ccab5d83094618410a68ddb929f Mon Sep 17 00:00:00 2001 From: Daniel Reis Date: Mon, 15 Nov 2021 10:11:04 +0000 Subject: [PATCH 107/157] [IMP] l10n_pt_stock_invoicexpress: add support for transport doc types --- l10n_pt_account_invoicexpress/readme/DESCRIPTION.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/l10n_pt_account_invoicexpress/readme/DESCRIPTION.rst b/l10n_pt_account_invoicexpress/readme/DESCRIPTION.rst index fb2124f9..84a12960 100644 --- a/l10n_pt_account_invoicexpress/readme/DESCRIPTION.rst +++ b/l10n_pt_account_invoicexpress/readme/DESCRIPTION.rst @@ -8,9 +8,12 @@ Invoices: Invoice, Invoice Receipt, Simplified Invoice and VAT MOSS. The default document type is set on the Journal, and can be changed on the Invoice form. + - Use the invoice commercial partner for the name and address, instead of the invoice contact. + - Added support for the Terms and Conditions/Observations field + - Added to Credit Notes the link to the source Invoice From fb6164b8eed380da6da942321d6cb496c7d0cd2b Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Fri, 19 Nov 2021 22:21:35 +0000 Subject: [PATCH 108/157] [UPD] README.rst --- l10n_pt_account_invoicexpress/README.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/l10n_pt_account_invoicexpress/README.rst b/l10n_pt_account_invoicexpress/README.rst index 63ef68b6..9981e3a8 100644 --- a/l10n_pt_account_invoicexpress/README.rst +++ b/l10n_pt_account_invoicexpress/README.rst @@ -35,9 +35,12 @@ Invoices: Invoice, Invoice Receipt, Simplified Invoice and VAT MOSS. The default document type is set on the Journal, and can be changed on the Invoice form. + - Use the invoice commercial partner for the name and address, instead of the invoice contact. + - Added support for the Terms and Conditions/Observations field + - Added to Credit Notes the link to the source Invoice From 6494b2212386f1521c282eedac3d9c85195be5a2 Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Fri, 19 Nov 2021 22:21:36 +0000 Subject: [PATCH 109/157] l10n_pt_account_invoicexpress 14.0.4.0.0 --- l10n_pt_account_invoicexpress/__manifest__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/l10n_pt_account_invoicexpress/__manifest__.py b/l10n_pt_account_invoicexpress/__manifest__.py index 663cb914..f4d1f6bc 100644 --- a/l10n_pt_account_invoicexpress/__manifest__.py +++ b/l10n_pt_account_invoicexpress/__manifest__.py @@ -4,7 +4,7 @@ { "name": "Portugal InvoiceXpress Integration", "summary": "Portuguese certified invoices using InvoiceXpress", - "version": "14.0.3.0.1", + "version": "14.0.4.0.0", "author": "Open Source Integrators, Odoo Community Association (OCA)", "license": "AGPL-3", "website": "https://github.com/OCA/l10n-portugal", From 1bbbccb20ac2cad3c26026f21221591f93696eac Mon Sep 17 00:00:00 2001 From: Daniel Reis Date: Fri, 19 Nov 2021 22:55:38 +0000 Subject: [PATCH 110/157] [FIX]l10n_pt_account_invoicexpress: use latest Odoo address, instead of (old) stored ones --- l10n_pt_account_invoicexpress/models/res_partner.py | 1 - 1 file changed, 1 deletion(-) diff --git a/l10n_pt_account_invoicexpress/models/res_partner.py b/l10n_pt_account_invoicexpress/models/res_partner.py index 60658ae0..b02a22fa 100644 --- a/l10n_pt_account_invoicexpress/models/res_partner.py +++ b/l10n_pt_account_invoicexpress/models/res_partner.py @@ -11,7 +11,6 @@ def _prepare_invoicexpress_vals(self): self.ensure_one() vals = { "name": self.name, - "code": self.vat or "ODOO-{}".format(self.id), "email": self.email, "address": ", ".join(filter(None, [self.street, self.street2])), "city": self.city, From 97f765e143691a557408fce08cb510789016a284 Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Fri, 19 Nov 2021 23:03:26 +0000 Subject: [PATCH 111/157] l10n_pt_account_invoicexpress 14.0.4.0.1 --- l10n_pt_account_invoicexpress/__manifest__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/l10n_pt_account_invoicexpress/__manifest__.py b/l10n_pt_account_invoicexpress/__manifest__.py index f4d1f6bc..a2aeae12 100644 --- a/l10n_pt_account_invoicexpress/__manifest__.py +++ b/l10n_pt_account_invoicexpress/__manifest__.py @@ -4,7 +4,7 @@ { "name": "Portugal InvoiceXpress Integration", "summary": "Portuguese certified invoices using InvoiceXpress", - "version": "14.0.4.0.0", + "version": "14.0.4.0.1", "author": "Open Source Integrators, Odoo Community Association (OCA)", "license": "AGPL-3", "website": "https://github.com/OCA/l10n-portugal", From 7df9176f1e61b5895b3a851a5dfbff6c64c56aa3 Mon Sep 17 00:00:00 2001 From: Daniel Reis Date: Mon, 22 Nov 2021 18:19:09 +0000 Subject: [PATCH 112/157] [FIX] l10n_pt_account_invoicexpress: limit to InvX supported languages --- l10n_pt_account_invoicexpress/models/res_partner.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/l10n_pt_account_invoicexpress/models/res_partner.py b/l10n_pt_account_invoicexpress/models/res_partner.py index b02a22fa..9bad03b8 100644 --- a/l10n_pt_account_invoicexpress/models/res_partner.py +++ b/l10n_pt_account_invoicexpress/models/res_partner.py @@ -16,9 +16,12 @@ def _prepare_invoicexpress_vals(self): "city": self.city, "postal_code": self.zip, "country": self.country_id.invoicexpress_name, - "language": self.lang[:2], "fiscal_id": self.vat, "website": self.website, "phone": self.phone, } + # InvoiceXpress supported languages + language = self.lang[:2] + if language in ["pt", "en", "es"]: + vals["language"] = language return {k: v for k, v in vals.items() if v} From b101fe3ee26d6e71ac6796f13735a5c4eda47d46 Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Tue, 23 Nov 2021 09:23:49 +0000 Subject: [PATCH 113/157] l10n_pt_account_invoicexpress 14.0.4.0.2 --- l10n_pt_account_invoicexpress/__manifest__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/l10n_pt_account_invoicexpress/__manifest__.py b/l10n_pt_account_invoicexpress/__manifest__.py index a2aeae12..caa4bdcc 100644 --- a/l10n_pt_account_invoicexpress/__manifest__.py +++ b/l10n_pt_account_invoicexpress/__manifest__.py @@ -4,7 +4,7 @@ { "name": "Portugal InvoiceXpress Integration", "summary": "Portuguese certified invoices using InvoiceXpress", - "version": "14.0.4.0.1", + "version": "14.0.4.0.2", "author": "Open Source Integrators, Odoo Community Association (OCA)", "license": "AGPL-3", "website": "https://github.com/OCA/l10n-portugal", From 79d1ca87a48051e80db07338365479defa7fdb48 Mon Sep 17 00:00:00 2001 From: Daniel Reis Date: Wed, 24 Nov 2021 08:20:57 +0000 Subject: [PATCH 114/157] [FIX] l10n_pt_account_invoicexpress: set language based on destination country, rather than user lang --- .../models/res_partner.py | 14 ++++++++++---- .../tests/test_invoicexpress.py | 19 +++++++++++++++++++ 2 files changed, 29 insertions(+), 4 deletions(-) diff --git a/l10n_pt_account_invoicexpress/models/res_partner.py b/l10n_pt_account_invoicexpress/models/res_partner.py index 9bad03b8..cb8d6240 100644 --- a/l10n_pt_account_invoicexpress/models/res_partner.py +++ b/l10n_pt_account_invoicexpress/models/res_partner.py @@ -20,8 +20,14 @@ def _prepare_invoicexpress_vals(self): "website": self.website, "phone": self.phone, } - # InvoiceXpress supported languages - language = self.lang[:2] - if language in ["pt", "en", "es"]: - vals["language"] = language + # InvoiceXpress document language (pt, es or rn) + # Outside PT and ES use english + # Could be a requirement for some border authorities + country_code = self.country_id.code + if country_code == "ES": + vals["language"] = "es" + elif country_code == "PT": + vals["language"] = "pt" + elif country_code: + vals["language"] = "en" return {k: v for k, v in vals.items() if v} diff --git a/l10n_pt_account_invoicexpress/tests/test_invoicexpress.py b/l10n_pt_account_invoicexpress/tests/test_invoicexpress.py index 1cf8b5c9..e8d859d8 100644 --- a/l10n_pt_account_invoicexpress/tests/test_invoicexpress.py +++ b/l10n_pt_account_invoicexpress/tests/test_invoicexpress.py @@ -52,6 +52,25 @@ def setUp(self): } ) + def test_res_partner__prepare_invoicexpress_vals(self): + partner_PT = self.partnerA.copy({"country_id": self.env.ref("base.pt").id}) + partner_PT_vals = partner_PT._prepare_invoicexpress_vals() + self.assertEqual( + partner_PT_vals["language"], "pt", "Address in Portugal uses pt language" + ) + partner_ES = self.partnerA.copy({"country_id": self.env.ref("base.es").id}) + partner_ES_vals = partner_ES._prepare_invoicexpress_vals() + self.assertEqual( + partner_ES_vals["language"], "es", "Address in Spain uses es language" + ) + partner_FR = self.partnerA.copy({"country_id": self.env.ref("base.fr").id}) + partner_FR_vals = partner_FR._prepare_invoicexpress_vals() + self.assertEqual( + partner_FR_vals["language"], + "en", + "Address not in Spain or Portugal uses en language", + ) + def test_010_get_config_and_base_url(self): API = self.env["account.invoicexpress"] url = API._build_url(API._get_config(self.company), "dummy.json") From 55b3adfd4edb4e85802ee0f47a94089a1cb190ad Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Thu, 25 Nov 2021 09:08:34 +0000 Subject: [PATCH 115/157] l10n_pt_account_invoicexpress 14.0.4.0.3 --- l10n_pt_account_invoicexpress/__manifest__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/l10n_pt_account_invoicexpress/__manifest__.py b/l10n_pt_account_invoicexpress/__manifest__.py index caa4bdcc..dc279813 100644 --- a/l10n_pt_account_invoicexpress/__manifest__.py +++ b/l10n_pt_account_invoicexpress/__manifest__.py @@ -4,7 +4,7 @@ { "name": "Portugal InvoiceXpress Integration", "summary": "Portuguese certified invoices using InvoiceXpress", - "version": "14.0.4.0.2", + "version": "14.0.4.0.3", "author": "Open Source Integrators, Odoo Community Association (OCA)", "license": "AGPL-3", "website": "https://github.com/OCA/l10n-portugal", From cdabce49f4013f3ff65029a8c9faaee71eb127c8 Mon Sep 17 00:00:00 2001 From: Daniel Reis Date: Wed, 24 Nov 2021 08:24:39 +0000 Subject: [PATCH 116/157] [IMP] l10n_pt_account_invoicexpress: suport VAT MOSS Credit Notes --- .../models/account_move.py | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/l10n_pt_account_invoicexpress/models/account_move.py b/l10n_pt_account_invoicexpress/models/account_move.py index e43e2252..ec222e8d 100644 --- a/l10n_pt_account_invoicexpress/models/account_move.py +++ b/l10n_pt_account_invoicexpress/models/account_move.py @@ -39,14 +39,14 @@ def _compute_invoicexpress_doc_type(self): doctype = invoice.journal_id.invoicexpress_doc_type europe = self.env.ref("base.europe") country = invoice.partner_shipping_id.country_id + is_eu = country and country.code != "PT" and country in europe.country_ids if not doctype or doctype == "none": - invoice.invoicexpress_doc_type = None + res = None elif invoice.move_type == "out_refund": - invoice.invoicexpress_doc_type = "credit_note" - elif country and country.code != "PT" and country in europe.country_ids: - invoice.invoicexpress_doc_type = "vat_moss_invoice" + res = "vat_moss_credit_note" if is_eu else "credit_note" else: - invoice.invoicexpress_doc_type = doctype + res = "vat_moss_invoice" if is_eu else doctype + invoice.invoicexpress_doc_type = res journal_type = fields.Selection( related="journal_id.type", string="Journal Type", readonly=True @@ -64,6 +64,7 @@ def _compute_invoicexpress_doc_type(self): ("invoice_receipt", "Invoice and Receipt"), ("simplified_invoice", "Simplified Invoice"), ("vat_moss_invoice", "Europe VAT MOSS Invoice"), + ("vat_moss_credit_note", "Europe VAT MOSS Credit Note"), ("debit_note", "Debit Note"), ("credit_note", "Credit Note"), ], @@ -101,6 +102,7 @@ def _get_invoicexpress_prefix(self, doctype): "invoice_receipt": "FR", "simplified_invoice": "FS", "vat_moss_invoice": "FVM", + # vat_moss_credit_note does not have a prefix! "credit_note": "NC", "debit_note": "ND", }.get(doctype) @@ -219,7 +221,7 @@ def action_create_invoicexpress_invoice(self): ) ) prefix = self._get_invoicexpress_prefix(doctype) - invx_number = "%s %s" % (prefix, seqnum) + invx_number = "%s %s" % (prefix, seqnum) if prefix else seqnum if invoice.payment_reference == invoice.name: invoice.payment_reference = invx_number invoice.name = invx_number From e467dfe06ef495df56f109545bbb76da7706f1eb Mon Sep 17 00:00:00 2001 From: Daniel Reis Date: Wed, 24 Nov 2021 08:43:10 +0000 Subject: [PATCH 117/157] [IMP] l10n_pt_account_invoicexpress: fix InvX Settings --- l10n_pt_account_invoicexpress/models/res_config_settings.py | 6 ------ 1 file changed, 6 deletions(-) diff --git a/l10n_pt_account_invoicexpress/models/res_config_settings.py b/l10n_pt_account_invoicexpress/models/res_config_settings.py index eed120fc..12a47eee 100644 --- a/l10n_pt_account_invoicexpress/models/res_config_settings.py +++ b/l10n_pt_account_invoicexpress/models/res_config_settings.py @@ -9,16 +9,10 @@ class ResConfigSettings(models.TransientModel): invoicexpress_account_name = fields.Char( related="company_id.invoicexpress_account_name", readonly=False, - default=lambda s: s.env["ir.config_parameter"] - .sudo() - .get_param("invoicexpress.account_name", default=""), ) invoicexpress_api_key = fields.Char( related="company_id.invoicexpress_api_key", readonly=False, - default=lambda s: s.env["ir.config_parameter"] - .sudo() - .get_param("invoicexpress.api_key", default=""), ) invoicexpress_template_id = fields.Many2one( related="company_id.invoicexpress_template_id", readonly=False From 60b054d7c6b55f761d01d8c64bb6a84d06bb3117 Mon Sep 17 00:00:00 2001 From: oca-travis Date: Thu, 25 Nov 2021 09:26:44 +0000 Subject: [PATCH 118/157] [UPD] Update l10n_pt_account_invoicexpress.pot --- .../i18n/l10n_pt_account_invoicexpress.pot | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/l10n_pt_account_invoicexpress/i18n/l10n_pt_account_invoicexpress.pot b/l10n_pt_account_invoicexpress/i18n/l10n_pt_account_invoicexpress.pot index 4d433b1f..78df02c9 100644 --- a/l10n_pt_account_invoicexpress/i18n/l10n_pt_account_invoicexpress.pot +++ b/l10n_pt_account_invoicexpress/i18n/l10n_pt_account_invoicexpress.pot @@ -118,6 +118,11 @@ msgstr "" msgid "Error running API request ({} {}): {}" msgstr "" +#. module: l10n_pt_account_invoicexpress +#: model:ir.model.fields.selection,name:l10n_pt_account_invoicexpress.selection__account_move__invoicexpress_doc_type__vat_moss_credit_note +msgid "Europe VAT MOSS Credit Note" +msgstr "" + #. module: l10n_pt_account_invoicexpress #: model:ir.model.fields.selection,name:l10n_pt_account_invoicexpress.selection__account_move__invoicexpress_doc_type__vat_moss_invoice msgid "Europe VAT MOSS Invoice" From 2c98aff8d6cf05efdf654e61fcf8a15183996d83 Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Thu, 25 Nov 2021 09:36:59 +0000 Subject: [PATCH 119/157] l10n_pt_account_invoicexpress 14.0.4.1.0 --- l10n_pt_account_invoicexpress/__manifest__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/l10n_pt_account_invoicexpress/__manifest__.py b/l10n_pt_account_invoicexpress/__manifest__.py index dc279813..3866aa7e 100644 --- a/l10n_pt_account_invoicexpress/__manifest__.py +++ b/l10n_pt_account_invoicexpress/__manifest__.py @@ -4,7 +4,7 @@ { "name": "Portugal InvoiceXpress Integration", "summary": "Portuguese certified invoices using InvoiceXpress", - "version": "14.0.4.0.3", + "version": "14.0.4.1.0", "author": "Open Source Integrators, Odoo Community Association (OCA)", "license": "AGPL-3", "website": "https://github.com/OCA/l10n-portugal", From 0aebe32aad5524e6cbf066e555bebf1f9fcaca4b Mon Sep 17 00:00:00 2001 From: OCA Transbot Date: Thu, 25 Nov 2021 09:37:05 +0000 Subject: [PATCH 120/157] Update translation files Updated by "Update PO files to match POT (msgmerge)" hook in Weblate. Translation: l10n-portugal-14.0/l10n-portugal-14.0-l10n_pt_account_invoicexpress Translate-URL: https://translation.odoo-community.org/projects/l10n-portugal-14-0/l10n-portugal-14-0-l10n_pt_account_invoicexpress/ --- l10n_pt_account_invoicexpress/i18n/pt.po | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/l10n_pt_account_invoicexpress/i18n/pt.po b/l10n_pt_account_invoicexpress/i18n/pt.po index c253be8e..7f4df367 100644 --- a/l10n_pt_account_invoicexpress/i18n/pt.po +++ b/l10n_pt_account_invoicexpress/i18n/pt.po @@ -122,6 +122,11 @@ msgstr "" msgid "Error running API request ({} {}): {}" msgstr "Erro na chamada à API ({} {}): {}" +#. module: l10n_pt_account_invoicexpress +#: model:ir.model.fields.selection,name:l10n_pt_account_invoicexpress.selection__account_move__invoicexpress_doc_type__vat_moss_credit_note +msgid "Europe VAT MOSS Credit Note" +msgstr "" + #. module: l10n_pt_account_invoicexpress #: model:ir.model.fields.selection,name:l10n_pt_account_invoicexpress.selection__account_move__invoicexpress_doc_type__vat_moss_invoice msgid "Europe VAT MOSS Invoice" From bca8546d49599347d759cfa89afa5b99b93f29fc Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Thu, 25 Nov 2021 09:44:27 +0000 Subject: [PATCH 121/157] l10n_pt_account_invoicexpress 14.0.4.1.1 --- l10n_pt_account_invoicexpress/__manifest__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/l10n_pt_account_invoicexpress/__manifest__.py b/l10n_pt_account_invoicexpress/__manifest__.py index 3866aa7e..4ec46072 100644 --- a/l10n_pt_account_invoicexpress/__manifest__.py +++ b/l10n_pt_account_invoicexpress/__manifest__.py @@ -4,7 +4,7 @@ { "name": "Portugal InvoiceXpress Integration", "summary": "Portuguese certified invoices using InvoiceXpress", - "version": "14.0.4.1.0", + "version": "14.0.4.1.1", "author": "Open Source Integrators, Odoo Community Association (OCA)", "license": "AGPL-3", "website": "https://github.com/OCA/l10n-portugal", From 98f60e7d3473d3bb0d9b564d5c69eb52d1e3acdb Mon Sep 17 00:00:00 2001 From: Daniel Reis Date: Thu, 25 Nov 2021 13:05:47 +0000 Subject: [PATCH 122/157] [IMP] l10n_pt_account_invoicexpress: force update of Invx stored Contact details --- .../models/account_move.py | 12 +++-- .../models/res_partner.py | 45 ++++++++++++++++++- 2 files changed, 53 insertions(+), 4 deletions(-) diff --git a/l10n_pt_account_invoicexpress/models/account_move.py b/l10n_pt_account_invoicexpress/models/account_move.py index ec222e8d..eb2d9ac2 100644 --- a/l10n_pt_account_invoicexpress/models/account_move.py +++ b/l10n_pt_account_invoicexpress/models/account_move.py @@ -1,6 +1,8 @@ # Copyright (C) 2021 Open Source Integrators # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +import uuid + from odoo import _, api, exceptions, fields, models @@ -132,6 +134,10 @@ def _prepare_invoicexpress_lines(self): ) return items + def _get_invoicexpress_partner(self): + # Hook to customize the "client" values to use + return self.commercial_partner_id + def _prepare_invoicexpress_vals(self): self.ensure_one() if not self.invoice_date and self.invoice_date_due: @@ -139,15 +145,15 @@ def _prepare_invoicexpress_vals(self): _("Kindly add the invoice date and invoice due date.") ) - customer = self.commercial_partner_id._prepare_invoicexpress_vals() + client_vals = self._get_invoicexpress_partner().set_invoicexpress_contact() items = self._prepare_invoicexpress_lines() - proprietary_uid = ("%s.%s" % (self.name, self.env.cr.dbname)).replace(" ", "-") + proprietary_uid = "ODOO" + str(uuid.uuid4()).replace("-", "") invoice_data = { "invoice": { "date": self.invoice_date.strftime("%d/%m/%Y"), "due_date": self.invoice_date_due.strftime("%d/%m/%Y"), "reference": self.ref or "", - "client": customer, + "client": client_vals, "observations": self.narration or "", "items": items, }, diff --git a/l10n_pt_account_invoicexpress/models/res_partner.py b/l10n_pt_account_invoicexpress/models/res_partner.py index cb8d6240..1270e2f7 100644 --- a/l10n_pt_account_invoicexpress/models/res_partner.py +++ b/l10n_pt_account_invoicexpress/models/res_partner.py @@ -1,16 +1,19 @@ # Copyright (C) 2021 Open Source Integrators # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). -from odoo import models +from odoo import fields, models class ResPartner(models.Model): _inherit = "res.partner" + invoicexpress_id = fields.Char("InvoiceXpress ID", copy=False, readonly=True) + def _prepare_invoicexpress_vals(self): self.ensure_one() vals = { "name": self.name, + "code": "ODOO-{}".format(self.ref or self.id), "email": self.email, "address": ", ".join(filter(None, [self.street, self.street2])), "city": self.city, @@ -31,3 +34,43 @@ def _prepare_invoicexpress_vals(self): elif country_code: vals["language"] = "en" return {k: v for k, v in vals.items() if v} + + def set_invoicexpress_contact(self): + self.ensure_one() + self.vat and self.check_vat() # Double check VAT is right + InvoiceXpress = self.env["account.invoicexpress"] + company = self.company_id or self.env.company + doctype = "client" + vals = self._prepare_invoicexpress_vals() + invx_id_to_update = self.invoicexpress_id + if not invx_id_to_update: + # Create: POST /clients.json + response = InvoiceXpress.call( + company, + "{}s.json".format(doctype), + "POST", + payload={"client": vals}, + raise_errors=False, + ) + if response.status_code == 422: # Oh, it already exists! + response = InvoiceXpress.call( + company, + "{}s/find-by-code.json".format(doctype), + "GET", + params={"client_code": vals["code"]}, + ) + values = response.json().get(doctype) + invx_id_to_update = values.get("id") # Update is needed! + values = response.json().get(doctype, {}) + self.invoicexpress_id = values.get("id") + + if invx_id_to_update: + # Update: PUT /clients/$(client-id).json + response = InvoiceXpress.call( + company, + "{}s/{}.json".format(doctype, self.invoicexpress_id), + "PUT", + payload={"client": vals}, + raise_errors=True, + ) + return {"name": vals["name"], "code": vals["code"]} From 161bd9bb16ca3ae069e185c80dfc41b746bcc09f Mon Sep 17 00:00:00 2001 From: oca-travis Date: Fri, 26 Nov 2021 21:16:51 +0000 Subject: [PATCH 123/157] [UPD] Update l10n_pt_account_invoicexpress.pot --- .../i18n/l10n_pt_account_invoicexpress.pot | 2 ++ 1 file changed, 2 insertions(+) diff --git a/l10n_pt_account_invoicexpress/i18n/l10n_pt_account_invoicexpress.pot b/l10n_pt_account_invoicexpress/i18n/l10n_pt_account_invoicexpress.pot index 78df02c9..4ec3861a 100644 --- a/l10n_pt_account_invoicexpress/i18n/l10n_pt_account_invoicexpress.pot +++ b/l10n_pt_account_invoicexpress/i18n/l10n_pt_account_invoicexpress.pot @@ -212,6 +212,8 @@ msgstr "" #: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_account_move__invoicexpress_id #: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_account_payment__invoicexpress_id #: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_account_tax__invoicexpress_id +#: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_res_partner__invoicexpress_id +#: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_res_users__invoicexpress_id msgid "InvoiceXpress ID" msgstr "" From 29e371a99a4b3322106332e1230dfef8dac79c24 Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Fri, 26 Nov 2021 22:33:52 +0000 Subject: [PATCH 124/157] l10n_pt_account_invoicexpress 14.0.4.1.2 --- l10n_pt_account_invoicexpress/__manifest__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/l10n_pt_account_invoicexpress/__manifest__.py b/l10n_pt_account_invoicexpress/__manifest__.py index 4ec46072..baed4eb8 100644 --- a/l10n_pt_account_invoicexpress/__manifest__.py +++ b/l10n_pt_account_invoicexpress/__manifest__.py @@ -4,7 +4,7 @@ { "name": "Portugal InvoiceXpress Integration", "summary": "Portuguese certified invoices using InvoiceXpress", - "version": "14.0.4.1.1", + "version": "14.0.4.1.2", "author": "Open Source Integrators, Odoo Community Association (OCA)", "license": "AGPL-3", "website": "https://github.com/OCA/l10n-portugal", From ee29d286286e66ffae6d580c6ab3c7bada22fe05 Mon Sep 17 00:00:00 2001 From: OCA Transbot Date: Fri, 26 Nov 2021 22:34:01 +0000 Subject: [PATCH 125/157] Update translation files Updated by "Update PO files to match POT (msgmerge)" hook in Weblate. Translation: l10n-portugal-14.0/l10n-portugal-14.0-l10n_pt_account_invoicexpress Translate-URL: https://translation.odoo-community.org/projects/l10n-portugal-14-0/l10n-portugal-14-0-l10n_pt_account_invoicexpress/ --- l10n_pt_account_invoicexpress/i18n/pt.po | 2 ++ 1 file changed, 2 insertions(+) diff --git a/l10n_pt_account_invoicexpress/i18n/pt.po b/l10n_pt_account_invoicexpress/i18n/pt.po index 7f4df367..4d61f813 100644 --- a/l10n_pt_account_invoicexpress/i18n/pt.po +++ b/l10n_pt_account_invoicexpress/i18n/pt.po @@ -216,6 +216,8 @@ msgstr "" #: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_account_move__invoicexpress_id #: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_account_payment__invoicexpress_id #: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_account_tax__invoicexpress_id +#: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_res_partner__invoicexpress_id +#: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_res_users__invoicexpress_id msgid "InvoiceXpress ID" msgstr "" From fe7baca7c5f9112916fd1577133b3cca510731d2 Mon Sep 17 00:00:00 2001 From: Daniel Reis Date: Thu, 10 Mar 2022 18:19:01 +0000 Subject: [PATCH 126/157] [FIX] l10n_pt_account_invoicexpress: error messages correctly present non-ASCII characters --- l10n_pt_account_invoicexpress/models/account_invoicexpress.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/l10n_pt_account_invoicexpress/models/account_invoicexpress.py b/l10n_pt_account_invoicexpress/models/account_invoicexpress.py index fc6292b1..d11d8228 100644 --- a/l10n_pt_account_invoicexpress/models/account_invoicexpress.py +++ b/l10n_pt_account_invoicexpress/models/account_invoicexpress.py @@ -58,8 +58,8 @@ def _check_http_status(self, response): if response.status_code not in [200, 201]: raise exceptions.ValidationError( _( - "Error running API request ({} {}): {}".format( - response.status_code, response.reason, response.text + "Error running API request ({} {}):\n{}".format( + response.status_code, response.reason, response.json() ) ) ) From 3f480660406864f00119533965a745726f7d42c4 Mon Sep 17 00:00:00 2001 From: oca-travis Date: Mon, 14 Mar 2022 07:43:59 +0000 Subject: [PATCH 127/157] [UPD] Update l10n_pt_account_invoicexpress.pot --- .../i18n/l10n_pt_account_invoicexpress.pot | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/l10n_pt_account_invoicexpress/i18n/l10n_pt_account_invoicexpress.pot b/l10n_pt_account_invoicexpress/i18n/l10n_pt_account_invoicexpress.pot index 4ec3861a..2da7e657 100644 --- a/l10n_pt_account_invoicexpress/i18n/l10n_pt_account_invoicexpress.pot +++ b/l10n_pt_account_invoicexpress/i18n/l10n_pt_account_invoicexpress.pot @@ -115,7 +115,9 @@ msgstr "" #. module: l10n_pt_account_invoicexpress #: code:addons/l10n_pt_account_invoicexpress/models/account_invoicexpress.py:0 #, python-format -msgid "Error running API request ({} {}): {}" +msgid "" +"Error running API request ({} {}):\n" +"{}" msgstr "" #. module: l10n_pt_account_invoicexpress From 61523f298144b5b336c8fa475346cf2b166423b2 Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Mon, 14 Mar 2022 07:49:16 +0000 Subject: [PATCH 128/157] l10n_pt_account_invoicexpress 14.0.4.1.3 --- l10n_pt_account_invoicexpress/__manifest__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/l10n_pt_account_invoicexpress/__manifest__.py b/l10n_pt_account_invoicexpress/__manifest__.py index baed4eb8..4df80d90 100644 --- a/l10n_pt_account_invoicexpress/__manifest__.py +++ b/l10n_pt_account_invoicexpress/__manifest__.py @@ -4,7 +4,7 @@ { "name": "Portugal InvoiceXpress Integration", "summary": "Portuguese certified invoices using InvoiceXpress", - "version": "14.0.4.1.2", + "version": "14.0.4.1.3", "author": "Open Source Integrators, Odoo Community Association (OCA)", "license": "AGPL-3", "website": "https://github.com/OCA/l10n-portugal", From 0911d644f29b611cfecdf3512ccf83a39e758f50 Mon Sep 17 00:00:00 2001 From: OCA Transbot Date: Mon, 14 Mar 2022 07:49:21 +0000 Subject: [PATCH 129/157] Update translation files Updated by "Update PO files to match POT (msgmerge)" hook in Weblate. Translation: l10n-portugal-14.0/l10n-portugal-14.0-l10n_pt_account_invoicexpress Translate-URL: https://translation.odoo-community.org/projects/l10n-portugal-14-0/l10n-portugal-14-0-l10n_pt_account_invoicexpress/ --- l10n_pt_account_invoicexpress/i18n/pt.po | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/l10n_pt_account_invoicexpress/i18n/pt.po b/l10n_pt_account_invoicexpress/i18n/pt.po index 4d61f813..25b23678 100644 --- a/l10n_pt_account_invoicexpress/i18n/pt.po +++ b/l10n_pt_account_invoicexpress/i18n/pt.po @@ -119,8 +119,10 @@ msgstr "" #. module: l10n_pt_account_invoicexpress #: code:addons/l10n_pt_account_invoicexpress/models/account_invoicexpress.py:0 #, python-format -msgid "Error running API request ({} {}): {}" -msgstr "Erro na chamada à API ({} {}): {}" +msgid "" +"Error running API request ({} {}):\n" +"{}" +msgstr "" #. module: l10n_pt_account_invoicexpress #: model:ir.model.fields.selection,name:l10n_pt_account_invoicexpress.selection__account_move__invoicexpress_doc_type__vat_moss_credit_note @@ -430,6 +432,9 @@ msgstr "" msgid "View Document" msgstr "" +#~ msgid "Error running API request ({} {}): {}" +#~ msgstr "Erro na chamada à API ({} {}): {}" + #~ msgid " View Document" #~ msgstr " Ver Documento" From f33012016444ff080661b7799f16aeed9705f8f9 Mon Sep 17 00:00:00 2001 From: Daniel Reis Date: Wed, 28 Dec 2022 12:26:35 +0000 Subject: [PATCH 130/157] [FIX] l10n_pt_account_invoicexpress: ensure customer data is updated --- l10n_pt_account_invoicexpress/models/account_move.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/l10n_pt_account_invoicexpress/models/account_move.py b/l10n_pt_account_invoicexpress/models/account_move.py index eb2d9ac2..ec782059 100644 --- a/l10n_pt_account_invoicexpress/models/account_move.py +++ b/l10n_pt_account_invoicexpress/models/account_move.py @@ -144,8 +144,8 @@ def _prepare_invoicexpress_vals(self): raise exceptions.UserError( _("Kindly add the invoice date and invoice due date.") ) - - client_vals = self._get_invoicexpress_partner().set_invoicexpress_contact() + customer = self._get_invoicexpress_partner() + customer_vals = customer.set_invoicexpress_contact() items = self._prepare_invoicexpress_lines() proprietary_uid = "ODOO" + str(uuid.uuid4()).replace("-", "") invoice_data = { @@ -153,7 +153,7 @@ def _prepare_invoicexpress_vals(self): "date": self.invoice_date.strftime("%d/%m/%Y"), "due_date": self.invoice_date_due.strftime("%d/%m/%Y"), "reference": self.ref or "", - "client": client_vals, + "client": customer_vals, "observations": self.narration or "", "items": items, }, From 93c9fb4e0e13aa44f5cf0d2789099a79a1f26b0f Mon Sep 17 00:00:00 2001 From: Daniel Reis Date: Wed, 28 Dec 2022 12:54:55 +0000 Subject: [PATCH 131/157] [FIX] l10n_pt_account_invoicexpress: hide fields if InvX disabled --- l10n_pt_account_invoicexpress/models/account_move.py | 2 +- .../views/account_move_view.xml | 10 +++++++--- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/l10n_pt_account_invoicexpress/models/account_move.py b/l10n_pt_account_invoicexpress/models/account_move.py index ec782059..bea2afb9 100644 --- a/l10n_pt_account_invoicexpress/models/account_move.py +++ b/l10n_pt_account_invoicexpress/models/account_move.py @@ -299,7 +299,7 @@ class AccountMoveLine(models.Model): def _get_invoicexpress_descr(self): """ Remove Odoo product code from description, - since it is already presneted in a the Code column + since it is already presented in a the Code column """ res = self.name ref = self.product_id.default_code diff --git a/l10n_pt_account_invoicexpress/views/account_move_view.xml b/l10n_pt_account_invoicexpress/views/account_move_view.xml index 5408c392..7268c63c 100644 --- a/l10n_pt_account_invoicexpress/views/account_move_view.xml +++ b/l10n_pt_account_invoicexpress/views/account_move_view.xml @@ -12,8 +12,10 @@
    @@ -29,7 +31,9 @@
    @@ -483,7 +483,7 @@

    Maintainers

    promote its widespread use.

    Current maintainer:

    dreispt

    -

    This module is part of the OCA/l10n-portugal project on GitHub.

    +

    This module is part of the OCA/l10n-portugal project on GitHub.

    You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

    From 505580d64568a08be44fde1bf846713628798547 Mon Sep 17 00:00:00 2001 From: Daniel Reis Date: Tue, 7 Feb 2023 20:35:12 +0000 Subject: [PATCH 136/157] [FIX] l10n_pt_account_invoicexpress: VAT MOSS doc type no longer used --- l10n_pt_account_invoicexpress/models/account_move.py | 7 ++----- l10n_pt_account_invoicexpress/readme/DESCRIPTION.rst | 2 +- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/l10n_pt_account_invoicexpress/models/account_move.py b/l10n_pt_account_invoicexpress/models/account_move.py index 8d1f21f2..4d8e8a37 100644 --- a/l10n_pt_account_invoicexpress/models/account_move.py +++ b/l10n_pt_account_invoicexpress/models/account_move.py @@ -40,15 +40,12 @@ def _compute_invoicexpress_doc_type(self): invoices = self.filtered("journal_id.use_invoicexpress") for invoice in invoices: doctype = invoice.journal_id.invoicexpress_doc_type - europe = self.env.ref("base.europe") - country = invoice.partner_shipping_id.country_id - is_eu = country and country.code != "PT" and country in europe.country_ids if not doctype or doctype == "none": res = None elif invoice.move_type == "out_refund": - res = "vat_moss_credit_note" if is_eu else "credit_note" + res = "credit_note" else: - res = "vat_moss_invoice" if is_eu else doctype + res = doctype invoice.invoicexpress_doc_type = res journal_type = fields.Selection( diff --git a/l10n_pt_account_invoicexpress/readme/DESCRIPTION.rst b/l10n_pt_account_invoicexpress/readme/DESCRIPTION.rst index 84a12960..cf2e679b 100644 --- a/l10n_pt_account_invoicexpress/readme/DESCRIPTION.rst +++ b/l10n_pt_account_invoicexpress/readme/DESCRIPTION.rst @@ -5,7 +5,7 @@ Generate Portuguese tax authority legal Invoices ("Faturas") using InvoiceXpress Invoices: - Added support to the different documents types: - Invoice, Invoice Receipt, Simplified Invoice and VAT MOSS. + Invoice, Invoice Receipt, Simplified Invoice. The default document type is set on the Journal, and can be changed on the Invoice form. From 1c9924f2fd337794b0146b9ca33d9ca77c65d2ba Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Sat, 4 Mar 2023 14:18:34 +0000 Subject: [PATCH 137/157] [UPD] README.rst --- l10n_pt_account_invoicexpress/README.rst | 2 +- l10n_pt_account_invoicexpress/static/description/index.html | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/l10n_pt_account_invoicexpress/README.rst b/l10n_pt_account_invoicexpress/README.rst index 06b0d129..adeb01d2 100644 --- a/l10n_pt_account_invoicexpress/README.rst +++ b/l10n_pt_account_invoicexpress/README.rst @@ -32,7 +32,7 @@ Generate Portuguese tax authority legal Invoices ("Faturas") using InvoiceXpress Invoices: - Added support to the different documents types: - Invoice, Invoice Receipt, Simplified Invoice and VAT MOSS. + Invoice, Invoice Receipt, Simplified Invoice. The default document type is set on the Journal, and can be changed on the Invoice form. diff --git a/l10n_pt_account_invoicexpress/static/description/index.html b/l10n_pt_account_invoicexpress/static/description/index.html index c55bee08..7dd50c3a 100644 --- a/l10n_pt_account_invoicexpress/static/description/index.html +++ b/l10n_pt_account_invoicexpress/static/description/index.html @@ -373,7 +373,7 @@

    Portugal InvoiceXpress Integration

    Invoices:

    • Added support to the different documents types: -Invoice, Invoice Receipt, Simplified Invoice and VAT MOSS. +Invoice, Invoice Receipt, Simplified Invoice. The default document type is set on the Journal, and can be changed on the Invoice form.
    • Use the invoice commercial partner for the name and address, From a8fa402ad02a383a3f7d6f7c8667157276bfbfeb Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Sat, 4 Mar 2023 14:18:35 +0000 Subject: [PATCH 138/157] l10n_pt_account_invoicexpress 16.0.1.1.0 --- l10n_pt_account_invoicexpress/__manifest__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/l10n_pt_account_invoicexpress/__manifest__.py b/l10n_pt_account_invoicexpress/__manifest__.py index 9f99ef60..1a6c760f 100644 --- a/l10n_pt_account_invoicexpress/__manifest__.py +++ b/l10n_pt_account_invoicexpress/__manifest__.py @@ -4,7 +4,7 @@ { "name": "Portugal InvoiceXpress Integration", "summary": "Portuguese certified invoices using InvoiceXpress", - "version": "16.0.1.0.0", + "version": "16.0.1.1.0", "author": "Open Source Integrators, Odoo Community Association (OCA)", "license": "AGPL-3", "website": "https://github.com/OCA/l10n-portugal", From 3f1475779d37a4ee2358082265e3420c201979cd Mon Sep 17 00:00:00 2001 From: justreisz Date: Tue, 4 Jul 2023 10:42:07 +0100 Subject: [PATCH 139/157] [IMP] l10n_pt_account_invoicexpress: automatically set invx pay status --- .../models/account_move.py | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/l10n_pt_account_invoicexpress/models/account_move.py b/l10n_pt_account_invoicexpress/models/account_move.py index 4d8e8a37..6ecaab50 100644 --- a/l10n_pt_account_invoicexpress/models/account_move.py +++ b/l10n_pt_account_invoicexpress/models/account_move.py @@ -290,6 +290,41 @@ def _post(self, soft=False): invoice.action_send_invoicexpress_email(ignore_no_config=True) return res + def _track_subtype(self, init_values): + res = super()._track_subtype(init_values) + if "payment_state" in init_values and self.payment_state == "paid": + for invoice in self: + if invoice.invoicexpress_id: + invoice._mark_invoice_paid() + return res + + def _mark_invoice_paid(self): + InvoiceXpress = self.env["account.invoicexpress"] + for invoice in self.filtered("can_invoicexpress"): + doctype = invoice.invoicexpress_doc_type + if not doctype: + raise exceptions.UserError( + _("Invoice is missing the InvoiceXpress document type!") + ) + response = InvoiceXpress.call( + invoice.company_id, + "{}s/{}/change-state.json".format(doctype, invoice.invoicexpress_id), + "PUT", + payload={"invoice": {"state": "settled"}}, + raise_errors=True, + ).json() + values = response.get(doctype) + seqnum = values and values.get("inverted_sequence_number") + if not seqnum: + raise exceptions.UserError( + _( + "Something went wrong: the InvoiceXpress response" + " is missing a sequence number." + ) + ) + msg = _("InvoiceXpress record has been modified to Paid.") + self.message_post(body=msg) + class AccountMoveLine(models.Model): _inherit = "account.move.line" From 6479daead93ad6c389d7aed6efe007f78965805e Mon Sep 17 00:00:00 2001 From: oca-ci Date: Tue, 11 Jul 2023 08:10:59 +0000 Subject: [PATCH 140/157] [UPD] Update l10n_pt_account_invoicexpress.pot --- .../i18n/l10n_pt_account_invoicexpress.pot | 21 +++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/l10n_pt_account_invoicexpress/i18n/l10n_pt_account_invoicexpress.pot b/l10n_pt_account_invoicexpress/i18n/l10n_pt_account_invoicexpress.pot index 0e7b0176..45720a13 100644 --- a/l10n_pt_account_invoicexpress/i18n/l10n_pt_account_invoicexpress.pot +++ b/l10n_pt_account_invoicexpress/i18n/l10n_pt_account_invoicexpress.pot @@ -23,17 +23,17 @@ msgstr "" msgid "" "

      \n" "Olá,\n" -"
      \n" -"Enviamos em anexo a fatura \n" +"
      \n" +"Enviamos em anexo a fatura \n" "\n" -" relativa à sua encomenda \n" +" relativa à sua encomenda \n" "\n" ".\n" -"

      \n" +"

      \n" "Obrigado\n" "\n" -"
      \n" -" \n" +"
      \n" +" \n" "
      \n" "

      \n" " " @@ -145,6 +145,7 @@ msgstr "" #. module: l10n_pt_account_invoicexpress #. odoo-python #: code:addons/l10n_pt_account_invoicexpress/models/account_move.py:0 +#: code:addons/l10n_pt_account_invoicexpress/models/account_move.py:0 #, python-format msgid "Invoice is missing the InvoiceXpress document type!" msgstr "" @@ -216,6 +217,13 @@ msgid "" " Id: {inv_xpress_id}
    • {inv_xpress_link}
    " msgstr "" +#. module: l10n_pt_account_invoicexpress +#. odoo-python +#: code:addons/l10n_pt_account_invoicexpress/models/account_move.py:0 +#, python-format +msgid "InvoiceXpress record has been modified to Paid." +msgstr "" + #. module: l10n_pt_account_invoicexpress #: model:mail.template,name:l10n_pt_account_invoicexpress.email_template_invoice msgid "InvoiceXpress: Send Invoice by Email" @@ -360,6 +368,7 @@ msgstr "" #. module: l10n_pt_account_invoicexpress #. odoo-python #: code:addons/l10n_pt_account_invoicexpress/models/account_move.py:0 +#: code:addons/l10n_pt_account_invoicexpress/models/account_move.py:0 #, python-format msgid "" "Something went wrong: the InvoiceXpress response is missing a sequence " From e34184f15ff1dfdeadc7861688c897637fabbfe7 Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Tue, 11 Jul 2023 08:13:43 +0000 Subject: [PATCH 141/157] l10n_pt_account_invoicexpress 16.0.1.2.0 --- l10n_pt_account_invoicexpress/__manifest__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/l10n_pt_account_invoicexpress/__manifest__.py b/l10n_pt_account_invoicexpress/__manifest__.py index 1a6c760f..d6fcc217 100644 --- a/l10n_pt_account_invoicexpress/__manifest__.py +++ b/l10n_pt_account_invoicexpress/__manifest__.py @@ -4,7 +4,7 @@ { "name": "Portugal InvoiceXpress Integration", "summary": "Portuguese certified invoices using InvoiceXpress", - "version": "16.0.1.1.0", + "version": "16.0.1.2.0", "author": "Open Source Integrators, Odoo Community Association (OCA)", "license": "AGPL-3", "website": "https://github.com/OCA/l10n-portugal", From 84caa701dc7d57a94aabb6ce979c5c3a2aa7cbaf Mon Sep 17 00:00:00 2001 From: Weblate Date: Tue, 11 Jul 2023 08:13:53 +0000 Subject: [PATCH 142/157] Update translation files Updated by "Update PO files to match POT (msgmerge)" hook in Weblate. Translation: l10n-portugal-16.0/l10n-portugal-16.0-l10n_pt_account_invoicexpress Translate-URL: https://translation.odoo-community.org/projects/l10n-portugal-16-0/l10n-portugal-16-0-l10n_pt_account_invoicexpress/ --- l10n_pt_account_invoicexpress/i18n/pt.po | 94 +++++++++++------------- 1 file changed, 42 insertions(+), 52 deletions(-) diff --git a/l10n_pt_account_invoicexpress/i18n/pt.po b/l10n_pt_account_invoicexpress/i18n/pt.po index 25b23678..15cd5136 100644 --- a/l10n_pt_account_invoicexpress/i18n/pt.po +++ b/l10n_pt_account_invoicexpress/i18n/pt.po @@ -26,18 +26,18 @@ msgstr " Gerar uma chave de API" msgid "" "

    \n" "Olá,\n" -"
    \n" -"Enviamos em anexo a fatura ${object.name | safe}\n" -"% if object.ref:\n" -" relativa à sua encomenda ${object.ref | safe}\n" -"% endif\n" +"
    \n" +"Enviamos em anexo a fatura \n" +"\n" +" relativa à sua encomenda \n" +"\n" ".\n" -"

    \n" +"

    \n" "Obrigado\n" -"% if user.signature:\n" -"
    \n" -" ${user.signature | safe}\n" -"% endif\n" +"\n" +"
    \n" +" \n" +"
    \n" "

    \n" " " msgstr "" @@ -86,19 +86,6 @@ msgstr "" msgid "Debit Note" msgstr "" -#. module: l10n_pt_account_invoicexpress -#: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_account_invoicexpress__display_name -#: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_account_journal__display_name -#: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_account_move__display_name -#: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_account_move_line__display_name -#: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_account_tax__display_name -#: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_res_company__display_name -#: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_res_config_settings__display_name -#: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_res_country__display_name -#: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_res_partner__display_name -msgid "Display Name" -msgstr "Nome de apresentação" - #. module: l10n_pt_account_invoicexpress #: model:ir.model.fields,help:l10n_pt_account_invoicexpress.field_res_company__has_invoicexpress msgid "Easy to use indicator if InvoiceXpress is enabled and can be used" @@ -110,6 +97,7 @@ msgid "Email InvoiceXpress" msgstr "Email InvoiceXpress" #. module: l10n_pt_account_invoicexpress +#. odoo-python #: code:addons/l10n_pt_account_invoicexpress/models/account_move.py:0 #, python-format msgid "Email sent by InvoiceXpress:
    • To: {}
    • Cc: {}
    " @@ -117,11 +105,12 @@ msgstr "" "Email enviado por InvoiceXpress:
    • To: {}
    • Cc: {}
    " #. module: l10n_pt_account_invoicexpress +#. odoo-python #: code:addons/l10n_pt_account_invoicexpress/models/account_invoicexpress.py:0 #, python-format msgid "" -"Error running API request ({} {}):\n" -"{}" +"Error running API request (%(status_code)s %(reason)s):\n" +"%(json)s" msgstr "" #. module: l10n_pt_account_invoicexpress @@ -139,19 +128,6 @@ msgstr "" msgid "Has Invoicexpress" msgstr "" -#. module: l10n_pt_account_invoicexpress -#: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_account_invoicexpress__id -#: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_account_journal__id -#: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_account_move__id -#: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_account_move_line__id -#: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_account_tax__id -#: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_res_company__id -#: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_res_config_settings__id -#: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_res_country__id -#: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_res_partner__id -msgid "ID" -msgstr "" - #. module: l10n_pt_account_invoicexpress #: model:ir.model.fields.selection,name:l10n_pt_account_invoicexpress.selection__account_journal__invoicexpress_doc_type__invoice #: model:ir.model.fields.selection,name:l10n_pt_account_invoicexpress.selection__account_move__invoicexpress_doc_type__invoice @@ -159,6 +135,7 @@ msgid "Invoice" msgstr "" #. module: l10n_pt_account_invoicexpress +#. odoo-python #: code:addons/l10n_pt_account_invoicexpress/models/account_move.py:0 #, python-format msgid "Invoice %s is not registered in InvoiceXpress yet." @@ -170,6 +147,7 @@ msgid "Invoice and Receipt" msgstr "" #. module: l10n_pt_account_invoicexpress +#. odoo-python #: code:addons/l10n_pt_account_invoicexpress/models/account_move.py:0 #, python-format msgid "Invoice is missing the InvoiceXpress document type!" @@ -234,6 +212,7 @@ msgid "InvoiceXpress connector" msgstr "Conector InvoiceXpress" #. module: l10n_pt_account_invoicexpress +#. odoo-python #: code:addons/l10n_pt_account_invoicexpress/models/account_move.py:0 #, python-format msgid "" @@ -243,6 +222,18 @@ msgstr "" "O registo InvoiceXpress foi criado para esta fatura:
    • InvoiceXpress " "Id: {inv_xpress_id}
    • {inv_xpress_link}
    " +#. module: l10n_pt_account_invoicexpress +#. odoo-python +#: code:addons/l10n_pt_account_invoicexpress/models/account_move.py:0 +#, python-format +msgid "InvoiceXpress record has been modified to Paid." +msgstr "" + +#. module: l10n_pt_account_invoicexpress +#: model:mail.template,name:l10n_pt_account_invoicexpress.email_template_invoice +msgid "InvoiceXpress: Send Invoice by Email" +msgstr "" + #. module: l10n_pt_account_invoicexpress #: model:ir.model.fields.selection,name:l10n_pt_account_invoicexpress.selection__account_journal__invoicexpress_doc_type__invoice_receipt msgid "Invoices Receipt" @@ -281,6 +272,7 @@ msgid "Journal" msgstr "Diário" #. module: l10n_pt_account_invoicexpress +#. odoo-python #: code:addons/l10n_pt_account_invoicexpress/models/account_move.py:0 #, python-format msgid "Journal %s is missing the InvoiceXpress document type configuration!" @@ -304,42 +296,33 @@ msgid "Journal Type" msgstr "" #. module: l10n_pt_account_invoicexpress +#. odoo-python #: code:addons/l10n_pt_account_invoicexpress/models/account_move.py:0 #, python-format msgid "Kindly add the invoice date and invoice due date." msgstr "" -#. module: l10n_pt_account_invoicexpress -#: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_account_invoicexpress____last_update -#: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_account_journal____last_update -#: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_account_move____last_update -#: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_account_move_line____last_update -#: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_account_tax____last_update -#: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_res_company____last_update -#: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_res_config_settings____last_update -#: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_res_country____last_update -#: model:ir.model.fields,field_description:l10n_pt_account_invoicexpress.field_res_partner____last_update -msgid "Last Modified on" -msgstr "" - #. module: l10n_pt_account_invoicexpress #: model:ir.model.fields.selection,name:l10n_pt_account_invoicexpress.selection__account_journal__invoicexpress_doc_type__none msgid "No InvoiceXpress document" msgstr "" #. module: l10n_pt_account_invoicexpress +#. odoo-python #: code:addons/l10n_pt_account_invoicexpress/models/account_move.py:0 #, python-format msgid "No address to send invoice email to." msgstr "" #. module: l10n_pt_account_invoicexpress +#. odoo-python #: code:addons/l10n_pt_account_invoicexpress/models/account_move.py:0 #, python-format msgid "None" msgstr "" #. module: l10n_pt_account_invoicexpress +#. odoo-python #: code:addons/l10n_pt_account_invoicexpress/models/account_move.py:0 #, python-format msgid "" @@ -381,6 +364,7 @@ msgid "Simplified Invoice" msgstr "" #. module: l10n_pt_account_invoicexpress +#. odoo-python #: code:addons/l10n_pt_account_invoicexpress/models/account_invoicexpress.py:0 #, python-format msgid "" @@ -390,6 +374,7 @@ msgid "" msgstr "" #. module: l10n_pt_account_invoicexpress +#. odoo-python #: code:addons/l10n_pt_account_invoicexpress/models/account_move.py:0 #, python-format msgid "" @@ -398,6 +383,7 @@ msgid "" msgstr "" #. module: l10n_pt_account_invoicexpress +#. odoo-python #: code:addons/l10n_pt_account_invoicexpress/models/account_move.py:0 #, python-format msgid "Something went wrong: the InvoiceXpress response looks empty." @@ -405,7 +391,7 @@ msgstr "" #. module: l10n_pt_account_invoicexpress #: model:mail.template,subject:l10n_pt_account_invoicexpress.email_template_invoice -msgid "Sua Fatura ${object.name | safe}" +msgid "Sua Fatura {{ object.name }}" msgstr "" #. module: l10n_pt_account_invoicexpress @@ -427,11 +413,15 @@ msgid "" msgstr "" #. module: l10n_pt_account_invoicexpress +#. odoo-python #: code:addons/l10n_pt_account_invoicexpress/models/account_move.py:0 #, python-format msgid "View Document" msgstr "" +#~ msgid "Display Name" +#~ msgstr "Nome de apresentação" + #~ msgid "Error running API request ({} {}): {}" #~ msgstr "Erro na chamada à API ({} {}): {}" From 335fdcfcc4b2a118d1e544d6d8cddde021b24a5c Mon Sep 17 00:00:00 2001 From: Dario Del Zozzo Date: Tue, 18 Jul 2023 15:26:22 +0200 Subject: [PATCH 143/157] [16.0][FIX]l10n_pt_account_invoicexpress fixed method override --- l10n_pt_account_invoicexpress/models/account_move.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/l10n_pt_account_invoicexpress/models/account_move.py b/l10n_pt_account_invoicexpress/models/account_move.py index 6ecaab50..6c14dc09 100644 --- a/l10n_pt_account_invoicexpress/models/account_move.py +++ b/l10n_pt_account_invoicexpress/models/account_move.py @@ -281,7 +281,7 @@ def action_send_invoicexpress_email(self, ignore_no_config=False): ) invoice.message_post(body=msg) - def _post(self, soft=False): + def _post(self, soft=True): res = super()._post(soft=soft) for invoice in self: if not invoice.invoicexpress_id: From 477528036a852d6800206dbf97d5f1b75c180c98 Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Tue, 18 Jul 2023 17:33:47 +0000 Subject: [PATCH 144/157] l10n_pt_account_invoicexpress 16.0.1.2.1 --- l10n_pt_account_invoicexpress/__manifest__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/l10n_pt_account_invoicexpress/__manifest__.py b/l10n_pt_account_invoicexpress/__manifest__.py index d6fcc217..1d18b2c0 100644 --- a/l10n_pt_account_invoicexpress/__manifest__.py +++ b/l10n_pt_account_invoicexpress/__manifest__.py @@ -4,7 +4,7 @@ { "name": "Portugal InvoiceXpress Integration", "summary": "Portuguese certified invoices using InvoiceXpress", - "version": "16.0.1.2.0", + "version": "16.0.1.2.1", "author": "Open Source Integrators, Odoo Community Association (OCA)", "license": "AGPL-3", "website": "https://github.com/OCA/l10n-portugal", From 5b1c4447682f581c731a1a956afd953adbaeaf49 Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Sun, 3 Sep 2023 13:52:23 +0000 Subject: [PATCH 145/157] [UPD] README.rst --- l10n_pt_account_invoicexpress/README.rst | 15 ++++--- .../static/description/index.html | 44 ++++++++++--------- 2 files changed, 32 insertions(+), 27 deletions(-) diff --git a/l10n_pt_account_invoicexpress/README.rst b/l10n_pt_account_invoicexpress/README.rst index adeb01d2..4903e688 100644 --- a/l10n_pt_account_invoicexpress/README.rst +++ b/l10n_pt_account_invoicexpress/README.rst @@ -2,10 +2,13 @@ Portugal InvoiceXpress Integration ================================== -.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:6d44fa33f022d99b79c0fe19d7c522760edf12797eb7d482b09a9e33adfad164 + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Production%2FStable-green.png :target: https://odoo-community.org/page/development-status @@ -19,11 +22,11 @@ Portugal InvoiceXpress Integration .. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png :target: https://translation.odoo-community.org/projects/l10n-portugal-16-0/l10n-portugal-16-0-l10n_pt_account_invoicexpress :alt: Translate me on Weblate -.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png - :target: https://runbot.odoo-community.org/runbot/171/16.0 - :alt: Try me on Runbot +.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png + :target: https://runboat.odoo-community.org/builds?repo=OCA/l10n-portugal&target_branch=16.0 + :alt: Try me on Runboat -|badge1| |badge2| |badge3| |badge4| |badge5| +|badge1| |badge2| |badge3| |badge4| |badge5| Generate Portuguese tax authority legal Invoices ("Faturas") using InvoiceXpress. @@ -122,7 +125,7 @@ Bug Tracker Bugs are tracked on `GitHub Issues `_. In case of trouble, please check there if your issue has already been reported. -If you spotted it first, help us smashing it by providing a detailed and welcomed +If you spotted it first, help us to smash it by providing a detailed and welcomed `feedback `_. Do not contact contributors directly about support or help with technical issues. diff --git a/l10n_pt_account_invoicexpress/static/description/index.html b/l10n_pt_account_invoicexpress/static/description/index.html index 7dd50c3a..e34aeaac 100644 --- a/l10n_pt_account_invoicexpress/static/description/index.html +++ b/l10n_pt_account_invoicexpress/static/description/index.html @@ -1,20 +1,20 @@ - + - + Portugal InvoiceXpress Integration