feat: add per-department default item discount

This commit is contained in:
Lance Edgar 2025-01-30 21:45:10 -06:00
parent 7e1d68e2cf
commit aa31d23fc8
6 changed files with 363 additions and 25 deletions

View file

@ -2,6 +2,7 @@
import datetime
import decimal
import json
from unittest.mock import patch
from sqlalchemy import orm
@ -291,6 +292,50 @@ class TestOrderView(WebTestCase):
fields = view.get_pending_product_required_fields()
self.assertEqual(fields, ['brand_name', 'size', 'unit_price_reg'])
def test_get_dept_item_discounts(self):
model = self.app.model
view = self.make_view()
with patch.object(view, 'Session', return_value=self.session):
# empty list by default
discounts = view.get_dept_item_discounts()
self.assertEqual(discounts, [])
# mock settings
self.app.save_setting(self.session, 'sideshow.orders.departments.5.name', 'Bulk')
self.app.save_setting(self.session, 'sideshow.orders.departments.5.default_item_discount', '15')
self.app.save_setting(self.session, 'sideshow.orders.departments.6.name', 'Produce')
self.app.save_setting(self.session, 'sideshow.orders.departments.6.default_item_discount', '5')
discounts = view.get_dept_item_discounts()
self.assertEqual(len(discounts), 2)
self.assertEqual(discounts[0], {
'department_id': '5',
'department_name': 'Bulk',
'default_item_discount': '15',
})
self.assertEqual(discounts[1], {
'department_id': '6',
'department_name': 'Produce',
'default_item_discount': '5',
})
# invalid setting
self.app.save_setting(self.session, 'sideshow.orders.departments.I.N.V.A.L.I.D.name', 'Bad News')
self.app.save_setting(self.session, 'sideshow.orders.departments.I.N.V.A.L.I.D.default_item_discount', '42')
discounts = view.get_dept_item_discounts()
self.assertEqual(len(discounts), 2)
self.assertEqual(discounts[0], {
'department_id': '5',
'department_name': 'Bulk',
'default_item_discount': '15',
})
self.assertEqual(discounts[1], {
'department_id': '6',
'department_name': 'Produce',
'default_item_discount': '5',
})
def test_get_context_customer(self):
self.pyramid_config.add_route('orders', '/orders/')
model = self.app.model
@ -1288,6 +1333,12 @@ class TestOrderView(WebTestCase):
model = self.app.model
view = self.make_view()
self.app.save_setting(self.session, 'sideshow.orders.departments.5.name', 'Bulk')
self.app.save_setting(self.session, 'sideshow.orders.departments.5.default_item_discount', '15')
self.app.save_setting(self.session, 'sideshow.orders.departments.6.name', 'Produce')
self.app.save_setting(self.session, 'sideshow.orders.departments.6.default_item_discount', '5')
self.session.commit()
with patch.object(view, 'Session', return_value=self.session):
with patch.multiple(self.config, usedb=True, preferdb=True):
@ -1295,7 +1346,19 @@ class TestOrderView(WebTestCase):
allowed = self.config.get_bool('sideshow.orders.allow_unknown_products',
session=self.session)
self.assertIsNone(allowed)
self.assertEqual(self.session.query(model.Setting).count(), 0)
self.assertEqual(self.session.query(model.Setting).count(), 4)
discounts = view.get_dept_item_discounts()
self.assertEqual(len(discounts), 2)
self.assertEqual(discounts[0], {
'department_id': '5',
'department_name': 'Bulk',
'default_item_discount': '15',
})
self.assertEqual(discounts[1], {
'department_id': '6',
'department_name': 'Produce',
'default_item_discount': '5',
})
# fetch initial page
response = view.configure()
@ -1305,13 +1368,18 @@ class TestOrderView(WebTestCase):
allowed = self.config.get_bool('sideshow.orders.allow_unknown_products',
session=self.session)
self.assertIsNone(allowed)
self.assertEqual(self.session.query(model.Setting).count(), 0)
self.assertEqual(self.session.query(model.Setting).count(), 4)
# post new settings
with patch.multiple(self.request, create=True,
method='POST',
POST={
'sideshow.orders.allow_unknown_products': 'true',
'dept_item_discounts': json.dumps([{
'department_id': '5',
'department_name': 'Grocery',
'default_item_discount': 10,
}])
}):
response = view.configure()
self.assertIsInstance(response, HTTPFound)
@ -1320,6 +1388,13 @@ class TestOrderView(WebTestCase):
session=self.session)
self.assertTrue(allowed)
self.assertTrue(self.session.query(model.Setting).count() > 1)
discounts = view.get_dept_item_discounts()
self.assertEqual(len(discounts), 1)
self.assertEqual(discounts[0], {
'department_id': '5',
'department_name': 'Grocery',
'default_item_discount': '10',
})
class OrderItemViewTestMixin: