Fall 4433: Intercompany Rechnung
							parent
							
								
									102c8fd704
								
							
						
					
					
						commit
						291deedcc2
					
				|  | @ -0,0 +1,70 @@ | ||||||
|  | .. image:: https://img.shields.io/badge/licence-AGPL--3-blue.svg | ||||||
|  |    :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html | ||||||
|  |    :alt: License: AGPL-3 | ||||||
|  | 
 | ||||||
|  | ================================= | ||||||
|  | Product Tax Multi Company Default | ||||||
|  | ================================= | ||||||
|  | 
 | ||||||
|  | This module sets the default company taxes for all the existing companies when | ||||||
|  | a product is created. It also adds a button to set all the taxes from other | ||||||
|  | companies matching them by tax code. | ||||||
|  | 
 | ||||||
|  | Configuration | ||||||
|  | ============= | ||||||
|  | 
 | ||||||
|  | #. As obvious, you need to have several companies. | ||||||
|  | #. Go to Accounting > Configuration > Settings | ||||||
|  | #. Select the proper company (if you are admin or a user with several companies | ||||||
|  |    access), or keep the current one (for a regular user). | ||||||
|  | #. On Invoicing & Payments section, set fields "Default Sale Tax" and "Default | ||||||
|  |    Purchase Tax". | ||||||
|  | 
 | ||||||
|  | Usage | ||||||
|  | ===== | ||||||
|  | 
 | ||||||
|  | To use this module, you need to: | ||||||
|  | 
 | ||||||
|  | #. Go to Sales > Sales > Products. | ||||||
|  | #. Create a new product and save it. | ||||||
|  | #. Switching user company (or being as admin or user with several companies | ||||||
|  |    access), you will see that the product has the default taxes for all the | ||||||
|  |    companies. | ||||||
|  | 
 | ||||||
|  | .. image:: https://odoo-community.org/website/image/ir.attachment/5784_f2813bd/datas | ||||||
|  |    :alt: Try me on Runbot | ||||||
|  |    :target: https://runbot.odoo-community.org/runbot/133/9.0 | ||||||
|  | 
 | ||||||
|  | Bug Tracker | ||||||
|  | =========== | ||||||
|  | 
 | ||||||
|  | Bugs are tracked on `GitHub Issues | ||||||
|  | <https://github.com/OCA/multi-company/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. | ||||||
|  | 
 | ||||||
|  | Images | ||||||
|  | ------ | ||||||
|  | 
 | ||||||
|  | * Odoo Community Association: `Icon <https://github.com/OCA/maintainer-tools/blob/master/template/module/static/description/icon.svg>`_. | ||||||
|  | 
 | ||||||
|  | Contributors | ||||||
|  | ------------ | ||||||
|  | 
 | ||||||
|  | * Carlos Dauden - Tecnativa <carlos.dauden@tecnativa.com> | ||||||
|  | * Pedro M. Baeza <pedro.baeza@tecnativa.com> | ||||||
|  | 
 | ||||||
|  | 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 https://odoo-community.org. | ||||||
|  | @ -0,0 +1,5 @@ | ||||||
|  | # -*- coding: utf-8 -*- | ||||||
|  | # Copyright 2017 Carlos Dauden - Tecnativa <carlos.dauden@tecnativa.com> | ||||||
|  | # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). | ||||||
|  | 
 | ||||||
|  | from . import models | ||||||
|  | @ -0,0 +1,21 @@ | ||||||
|  | # -*- coding: utf-8 -*- | ||||||
|  | # Copyright 2017 Carlos Dauden - Tecnativa <carlos.dauden@tecnativa.com> | ||||||
|  | # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). | ||||||
|  | 
 | ||||||
|  | # noinspection PyStatementEffect | ||||||
|  | { | ||||||
|  |     'name': 'Product Tax Multi Company Default', | ||||||
|  |     'version': '11.0.1.0.0', | ||||||
|  |     'category': 'Account', | ||||||
|  |     'website': 'https://www.tecnativa.com', | ||||||
|  |     'author': 'Tecnativa, ' | ||||||
|  |               'Odoo Community Association (OCA)', | ||||||
|  |     'license': 'AGPL-3', | ||||||
|  |     'depends': [ | ||||||
|  |         'account', | ||||||
|  |         'product', | ||||||
|  |     ], | ||||||
|  |     'data': [ | ||||||
|  |         'views/product_template_view.xml', | ||||||
|  |     ], | ||||||
|  | } | ||||||
|  | @ -0,0 +1,73 @@ | ||||||
|  | # Translation of Odoo Server. | ||||||
|  | # This file contains the translation of the following modules: | ||||||
|  | # * product_tax_multicompany_default | ||||||
|  | #  | ||||||
|  | # Translators: | ||||||
|  | # Rudolf Schnapka <rs@techno-flex.de>, 2017 | ||||||
|  | msgid "" | ||||||
|  | msgstr "" | ||||||
|  | "Project-Id-Version: Odoo Server 9.0c\n" | ||||||
|  | "Report-Msgid-Bugs-To: \n" | ||||||
|  | "POT-Creation-Date: 2017-08-17 03:16+0000\n" | ||||||
|  | "PO-Revision-Date: 2017-08-17 03:16+0000\n" | ||||||
|  | "Last-Translator: Rudolf Schnapka <rs@techno-flex.de>, 2017\n" | ||||||
|  | "Language-Team: German (https://www.transifex.com/oca/teams/23907/de/)\n" | ||||||
|  | "MIME-Version: 1.0\n" | ||||||
|  | "Content-Type: text/plain; charset=UTF-8\n" | ||||||
|  | "Content-Transfer-Encoding: \n" | ||||||
|  | "Language: de\n" | ||||||
|  | "Plural-Forms: nplurals=2; plural=(n != 1);\n" | ||||||
|  | 
 | ||||||
|  | #. module: product_tax_multicompany_default | ||||||
|  | #: model:ir.model.fields,field_description:product_tax_multicompany_default.field_product_product_company_ids | ||||||
|  | msgid "Companies" | ||||||
|  | msgstr "Unternehmen" | ||||||
|  | 
 | ||||||
|  | #. module: product_tax_multicompany_default | ||||||
|  | #: model:ir.model.fields,field_description:product_tax_multicompany_default.field_product_product_taxes_id | ||||||
|  | msgid "Customer Taxes" | ||||||
|  | msgstr "" | ||||||
|  | 
 | ||||||
|  | #. module: product_tax_multicompany_default | ||||||
|  | #: model:ir.model.fields,field_description:product_tax_multicompany_default.field_product_product_property_account_expense_id | ||||||
|  | msgid "Expense Account" | ||||||
|  | msgstr "" | ||||||
|  | 
 | ||||||
|  | #. module: product_tax_multicompany_default | ||||||
|  | #: model:ir.model.fields,field_description:product_tax_multicompany_default.field_product_product_property_account_income_id | ||||||
|  | msgid "Income Account" | ||||||
|  | msgstr "" | ||||||
|  | 
 | ||||||
|  | #. module: product_tax_multicompany_default | ||||||
|  | #: model:ir.model,name:product_tax_multicompany_default.model_product_product | ||||||
|  | msgid "Product" | ||||||
|  | msgstr "" | ||||||
|  | 
 | ||||||
|  | #. module: product_tax_multicompany_default | ||||||
|  | #: model:ir.model,name:product_tax_multicompany_default.model_product_template | ||||||
|  | msgid "Product Template" | ||||||
|  | msgstr "Produktvorlage" | ||||||
|  | 
 | ||||||
|  | #. module: product_tax_multicompany_default | ||||||
|  | #: model:ir.ui.view,arch_db:product_tax_multicompany_default.product_template_form_view | ||||||
|  | msgid "Propagate Taxes" | ||||||
|  | msgstr "" | ||||||
|  | 
 | ||||||
|  | #. module: product_tax_multicompany_default | ||||||
|  | #: model:ir.model.fields,help:product_tax_multicompany_default.field_product_product_property_account_expense_id | ||||||
|  | msgid "" | ||||||
|  | "This account will be used for invoices instead of the default one to value " | ||||||
|  | "expenses for the current product." | ||||||
|  | msgstr "" | ||||||
|  | 
 | ||||||
|  | #. module: product_tax_multicompany_default | ||||||
|  | #: model:ir.model.fields,help:product_tax_multicompany_default.field_product_product_property_account_income_id | ||||||
|  | msgid "" | ||||||
|  | "This account will be used for invoices instead of the default one to value " | ||||||
|  | "sales for the current product." | ||||||
|  | msgstr "" | ||||||
|  | 
 | ||||||
|  | #. module: product_tax_multicompany_default | ||||||
|  | #: model:ir.model.fields,field_description:product_tax_multicompany_default.field_product_product_supplier_taxes_id | ||||||
|  | msgid "Vendor Taxes" | ||||||
|  | msgstr "" | ||||||
|  | @ -0,0 +1,73 @@ | ||||||
|  | # Translation of Odoo Server. | ||||||
|  | # This file contains the translation of the following modules: | ||||||
|  | # * product_tax_multicompany_default | ||||||
|  | #  | ||||||
|  | # Translators: | ||||||
|  | # OCA Transbot <transbot@odoo-community.org>, 2017 | ||||||
|  | msgid "" | ||||||
|  | msgstr "" | ||||||
|  | "Project-Id-Version: Odoo Server 9.0c\n" | ||||||
|  | "Report-Msgid-Bugs-To: \n" | ||||||
|  | "POT-Creation-Date: 2017-08-17 03:16+0000\n" | ||||||
|  | "PO-Revision-Date: 2017-08-17 03:16+0000\n" | ||||||
|  | "Last-Translator: OCA Transbot <transbot@odoo-community.org>, 2017\n" | ||||||
|  | "Language-Team: Spanish (https://www.transifex.com/oca/teams/23907/es/)\n" | ||||||
|  | "MIME-Version: 1.0\n" | ||||||
|  | "Content-Type: text/plain; charset=UTF-8\n" | ||||||
|  | "Content-Transfer-Encoding: \n" | ||||||
|  | "Language: es\n" | ||||||
|  | "Plural-Forms: nplurals=2; plural=(n != 1);\n" | ||||||
|  | 
 | ||||||
|  | #. module: product_tax_multicompany_default | ||||||
|  | #: model:ir.model.fields,field_description:product_tax_multicompany_default.field_product_product_company_ids | ||||||
|  | msgid "Companies" | ||||||
|  | msgstr "Compañías" | ||||||
|  | 
 | ||||||
|  | #. module: product_tax_multicompany_default | ||||||
|  | #: model:ir.model.fields,field_description:product_tax_multicompany_default.field_product_product_taxes_id | ||||||
|  | msgid "Customer Taxes" | ||||||
|  | msgstr "" | ||||||
|  | 
 | ||||||
|  | #. module: product_tax_multicompany_default | ||||||
|  | #: model:ir.model.fields,field_description:product_tax_multicompany_default.field_product_product_property_account_expense_id | ||||||
|  | msgid "Expense Account" | ||||||
|  | msgstr "" | ||||||
|  | 
 | ||||||
|  | #. module: product_tax_multicompany_default | ||||||
|  | #: model:ir.model.fields,field_description:product_tax_multicompany_default.field_product_product_property_account_income_id | ||||||
|  | msgid "Income Account" | ||||||
|  | msgstr "" | ||||||
|  | 
 | ||||||
|  | #. module: product_tax_multicompany_default | ||||||
|  | #: model:ir.model,name:product_tax_multicompany_default.model_product_product | ||||||
|  | msgid "Product" | ||||||
|  | msgstr "" | ||||||
|  | 
 | ||||||
|  | #. module: product_tax_multicompany_default | ||||||
|  | #: model:ir.model,name:product_tax_multicompany_default.model_product_template | ||||||
|  | msgid "Product Template" | ||||||
|  | msgstr "Plantilla producto" | ||||||
|  | 
 | ||||||
|  | #. module: product_tax_multicompany_default | ||||||
|  | #: model:ir.ui.view,arch_db:product_tax_multicompany_default.product_template_form_view | ||||||
|  | msgid "Propagate Taxes" | ||||||
|  | msgstr "Propagar impuestos" | ||||||
|  | 
 | ||||||
|  | #. module: product_tax_multicompany_default | ||||||
|  | #: model:ir.model.fields,help:product_tax_multicompany_default.field_product_product_property_account_expense_id | ||||||
|  | msgid "" | ||||||
|  | "This account will be used for invoices instead of the default one to value " | ||||||
|  | "expenses for the current product." | ||||||
|  | msgstr "" | ||||||
|  | 
 | ||||||
|  | #. module: product_tax_multicompany_default | ||||||
|  | #: model:ir.model.fields,help:product_tax_multicompany_default.field_product_product_property_account_income_id | ||||||
|  | msgid "" | ||||||
|  | "This account will be used for invoices instead of the default one to value " | ||||||
|  | "sales for the current product." | ||||||
|  | msgstr "" | ||||||
|  | 
 | ||||||
|  | #. module: product_tax_multicompany_default | ||||||
|  | #: model:ir.model.fields,field_description:product_tax_multicompany_default.field_product_product_supplier_taxes_id | ||||||
|  | msgid "Vendor Taxes" | ||||||
|  | msgstr "" | ||||||
|  | @ -0,0 +1,78 @@ | ||||||
|  | # Translation of Odoo Server. | ||||||
|  | # This file contains the translation of the following modules: | ||||||
|  | # * product_tax_multicompany_default | ||||||
|  | #  | ||||||
|  | # Translators: | ||||||
|  | # OCA Transbot <transbot@odoo-community.org>, 2017 | ||||||
|  | # Quentin THEURET <odoo@kerpeo.com>, 2017 | ||||||
|  | msgid "" | ||||||
|  | msgstr "" | ||||||
|  | "Project-Id-Version: Odoo Server 9.0c\n" | ||||||
|  | "Report-Msgid-Bugs-To: \n" | ||||||
|  | "POT-Creation-Date: 2017-08-19 05:30+0000\n" | ||||||
|  | "PO-Revision-Date: 2017-08-19 05:30+0000\n" | ||||||
|  | "Last-Translator: Quentin THEURET <odoo@kerpeo.com>, 2017\n" | ||||||
|  | "Language-Team: French (https://www.transifex.com/oca/teams/23907/fr/)\n" | ||||||
|  | "MIME-Version: 1.0\n" | ||||||
|  | "Content-Type: text/plain; charset=UTF-8\n" | ||||||
|  | "Content-Transfer-Encoding: \n" | ||||||
|  | "Language: fr\n" | ||||||
|  | "Plural-Forms: nplurals=2; plural=(n > 1);\n" | ||||||
|  | 
 | ||||||
|  | #. module: product_tax_multicompany_default | ||||||
|  | #: model:ir.model.fields,field_description:product_tax_multicompany_default.field_product_product_company_ids | ||||||
|  | msgid "Companies" | ||||||
|  | msgstr "Sociétés" | ||||||
|  | 
 | ||||||
|  | #. module: product_tax_multicompany_default | ||||||
|  | #: model:ir.model.fields,field_description:product_tax_multicompany_default.field_product_product_taxes_id | ||||||
|  | msgid "Customer Taxes" | ||||||
|  | msgstr "Taxes client" | ||||||
|  | 
 | ||||||
|  | #. module: product_tax_multicompany_default | ||||||
|  | #: model:ir.model.fields,field_description:product_tax_multicompany_default.field_product_product_property_account_expense_id | ||||||
|  | msgid "Expense Account" | ||||||
|  | msgstr "Compte de dépense" | ||||||
|  | 
 | ||||||
|  | #. module: product_tax_multicompany_default | ||||||
|  | #: model:ir.model.fields,field_description:product_tax_multicompany_default.field_product_product_property_account_income_id | ||||||
|  | msgid "Income Account" | ||||||
|  | msgstr "Compte de revenu" | ||||||
|  | 
 | ||||||
|  | #. module: product_tax_multicompany_default | ||||||
|  | #: model:ir.model,name:product_tax_multicompany_default.model_product_product | ||||||
|  | msgid "Product" | ||||||
|  | msgstr "Produit" | ||||||
|  | 
 | ||||||
|  | #. module: product_tax_multicompany_default | ||||||
|  | #: model:ir.model,name:product_tax_multicompany_default.model_product_template | ||||||
|  | msgid "Product Template" | ||||||
|  | msgstr "Template de produit" | ||||||
|  | 
 | ||||||
|  | #. module: product_tax_multicompany_default | ||||||
|  | #: model:ir.ui.view,arch_db:product_tax_multicompany_default.product_template_form_view | ||||||
|  | msgid "Propagate Taxes" | ||||||
|  | msgstr "Propager les taxes" | ||||||
|  | 
 | ||||||
|  | #. module: product_tax_multicompany_default | ||||||
|  | #: model:ir.model.fields,help:product_tax_multicompany_default.field_product_product_property_account_expense_id | ||||||
|  | msgid "" | ||||||
|  | "This account will be used for invoices instead of the default one to value " | ||||||
|  | "expenses for the current product." | ||||||
|  | msgstr "" | ||||||
|  | "Ce compte sera utilisé pour les factures à la place de celui par défaut pour" | ||||||
|  | " évaluer les dépenses pour le produit courant." | ||||||
|  | 
 | ||||||
|  | #. module: product_tax_multicompany_default | ||||||
|  | #: model:ir.model.fields,help:product_tax_multicompany_default.field_product_product_property_account_income_id | ||||||
|  | msgid "" | ||||||
|  | "This account will be used for invoices instead of the default one to value " | ||||||
|  | "sales for the current product." | ||||||
|  | msgstr "" | ||||||
|  | "Ce compte sera utilisé pour les factures à la place de celui par défaut pour" | ||||||
|  | " évaluer les ventes du produit courant." | ||||||
|  | 
 | ||||||
|  | #. module: product_tax_multicompany_default | ||||||
|  | #: model:ir.model.fields,field_description:product_tax_multicompany_default.field_product_product_supplier_taxes_id | ||||||
|  | msgid "Vendor Taxes" | ||||||
|  | msgstr "Taxes sur la vente" | ||||||
|  | @ -0,0 +1,5 @@ | ||||||
|  | # -*- coding: utf-8 -*- | ||||||
|  | # Copyright 2017 Carlos Dauden - Tecnativa <carlos.dauden@tecnativa.com> | ||||||
|  | # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). | ||||||
|  | 
 | ||||||
|  | from . import product | ||||||
|  | @ -0,0 +1,68 @@ | ||||||
|  | # -*- coding: utf-8 -*- | ||||||
|  | # Copyright 2017 Carlos Dauden - Tecnativa <carlos.dauden@tecnativa.com> | ||||||
|  | # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). | ||||||
|  | 
 | ||||||
|  | from odoo import api, models | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class ProductTemplate(models.Model): | ||||||
|  |     _inherit = 'product.template' | ||||||
|  | 
 | ||||||
|  |     def taxes_by_company(self, field, company_id, match_tax_ids=None): | ||||||
|  |         taxes_ids = [] | ||||||
|  |         if match_tax_ids is None: | ||||||
|  |             taxes_ids = self.env['ir.values'].get_default( | ||||||
|  |                 'product.template', field, company_id=company_id) | ||||||
|  |         # If None: return default taxes if []: return empty list | ||||||
|  |         if not match_tax_ids: | ||||||
|  |             return isinstance(taxes_ids, list) and taxes_ids or [] | ||||||
|  |         AccountTax = self.env['account.tax'] | ||||||
|  |         for tax in AccountTax.browse(match_tax_ids): | ||||||
|  |             taxes_ids.extend(AccountTax.search([ | ||||||
|  |                 ('name', '=', tax.name), | ||||||
|  |                 ('company_id', '=', company_id) | ||||||
|  |             ]).ids) | ||||||
|  |         return taxes_ids | ||||||
|  | 
 | ||||||
|  |     @api.multi | ||||||
|  |     def set_multicompany_taxes(self): | ||||||
|  |         self.ensure_one() | ||||||
|  |         customer_tax_ids = self.taxes_id.ids | ||||||
|  |         supplier_tax_ids = self.supplier_taxes_id.ids | ||||||
|  |         company_id = self.env.user.company_id.id | ||||||
|  |         obj = self.sudo() | ||||||
|  |         default_customer_tax_ids = obj.taxes_by_company( | ||||||
|  |             'taxes_id', company_id) | ||||||
|  |         default_supplier_tax_ids = obj.taxes_by_company( | ||||||
|  |             'supplier_taxes_id', company_id) | ||||||
|  |         # Use list() to copy list | ||||||
|  |         match_customer_tax_ids = ( | ||||||
|  |             default_customer_tax_ids != customer_tax_ids and | ||||||
|  |             list(customer_tax_ids) or None) | ||||||
|  |         match_suplier_tax_ids = ( | ||||||
|  |             default_supplier_tax_ids != supplier_tax_ids and | ||||||
|  |             list(supplier_tax_ids) or None) | ||||||
|  |         for company in obj.env['res.company'].search( | ||||||
|  |                 [('id', '!=', company_id)]): | ||||||
|  |             customer_tax_ids.extend(obj.taxes_by_company( | ||||||
|  |                 'taxes_id', company.id, match_customer_tax_ids)) | ||||||
|  |             supplier_tax_ids.extend(obj.taxes_by_company( | ||||||
|  |                 'supplier_taxes_id', company.id, match_suplier_tax_ids)) | ||||||
|  |         self.write({ | ||||||
|  |             'taxes_id': [(6, 0, customer_tax_ids)], | ||||||
|  |             'supplier_taxes_id': [(6, 0, supplier_tax_ids)], | ||||||
|  |         }) | ||||||
|  | 
 | ||||||
|  |     @api.model | ||||||
|  |     def create(self, vals): | ||||||
|  |         res = super(ProductTemplate, self).create(vals) | ||||||
|  |         res.set_multicompany_taxes() | ||||||
|  |         return res | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class ProductProduct(models.Model): | ||||||
|  |     _inherit = 'product.product' | ||||||
|  | 
 | ||||||
|  |     @api.multi | ||||||
|  |     def set_multicompany_taxes(self): | ||||||
|  |         self.product_tmpl_id.set_multicompany_taxes() | ||||||
|  | @ -0,0 +1,3 @@ | ||||||
|  | # -*- coding: utf-8 -*- | ||||||
|  | 
 | ||||||
|  | from . import test_product_tax_multicompany | ||||||
|  | @ -0,0 +1,127 @@ | ||||||
|  | # -*- coding: utf-8 -*- | ||||||
|  | # Copyright 2017 Carlos Dauden - Tecnativa <carlos.dauden@tecnativa.com> | ||||||
|  | # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). | ||||||
|  | 
 | ||||||
|  | from openerp.tests.common import SavepointCase | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class TestsProductTaxMulticompany(SavepointCase): | ||||||
|  |     @classmethod | ||||||
|  |     def setUpClass(cls): | ||||||
|  |         super(TestsProductTaxMulticompany, cls).setUpClass() | ||||||
|  |         cls.company_1 = cls.env['res.company'].create( | ||||||
|  |             {'name': 'Test company 1'}) | ||||||
|  |         cls.company_2 = cls.env['res.company'].create( | ||||||
|  |             {'name': 'Test company 2'}) | ||||||
|  |         group_sale_manager = cls.env.ref('base.group_sale_manager') | ||||||
|  |         group_account_manager = cls.env.ref('account.group_account_manager') | ||||||
|  |         ResUsers = cls.env['res.users'] | ||||||
|  |         cls.user_1 = ResUsers.create( | ||||||
|  |             {'name': 'User not admin', | ||||||
|  |              'login': 'user_1', | ||||||
|  |              'email': 'test@test.com', | ||||||
|  |              'groups_id': [(6, 0, ( | ||||||
|  |                  group_sale_manager | group_account_manager).ids)], | ||||||
|  |              'company_id': cls.company_1.id, | ||||||
|  |              'company_ids': [(6, 0, cls.company_1.ids)]}) | ||||||
|  |         cls.user_2 = ResUsers.create( | ||||||
|  |             {'name': 'User not admin', | ||||||
|  |              'login': 'user_2', | ||||||
|  |              'email': 'test@test.com', | ||||||
|  |              'groups_id': [(6, 0, ( | ||||||
|  |                  group_sale_manager | group_account_manager).ids)], | ||||||
|  |              'company_id': cls.company_2.id, | ||||||
|  |              'company_ids': [(6, 0, cls.company_2.ids)]}) | ||||||
|  |         AccountTax = cls.env['account.tax'] | ||||||
|  |         tax_vals = { | ||||||
|  |             'name': 'Test Customer Tax 10%', | ||||||
|  |             'amount': 10.0, | ||||||
|  |             'amount_type': 'percent', | ||||||
|  |             'type_tax_use': 'sale', | ||||||
|  |         } | ||||||
|  |         cls.tax_10_cc1 = AccountTax.sudo(cls.user_1.id).create(tax_vals) | ||||||
|  |         cls.tax_10_cc2 = AccountTax.sudo(cls.user_2.id).create(tax_vals) | ||||||
|  |         tax_vals.update({ | ||||||
|  |             'name': 'Test Customer Tax 20%', | ||||||
|  |             'amount': 20.0, | ||||||
|  |         }) | ||||||
|  |         cls.tax_20_cc1 = AccountTax.sudo(cls.user_1.id).create(tax_vals) | ||||||
|  |         cls.tax_20_cc2 = AccountTax.sudo(cls.user_2.id).create(tax_vals) | ||||||
|  |         tax_vals.update({ | ||||||
|  |             'name': 'Test Supplier Tax 10%', | ||||||
|  |             'amount': 10.0, | ||||||
|  |             'type_tax_use': 'purchase', | ||||||
|  |         }) | ||||||
|  |         cls.tax_10_sc1 = AccountTax.sudo(cls.user_1.id).create(tax_vals) | ||||||
|  |         cls.tax_10_sc2 = AccountTax.sudo(cls.user_2.id).create(tax_vals) | ||||||
|  |         tax_vals.update({ | ||||||
|  |             'name': 'Test Supplier Tax 20%', | ||||||
|  |             'amount': 20.0, | ||||||
|  |         }) | ||||||
|  |         cls.tax_20_sc1 = AccountTax.sudo(cls.user_1.id).create(tax_vals) | ||||||
|  |         cls.tax_20_sc2 = AccountTax.sudo(cls.user_2.id).create(tax_vals) | ||||||
|  |         IrValues = cls.env['ir.values'] | ||||||
|  |         IrValues.set_default( | ||||||
|  |             'product.template', "taxes_id", [cls.tax_10_cc1.id], | ||||||
|  |             for_all_users=True, company_id=cls.company_1.id) | ||||||
|  |         IrValues.set_default( | ||||||
|  |             'product.template', "supplier_taxes_id", [cls.tax_10_sc1.id], | ||||||
|  |             for_all_users=True, company_id=cls.company_1.id) | ||||||
|  |         IrValues.set_default( | ||||||
|  |             'product.template', "taxes_id", [cls.tax_20_cc2.id], | ||||||
|  |             for_all_users=True, company_id=cls.company_2.id) | ||||||
|  |         IrValues.set_default( | ||||||
|  |             'product.template', "supplier_taxes_id", [cls.tax_20_sc2.id], | ||||||
|  |             for_all_users=True, company_id=cls.company_2.id) | ||||||
|  | 
 | ||||||
|  |     def test_multicompany_default_tax(self): | ||||||
|  |         product = self.env['product.product'].sudo(self.user_1.id).create({ | ||||||
|  |             'name': 'Test Product', | ||||||
|  |             'company_id': False, | ||||||
|  |         }) | ||||||
|  |         product = product.sudo() | ||||||
|  |         self.assertIn(self.tax_10_cc1, product.taxes_id) | ||||||
|  |         self.assertIn(self.tax_20_cc2, product.taxes_id) | ||||||
|  |         self.assertIn(self.tax_10_sc1, product.supplier_taxes_id) | ||||||
|  |         self.assertIn(self.tax_20_sc2, product.supplier_taxes_id) | ||||||
|  | 
 | ||||||
|  |     def test_not_default_tax_if_set(self): | ||||||
|  |         product = self.env['product.product'].sudo(self.user_1.id).create({ | ||||||
|  |             'name': 'Test Product', | ||||||
|  |             'taxes_id': [(6, 0, self.tax_20_cc1.ids)], | ||||||
|  |             'supplier_taxes_id': [(6, 0, self.tax_20_sc1.ids)], | ||||||
|  |             'company_id': False, | ||||||
|  |         }) | ||||||
|  |         product = product.sudo() | ||||||
|  |         self.assertNotIn(self.tax_10_cc1, product.taxes_id) | ||||||
|  |         self.assertNotIn(self.tax_10_sc1, product.supplier_taxes_id) | ||||||
|  | 
 | ||||||
|  |     def test_default_tax_if_set_match(self): | ||||||
|  |         product = self.env['product.product'].sudo(self.user_2.id).create({ | ||||||
|  |             'name': 'Test Product', | ||||||
|  |             'taxes_id': [(6, 0, self.tax_20_cc2.ids)], | ||||||
|  |             'supplier_taxes_id': [(6, 0, self.tax_20_sc2.ids)], | ||||||
|  |             'company_id': False, | ||||||
|  |         }) | ||||||
|  |         product = product.sudo() | ||||||
|  |         self.assertIn(self.tax_10_cc1, product.taxes_id) | ||||||
|  |         self.assertIn(self.tax_10_sc1, product.supplier_taxes_id) | ||||||
|  | 
 | ||||||
|  |     def test_tax_not_default_set_match(self): | ||||||
|  |         IrValues = self.env['ir.values'] | ||||||
|  |         IrValues.set_default( | ||||||
|  |             'product.template', "taxes_id", [self.tax_20_cc1.id], | ||||||
|  |             for_all_users=True, company_id=self.company_1.id) | ||||||
|  |         IrValues.set_default( | ||||||
|  |             'product.template', "supplier_taxes_id", [self.tax_20_sc1.id], | ||||||
|  |             for_all_users=True, company_id=self.company_1.id) | ||||||
|  | 
 | ||||||
|  |         product = self.env['product.product'].sudo(self.user_1.id).create({ | ||||||
|  |             'name': 'Test Product', | ||||||
|  |             'taxes_id': [(6, 0, self.tax_10_cc1.ids)], | ||||||
|  |             'supplier_taxes_id': [(6, 0, self.tax_10_sc1.ids)], | ||||||
|  |             'company_id': False, | ||||||
|  |         }) | ||||||
|  |         product = product.sudo() | ||||||
|  |         self.assertIn(self.tax_10_cc2, product.taxes_id) | ||||||
|  |         self.assertIn(self.tax_10_sc2, product.supplier_taxes_id) | ||||||
|  | @ -0,0 +1,20 @@ | ||||||
|  | <?xml version="1.0" encoding="utf-8"?> | ||||||
|  | <!-- Copyright 2017 Carlos Dauden - Tecnativa <carlos.dauden@tecnativa.com> | ||||||
|  |      License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). --> | ||||||
|  | <odoo> | ||||||
|  | 
 | ||||||
|  |     <record model="ir.ui.view" id="product_template_form_view"> | ||||||
|  |         <field name="name">Product template form (multi-company tax button)</field> | ||||||
|  |         <field name="model">product.template</field> | ||||||
|  |         <field name="inherit_id" ref="account.product_template_form_view" /> | ||||||
|  |         <field name="arch" type="xml"> | ||||||
|  |             <field name ="taxes_id" position="after"> | ||||||
|  |               <button name="set_multicompany_taxes" | ||||||
|  |                       string="Propagate Taxes" | ||||||
|  |                       groups="account.group_account_user" | ||||||
|  |                       type="object"/> | ||||||
|  |             </field> | ||||||
|  |         </field> | ||||||
|  |     </record> | ||||||
|  | 
 | ||||||
|  | </odoo> | ||||||
|  | @ -13,6 +13,7 @@ | ||||||
|         <field name="country_id" search="[('code','=','AT')]"/> |         <field name="country_id" search="[('code','=','AT')]"/> | ||||||
|         <field name="vat">ATU17860303</field> |         <field name="vat">ATU17860303</field> | ||||||
|         <field name="vat_check_vies" eval="False"/> |         <field name="vat_check_vies" eval="False"/> | ||||||
|  |         <field name="supplier" eval="True"/> | ||||||
|     </record> |     </record> | ||||||
| 
 | 
 | ||||||
|     <function id="set_company_logo" model="res.company" name="set_company_logo"> |     <function id="set_company_logo" model="res.company" name="set_company_logo"> | ||||||
|  |  | ||||||
|  | @ -0,0 +1,22 @@ | ||||||
|  | # -*- coding: utf-8 -*- | ||||||
|  | ############################################################################## | ||||||
|  | # | ||||||
|  | #    datenpol gmbh | ||||||
|  | #    Copyright (C) 2013-TODAY datenpol gmbh (<http://www.datenpol.at/>) | ||||||
|  | # | ||||||
|  | #    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 <http://www.gnu.org/licenses/>. | ||||||
|  | # | ||||||
|  | ############################################################################## | ||||||
|  | 
 | ||||||
|  | from . import models | ||||||
|  | @ -0,0 +1,42 @@ | ||||||
|  | # -*- coding: utf-8 -*- | ||||||
|  | ############################################################################## | ||||||
|  | # | ||||||
|  | #    datenpol gmbh | ||||||
|  | #    Copyright (C) 2013-TODAY datenpol gmbh (<http://www.datenpol.at/>) | ||||||
|  | # | ||||||
|  | #    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 <http://www.gnu.org/licenses/>. | ||||||
|  | # | ||||||
|  | ############################################################################## | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | # noinspection PyStatementEffect | ||||||
|  | { | ||||||
|  |     'name': 'Inter-Company Invoicing', | ||||||
|  |     'category': 'Stock', | ||||||
|  |     'version': '11.0.1.0.0', | ||||||
|  |     'description': """Inter-Company Invoicing""", | ||||||
|  |     'author': 'datenpol gmbh', | ||||||
|  |     'website': 'http://www.datenpol.at/', | ||||||
|  |     'depends': [ | ||||||
|  |         'base', | ||||||
|  |         'account' | ||||||
|  |     ], | ||||||
|  |     'data': [ | ||||||
|  |         'views/account_views.xml', | ||||||
|  |         'views/res_company_views.xml', | ||||||
|  |         'security/ir.model.access.csv', | ||||||
|  |     ], | ||||||
|  |     'installable': True, | ||||||
|  |     'auto_install': False, | ||||||
|  | } | ||||||
|  | @ -0,0 +1,23 @@ | ||||||
|  | # -*- coding: utf-8 -*- | ||||||
|  | ############################################################################## | ||||||
|  | # | ||||||
|  | #    OpenERP, Open Source Management Solution | ||||||
|  | #    Copyright (C) 20014-2016 datenpol gmbh (<http://www.datenpol.at/>). | ||||||
|  | # | ||||||
|  | #    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 <http://www.gnu.org/licenses/>. | ||||||
|  | # | ||||||
|  | ############################################################################## | ||||||
|  | 
 | ||||||
|  | from . import res_company | ||||||
|  | from . import account | ||||||
|  | @ -0,0 +1,185 @@ | ||||||
|  | # -*- coding: utf-8 -*- | ||||||
|  | ############################################################################## | ||||||
|  | # | ||||||
|  | #    datenpol gmbh | ||||||
|  | #    Copyright (C) 2013-TODAY datenpol gmbh (<http://www.datenpol.at/>) | ||||||
|  | # | ||||||
|  | #    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 <http://www.gnu.org/licenses/>. | ||||||
|  | # | ||||||
|  | ############################################################################## | ||||||
|  | from odoo import api, fields, models, _ | ||||||
|  | from odoo.exceptions import ValidationError | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class AccountInvoice(models.Model): | ||||||
|  |     _inherit = 'account.invoice' | ||||||
|  | 
 | ||||||
|  |     @api.model | ||||||
|  |     def default_inter_company_supplier_isset(self): | ||||||
|  |         return bool(self.env.user.company_id.inter_company_supplier_id.id) | ||||||
|  | 
 | ||||||
|  |     inter_company_supplier_isset = fields.Boolean(compute='_compute_inter_company_supplier_isset', | ||||||
|  |                                                   default=default_inter_company_supplier_isset) | ||||||
|  | 
 | ||||||
|  |     reimburse_invoice_id = fields.Many2one(comodel_name='account.invoice', string='Weiterverrechnung') | ||||||
|  |     charge_further = fields.Boolean(string='Weiterverrechnen', compute='_compute_charge_further', store=True, | ||||||
|  |                                     help='Ist gesetzt, wenn das WV-Flag von mindestens einer Zeile gesetzt ist') | ||||||
|  | 
 | ||||||
|  |     @api.multi | ||||||
|  |     def _compute_inter_company_supplier_isset(self): | ||||||
|  |         for record in self: | ||||||
|  |             record.inter_company_supplier_isset = bool(self.env.user.company_id.inter_company_supplier_id.id) | ||||||
|  | 
 | ||||||
|  |     @api.multi | ||||||
|  |     @api.depends('invoice_line_ids.reimbursement') | ||||||
|  |     def _compute_charge_further(self): | ||||||
|  |         for record in self: | ||||||
|  |             record.charge_further = False | ||||||
|  |             for line in record.invoice_line_ids: | ||||||
|  |                 if line.reimbursement: | ||||||
|  |                     record.charge_further = True | ||||||
|  |                     break | ||||||
|  | 
 | ||||||
|  |     @api.multi | ||||||
|  |     def action_set_all_wv_flag(self): | ||||||
|  |         for record in self: | ||||||
|  |             for line in record.invoice_line_ids: | ||||||
|  |                 line.reimbursement = True | ||||||
|  | 
 | ||||||
|  |     @api.multi | ||||||
|  |     def action_unset_all_wv_flag(self): | ||||||
|  |         for record in self: | ||||||
|  |             for line in record.invoice_line_ids: | ||||||
|  |                 line.reimbursement = False | ||||||
|  | 
 | ||||||
|  |     @api.multi | ||||||
|  |     def reimburse_invoice(self): | ||||||
|  |         for record in self: | ||||||
|  |             if not record.charge_further: | ||||||
|  |                 raise ValidationError(_('Sie müssen mindestens eine Position mit WV markieren.')) | ||||||
|  |             if record.charge_further: | ||||||
|  |                 intercompany_admin_id = record.company_id.admin_user_id | ||||||
|  |                 in_invoice_vals = record._prepare_er_invoice_data() | ||||||
|  |                 invoice_id = self.env['account.invoice'].sudo(intercompany_admin_id).create( | ||||||
|  |                     in_invoice_vals) | ||||||
|  |                 record.reimburse_invoice_id = invoice_id.id | ||||||
|  |                 for line in record.invoice_line_ids: | ||||||
|  |                     if line.reimbursement: | ||||||
|  |                         in_line_vals = record._prepare_er_invoice_line_data(line, invoice_id) | ||||||
|  |                         self.env['account.invoice.line'].sudo(intercompany_admin_id).create(in_line_vals) | ||||||
|  |                 invoice_id.compute_taxes() | ||||||
|  | 
 | ||||||
|  |     @api.multi | ||||||
|  |     def _prepare_er_invoice_data(self): | ||||||
|  |         self.ensure_one() | ||||||
|  | 
 | ||||||
|  |         journal = self.env['account.journal'].sudo(self.company_id.admin_user_id).search( | ||||||
|  |             [('type', '=', 'purchase'), ('company_id', '=', self.company_id.id)], limit=1) | ||||||
|  |         vals = { | ||||||
|  |             'company_id': self.company_id.id, | ||||||
|  |             'type': 'in_invoice', | ||||||
|  |             'partner_id': self.company_id.inter_company_supplier_id.partner_id.id, | ||||||
|  |             'origin': "Weiterverrechnung von " + self.number, | ||||||
|  |             'journal_id': journal.id, | ||||||
|  |             'currency_id': self.currency_id and self.currency_id.id, | ||||||
|  |         } | ||||||
|  |         inv = self.env['account.invoice'].with_context(company_id=self.company_id.id).sudo( | ||||||
|  |             self.company_id.admin_user_id).new(vals) | ||||||
|  |         inv._onchange_partner_id() | ||||||
|  |         new_vals = {k: v or False for k, v in dict(inv._cache).items()} | ||||||
|  |         return inv._convert_to_write(new_vals) | ||||||
|  | 
 | ||||||
|  |     @api.model | ||||||
|  |     def _prepare_er_invoice_line_data(self, line, invoice_id): | ||||||
|  |         vals = { | ||||||
|  |             'name': line.name, | ||||||
|  |             'price_unit': line.price_unit * (line.invoice_id.company_id.percentage_billing / 100), | ||||||
|  |             'quantity': line.quantity, | ||||||
|  |             'discount': line.discount, | ||||||
|  |             'product_id': line.product_id.id or False, | ||||||
|  |             'uom_id': line.uom_id.id or False, | ||||||
|  |             'sequence': line.sequence, | ||||||
|  |             'invoice_id': invoice_id.id | ||||||
|  |         } | ||||||
|  |         new_line = self.env['account.invoice.line'].with_context(company_id=line.invoice_id.company_id.id).sudo( | ||||||
|  |             line.invoice_id.company_id.admin_user_id).new(vals) | ||||||
|  |         new_line._onchange_product_id() | ||||||
|  |         new_line_vals = {k: v or False for k, v in dict(new_line._cache).items()} | ||||||
|  |         return new_line._convert_to_write(new_line_vals) | ||||||
|  | 
 | ||||||
|  |     @api.multi | ||||||
|  |     def invoice_validate(self): | ||||||
|  |         res = super(AccountInvoice, self).invoice_validate() | ||||||
|  |         for record in self: | ||||||
|  |             if record.type == 'in_invoice' and record.partner_id.id == record.company_id.inter_company_supplier_id.partner_id.id: | ||||||
|  |                 company_id = record.company_id.inter_company_supplier_id | ||||||
|  |                 intercompany_admin_id = company_id.admin_user_id | ||||||
|  |                 out_invoice_vals = record._prepare_ic_invoice_data() | ||||||
|  |                 invoice_id = self.env['account.invoice'].sudo(intercompany_admin_id).create( | ||||||
|  |                     out_invoice_vals) | ||||||
|  |                 for line in record.invoice_line_ids: | ||||||
|  |                     out_line_vals = record._prepare_ic_invoice_line_data(line, invoice_id) | ||||||
|  |                     self.env['account.invoice.line'].sudo(intercompany_admin_id).create(out_line_vals) | ||||||
|  |                 invoice_id.compute_taxes() | ||||||
|  |         return res | ||||||
|  | 
 | ||||||
|  |     @api.multi | ||||||
|  |     def _prepare_ic_invoice_data(self): | ||||||
|  |         self.ensure_one() | ||||||
|  | 
 | ||||||
|  |         journal = self.env['account.journal'].sudo(self.company_id.inter_company_supplier_id.admin_user_id).search( | ||||||
|  |             [('type', '=', 'sale'), ('company_id', '=', self.company_id.inter_company_supplier_id.id)], limit=1) | ||||||
|  |         vals = { | ||||||
|  |             'company_id': self.company_id.inter_company_supplier_id.id, | ||||||
|  |             'type': 'out_invoice', | ||||||
|  |             'partner_id': self.company_id.partner_id.id, | ||||||
|  |             'origin': self.origin, | ||||||
|  |             'journal_id': journal.id, | ||||||
|  |             'currency_id': self.currency_id and self.currency_id.id, | ||||||
|  |         } | ||||||
|  |         inv = self.env['account.invoice'].with_context(company_id=self.company_id.inter_company_supplier_id.id).sudo( | ||||||
|  |             self.company_id.inter_company_supplier_id.admin_user_id).new(vals) | ||||||
|  |         inv._onchange_partner_id() | ||||||
|  |         new_vals = {k: v or False for k, v in dict(inv._cache).items()} | ||||||
|  |         return inv._convert_to_write(new_vals) | ||||||
|  | 
 | ||||||
|  |     @api.model | ||||||
|  |     def _prepare_ic_invoice_line_data(self, line, invoice_id): | ||||||
|  |         vals = { | ||||||
|  |             'name': line.name, | ||||||
|  |             'quantity': line.quantity, | ||||||
|  |             'discount': line.discount, | ||||||
|  |             'product_id': line.product_id.id or False, | ||||||
|  |             'uom_id': line.uom_id.id or False, | ||||||
|  |             'sequence': line.sequence, | ||||||
|  |             'invoice_id': invoice_id.id | ||||||
|  |         } | ||||||
|  |         admin_user = line.invoice_id.company_id.inter_company_supplier_id.admin_user_id | ||||||
|  |         company_id = line.invoice_id.company_id.inter_company_supplier_id.id | ||||||
|  |         new_line = self.env['account.invoice.line'].with_context(company_id=company_id).sudo(admin_user).new(vals) | ||||||
|  |         new_line._onchange_product_id() | ||||||
|  |         new_line.price_unit = line.price_unit | ||||||
|  |         new_line_vals = {k: v or False for k, v in dict(new_line._cache).items()} | ||||||
|  |         return new_line._convert_to_write(new_line_vals) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class AccountInvoiceLine(models.Model): | ||||||
|  |     _inherit = 'account.invoice.line' | ||||||
|  | 
 | ||||||
|  |     reimbursement = fields.Boolean(string='WV', help='Wenn Weiterverrechnung (WV) gesetzt ist, dann wird diese Zeile ' \ | ||||||
|  |                                                      'intern weiterverrechnet', ) | ||||||
|  | 
 | ||||||
|  |     inter_company_supplier_isset = fields.Boolean(related='invoice_id.inter_company_supplier_isset') | ||||||
|  | 
 | ||||||
|  |     state = fields.Selection(related='invoice_id.state') | ||||||
|  | @ -0,0 +1,33 @@ | ||||||
|  | # -*- coding: utf-8 -*- | ||||||
|  | ############################################################################## | ||||||
|  | # | ||||||
|  | #    datenpol gmbh | ||||||
|  | #    Copyright (C) 2013-TODAY datenpol gmbh (<http://www.datenpol.at/>) | ||||||
|  | # | ||||||
|  | #    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 <http://www.gnu.org/licenses/>. | ||||||
|  | # | ||||||
|  | ############################################################################## | ||||||
|  | from odoo import models, api, fields | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class Company(models.Model): | ||||||
|  |     _inherit = 'res.company' | ||||||
|  | 
 | ||||||
|  |     inter_company_supplier_id = fields.Many2one(comodel_name='res.company', string='Inter-Company Lieferant', | ||||||
|  |                                                 help='Wenn gesetzt, dann wird eine Eingangsrechung von diesem ' \ | ||||||
|  |                                                      'Lieferant erstellt. Im Unternehmen des Lieferanten wird entsprechend eine Ausgangsrechnung erstellt') | ||||||
|  |     percentage_billing = fields.Float(string='Prozentsatz Weiterverrechnung', | ||||||
|  |                                       help='Wenn hier 70% hinterlegt ist, dann wird bei einer Weiterverrechnung eine Eingangsrechnung erstellt mit einem um  30% verminderten Preis erstellt') | ||||||
|  |     admin_user_id = fields.Many2one(comodel_name='res.users', | ||||||
|  |                                     help='Mit diesem User werden Inter-Company Rechnungen erstellt') | ||||||
|  | @ -0,0 +1 @@ | ||||||
|  | id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink | ||||||
| 
 | 
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 2.2 KiB | 
|  | @ -0,0 +1,45 @@ | ||||||
|  | <?xml version="1.0" encoding="utf-8"?> | ||||||
|  | <odoo> | ||||||
|  | 
 | ||||||
|  |     <record id="account_invoice_form_view" model="ir.ui.view"> | ||||||
|  |         <field name="name">account_invoice_form_view</field> | ||||||
|  |         <field name="model">account.invoice</field> | ||||||
|  |         <field name="inherit_id" ref="account.invoice_form"/> | ||||||
|  |         <field name="arch" type="xml"> | ||||||
|  |             <xpath expr="//button[@name='action_invoice_cancel']" position="after"> | ||||||
|  |                 <button name="reimburse_invoice" type="object" | ||||||
|  |                         attrs="{'invisible': ['|', ('state', '=', 'draft'), '|', ('reimburse_invoice_id', '!=', False), '|', ('type', '!=', 'out_invoice'), ('charge_further', '=', False)]}" | ||||||
|  |                         string="Weiterverrechnen" groups="account.group_account_invoice"/> | ||||||
|  |             </xpath> | ||||||
|  |             <field name="payment_term_id" position="after"> | ||||||
|  |                 <label for="charge_further"/> | ||||||
|  |                 <div class="o_row" name="charge_further"> | ||||||
|  |                     <field name="charge_further"/> | ||||||
|  |                     <button class="btn btn-primary" type="object" name="action_set_all_wv_flag" string="Setzen"/> | ||||||
|  |                     <button class="btn btn-primary" type="object" name="action_unset_all_wv_flag" string="Löschen"/> | ||||||
|  |                 </div> | ||||||
|  |                 <field name="reimburse_invoice_id"/> | ||||||
|  |             </field> | ||||||
|  | 
 | ||||||
|  |             <xpath expr="//field[@name='invoice_line_ids']/tree//field[@name='account_id']" position="before"> | ||||||
|  |                 <field name="inter_company_supplier_isset" invisible="1"/> | ||||||
|  |                 <field name="state" invisible="1"/> | ||||||
|  |                 <field name="reimbursement" | ||||||
|  |                        attrs="{'invisible': [('inter_company_supplier_isset', '=', False)], 'readonly': [('state', '!=', 'draft')]}"/> | ||||||
|  |             </xpath> | ||||||
|  |         </field> | ||||||
|  |     </record> | ||||||
|  | 
 | ||||||
|  |     <record id="account_invoice_filter_search_view" model="ir.ui.view"> | ||||||
|  |         <field name="name">account_invoice_filter_search_view</field> | ||||||
|  |         <field name="model">account.invoice</field> | ||||||
|  |         <field name="inherit_id" ref="account.view_account_invoice_filter_inherit_invoices"/> | ||||||
|  |         <field name="arch" type="xml"> | ||||||
|  |             <xpath expr="filter[@name='draft']" position="before"> | ||||||
|  |                 <filter name="reimburse" string="Weiterverrechnen" | ||||||
|  |                         domain="[('state', '!=', 'draft'), ('reimburse_invoice_id', '=', False), ('type', '=', 'out_invoice'), ('charge_further', '!=', False), ('inter_company_supplier_isset', '=', True)]"/> | ||||||
|  |             </xpath> | ||||||
|  |         </field> | ||||||
|  |     </record> | ||||||
|  | 
 | ||||||
|  | </odoo> | ||||||
|  | @ -0,0 +1,26 @@ | ||||||
|  | <?xml version="1.0" encoding="utf-8"?> | ||||||
|  | <odoo> | ||||||
|  | 
 | ||||||
|  |     <record id="res_company_form_view" model="ir.ui.view"> | ||||||
|  |         <field name="name">res_company_form_view</field> | ||||||
|  |         <field name="model">res.company</field> | ||||||
|  |         <field name="inherit_id" ref="base.view_company_form"/> | ||||||
|  |         <field name="arch" type="xml"> | ||||||
|  |             <field name="parent_id" position="after"> | ||||||
|  |                 <field name="inter_company_supplier_id"/> | ||||||
|  |                 <field name="percentage_billing"/> | ||||||
|  |                 <field name="admin_user_id"/> | ||||||
|  |             </field> | ||||||
|  |         </field> | ||||||
|  |     </record> | ||||||
|  | 
 | ||||||
|  |     <record id="action_reimburse_invoice" model="ir.actions.server"> | ||||||
|  |         <field name="name">Intern Weiterverrechnen</field> | ||||||
|  |         <field name="model_id" ref="account.model_account_invoice"/> | ||||||
|  |         <field name="binding_model_id" ref="account.model_account_invoice"/> | ||||||
|  |         <field name="binding_type">action</field> | ||||||
|  |         <field name="state">code</field>9 | ||||||
|  |         <field name="code">records.reimburse_invoice()</field> | ||||||
|  |     </record> | ||||||
|  | 
 | ||||||
|  | </odoo> | ||||||
|  | @ -22,6 +22,7 @@ class ConfigGlaser(Config): | ||||||
|             'vat': 'ATU17860303', |             'vat': 'ATU17860303', | ||||||
|             'vat_check_vies': True, |             'vat_check_vies': True, | ||||||
|             'logo': '../ext/custom-addons/dp_custom/static/src/img/logo_glaser.png', |             'logo': '../ext/custom-addons/dp_custom/static/src/img/logo_glaser.png', | ||||||
|  |             'supplier': True, | ||||||
|             #'favicon_backend': '../ext/custom-addons/dp_custom/static/src/img/favicon.ico', |             #'favicon_backend': '../ext/custom-addons/dp_custom/static/src/img/favicon.ico', | ||||||
|             #'favicon_backend_mimetype': 'image/x-icon' |             #'favicon_backend_mimetype': 'image/x-icon' | ||||||
|         } |         } | ||||||
|  |  | ||||||
|  | @ -22,6 +22,7 @@ class ConfigTZA(Config): | ||||||
|             'vat': 'ATU 54619104', |             'vat': 'ATU 54619104', | ||||||
|             'vat_check_vies': True, |             'vat_check_vies': True, | ||||||
|             'logo': '../ext/custom-addons/dp_custom/static/src/img/logo.png', |             'logo': '../ext/custom-addons/dp_custom/static/src/img/logo.png', | ||||||
|  |             'customer': True, | ||||||
|             #'favicon_backend': '../ext/custom-addons/dp_custom/static/src/img/favicon.ico', |             #'favicon_backend': '../ext/custom-addons/dp_custom/static/src/img/favicon.ico', | ||||||
|             #'favicon_backend_mimetype': 'image/x-icon' |             #'favicon_backend_mimetype': 'image/x-icon' | ||||||
|         } |         } | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue