1
0
forked from Mapan/odoo17e
odoo17e-kedaikipas58/addons/partner_commission/tests/test_sale_subscription.py
2024-12-10 09:04:09 +07:00

287 lines
12 KiB
Python

# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from dateutil.relativedelta import relativedelta
from odoo.tests.common import Form, tagged
from odoo.addons.partner_commission.tests.setup import TestCommissionsSetup
from odoo import fields
@tagged('commission_subscription', 'post_install', '-at_install')
class TestSaleSubscription(TestCommissionsSetup):
@classmethod
def setUpClass(cls):
super().setUpClass()
cls.env.ref('base.group_user').write({"implied_ids": [(4, cls.env.ref('sale_management.group_sale_order_template').id)]})
def test_referrer_commission_plan_changed(self):
"""When the referrer's commission plan changes, its new commission plan should be set on the subscription,
unless commission_plan_frozen is checked."""
self.referrer.commission_plan_id = self.gold_plan
# # Normal Sale order
form = Form(self.env['sale.order'])
form.partner_id = self.customer
form.referrer_id = self.referrer
form.sale_order_template_id = self.template_yearly
so = form.save()
# Auto assignation mode.
self.referrer.commission_plan_id = self.silver_plan
self.assertEqual(so.commission_plan_id, self.silver_plan)
self.referrer.commission_plan_id = self.gold_plan
self.assertEqual(so.commission_plan_id, self.gold_plan)
# Subscriptions
form = Form(self.env['sale.order'])
form.partner_id = self.customer
form.referrer_id = self.referrer
form.sale_order_template_id = self.template_yearly
# Subscription plan is defined by the product and pricing
with form.order_line.new() as line:
line.name = self.worker.name
line.product_id = self.worker
line.product_uom_qty = 1
sub = form.save()
# Auto assignation mode.
self.referrer.commission_plan_id = self.silver_plan
self.assertEqual(sub.commission_plan_id, self.silver_plan)
# Fixed mode.
sub.commission_plan_frozen = True
self.referrer.commission_plan_id = self.gold_plan
self.assertEqual(sub.commission_plan_id, self.silver_plan)
def test_referrer_grade_changed(self):
"""When the referrer's grade changes, its new commission plan should be set on the subscription,
unless commission_plan_frozen is checked."""
self.referrer.grade_id = self.gold
self.referrer._onchange_grade_id()
form = Form(self.env['sale.order'])
form.partner_id = self.customer
form.referrer_id = self.referrer
form.sale_order_template_id = self.template_yearly
# Subscription plan is defined by the product and pricing
with form.order_line.new() as line:
line.name = self.worker.name
line.product_id = self.worker
line.product_uom_qty = 1
sub = form.save()
# Auto assignation mode.
self.referrer.grade_id = self.silver
self.referrer._onchange_grade_id()
self.assertEqual(sub.commission_plan_id, self.silver_plan)
# Fixed mode.
sub.commission_plan_frozen = True
self.referrer.grade_id = self.gold
self.referrer._onchange_grade_id()
self.assertEqual(sub.commission_plan_id, self.silver_plan)
def test_sub_data_forwarded_to_renewal(self):
"""Some data should be forwarded from the subscription to the renewal's sale order."""
self.referrer.commission_plan_id = self.gold_plan
form = Form(self.env['sale.order'].with_user(self.salesman).with_context(tracking_disable=True),
view=self.env.ref('sale_subscription.sale_subscription_primary_form_view'))
form.partner_id = self.customer
form.referrer_id = self.referrer
# form.commission_plan_frozen = False
form.plan_id = self.plan_month
with form.order_line.new() as line:
line.name = self.worker.name
line.product_id = self.worker
line.product_uom_qty = 1
form.end_date = fields.Date.today()
so = form.save()
so.action_confirm()
so.next_invoice_date += relativedelta(months=1) # prevent validation error
res = so.prepare_renewal_order()
res_id = res['res_id']
renewal_so = self.env['sale.order'].browse(res_id)
renewal_so.order_line.product_uom_qty = 1
self.assertEqual(renewal_so.referrer_id, so.referrer_id)
self.assertEqual(renewal_so.commission_plan_id, so.commission_plan_id)
def test_compute_commission(self):
self.referrer.commission_plan_id = self.gold_plan
form = Form(self.env['sale.order'].with_user(self.salesman).with_context(tracking_disable=True))
form.partner_id = self.customer
form.referrer_id = self.referrer
# We test the non recurring flow: recurring_invoice is False on the product
self.worker.recurring_invoice = False
with form.order_line.new() as line:
line.name = self.worker.name
line.product_id = self.worker
line.product_uom_qty = 2
so = form.save()
so.pricelist_id = self.usd_8
so.action_confirm()
self.assertEqual(so.commission, 180)
def test_commission_plan_assignation(self):
"""
- When 'fixed' the commission plan set on the susbcription is used regardless of the referrer's commission plan.
"""
self.referrer.commission_plan_id = self.gold_plan
# Test that it works even when the commission plan is Falsy.
form = Form(self.env['sale.order'].with_context(tracking_disable=True), view=self.env.ref('sale_subscription.sale_subscription_primary_form_view'))
form.partner_id = self.customer
form.referrer_id = self.referrer
form.sale_order_template_id = self.template_yearly
form.pricelist_id = self.usd_8
with form.order_line.new() as line:
line.name = self.worker.name
line.product_id = self.worker
line.product_uom_qty = 2
# `commission_plan_frozen` and `end_date` are invisible until `is_subscription` is True
# `is_subscription` is True when there are recurring lines in the sale order.
form.commission_plan_frozen = True
form.commission_plan_id = self.env['commission.plan']
sub = form.save()
sub.action_confirm()
sub._cron_recurring_create_invoice()
# renew
res = sub.prepare_renewal_order()
res_id = res['res_id']
renewal_so = self.env['sale.order'].browse(res_id)
renewal_so.order_line.product_uom_qty = 2
renewal_so.action_confirm()
# pay
inv = renewal_so._create_invoices()
inv.action_post()
self._pay_invoice(inv)
self.assertFalse(inv.commission_po_line_id)
# Switch to the greedy plan and renew again.
renewal_so.commission_plan_id = self.greedy_plan
# renew
res = renewal_so.prepare_renewal_order()
res_id = res['res_id']
renewal_so_2 = self.env['sale.order'].browse(res_id)
renewal_so_2.order_line.product_uom_qty = 1
renewal_so_2.action_confirm()
# pay
inv = renewal_so_2._create_invoices()
inv.action_post()
self._pay_invoice(inv)
self.assertEqual(inv.commission_po_line_id.price_subtotal, 18, 'Commission is wrong')
# Switch to unfrozen and check that the gold plan is used.
renewal_so_2.commission_plan_frozen = False
self.assertEqual(renewal_so_2.commission_plan_id, self.gold_plan)
# renew
res = renewal_so_2.prepare_renewal_order()
res_id = res['res_id']
renewal_so_3 = self.env['sale.order'].browse(res_id)
renewal_so_3.order_line.product_uom_qty = 2
renewal_so_3.action_confirm()
# pay
inv = renewal_so_3._create_invoices()
inv.action_post()
self._pay_invoice(inv)
self.assertEqual(inv.commission_po_line_id.price_subtotal, 180, 'Commission is wrong')
def test_commission_plan_frozen(self):
"""
Check the change of option `commission_plan_frozen`
with commission plan and vice versa
"""
self.referrer.commission_plan_id = self.gold_plan
# [1.] Save subscription with commission plan frozen enabled
# --> commission plan can be redefined
form = Form(self.env['sale.order'])
form.partner_id = self.customer
form.referrer_id = self.referrer
form.sale_order_template_id = self.template_yearly
# Subscription plan is defined by the product and pricing
with form.order_line.new() as line:
line.name = self.worker.name
line.product_id = self.worker
line.product_uom_qty = 1
form.commission_plan_frozen = True
form.commission_plan_id = self.silver_plan
sub_A = form.save()
sub_A.action_confirm()
sub_A._cron_recurring_create_invoice()
self.assertEqual(sub_A.commission_plan_id, self.silver_plan)
self.assertEqual(sub_A.commission_plan_frozen, True)
# [2.] Save subscription with commission plan frozen disabled
# --> commission plan cannot be redefined, it will be the referrer commission plan
form = Form(self.env['sale.order'])
form.partner_id = self.customer
form.referrer_id = self.referrer
form.sale_order_template_id = self.template_yearly
# Subscription plan is defined by the product and pricing
with form.order_line.new() as line:
line.name = self.worker.name
line.product_id = self.worker
line.product_uom_qty = 1
form.commission_plan_frozen = True
form.commission_plan_id = self.silver_plan
form.commission_plan_frozen = False
sub_B = form.save()
sub_B.action_confirm()
sub_B._cron_recurring_create_invoice()
self.assertEqual(sub_B.commission_plan_id, self.gold_plan)
self.assertEqual(sub_B.commission_plan_frozen, False)
# [3.] Save subscription with commission plan frozen and default commission plan
# --> commission plan frozen remains enabled
form = Form(self.env['sale.order'])
form.partner_id = self.customer
form.referrer_id = self.referrer
form.sale_order_template_id = self.template_yearly
# Subscription plan is defined by the product and pricing
with form.order_line.new() as line:
line.name = self.worker.name
line.product_id = self.worker
line.product_uom_qty = 1
form.commission_plan_frozen = True
sub_C = form.save()
sub_C.action_confirm()
sub_C._cron_recurring_create_invoice()
self.assertEqual(sub_C.commission_plan_id, self.gold_plan)
self.assertEqual(sub_C.commission_plan_frozen, True)
# [4.] Renew subscription with commission plan frozen enabled
# --> keep the same commission plan
sub_A_renew_id = sub_A.prepare_renewal_order()['res_id']
sub_A_renew = self.env['sale.order'].browse(sub_A_renew_id)
self.assertEqual(sub_A_renew.commission_plan_id, self.silver_plan)
# [5.] Renew subscription with commission plan frozen disabled
# --> use referrer's commission plan
sub_A.commission_plan_frozen = False
sub_A_renew_id = sub_A.prepare_renewal_order()['res_id']
sub_A_renew = self.env['sale.order'].browse(sub_A_renew_id)
self.assertEqual(sub_A_renew.commission_plan_id, self.gold_plan)
# [6.] Renew subscription with commission plan frozen enabled and default commission plan
# --> commission plan frozen has to be disabled
sub_C_renew_id = sub_C.prepare_renewal_order()['res_id']
sub_C_renew = self.env['sale.order'].browse(sub_C_renew_id)
self.assertEqual(sub_C_renew.commission_plan_frozen, False)