mirror of
https://github.com/bringout/oca-ocb-pos.git
synced 2026-04-23 00:22:06 +02:00
284 lines
10 KiB
Python
284 lines
10 KiB
Python
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
|
|
|
from odoo import Command
|
|
from odoo.tests import tagged, new_test_user, users
|
|
from odoo.addons.point_of_sale.tests.test_frontend import TestPointOfSaleHttpCommon
|
|
|
|
|
|
class TestPosHrHttpCommon(TestPointOfSaleHttpCommon):
|
|
@classmethod
|
|
def setUpClass(cls):
|
|
super().setUpClass()
|
|
|
|
cls.env.user.group_ids += cls.env.ref('hr.group_hr_user')
|
|
|
|
cls.main_pos_config.write({"module_pos_hr": True})
|
|
|
|
# Admin employee
|
|
cls.admin = cls.env.ref("hr.employee_admin").sudo().copy({
|
|
"date_version": '2000-01-01',
|
|
"company_id": cls.env.company.id,
|
|
"user_id": cls.pos_admin.id,
|
|
"name": "Mitchell Admin",
|
|
"pin": False,
|
|
})
|
|
|
|
# Managers
|
|
cls.manager_user = new_test_user(
|
|
cls.env,
|
|
login="manager_user",
|
|
groups="point_of_sale.group_pos_manager",
|
|
name="Pos Manager",
|
|
email="manager_user@pos.com",
|
|
)
|
|
cls.manager1 = cls.env['hr.employee'].create({
|
|
'name': 'Test Manager 1',
|
|
"company_id": cls.env.company.id,
|
|
"user_id": cls.manager_user.id,
|
|
"pin": "5651"
|
|
})
|
|
cls.manager2 = cls.env['hr.employee'].create({
|
|
'name': 'Test Manager 2',
|
|
"company_id": cls.env.company.id,
|
|
"pin": "5652"
|
|
})
|
|
|
|
# User employee
|
|
cls.emp1 = cls.env['hr.employee'].create({
|
|
'name': 'Test Employee 1',
|
|
"company_id": cls.env.company.id,
|
|
})
|
|
emp1_user = new_test_user(
|
|
cls.env,
|
|
login="emp1_user",
|
|
groups="base.group_user, point_of_sale.group_pos_user, account.group_account_invoice",
|
|
name="Pos Employee1",
|
|
email="emp1_user@pos.com",
|
|
)
|
|
cls.emp1.write({"name": "Pos Employee1", "pin": "2580", "user_id": emp1_user.id})
|
|
|
|
# Non-user employee
|
|
cls.emp2 = cls.env['hr.employee'].create({
|
|
'name': 'Test Employee 2',
|
|
"company_id": cls.env.company.id,
|
|
})
|
|
cls.emp2.write({"name": "Pos Employee2", "pin": "1234"})
|
|
(cls.admin + cls.emp1 + cls.emp2).company_id = cls.env.company
|
|
|
|
cls.emp3 = cls.env['hr.employee'].create({
|
|
'name': 'Test Employee 3',
|
|
"user_id": cls.pos_user.id,
|
|
"company_id": cls.env.company.id,
|
|
})
|
|
|
|
cls.emp4 = cls.env['hr.employee'].create({
|
|
'name': 'Test Employee 4',
|
|
"company_id": cls.env.company.id,
|
|
})
|
|
|
|
cls.main_pos_config.write({
|
|
'basic_employee_ids': [Command.link(cls.emp1.id), Command.link(cls.emp2.id), Command.link(cls.emp3.id)],
|
|
'minimal_employee_ids': [Command.link(cls.emp4.id)],
|
|
'advanced_employee_ids': [Command.link(cls.manager1.id), Command.link(cls.manager2.id)]
|
|
})
|
|
|
|
|
|
@tagged("post_install", "-at_install")
|
|
class TestUi(TestPosHrHttpCommon):
|
|
def test_01_pos_hr_tour(self):
|
|
self.pos_admin.write({
|
|
"group_ids": [
|
|
(4, self.env.ref('account.group_account_invoice').id)
|
|
]
|
|
})
|
|
self.main_pos_config.update({
|
|
'advanced_employee_ids': [(6, 0, self.admin.ids)],
|
|
})
|
|
self.main_pos_config.with_user(self.pos_admin).open_ui()
|
|
self.start_pos_tour("PosHrTour", login="pos_admin")
|
|
|
|
def test_cashier_stay_logged_in(self):
|
|
# open a session, the /pos/ui controller will redirect to it
|
|
self.main_pos_config.with_user(self.pos_admin).open_ui()
|
|
|
|
self.start_tour(
|
|
"/pos/ui/%d" % self.main_pos_config.id,
|
|
"CashierStayLogged",
|
|
login="pos_admin",
|
|
)
|
|
|
|
def test_cashier_can_see_product_info(self):
|
|
# open a session, the /pos/ui controller will redirect to it
|
|
self.product_a.available_in_pos = True
|
|
self.main_pos_config.with_user(self.pos_admin).open_ui()
|
|
|
|
self.start_tour(
|
|
"/pos/ui/%d" % self.main_pos_config.id,
|
|
"CashierCanSeeProductInfo",
|
|
login="pos_admin",
|
|
)
|
|
|
|
def test_basic_user_cannot_close_session(self):
|
|
# open a session, the /pos/ui controller will redirect to it
|
|
self.main_pos_config.advanced_employee_ids = []
|
|
self.main_pos_config.basic_employee_ids = [
|
|
Command.link(self.emp3.id),
|
|
]
|
|
self.main_pos_config.with_user(self.pos_admin).open_ui()
|
|
|
|
self.start_tour(
|
|
"/pos/ui/%d" % self.main_pos_config.id,
|
|
"CashierCannotClose",
|
|
login="pos_user",
|
|
)
|
|
|
|
def test_basic_user_can_change_price(self):
|
|
self.main_pos_config.advanced_employee_ids = []
|
|
self.main_pos_config.basic_employee_ids = [
|
|
Command.link(self.emp3.id),
|
|
Command.link(self.admin.id)
|
|
]
|
|
self.main_pos_config.write({
|
|
"restrict_price_control": False,
|
|
})
|
|
self.main_pos_config.with_user(self.pos_admin).open_ui()
|
|
|
|
self.start_tour(
|
|
"/pos/ui?config_id=%d" % self.main_pos_config.id,
|
|
"test_basic_user_can_change_price",
|
|
login="pos_user",
|
|
)
|
|
|
|
def test_change_on_rights_reflected_directly(self):
|
|
"""When changes in employee rights (advanced/basic/minimal) should
|
|
be reflected directly and not read from the cache."""
|
|
|
|
self.main_pos_config.advanced_employee_ids = self.pos_admin.employee_id
|
|
self.main_pos_config.with_user(self.pos_admin).open_ui()
|
|
self.start_tour(
|
|
"/pos/ui?config_id=%d" % self.main_pos_config.id,
|
|
"test_change_on_rights_reflected_directly",
|
|
login="pos_admin",
|
|
)
|
|
|
|
def test_cashier_changed_in_receipt(self):
|
|
"""
|
|
Checks that when the cashier is changed during the order,
|
|
the receipts displays the employee that concluded the order,
|
|
meaning the one that was at the register when the customer was paying.
|
|
Also checks that the order has the right cashier and employee in the same
|
|
use case.
|
|
"""
|
|
self.product_a.available_in_pos = True
|
|
self.main_pos_config.with_user(self.pos_admin).open_ui()
|
|
|
|
self.start_tour(
|
|
"/pos/ui?config_id=%d" % self.main_pos_config.id,
|
|
"test_cashier_changed_in_receipt",
|
|
login="pos_admin",
|
|
)
|
|
order = self.main_pos_config.current_session_id.order_ids[0]
|
|
self.assertEqual(order.cashier, "Test Employee 3")
|
|
self.assertEqual(order.employee_id.display_name, "Test Employee 3")
|
|
|
|
def test_minimal_employee_refund(self):
|
|
minimal_emp = self.env['hr.employee'].create({
|
|
'name': 'Minimal Employee',
|
|
"company_id": self.env.company.id,
|
|
})
|
|
self.main_pos_config.update({
|
|
'minimal_employee_ids': [(6, 0, minimal_emp.ids)],
|
|
})
|
|
self.main_pos_config.with_user(self.pos_admin).open_ui()
|
|
current_session = self.main_pos_config.current_session_id
|
|
current_session.set_opening_control(0, None)
|
|
order = self.env['pos.order'].create({
|
|
'company_id': self.env.company.id,
|
|
'session_id': current_session.id,
|
|
'partner_id': self.partner_a.id,
|
|
'pricelist_id': self.partner_a.property_product_pricelist.id,
|
|
'lines': [
|
|
Command.create({
|
|
'product_id': self.product_a.id,
|
|
'qty': 1,
|
|
'price_subtotal': 100.0,
|
|
'price_subtotal_incl': 100.0,
|
|
}),
|
|
],
|
|
'amount_tax': 0.0,
|
|
'amount_total': 100.0,
|
|
'amount_paid': 0.0,
|
|
'amount_return': 0.0,
|
|
})
|
|
|
|
payment_context = {"active_ids": order.ids, "active_id": order.id}
|
|
order_payment = self.env['pos.make.payment'].with_context(**payment_context).create({
|
|
'amount': 100,
|
|
'payment_method_id': self.bank_payment_method.id
|
|
})
|
|
order_payment.with_context(**payment_context).check()
|
|
self.start_pos_tour("test_minimal_employee_refund", login="pos_admin")
|
|
|
|
def test_cost_and_margin_visibility(self):
|
|
self.product_a.available_in_pos = True
|
|
self.main_pos_config.write({
|
|
'is_margins_costs_accessible_to_every_user': True,
|
|
})
|
|
self.main_pos_config.with_user(self.pos_admin).open_ui()
|
|
|
|
self.start_tour(
|
|
"/pos/ui?config_id=%d" % self.main_pos_config.id,
|
|
"test_cost_and_margin_visibility",
|
|
login="pos_admin",
|
|
)
|
|
|
|
@users('pos_admin')
|
|
def test_create_pos_config_without_hr_right(self):
|
|
self.env['pos.config'].create({
|
|
'name': 'My cute pos config',
|
|
'module_pos_hr': True,
|
|
'advanced_employee_ids': [(6, 0, self.emp2.ids)]
|
|
})
|
|
|
|
def test_go_backend(self):
|
|
self.main_pos_config.with_user(self.manager_user).open_ui()
|
|
|
|
self.start_pos_tour("pos_hr_go_backend_closed_registered", login="manager_user")
|
|
self.start_pos_tour("pos_hr_go_backend_opened_registered", login="manager_user")
|
|
self.start_pos_tour("pos_hr_go_backend_opened_registered_different_user_logged", login="emp1_user")
|
|
|
|
def test_maximum_closing_difference(self):
|
|
self.main_pos_config.set_maximum_difference = True
|
|
self.main_pos_config.amount_authorized_diff = 0
|
|
|
|
# Admin users should still be able to override max difference
|
|
# regardless if they are the connected user or not
|
|
self.main_pos_config.with_user(self.pos_user).open_ui()
|
|
self.start_tour(
|
|
"/pos/ui?config_id=%d" % self.main_pos_config.id,
|
|
"test_maximum_closing_difference",
|
|
login="pos_user"
|
|
)
|
|
|
|
# Advanced rights employees should not override max difference
|
|
# when the connected user has admin rights (they never should)
|
|
self.main_pos_config.with_user(self.pos_admin).open_ui()
|
|
self.start_tour(
|
|
"/pos/ui?config_id=%d" % self.main_pos_config.id,
|
|
"test_maximum_closing_difference",
|
|
login="pos_admin"
|
|
)
|
|
|
|
def test_scan_employee_barcode_with_pos_hr_disabled(self):
|
|
"""
|
|
Ensure that scanning an employee barcode when module_pos_hr is disabled does not
|
|
trigger any traceback.
|
|
"""
|
|
self.main_pos_config.module_pos_hr = False
|
|
self.main_pos_config.with_user(self.pos_admin).open_ui()
|
|
|
|
self.start_tour(
|
|
"/pos/ui?config_id=%d" % self.main_pos_config.id,
|
|
"test_scan_employee_barcode_with_pos_hr_disabled",
|
|
login="pos_admin"
|
|
)
|