From 3655e8eb53538e4673e0e1b7fab7a044b3f112ba Mon Sep 17 00:00:00 2001 From: tcprod Date: Tue, 4 Feb 2025 19:05:19 +0100 Subject: [PATCH] Fix Decimal precision issue --- sql/create_database.sql | 2 +- .../pages/ManageCateringPage.py | 38 ++++++++++++------- .../services/DatabaseService.py | 6 +-- src/ez_lan_manager/types/CateringOrder.py | 3 +- 4 files changed, 30 insertions(+), 19 deletions(-) diff --git a/sql/create_database.sql b/sql/create_database.sql index 20a3cee..84ee4d5 100644 --- a/sql/create_database.sql +++ b/sql/create_database.sql @@ -28,7 +28,7 @@ CREATE TABLE `catering_menu_items` ( `catering_menu_item_id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(45) NOT NULL, `additional_info` varchar(300) DEFAULT '', - `price` int(11) NOT NULL DEFAULT 0, + `price` varchar(45) NOT NULL DEFAULT '0', `category` varchar(80) NOT NULL, `is_disabled` tinyint(4) DEFAULT 0, PRIMARY KEY (`catering_menu_item_id`) diff --git a/src/ez_lan_manager/pages/ManageCateringPage.py b/src/ez_lan_manager/pages/ManageCateringPage.py index f42f61e..3706fbd 100644 --- a/src/ez_lan_manager/pages/ManageCateringPage.py +++ b/src/ez_lan_manager/pages/ManageCateringPage.py @@ -13,6 +13,7 @@ from src.ez_lan_manager.types.Seat import Seat logger = logging.getLogger(__name__.split(".")[-1]) + class CateringOrderInfoPopup(Component): order: Optional[CateringOrder] = None close_cb: Optional[Callable] = None @@ -20,17 +21,18 @@ class CateringOrderInfoPopup(Component): def build(self) -> Component: if not self.order: return Card( - content=Text(""), - margin=1, - color=self.session.theme.hud_color, - min_width=40, - min_height=40, - on_press=self.close_cb - ) + content=Text(""), + margin=1, + color=self.session.theme.hud_color, + min_width=40, + min_height=40, + on_press=self.close_cb + ) rows = [] is_contrast_line = True for item, amount in self.order.items.items(): - style = TextStyle(fill=self.session.theme.secondary_color if is_contrast_line else self.session.theme.neutral_color) + style = TextStyle( + fill=self.session.theme.secondary_color if is_contrast_line else self.session.theme.neutral_color) is_contrast_line = not is_contrast_line rows.append( Row( @@ -44,7 +46,8 @@ class CateringOrderInfoPopup(Component): Text(f"Bestellung {self.order.order_id}", style=TextStyle(font_size=1.2), margin_bottom=1), *rows, Spacer(), - Row(Text("Gesamtpreis:"), Spacer(), Text(self.session[AccountingService].make_euro_string_from_int(self.order.price))) + Row(Text("Gesamtpreis:"), Spacer(), + Text(self.session[AccountingService].make_euro_string_from_decimal(self.order.price))) ), margin=1, color=self.session.theme.hud_color, @@ -56,11 +59,13 @@ class CateringOrderInfoPopup(Component): colorize_on_hover=False ) + @dataclass class CateringOrderWithSeat: catering_order: CateringOrder seat: Optional[Seat] + class ManageCateringPage(Component): all_orders: list[CateringOrderWithSeat] = field(default_factory=list) last_updated: Optional[datetime] = None @@ -73,7 +78,6 @@ class ManageCateringPage(Component): self.all_orders = await self.populate_seating(await self.session[CateringService].get_orders()) self.last_updated = datetime.now() - @event.periodic(30) async def update_orders(self) -> None: polled_orders = await self.session[CateringService].get_orders() @@ -88,12 +92,16 @@ class ManageCateringPage(Component): return result def get_all_pending_orders(self) -> list[CateringOrderWithSeat]: - filtered_list = list(filter(lambda o: o.catering_order.status != CateringOrderStatus.COMPLETED and o.catering_order.status != CateringOrderStatus.CANCELED, self.all_orders)) + filtered_list = list(filter(lambda + o: o.catering_order.status != CateringOrderStatus.COMPLETED and o.catering_order.status != CateringOrderStatus.CANCELED, + self.all_orders)) sorted_list = sorted(filtered_list, key=lambda o: o.catering_order.order_date) return sorted_list def get_all_completed_orders(self) -> list[CateringOrderWithSeat]: - filtered_list = list(filter(lambda o: o.catering_order.status == CateringOrderStatus.COMPLETED or o.catering_order.status == CateringOrderStatus.CANCELED, self.all_orders)) + filtered_list = list(filter(lambda + o: o.catering_order.status == CateringOrderStatus.COMPLETED or o.catering_order.status == CateringOrderStatus.CANCELED, + self.all_orders)) sorted_list = sorted(filtered_list, key=lambda o: o.catering_order.order_date) return sorted_list @@ -154,7 +162,8 @@ class ManageCateringPage(Component): margin_bottom=1, on_press=self.update_orders ), - *[CateringManagementOrderDisplay(v.catering_order, v.seat, self.order_clicked) for v in self.get_all_pending_orders()], + *[CateringManagementOrderDisplay(v.catering_order, v.seat, self.order_clicked) for v in + self.get_all_pending_orders()], ) ), MainViewContentBox( @@ -169,7 +178,8 @@ class ManageCateringPage(Component): margin_bottom=0.2, align_x=0.5 ), - *[CateringManagementOrderDisplay(v.catering_order, v.seat, self.order_clicked) for v in self.get_all_completed_orders()], + *[CateringManagementOrderDisplay(v.catering_order, v.seat, self.order_clicked) for v in + self.get_all_completed_orders()], ) ), Spacer() diff --git a/src/ez_lan_manager/services/DatabaseService.py b/src/ez_lan_manager/services/DatabaseService.py index a63213a..7f6c532 100644 --- a/src/ez_lan_manager/services/DatabaseService.py +++ b/src/ez_lan_manager/services/DatabaseService.py @@ -485,7 +485,7 @@ class DatabaseService: item_id=menu_item_raw[0], name=menu_item_raw[1], additional_info=menu_item_raw[2], - price=menu_item_raw[3], + price=Decimal(menu_item_raw[3]), category=CateringMenuItemCategory(menu_item_raw[4]), is_disabled=bool(menu_item_raw[5]) )) @@ -515,7 +515,7 @@ class DatabaseService: item_id=raw_data[0], name=raw_data[1], additional_info=raw_data[2], - price=raw_data[3], + price=Decimal(raw_data[3]), category=CateringMenuItemCategory(raw_data[4]), is_disabled=bool(raw_data[5]) ) @@ -707,7 +707,7 @@ class DatabaseService: item_id=order_catering_menu_item_raw[1], name=order_catering_menu_item_raw[4], additional_info=order_catering_menu_item_raw[5], - price=order_catering_menu_item_raw[6], + price=Decimal(order_catering_menu_item_raw[6]), category=CateringMenuItemCategory(order_catering_menu_item_raw[7]), is_disabled=bool(order_catering_menu_item_raw[8]) )] = order_catering_menu_item_raw[2] diff --git a/src/ez_lan_manager/types/CateringOrder.py b/src/ez_lan_manager/types/CateringOrder.py index 7355439..8bafba2 100644 --- a/src/ez_lan_manager/types/CateringOrder.py +++ b/src/ez_lan_manager/types/CateringOrder.py @@ -18,6 +18,7 @@ class CateringOrderStatus(StrEnum): COMPLETED = "COMPLETED" CANCELED = "CANCELED" + @dataclass(frozen=True) class CateringOrder: order_id: int @@ -31,7 +32,7 @@ class CateringOrder: def price(self) -> Decimal: total = Decimal("0") for item, amount in self.items.items(): - total += (item.price * Decimal(amount)) + total += (item.price * amount) return total @staticmethod