Cleanup tender logic a bit; require amount
This commit is contained in:
		
							parent
							
								
									114c6e4dd6
								
							
						
					
					
						commit
						44b3b437e3
					
				
					 1 changed files with 99 additions and 29 deletions
				
			
		|  | @ -138,7 +138,7 @@ class POSView(WuttaView): | |||
|             session.commit() | ||||
|             self.add_row_item(row) | ||||
|             self.items.scroll_to(offset=-1, duration=250) | ||||
|             self.txn_total.value = self.app.render_currency(batch.sales_total) | ||||
|             self.txn_total.value = self.app.render_currency(batch.get_balance()) | ||||
|             self.reset() | ||||
| 
 | ||||
|         else: | ||||
|  | @ -251,7 +251,16 @@ class POSView(WuttaView): | |||
|                         bgcolor='yellow', | ||||
|                         visible=different, | ||||
|                     ), | ||||
|                     ft.Markdown(info), | ||||
|                     ft.Divider(), | ||||
|                     ft.Container( | ||||
|                         theme_mode=ft.ThemeMode.SYSTEM, | ||||
|                         theme=ft.Theme(text_theme=ft.TextTheme( | ||||
|                             body_medium=ft.TextStyle( | ||||
|                                 size=24, | ||||
|                                 color='black', | ||||
|                             ))), | ||||
|                         content=ft.Markdown(info), | ||||
|                     ), | ||||
|                 ], | ||||
|                 height=500, | ||||
|                 width=500, | ||||
|  | @ -400,7 +409,7 @@ class POSView(WuttaView): | |||
|             title=ft.Text("Remove Customer"), | ||||
|             content=ft.Text("Really remove the customer from this transaction?", size=20), | ||||
|             actions=[ | ||||
|                 ft.Container(content=ft.Text("Remove", | ||||
|                 ft.Container(content=ft.Text("Yes, Remove", | ||||
|                                              size=font_size, | ||||
|                                              weight=ft.FontWeight.BOLD), | ||||
|                              height=self.default_button_size, | ||||
|  | @ -711,25 +720,13 @@ class POSView(WuttaView): | |||
|                                 border_radius=ft.border_radius.all(5), | ||||
|                                 bgcolor='orange') | ||||
| 
 | ||||
|         cash = { | ||||
|             'tender_code': self.tender_cash.code if self.tender_cash else 'CA', | ||||
|             'tender_name': self.tender_cash.name if self.tender_cash else "Cash", | ||||
|         } | ||||
| 
 | ||||
|         check = { | ||||
|             'tender_code': self.tender_check.code if self.tender_check else 'CK', | ||||
|             'tender_name': self.tender_check.name if self.tender_check else "Check", | ||||
|         } | ||||
| 
 | ||||
|         self.context_menu = ft.Container( | ||||
|             content=ft.Column( | ||||
|                 [ | ||||
|                     ft.Row( | ||||
|                         [ | ||||
|                             context_button(cash['tender_name'], data=cash, | ||||
|                                            on_click=self.tender_click), | ||||
|                             context_button(check['tender_name'], data=check, | ||||
|                                            on_click=self.tender_click), | ||||
|                             self.make_cash_button(), | ||||
|                             self.make_check_button(), | ||||
|                         ], | ||||
|                         spacing=0, | ||||
|                     ), | ||||
|  | @ -786,6 +783,41 @@ class POSView(WuttaView): | |||
|         kwargs.setdefault('size', 24) | ||||
|         return ft.Text(*args, **kwargs) | ||||
| 
 | ||||
|     def make_tender_button(self, tender, **kwargs): | ||||
|         if isinstance(tender, self.model.Tender): | ||||
|             info = {'tender_code': tender.code, | ||||
|                     'tender_name': tender.name} | ||||
|         else: | ||||
|             info = tender | ||||
| 
 | ||||
|         font_size = kwargs.pop('font_size', self.default_font_size) | ||||
|         text = ft.Text(info['tender_name'], | ||||
|                        size=font_size, | ||||
|                        weight=ft.FontWeight.BOLD) | ||||
| 
 | ||||
|         kw = { | ||||
|             'height': self.default_button_size, | ||||
|             'width': self.default_button_size * 2, | ||||
|             'on_click': self.tender_click, | ||||
|             'alignment': ft.alignment.center, | ||||
|             'border': ft.border.all(1, 'black'), | ||||
|             'border_radius': ft.border_radius.all(5), | ||||
|             'bgcolor': 'orange', | ||||
|         } | ||||
|         kw.update(kwargs) | ||||
|         kw['data'] = info | ||||
|         return ft.Container(content=text, **kw) | ||||
| 
 | ||||
|     def make_cash_button(self, **kwargs): | ||||
|         cash = self.tender_cash or {'tender_code': 'CA', | ||||
|                                     'tender_name': "Cash"} | ||||
|         return self.make_tender_button(cash, **kwargs) | ||||
| 
 | ||||
|     def make_check_button(self, **kwargs): | ||||
|         check = self.tender_check or {'tender_code': 'CK', | ||||
|                                       'tender_name': "Check"} | ||||
|         return self.make_tender_button(check, **kwargs) | ||||
| 
 | ||||
|     def get_current_user(self, session): | ||||
|         uuid = self.page.session.get('user_uuid') | ||||
|         if uuid: | ||||
|  | @ -820,7 +852,7 @@ class POSView(WuttaView): | |||
|                 self.add_row_item(row) | ||||
|             self.items.scroll_to(offset=-1, duration=100) | ||||
| 
 | ||||
|             self.txn_total.value = self.app.render_currency(batch.sales_total) | ||||
|             self.txn_total.value = self.app.render_currency(batch.get_balance()) | ||||
| 
 | ||||
|         else: | ||||
|             self.page.session.set('txn_display', None) | ||||
|  | @ -954,9 +986,10 @@ class POSView(WuttaView): | |||
|         user = self.get_current_user(session) | ||||
|         batch = self.get_current_batch(session, user=user, create=False) | ||||
| 
 | ||||
|         # nothing to do if no transaction | ||||
|         if not batch: | ||||
|             session.close() | ||||
|             self.page.snack_bar = ft.SnackBar(ft.Text(f"NO TRANSACTION", | ||||
|             self.page.snack_bar = ft.SnackBar(ft.Text("NO TRANSACTION", | ||||
|                                                       color='black', | ||||
|                                                       size=20, | ||||
|                                                       weight=ft.FontWeight.BOLD), | ||||
|  | @ -966,9 +999,38 @@ class POSView(WuttaView): | |||
|             self.reset() | ||||
|             return | ||||
| 
 | ||||
|         # nothing to do if zero sales | ||||
|         if not batch.get_balance(): | ||||
|             session.close() | ||||
|             self.page.snack_bar = ft.SnackBar(ft.Text(f"NO SALES", | ||||
|             self.page.snack_bar = ft.SnackBar(ft.Text("NO SALES", | ||||
|                                                       color='black', | ||||
|                                                       size=20, | ||||
|                                                       weight=ft.FontWeight.BOLD), | ||||
|                                               bgcolor='yellow', | ||||
|                                               duration=1500) | ||||
|             self.page.snack_bar.open = True | ||||
|             self.reset() | ||||
|             return | ||||
| 
 | ||||
|         # nothing to do if no amount provided | ||||
|         if not self.main_input.value: | ||||
|             session.close() | ||||
|             self.page.snack_bar = ft.SnackBar(ft.Text("MUST SPECIFY AMOUNT", | ||||
|                                                       color='black', | ||||
|                                                       size=20, | ||||
|                                                       weight=ft.FontWeight.BOLD), | ||||
|                                               bgcolor='yellow', | ||||
|                                               duration=1500) | ||||
|             self.page.snack_bar.open = True | ||||
|             self.reset() | ||||
|             return | ||||
| 
 | ||||
|         # nothing to do if amount not valid | ||||
|         try: | ||||
|             amount = decimal.Decimal(self.main_input.value) | ||||
|         except: | ||||
|             session.close() | ||||
|             self.page.snack_bar = ft.SnackBar(ft.Text(f"AMOUNT NOT VALID: {self.main_input.value}", | ||||
|                                                       color='black', | ||||
|                                                       size=20, | ||||
|                                                       weight=ft.FontWeight.BOLD), | ||||
|  | @ -981,13 +1043,16 @@ class POSView(WuttaView): | |||
|         # tender / execute batch | ||||
|         code = e.control.data['tender_code'] | ||||
|         tender = handler.get_tender(session, code) | ||||
|         amount = -batch.get_balance() | ||||
|         try: | ||||
| 
 | ||||
|             # TODO: should prompt user for amount | ||||
|             # TODO: also should display the tender item somehow, | ||||
|             # unless that finalized txn in which case..?? | ||||
|             row = handler.apply_tender(batch, user, tender or code, amount) | ||||
|             # TODO: still need support for the following: | ||||
|             # - if balance remains, update display (i.e. show this tender) | ||||
|             # - if this tender overpays, how to handle change back? | ||||
| 
 | ||||
|             # apply tender amount to batch | ||||
|             # nb. this *may* execute the batch! | ||||
|             # nb. we negate the amount supplied by user | ||||
|             rows = handler.apply_tender(batch, user, tender or code, -amount) | ||||
| 
 | ||||
|         except Exception as error: | ||||
|             session.rollback() | ||||
|  | @ -1003,13 +1068,18 @@ class POSView(WuttaView): | |||
| 
 | ||||
|         else: | ||||
|             session.commit() | ||||
|         finally: | ||||
|             session.close() | ||||
| 
 | ||||
|             # TODO: maybe shouldn't clear screen so immediately? | ||||
|             if batch.executed: | ||||
|                 self.clear_all() | ||||
| 
 | ||||
|             else: | ||||
|                 # update screen to reflect new balance | ||||
|                 self.txn_total.value = self.app.render_currency(batch.get_balance()) | ||||
| 
 | ||||
|         finally: | ||||
|             session.close() | ||||
| 
 | ||||
|         self.reset() | ||||
| 
 | ||||
|     def clear_all(self): | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Lance Edgar
						Lance Edgar