forked from Mapan/odoo17e
287 lines
12 KiB
Python
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)
|