Files
enterprise-addons/sale_commission/tests/test_sale_commission_manager.py
T

258 lines
13 KiB
Python

from freezegun import freeze_time
from odoo.fields import Command
from odoo.tests import tagged
from odoo.addons.sale_commission.tests.test_sale_commission_common import TestSaleCommissionCommon
@tagged('post_install', '-at_install')
class TestSaleCommissionManager(TestSaleCommissionCommon):
@freeze_time('2024-02-02')
def test_commission_manager_achievement(self):
self.commission_plan_manager.write({
'periodicity': 'month',
'type': 'achieve',
'user_type': 'team',
})
self.commission_plan_manager.action_approve()
(self.commission_user_1 + self.commission_user_2 + self.commission_manager).sale_team_id = self.team_commission
self.commission_plan_manager.achievement_ids = self.env['sale.commission.plan.achievement'].create([{
'type': 'amount_sold',
'rate': 0.04,
'plan_id': self.commission_plan_user.id,
}, {
'type': 'amount_invoiced',
'rate': 0.06,
'plan_id': self.commission_plan_user.id,
}, {
'type': 'amount_sold',
'rate': 0.1,
'product_id': self.commission_product_2.id,
'plan_id': self.commission_plan_user.id,
}])
SO = self.env['sale.order'].create({
'partner_id': self.partner.id,
'user_id': self.commission_user_1.id,
'order_line': [Command.create({
'product_id': self.commission_product_1.id,
'product_uom_qty': 10,
'price_unit': 200,
})],
'team_id': self.commission_user_1.sale_team_id.id,
})
self.env['sale.commission.achievement.report']._pre_achievement_operation()
achievements = self.env['sale.commission.achievement.report'].search([('plan_id', '=', self.commission_plan_manager.id)])
commissions = self.env['sale.commission.report'].search([('plan_id', '=', self.commission_plan_manager.id)])
self.assertFalse(achievements, 'SO has not been confirmed yet, there should be no achievement.')
self.assertEqual(len(commissions), 12, "SO has not been confirmed, we only have forecast")
self.assertFalse(sum(commissions.mapped('target_amount')), 'SO has not been confirmed yet, there should be no commission.')
SO.action_confirm()
self.env['sale.commission.achievement.report']._pre_achievement_operation()
achievements = self.env['sale.commission.achievement.report'].search([('plan_id', '=', self.commission_plan_manager.id)])
commissions = self.env['sale.commission.report'].search([('plan_id', '=', self.commission_plan_manager.id)])
self.assertEqual(len(achievements), 1, 'The one line should count as an achievement')
self.assertEqual(achievements.user_id.id, self.commission_manager.id)
self.assertEqual(sum(achievements.mapped('achieved')), 80, '0.04 * 2000 = 80')
self.assertEqual(achievements.related_res_id, SO.id)
self.assertEqual(sum(commissions.mapped('commission')), 80)
AM = SO._create_invoices()
AM._post()
self.env['sale.commission.achievement.report']._pre_achievement_operation()
achievements = self.env['sale.commission.achievement.report'].search([('plan_id', '=', self.commission_plan_manager.id)]).\
filtered(lambda x: x.related_res_id == AM.id and x.related_res_model == 'account.move')
commissions = self.env['sale.commission.report'].search([('plan_id', '=', self.commission_plan_manager.id)])
self.assertEqual(len(achievements), 1, 'There should be one new achievement')
self.assertEqual(achievements.user_id.id, self.commission_manager.id)
self.assertEqual(sum(achievements.mapped('achieved')), 120, '0.06 * 2000 = 120')
self.assertEqual(len(commissions), 12)
self.assertEqual(sum(commissions.mapped('commission')), 200)
SO2 = self.env['sale.order'].create({
'partner_id': self.partner.id,
'user_id': self.commission_user_2.id,
'order_line': [Command.create({
'product_id': self.commission_product_2.id,
'product_uom_qty': 10,
'price_unit': 200,
})],
'team_id': self.commission_user_1.sale_team_id.id,
})
SO2.action_confirm()
self.env['sale.commission.achievement.report']._pre_achievement_operation()
achievements = self.env['sale.commission.achievement.report'].search([('plan_id', '=', self.commission_plan_manager.id)]).\
filtered(lambda x: x.related_res_id == SO2.id and x.related_res_model == 'sale.order')
commissions = self.env['sale.commission.report'].search([('plan_id', '=', self.commission_plan_manager.id)])
self.assertEqual(len(achievements), 1)
self.assertEqual(achievements.user_id.id, self.commission_manager.id)
self.assertEqual(sum(achievements.mapped('achieved')), 280, '0.04 * 2000 + 0.1 * 2000 = 280')
self.assertEqual(len(commissions), 12)
self.assertEqual(sum(commissions.mapped('commission')), 480, '200 + 280')
AM2 = SO2._create_invoices()
AM2._post()
self.env['sale.commission.achievement.report']._pre_achievement_operation()
achievements = self.env['sale.commission.achievement.report'].search([('plan_id', '=', self.commission_plan_manager.id)]).\
filtered(lambda x: x.related_res_id == AM2.id and x.related_res_model == 'account.move')
commissions = self.env['sale.commission.report'].search([('plan_id', '=', self.commission_plan_manager.id)])
self.assertEqual(len(achievements), 1, 'There should be one new achievement')
self.assertEqual(achievements.user_id.id, self.commission_manager.id)
self.assertEqual(sum(achievements.mapped('achieved')), 120, '0.06 * 2000 = 120')
self.assertEqual(len(commissions), 12)
self.assertEqual(sum(commissions.mapped('commission')), 600)
@freeze_time('2024-02-02')
def test_commission_user_target(self):
self.commission_plan_manager.write({
'periodicity': 'month',
'type': 'target',
'user_type': 'team',
'commission_amount': 2500,
})
(self.commission_user_1 + self.commission_user_2 + self.commission_manager).sale_team_id = self.team_commission
self.commission_plan_manager.achievement_ids = self.env['sale.commission.plan.achievement'].create([{
'type': 'amount_sold',
'rate': 0.4,
'plan_id': self.commission_plan_manager.id,
}, {
'type': 'amount_invoiced',
'rate': 0.6,
'plan_id': self.commission_plan_manager.id,
}, {
'type': 'amount_sold',
'rate': 1,
'product_id': self.commission_product_2.id,
'plan_id': self.commission_plan_manager.id,
}])
self.commission_plan_manager.target_ids.amount = 2000
# There is already a level 0 at 0$, level 0.5 at 0$ and level 1 at 2500$ by default
self.commission_plan_manager.target_commission_ids += self.env['sale.commission.plan.target.commission'].create([{
'target_rate': 2,
'amount': 3500,
'plan_id': self.commission_plan_manager.id,
}, {
'target_rate': 3,
'amount': 4000,
'plan_id': self.commission_plan_manager.id,
}])
self.commission_plan_manager.action_approve()
SO = self.env['sale.order'].create({
'partner_id': self.partner.id,
'user_id': self.commission_user_1.id,
'order_line': [Command.create({
'product_id': self.commission_product_1.id,
'product_uom_qty': 10,
'price_unit': 200,
})],
'team_id': self.commission_user_1.sale_team_id.id,
})
self.env['sale.commission.achievement.report']._pre_achievement_operation()
achievements = self.env['sale.commission.achievement.report'].search([('plan_id', '=', self.commission_plan_manager.id)])
commissions = self.env['sale.commission.report'].search([('plan_id', '=', self.commission_plan_manager.id)])
self.assertFalse(achievements, 'SO has not been confirmed yet, there should be no achievement.')
self.assertEqual(len(commissions), 12, 'SO has not been confirmed yet, there should be no commission but we have forecast.')
SO.action_confirm()
self.env['sale.commission.achievement.report']._pre_achievement_operation()
achievements = self.env['sale.commission.achievement.report'].search([('plan_id', '=', self.commission_plan_manager.id)])
commissions = self.env['sale.commission.report'].search([('plan_id', '=', self.commission_plan_manager.id)])
self.assertEqual(len(achievements), 1, 'The one line should count as an achievement')
self.assertEqual(sum(achievements.mapped('achieved')), 800, '0.4 * 2000 = 800')
self.assertEqual(len(commissions), 12)
self.assertEqual(sum(commissions.mapped('achieved')), 800)
self.assertEqual(sum(commissions.mapped('commission')), 0, 'Achieved Rate(0.4) < 0.5')
AM = SO._create_invoices()
AM._post()
self.env['sale.commission.achievement.report']._pre_achievement_operation()
achievements = self.env['sale.commission.achievement.report'].search([('plan_id', '=', self.commission_plan_manager.id)]).\
filtered(lambda x: x.related_res_id == AM.id and x.related_res_model == 'account.move')
commissions = self.env['sale.commission.report'].search([('plan_id', '=', self.commission_plan_manager.id)])
self.assertEqual(len(achievements), 1, 'There should be one new achievement')
self.assertEqual(sum(achievements.mapped('achieved')), 1200, '0.06 * 2000 = 120')
self.assertEqual(len(commissions), 12)
self.assertEqual(sum(commissions.mapped('achieved')), 2000)
self.assertEqual(sum(commissions.mapped('commission')), 2500, 'We reached the 1st level Tier 1 Achieved Rate(1) * 2500')
SO2 = self.env['sale.order'].create({
'partner_id': self.partner.id,
'user_id': self.commission_user_1.id,
'order_line': [Command.create({
'product_id': self.commission_product_2.id,
'product_uom_qty': 10,
'price_unit': 200,
})],
'team_id': self.commission_user_1.sale_team_id.id,
})
SO2.action_confirm()
self.env['sale.commission.achievement.report']._pre_achievement_operation()
achievements = self.env['sale.commission.achievement.report'].search([('plan_id', '=', self.commission_plan_manager.id)]).\
filtered(lambda x: x.related_res_id == SO2.id and x.related_res_model == 'sale.order')
commissions = self.env['sale.commission.report'].search([('plan_id', '=', self.commission_plan_manager.id)])
self.assertEqual(len(achievements), 1)
self.assertEqual(sum(achievements.mapped('achieved')), 2800, '0.4 * 2000 + 1 * 2000 = 4800')
self.assertEqual(len(commissions), 12)
self.assertEqual(sum(commissions.mapped('achieved')), 4800)
self.assertEqual(sum(commissions.mapped('commission')), 3700, 'We have reached the 2nd level,'
'Achieved Rate = 2.4'
'Amount = 3500 (AR = 2) + 200 (AR-2 * 500)')
AM2 = SO2._create_invoices()
AM2._post()
self.env['sale.commission.achievement.report']._pre_achievement_operation()
achievements = self.env['sale.commission.achievement.report'].search([('plan_id', '=', self.commission_plan_manager.id)]).\
filtered(lambda x: x.related_res_id == AM2.id and x.related_res_model == 'account.move')
commissions = self.env['sale.commission.report'].search([('plan_id', '=', self.commission_plan_manager.id)])
self.assertEqual(len(achievements), 1, 'There should be one new achievement')
self.assertEqual(sum(achievements.mapped('achieved')), 1200, '0.6 * 2000 = 1200')
self.assertEqual(len(commissions), 12)
self.assertEqual(sum(commissions.mapped('achieved')), 6000)
self.assertEqual(sum(commissions.mapped('commission')), 4000, 'We have reached the 3rd level')
def test_copy_plan(self):
self.commission_plan_user.write({
'periodicity': 'month',
'type': 'target',
'user_type': 'person',
'target_commission_ids': [
Command.clear(),
Command.create({
'target_rate': 0,
'amount': 0,
}), Command.create({
'target_rate': 0.1,
'amount': 10,
}), Command.create({
'target_rate': 1,
'amount': 100,
}),
],
})
new_plan = self.commission_plan_user.copy()
self.assertEqual(
new_plan.target_commission_ids.mapped('target_rate'),
self.commission_plan_user.target_commission_ids.mapped('target_rate'),
)
self.assertEqual(
new_plan.target_commission_ids.mapped('amount'),
self.commission_plan_user.target_commission_ids.mapped('amount'),
)