forked from Mapan/odoo17e
68 lines
3.1 KiB
Python
68 lines
3.1 KiB
Python
# -*- coding: utf-8 -*-
|
|
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
|
|
|
from odoo import api, fields, models, _
|
|
from odoo.exceptions import ValidationError
|
|
from odoo.osv import expression
|
|
|
|
class ResPartner(models.Model):
|
|
_inherit = 'res.partner'
|
|
|
|
subscription_count = fields.Integer(string='Subscriptions', compute='_subscription_count')
|
|
|
|
def write(self, vals):
|
|
res = super().write(vals)
|
|
if 'active' in vals and not vals.get('active'):
|
|
Subscription = self.env['sale.order']
|
|
order_ids = Subscription.sudo().search([
|
|
('subscription_state', '=', '3_progress'),
|
|
'|',
|
|
('partner_shipping_id', 'in', self.ids),
|
|
('partner_invoice_id', 'in', self.ids)
|
|
])
|
|
if order_ids:
|
|
contract_str = ", ".join(order_ids.mapped('name'))
|
|
raise ValidationError(_("You can't archive the partner as it is used in the following recurring orders: %s", contract_str))
|
|
return res
|
|
|
|
def _subscription_count(self):
|
|
all_partners_subquery = self.with_context(active_test=False)._search([('id', 'child_of', self.ids)])
|
|
|
|
subscription_data = self.env['sale.order']._read_group(
|
|
domain=[('partner_id', 'in', all_partners_subquery), ('is_subscription', '=', 'True'), ('subscription_state', 'in', ['3_progress', '6_churn', '4_paused'])],
|
|
groupby=['partner_id'], aggregates=['__count'],
|
|
)
|
|
|
|
self.subscription_count = 0
|
|
for partner, count in subscription_data:
|
|
while partner:
|
|
if partner in self:
|
|
partner.subscription_count += count
|
|
partner = partner.with_context(prefetch_fields=False).parent_id
|
|
|
|
def open_related_subscription(self):
|
|
self.ensure_one()
|
|
action = {
|
|
"type": "ir.actions.act_window",
|
|
"res_model": "sale.order",
|
|
"name": _("Partner Subscription"),
|
|
"domain": [('is_subscription', '=', True), ('subscription_state', 'in', ['3_progress', '6_churn', '4_paused'])],
|
|
"context": {
|
|
'search_default_partner_id': [self.id],
|
|
'default_partner_id': self.id,
|
|
}
|
|
}
|
|
all_partners = self.with_context(active_test=False).search([('id', 'child_of', self.ids)])
|
|
|
|
subscription_ids = self.env['sale.order'].search_read(
|
|
domain=[('partner_id', 'in', all_partners.ids), ('is_subscription', '=', 'True'), ('subscription_state', 'in', ['3_progress', '6_churn', '4_paused'])],
|
|
fields=['id']
|
|
)
|
|
if len(subscription_ids) == 1:
|
|
action['res_id'] = subscription_ids[0]['id']
|
|
action['views'] = [(self.env.ref('sale_subscription.sale_subscription_primary_form_view').id, 'form')]
|
|
else:
|
|
action['views'] = [(self.env.ref('sale_subscription.sale_subscription_view_tree').id, 'tree'), (self.env.ref('sale_subscription.sale_subscription_primary_form_view').id, 'form')]
|
|
action['search_view_id'] = [self.env.ref('sale_subscription.sale_subscription_view_search').id]
|
|
return action
|