From b0fc4c692eb31c018dd917272a9374ce5f57201d Mon Sep 17 00:00:00 2001 From: Sergi Almacellas Abellana Date: Wed, 6 Apr 2016 16:52:52 +0200 Subject: [PATCH] Add company domain on analytic_* modules --- analytic_account.diff | 150 +++++++++++++++++++++++++++++++++++++++++ analytic_invoice.diff | 48 +++++++++++++ analytic_purchase.diff | 37 ++++++++++ analytic_sale.diff | 45 +++++++++++++ series | 4 ++ 5 files changed, 284 insertions(+) create mode 100644 analytic_account.diff create mode 100644 analytic_invoice.diff create mode 100644 analytic_purchase.diff create mode 100644 analytic_sale.diff diff --git a/analytic_account.diff b/analytic_account.diff new file mode 100644 index 0000000..f73deec --- /dev/null +++ b/analytic_account.diff @@ -0,0 +1,150 @@ +# HG changeset patch +# User Sergi Almacellas Abellana +Add company domain + + +issue5104 + +review19141003 + +Index: trytond/trytond/modules/analytic_account/account.py +=================================================================== + +--- a/trytond/trytond/modules/analytic_account/account.py ++++ b/trytond/trytond/modules/analytic_account/account.py +@@ -8,7 +8,7 @@ + from trytond import backend + from trytond.model import ModelView, ModelSQL, fields, Unique + from trytond.wizard import Wizard, StateView, StateAction, Button +-from trytond.pyson import Eval, PYSONEncoder ++from trytond.pyson import Eval, If, PYSONEncoder, PYSONDecoder + from trytond.transaction import Transaction + from trytond.pool import Pool + +@@ -22,7 +22,7 @@ + name = fields.Char('Name', required=True, translate=True, select=True) + code = fields.Char('Code', select=True) + active = fields.Boolean('Active', select=True) +- company = fields.Many2One('company.company', 'Company') ++ company = fields.Many2One('company.company', 'Company', required=True) + currency = fields.Many2One('currency.currency', 'Currency', required=True) + currency_digits = fields.Function(fields.Integer('Currency Digits'), + 'on_change_with_currency_digits') +@@ -311,19 +311,26 @@ + __name__ = 'analytic.account.entry' + origin = fields.Reference('Origin', selection='get_origin', select=True) + root = fields.Many2One('analytic_account.account', 'Root Analytic', +- domain=[('type', '=', 'root')]) ++ domain=[ ++ ('company', '=', Eval('company')), ++ ('type', '=', 'root'), ++ ], ++ depends=['company']) + account = fields.Many2One('analytic_account.account', 'Account', + ondelete='RESTRICT', + states={ + 'required': Eval('required', False), + }, + domain=[ ++ ('company', '=', Eval('company')), + ('root', '=', Eval('root')), + ('type', '=', 'normal'), + ], +- depends=['root', 'required']) ++ depends=['root', 'required', 'company']) + required = fields.Function(fields.Boolean('Required'), + 'on_change_with_required') ++ company = fields.Function(fields.Many2One('company.company', 'Company'), ++ 'on_change_with_company', searcher='search_company') + + @classmethod + def __register__(cls, module_name): +@@ -386,12 +393,27 @@ + return self.root.mandatory + return False + ++ @classmethod ++ def default_company(cls): ++ return Transaction().context.get('company') ++ ++ def on_change_with_company(self, name=None): ++ return Transaction().context.get('company') ++ ++ @classmethod ++ def search_company(cls, name, clause): ++ raise NotImplementedError() ++ + + class AnalyticMixin(ModelSQL): + + analytic_accounts = fields.One2Many('analytic.account.entry', 'origin', + 'Analytic Accounts', + size=Eval('analytic_accounts_size', 0), ++ domain=[ ++ ('company', If(Eval('context', {}).contains('company'), '=', '!='), ++ Eval('context', {}).get('company', -1)), ++ ], + depends=['analytic_accounts_size']) + analytic_accounts_size = fields.Function(fields.Integer( + 'Analytic Accounts Size'), 'get_analytic_accounts_size') +@@ -427,13 +449,19 @@ + where=entry.selection == selection_id)) + handler.drop_column('analytic_accounts') + +- @staticmethod +- def default_analytic_accounts(): ++ @classmethod ++ def analytic_accounts_domain(cls): ++ return PYSONDecoder(Transaction().context).decode( ++ PYSONEncoder().encode(cls.analytic_accounts.domain)) ++ ++ @classmethod ++ def default_analytic_accounts(cls): + pool = Pool() + AnalyticAccount = pool.get('analytic_account.account') + + accounts = [] +- root_accounts = AnalyticAccount.search([ ++ root_accounts = AnalyticAccount.search( ++ cls.analytic_accounts_domain() + [ + ('parent', '=', None), + ]) + for account in root_accounts: +@@ -443,11 +471,14 @@ + }) + return accounts + +- @staticmethod +- def default_analytic_accounts_size(): ++ @classmethod ++ def default_analytic_accounts_size(cls): + pool = Pool() + AnalyticAccount = pool.get('analytic_account.account') +- return len(AnalyticAccount.search([('type', '=', 'root')])) ++ return len(AnalyticAccount.search( ++ cls.analytic_accounts_domain() + [ ++ ('type', '=', 'root'), ++ ])) + + @classmethod + def get_analytic_accounts_size(cls, records, name): +@@ -464,12 +495,17 @@ + "Check that all mandatory root entries are defined in entries" + pool = Pool() + Account = pool.get('analytic_account.account') +- mandatory_roots = {a for a in Account.search([ ++ all_mandatory_roots = {a for a in Account.search([ + ('type', '=', 'root'), + ('mandatory', '=', True), + ])} + for analytic in analytics: + analytic_roots = {e.root for e in analytic.analytic_accounts} ++ companies = {e.company for e in analytic.analytic_accounts} ++ mandatory_roots = set() ++ for mandatory in all_mandatory_roots: ++ if mandatory.company in companies: ++ mandatory_roots.add(mandatory) + if not mandatory_roots <= analytic_roots: + cls.raise_user_error('root_account', { + 'name': analytic.rec_name, + diff --git a/analytic_invoice.diff b/analytic_invoice.diff new file mode 100644 index 0000000..61b04af --- /dev/null +++ b/analytic_invoice.diff @@ -0,0 +1,48 @@ +# HG changeset patch +# User Sergi Almacellas Abellana +Add company domain on analytic entries + + +issue5104 + + +review24081002 + +Index: trytond/trytond/modules/analytic_invoice/invoice.py +=================================================================== + +--- a/trytond/trytond/modules/analytic_invoice/invoice.py ++++ b/trytond/trytond/modules/analytic_invoice/invoice.py +@@ -1,5 +1,6 @@ + # This file is part of Tryton. The COPYRIGHT file at the top level of + # this repository contains the full copyright notices and license terms. ++from trytond.model import fields + from trytond.pool import PoolMeta, Pool + + from trytond.modules.analytic_account import AnalyticMixin +@@ -61,3 +62,24 @@ + def _get_origin(cls): + origins = super(AnalyticAccountEntry, cls)._get_origin() + return origins + ['account.invoice.line'] ++ ++ @fields.depends('origin') ++ def on_change_with_company(self, name=None): ++ pool = Pool() ++ InvoiceLine = pool.get('account.invoice.line') ++ company = super(AnalyticAccountEntry, self).on_change_with_company( ++ name) ++ if isinstance(self.origin, InvoiceLine): ++ if self.origin.invoice: ++ return self.origin.invoice.company.id ++ elif self.origin.company: ++ return self.origin.company.id ++ return company ++ ++ @classmethod ++ def search_company(cls, name, clause): ++ return ['OR', ++ [('origin.company',) + tuple(clause[1:]) + ++ tuple(('account.invoice.line',))], ++ [('origin.invoice.company',) + tuple(clause[1:]) + ++ tuple(('account.invoice.line',))]] + diff --git a/analytic_purchase.diff b/analytic_purchase.diff new file mode 100644 index 0000000..ec55380 --- /dev/null +++ b/analytic_purchase.diff @@ -0,0 +1,37 @@ +# HG changeset patch +# User Sergi Almacellas Abellana +Add company domain on analytic entries + +issue5104 + +review17201002 + +Index: trytond/trytond/modules/analytic_purchase/purchase.py +=================================================================== + +--- a/trytond/trytond/modules/analytic_purchase/purchase.py ++++ b/trytond/trytond/modules/analytic_purchase/purchase.py +@@ -79,3 +79,22 @@ + and self.origin.purchase.state in ['cancel', 'draft']): + return False + return required ++ ++ @fields.depends('origin') ++ def on_change_with_company(self, name=None): ++ pool = Pool() ++ PurchaseLine = pool.get('purchase.line') ++ company = super(AnalyticAccountEntry, self).on_change_with_company( ++ name) ++ if isinstance(self.origin, PurchaseLine): ++ if self.origin.purchase: ++ return self.origin.purchase.company.id ++ return company ++ ++ @classmethod ++ def search_company(cls, name, clause): ++ domain = super(AnalyticAccountEntry, cls).search_company(name, clause) ++ return ['OR', ++ domain, ++ [('origin.purchase.company',) + tuple(clause[1:]) + ++ tuple(('purchase.line',))]] + diff --git a/analytic_sale.diff b/analytic_sale.diff new file mode 100644 index 0000000..07cbb2d --- /dev/null +++ b/analytic_sale.diff @@ -0,0 +1,45 @@ +# HG changeset patch +# User Sergi Almacellas Abellana +Add company domain on analytic entries + + +issue5104 + +review17991002 + +Index: trytond/trytond/modules/analytic_sale/sale.py +=================================================================== + +--- a/trytond/trytond/modules/analytic_sale/sale.py ++++ b/trytond/trytond/modules/analytic_sale/sale.py +@@ -1,5 +1,6 @@ + # This file is part of Tryton. The COPYRIGHT file at the top level of + # this repository contains the full copyright notices and license terms. ++from trytond.model import fields + from trytond.pool import Pool, PoolMeta + + from trytond.modules.analytic_account import AnalyticMixin +@@ -32,3 +33,22 @@ + def _get_origin(cls): + origins = super(AnalyticAccountEntry, cls)._get_origin() + return origins + ['sale.line'] ++ ++ @fields.depends('origin') ++ def on_change_with_company(self, name=None): ++ pool = Pool() ++ SaleLine = pool.get('sale.line') ++ company = super(AnalyticAccountEntry, self).on_change_with_company( ++ name) ++ if isinstance(self.origin, SaleLine): ++ if self.origin.sale: ++ return self.origin.sale.company.id ++ return company ++ ++ @classmethod ++ def search_company(cls, name, clause): ++ domain = super(AnalyticAccountEntry, cls).search_company(name, clause) ++ return ['OR', ++ domain, ++ [('origin.sale.company',) + tuple(clause[1:]) + ++ tuple(('sale.line',))]] + diff --git a/series b/series index 4c7731b..31cca62 100644 --- a/series +++ b/series @@ -35,6 +35,10 @@ issue23901002_1.diff issue17881002_1.diff workflow-performance.diff account_chart_speedup.diff +analytic_account.diff +analytic_invoice.diff +analytic_sale.diff +analytic_purchase.diff # Ignore next patches #incremental_wait_in_retries.diff