Add company domain on analytic_* modules

This commit is contained in:
Sergi Almacellas Abellana 2016-04-06 16:52:52 +02:00
parent edfe02e547
commit b0fc4c692e
5 changed files with 284 additions and 0 deletions

150
analytic_account.diff Normal file
View File

@ -0,0 +1,150 @@
# HG changeset patch
# User Sergi Almacellas Abellana <sergi@koolpi.com>
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,

48
analytic_invoice.diff Normal file
View File

@ -0,0 +1,48 @@
# HG changeset patch
# User Sergi Almacellas Abellana <sergi@koolpi.com>
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',))]]

37
analytic_purchase.diff Normal file
View File

@ -0,0 +1,37 @@
# HG changeset patch
# User Sergi Almacellas Abellana <sergi@koolpi.com>
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',))]]

45
analytic_sale.diff Normal file
View File

@ -0,0 +1,45 @@
# HG changeset patch
# User Sergi Almacellas Abellana <sergi@koolpi.com>
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',))]]

4
series
View File

@ -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