summaryrefslogtreecommitdiff
path: root/addons/account/models/account_analytic_line.py
diff options
context:
space:
mode:
Diffstat (limited to 'addons/account/models/account_analytic_line.py')
-rw-r--r--addons/account/models/account_analytic_line.py93
1 files changed, 93 insertions, 0 deletions
diff --git a/addons/account/models/account_analytic_line.py b/addons/account/models/account_analytic_line.py
new file mode 100644
index 00000000..80e35b80
--- /dev/null
+++ b/addons/account/models/account_analytic_line.py
@@ -0,0 +1,93 @@
+# -*- coding: utf-8 -*-
+
+from odoo import api, fields, models, _
+from odoo.exceptions import UserError
+
+
+class AccountAnalyticAccount(models.Model):
+ _inherit = 'account.analytic.account'
+
+ @api.constrains('company_id')
+ def _check_company_consistency(self):
+ analytic_accounts = self.filtered('company_id')
+
+ if not analytic_accounts:
+ return
+
+ self.flush(['company_id'])
+ self._cr.execute('''
+ SELECT line.id
+ FROM account_move_line line
+ JOIN account_analytic_account account ON account.id = line.analytic_account_id
+ WHERE line.analytic_account_id IN %s
+ AND line.company_id != account.company_id
+ ''', [tuple(analytic_accounts.ids)])
+
+ if self._cr.fetchone():
+ raise UserError(_("You can't set a different company on your analytic account since there are some journal items linked to it."))
+
+
+class AccountAnalyticTag(models.Model):
+ _inherit = 'account.analytic.tag'
+
+ @api.constrains('company_id')
+ def _check_company_consistency(self):
+ analytic_tags = self.filtered('company_id')
+
+ if not analytic_tags:
+ return
+
+ self.flush(['company_id'])
+ self._cr.execute('''
+ SELECT line.id
+ FROM account_analytic_tag_account_move_line_rel tag_rel
+ JOIN account_analytic_tag tag ON tag.id = tag_rel.account_analytic_tag_id
+ JOIN account_move_line line ON line.id = tag_rel.account_move_line_id
+ WHERE tag_rel.account_analytic_tag_id IN %s
+ AND line.company_id != tag.company_id
+ ''', [tuple(analytic_tags.ids)])
+
+ if self._cr.fetchone():
+ raise UserError(_("You can't set a different company on your analytic tags since there are some journal items linked to it."))
+
+
+class AccountAnalyticLine(models.Model):
+ _inherit = 'account.analytic.line'
+ _description = 'Analytic Line'
+
+ product_id = fields.Many2one('product.product', string='Product', check_company=True)
+ general_account_id = fields.Many2one('account.account', string='Financial Account', ondelete='restrict', readonly=True,
+ related='move_id.account_id', store=True, domain="[('deprecated', '=', False), ('company_id', '=', company_id)]",
+ compute_sudo=True)
+ move_id = fields.Many2one('account.move.line', string='Journal Item', ondelete='cascade', index=True, check_company=True)
+ code = fields.Char(size=8)
+ ref = fields.Char(string='Ref.')
+
+ @api.onchange('product_id', 'product_uom_id', 'unit_amount', 'currency_id')
+ def on_change_unit_amount(self):
+ if not self.product_id:
+ return {}
+
+ result = 0.0
+ prod_accounts = self.product_id.product_tmpl_id.with_company(self.company_id)._get_product_accounts()
+ unit = self.product_uom_id
+ account = prod_accounts['expense']
+ if not unit or self.product_id.uom_po_id.category_id.id != unit.category_id.id:
+ unit = self.product_id.uom_po_id
+
+ # Compute based on pricetype
+ amount_unit = self.product_id.price_compute('standard_price', uom=unit)[self.product_id.id]
+ amount = amount_unit * self.unit_amount or 0.0
+ result = (self.currency_id.round(amount) if self.currency_id else round(amount, 2)) * -1
+ self.amount = result
+ self.general_account_id = account
+ self.product_uom_id = unit
+
+ @api.model
+ def view_header_get(self, view_id, view_type):
+ if self.env.context.get('account_id'):
+ return _(
+ "Entries: %(account)s",
+ account=self.env['account.analytic.account'].browse(self.env.context['account_id']).name
+ )
+ return super().view_header_get(view_id, view_type)