173 lines
6.7 KiB
Python
173 lines
6.7 KiB
Python
# -*- coding: utf-8 -*-
|
|
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
|
|
|
from odoo.addons.point_of_sale.tests.test_frontend import TestPointOfSaleHttpCommon
|
|
from odoo.tests import Form, tagged
|
|
|
|
|
|
@tagged("post_install", "-at_install")
|
|
class TestUi(TestPointOfSaleHttpCommon):
|
|
def setUp(self):
|
|
super().setUp()
|
|
|
|
self.promo_programs = self.env["coupon.program"]
|
|
|
|
# code promo program -> discount on specific products
|
|
self.code_promo_program = self.env["coupon.program"].create(
|
|
{
|
|
"name": "Promo Code Program - Discount on Specific Products",
|
|
"program_type": "promotion_program",
|
|
"promo_code_usage": "code_needed",
|
|
"promo_code": "promocode",
|
|
"discount_apply_on": "specific_products",
|
|
"discount_percentage": 50,
|
|
"discount_specific_product_ids": (
|
|
self.whiteboard_pen | self.magnetic_board | self.desk_organizer
|
|
).ids,
|
|
}
|
|
)
|
|
self.promo_programs |= self.code_promo_program
|
|
|
|
# auto promo program on current order
|
|
# -> discount on cheapest product
|
|
self.auto_promo_program_current = self.env["coupon.program"].create(
|
|
{
|
|
"name": "Auto Promo Program - Cheapest Product",
|
|
"program_type": "promotion_program",
|
|
"promo_code_usage": "no_code_needed",
|
|
"discount_apply_on": "cheapest_product",
|
|
"discount_percentage": 90,
|
|
}
|
|
)
|
|
self.promo_programs |= self.auto_promo_program_current
|
|
|
|
# auto promo program on next order
|
|
# -> discount on order (global discount)
|
|
self.auto_promo_program_next = self.env["coupon.program"].create(
|
|
{
|
|
"name": "Auto Promo Program - Global Discount",
|
|
"program_type": "promotion_program",
|
|
"promo_code_usage": "no_code_needed",
|
|
"promo_applicability": "on_next_order",
|
|
"discount_apply_on": "on_order",
|
|
"discount_percentage": 10,
|
|
}
|
|
)
|
|
self.promo_programs |= self.auto_promo_program_next
|
|
|
|
# coupon program -> free product
|
|
self.coupon_program = self.env["coupon.program"].create(
|
|
{
|
|
"name": "Coupon Program - Buy 3 Take 2 Free Product",
|
|
"program_type": "coupon_program",
|
|
"rule_products_domain": "[('name', 'ilike', 'Desk Organizer')]",
|
|
"reward_type": "product",
|
|
"rule_min_quantity": 3,
|
|
"reward_product_id": self.desk_organizer.id,
|
|
"reward_product_quantity": 2,
|
|
}
|
|
)
|
|
|
|
# Create coupons for the coupon program and change the code
|
|
# to be able to use them in the frontend tour.
|
|
self.env["coupon.generate.wizard"].with_context(
|
|
{"active_id": self.coupon_program.id}
|
|
).create({"nbr_coupons": 4}).generate_coupon()
|
|
(
|
|
self.coupon1,
|
|
self.coupon2,
|
|
self.coupon3,
|
|
self.coupon4,
|
|
) = self.coupon_program.coupon_ids
|
|
self.coupon1.write({"code": "1234"})
|
|
self.coupon2.write({"code": "5678"})
|
|
self.coupon3.write({"code": "1357"})
|
|
self.coupon4.write({"code": "2468"})
|
|
|
|
def test_pos_coupon_tour_basic(self):
|
|
"""PoS Coupon Basic Tour"""
|
|
|
|
# Set the programs to the pos config.
|
|
# Remove fiscal position and pricelist.
|
|
with Form(self.main_pos_config) as pos_config:
|
|
pos_config.tax_regime_selection = False
|
|
pos_config.use_pricelist = False
|
|
pos_config.pricelist_id = self.env["product.pricelist"].create(
|
|
{"name": "PoS Default Pricelist",}
|
|
)
|
|
pos_config.use_coupon_programs = True
|
|
pos_config.coupon_program_ids.add(self.coupon_program)
|
|
for promo_program in self.promo_programs:
|
|
pos_config.promo_program_ids.add(promo_program)
|
|
|
|
self.main_pos_config.with_user(self.env.ref("base.user_admin")).open_session_cb(
|
|
check_coa=False
|
|
)
|
|
|
|
##
|
|
# Tour Part 1
|
|
# This part will generate coupons for `auto_promo_program_next`
|
|
# that will be used in the second part of the tour.
|
|
#
|
|
|
|
self.start_tour(
|
|
"/pos/web?config_id=%d" % self.main_pos_config.id,
|
|
"PosCouponTour1",
|
|
login="admin",
|
|
)
|
|
|
|
# check coupon usage
|
|
self.assertEqual(
|
|
self.coupon1.state, "used", msg="`1234` coupon should have been used."
|
|
)
|
|
self.assertEqual(
|
|
self.coupon2.state,
|
|
"new",
|
|
msg="`5678` coupon code is used but was eventually freed.",
|
|
)
|
|
# check pos_order_count in each program
|
|
self.assertEqual(self.auto_promo_program_current.pos_order_count, 3)
|
|
self.assertEqual(self.auto_promo_program_next.pos_order_count, 0)
|
|
self.assertEqual(self.code_promo_program.pos_order_count, 1)
|
|
self.assertEqual(self.coupon_program.pos_order_count, 1)
|
|
# check number of generated coupons
|
|
self.assertEqual(len(self.auto_promo_program_next.coupon_ids), 5)
|
|
# check number of orders in the session
|
|
pos_session = self.main_pos_config.current_session_id
|
|
self.assertEqual(
|
|
len(pos_session.order_ids), 5, msg="5 orders were made in tour part1."
|
|
)
|
|
|
|
##
|
|
# Tour Part 2
|
|
# The coupons generated in the first part will be used in this tour.
|
|
#
|
|
|
|
# Manually set the code for some `auto_promo_program_next` coupons
|
|
# to be able to use them in defining the part2 tour.
|
|
(
|
|
promo_coupon1,
|
|
promo_coupon2,
|
|
promo_coupon3,
|
|
promo_coupon4,
|
|
*_,
|
|
) = self.auto_promo_program_next.coupon_ids
|
|
promo_coupon1.write({"code": "123456"})
|
|
promo_coupon2.write({"code": "345678"})
|
|
promo_coupon3.write({"code": "567890"})
|
|
promo_coupon4.write({"code": "098765"})
|
|
|
|
# use here the generated coupon
|
|
self.start_tour(
|
|
"/pos/web?config_id=%d" % self.main_pos_config.id,
|
|
"PosCouponTour2",
|
|
login="admin",
|
|
)
|
|
self.assertEqual(self.coupon4.state, "new")
|
|
self.assertEqual(promo_coupon4.state, "new")
|
|
# check pos_order_count in each program
|
|
self.assertEqual(self.auto_promo_program_current.pos_order_count, 5)
|
|
self.assertEqual(self.auto_promo_program_next.pos_order_count, 2)
|
|
self.assertEqual(self.code_promo_program.pos_order_count, 2)
|
|
self.assertEqual(self.coupon_program.pos_order_count, 3)
|