The goal is that the counter on the smart button can display the conmplete
information ("this campaing generated 500k€, no matter if you can acces or not
the records behind this number").
Once the user clicks on the smart button, them can only see the records he has
access to.
Task-2516278
COM PR: odoo/odoo#76934
ENT PR: odoo/enterprise#21055
Signed-off-by: Thibault Delavallee (tde) <tde@openerp.com>
70 lines
3.4 KiB
Python
70 lines
3.4 KiB
Python
# -*- coding: utf-8 -*-
|
|
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
|
|
|
from odoo import fields, models
|
|
|
|
class UtmCampaign(models.Model):
|
|
_inherit = 'utm.campaign'
|
|
_description = 'UTM Campaign'
|
|
|
|
quotation_count = fields.Integer('Quotation Count',
|
|
compute="_compute_quotation_count", compute_sudo=True, groups='sales_team.group_sale_salesman')
|
|
invoiced_amount = fields.Integer(string="Revenues generated by the campaign",
|
|
compute="_compute_sale_invoiced_amount", compute_sudo=True, groups='sales_team.group_sale_salesman')
|
|
company_id = fields.Many2one('res.company', string='Company', readonly=True, states={'draft': [('readonly', False)], 'refused': [('readonly', False)]}, default=lambda self: self.env.company)
|
|
currency_id = fields.Many2one('res.currency', related='company_id.currency_id', string='Currency')
|
|
|
|
def _compute_quotation_count(self):
|
|
quotation_data = self.env['sale.order'].read_group([
|
|
('campaign_id', 'in', self.ids)],
|
|
['campaign_id'], ['campaign_id'])
|
|
data_map = {datum['campaign_id'][0]: datum['campaign_id_count'] for datum in quotation_data}
|
|
for campaign in self:
|
|
campaign.quotation_count = data_map.get(campaign.id, 0)
|
|
|
|
def _compute_sale_invoiced_amount(self):
|
|
self.env['account.move.line'].flush(['balance', 'move_id', 'account_id', 'exclude_from_invoice_tab'])
|
|
self.env['account.move'].flush(['state', 'campaign_id', 'move_type'])
|
|
query = """SELECT move.campaign_id, -SUM(line.balance) as price_subtotal
|
|
FROM account_move_line line
|
|
INNER JOIN account_move move ON line.move_id = move.id
|
|
WHERE move.state not in ('draft', 'cancel')
|
|
AND move.campaign_id IN %s
|
|
AND move.move_type IN ('out_invoice', 'out_refund', 'in_invoice', 'in_refund', 'out_receipt', 'in_receipt')
|
|
AND line.account_id IS NOT NULL
|
|
AND NOT line.exclude_from_invoice_tab
|
|
GROUP BY move.campaign_id
|
|
"""
|
|
|
|
self._cr.execute(query, [tuple(self.ids)])
|
|
query_res = self._cr.dictfetchall()
|
|
|
|
campaigns = self.browse()
|
|
for datum in query_res:
|
|
campaign = self.browse(datum['campaign_id'])
|
|
campaign.invoiced_amount = datum['price_subtotal']
|
|
campaigns |= campaign
|
|
for campaign in (self - campaigns):
|
|
campaign.invoiced_amount = 0
|
|
|
|
def action_redirect_to_quotations(self):
|
|
action = self.env["ir.actions.actions"]._for_xml_id("sale.action_quotations_with_onboarding")
|
|
action['domain'] = [('campaign_id', '=', self.id)]
|
|
action['context'] = {'default_campaign_id': self.id}
|
|
return action
|
|
|
|
def action_redirect_to_invoiced(self):
|
|
action = self.env["ir.actions.actions"]._for_xml_id("account.action_move_journal_line")
|
|
invoices = self.env['account.move'].search([('campaign_id', '=', self.id)])
|
|
action['context'] = {
|
|
'create': False,
|
|
'edit': False,
|
|
'view_no_maturity': True
|
|
}
|
|
action['domain'] = [
|
|
('id', 'in', invoices.ids),
|
|
('move_type', 'in', ('out_invoice', 'out_refund', 'in_invoice', 'in_refund', 'out_receipt', 'in_receipt')),
|
|
('state', 'not in', ['draft', 'cancel'])
|
|
]
|
|
return action
|