diff --git a/addons/account/models/account_analytic_line.py b/addons/account/models/account_analytic_line.py
index 80e35b8080b..92f19595a42 100644
--- a/addons/account/models/account_analytic_line.py
+++ b/addons/account/models/account_analytic_line.py
@@ -7,6 +7,9 @@ from odoo.exceptions import UserError
class AccountAnalyticAccount(models.Model):
_inherit = 'account.analytic.account'
+ invoice_count = fields.Integer("Invoice Count", compute='_compute_invoice_count')
+ vendor_bill_count = fields.Integer("Vendor Bill Count", compute='_compute_vendor_bill_count')
+
@api.constrains('company_id')
def _check_company_consistency(self):
analytic_accounts = self.filtered('company_id')
@@ -26,6 +29,55 @@ class AccountAnalyticAccount(models.Model):
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."))
+ @api.depends('line_ids')
+ def _compute_invoice_count(self):
+ sale_types = self.env['account.move'].get_sale_types()
+ domain = [
+ ('move_id.state', '=', 'posted'),
+ ('move_id.move_type', 'in', sale_types),
+ ('analytic_account_id', 'in', self.ids)
+ ]
+ groups = self.env['account.move.line'].read_group(domain, ['move_id:count_distinct'], ['analytic_account_id'])
+ moves_count_mapping = dict((g['analytic_account_id'][0], g['analytic_account_id_count']) for g in groups)
+ for account in self:
+ account.invoice_count = moves_count_mapping.get(account.id, 0)
+
+ @api.depends('line_ids')
+ def _compute_vendor_bill_count(self):
+ purchase_types = self.env['account.move'].get_purchase_types()
+ domain = [
+ ('move_id.state', '=', 'posted'),
+ ('move_id.move_type', 'in', purchase_types),
+ ('analytic_account_id', 'in', self.ids)
+ ]
+ groups = self.env['account.move.line'].read_group(domain, ['move_id:count_distinct'], ['analytic_account_id'])
+ moves_count_mapping = dict((g['analytic_account_id'][0], g['analytic_account_id_count']) for g in groups)
+ for account in self:
+ account.vendor_bill_count = moves_count_mapping.get(account.id, 0)
+
+ def action_view_invoice(self):
+ self.ensure_one()
+ result = {
+ "type": "ir.actions.act_window",
+ "res_model": "account.move",
+ "domain": [('id', 'in', self.line_ids.move_id.move_id.ids), ('move_type', 'in', self.env['account.move'].get_sale_types())],
+ "context": {"create": False},
+ "name": "Customer Invoices",
+ 'view_mode': 'tree,form',
+ }
+ return result
+
+ def action_view_vendor_bill(self):
+ self.ensure_one()
+ result = {
+ "type": "ir.actions.act_window",
+ "res_model": "account.move",
+ "domain": [('id', 'in', self.line_ids.move_id.move_id.ids), ('move_type', 'in', self.env['account.move'].get_purchase_types())],
+ "context": {"create": False},
+ "name": "Vendor Bills",
+ 'view_mode': 'tree,form',
+ }
+ return result
class AccountAnalyticTag(models.Model):
_inherit = 'account.analytic.tag'
@@ -62,6 +114,7 @@ class AccountAnalyticLine(models.Model):
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.')
+ category = fields.Selection(selection_add=[('invoice', 'Customer Invoice'), ('vendor_bill', 'Vendor Bill')])
@api.onchange('product_id', 'product_uom_id', 'unit_amount', 'currency_id')
def on_change_unit_amount(self):
diff --git a/addons/account/models/account_move.py b/addons/account/models/account_move.py
index 2ebdc23cef3..b8a6d5f6c8a 100644
--- a/addons/account/models/account_move.py
+++ b/addons/account/models/account_move.py
@@ -5007,6 +5007,11 @@ class AccountMoveLine(models.Model):
for move_line in self:
amount = (move_line.credit or 0.0) - (move_line.debit or 0.0)
default_name = move_line.name or (move_line.ref or '/' + ' -- ' + (move_line.partner_id and move_line.partner_id.name or '/'))
+ category = 'other'
+ if move_line.move_id.is_sale_document():
+ category = 'invoice'
+ elif move_line.move_id.is_purchase_document():
+ category = 'vendor_bill'
result.append({
'name': default_name,
'date': move_line.date,
@@ -5023,6 +5028,7 @@ class AccountMoveLine(models.Model):
'user_id': move_line.move_id.invoice_user_id.id or self._uid,
'partner_id': move_line.partner_id.id,
'company_id': move_line.analytic_account_id.company_id.id or move_line.move_id.company_id.id,
+ 'category': category,
})
return result
diff --git a/addons/account/views/account_analytic_view.xml b/addons/account/views/account_analytic_view.xml
index 0488534d2c8..34307b3fcb4 100644
--- a/addons/account/views/account_analytic_view.xml
+++ b/addons/account/views/account_analytic_view.xml
@@ -69,5 +69,25 @@
+
+ account.analytic.account.form.inherit
+ account.analytic.account
+
+
+
+
+
+
+
+
+
+
+
diff --git a/addons/analytic/models/analytic_account.py b/addons/analytic/models/analytic_account.py
index d7424b69a59..88cba7bf583 100644
--- a/addons/analytic/models/analytic_account.py
+++ b/addons/analytic/models/analytic_account.py
@@ -184,7 +184,7 @@ class AccountAnalyticLine(models.Model):
amount = fields.Monetary('Amount', required=True, default=0.0)
unit_amount = fields.Float('Quantity', default=0.0)
product_uom_id = fields.Many2one('uom.uom', string='Unit of Measure', domain="[('category_id', '=', product_uom_category_id)]")
- product_uom_category_id = fields.Many2one(related='product_uom_id.category_id', readonly=True)
+ product_uom_category_id = fields.Many2one(related='product_uom_id.category_id', string='UoM Category', readonly=True)
account_id = fields.Many2one('account.analytic.account', 'Analytic Account', required=True, ondelete='restrict', index=True, check_company=True)
partner_id = fields.Many2one('res.partner', string='Partner', check_company=True)
user_id = fields.Many2one('res.users', string='User', default=_default_user)
@@ -192,6 +192,7 @@ class AccountAnalyticLine(models.Model):
company_id = fields.Many2one('res.company', string='Company', required=True, readonly=True, default=lambda self: self.env.company)
currency_id = fields.Many2one(related="company_id.currency_id", string="Currency", readonly=True, store=True, compute_sudo=True)
group_id = fields.Many2one('account.analytic.group', related='account_id.group_id', store=True, readonly=True, compute_sudo=True)
+ category = fields.Selection([('other', 'Other')], default='other')
@api.constrains('company_id', 'account_id')
def _check_company_id(self):
diff --git a/addons/analytic/views/analytic_account_views.xml b/addons/analytic/views/analytic_account_views.xml
index 22e98f95aa2..43ddf175eeb 100644
--- a/addons/analytic/views/analytic_account_views.xml
+++ b/addons/analytic/views/analytic_account_views.xml
@@ -127,7 +127,7 @@
{'search_default_group_date': 1, 'default_account_id': active_id}
[('account_id','=', active_id)]
- Costs & Revenues
+ Gross Margin
account.analytic.line
tree,form,graph,pivot
@@ -157,8 +157,14 @@