diff --git a/app/commons/config.py b/app/commons/config.py index d4a40d6..70a87e6 100644 --- a/app/commons/config.py +++ b/app/commons/config.py @@ -1,4 +1,5 @@ import os + # from PyQt5.QtCore import QSettings from PySide6.QtCore import QSettings @@ -39,6 +40,7 @@ class Params(object): "mode": "http", "database": "DBNAME", "user": None, + "sale_device_code": None, "printer_sale_name": None, "profile_printer": "TM-P80", "row_characters": "48", diff --git a/app/commons/forms.py b/app/commons/forms.py index 299526a..41d466f 100644 --- a/app/commons/forms.py +++ b/app/commons/forms.py @@ -377,7 +377,7 @@ class ComboBox(QComboBox): selection_model = get_simple_model(obj, values, heads) self.setModel(selection_model) self.setModelColumn(1) - selection_model.findItems(str(3), column=0) + # selection_model.findItems(str(3), column=0) self.method_on_change = None self.currentIndexChanged.connect(self.on_change) if data.get('default'): @@ -426,6 +426,23 @@ class ComboBox(QComboBox): idx = model.indexFromItem(items[0]) self.setCurrentIndex(idx.row()) + def updateComboBox(self, id_): + "only call this function if you don't need require execute onchange" + # Block signals temporarily + self.blockSignals(True) + + # Set the desired value in the QComboBox + if id_: + model = self.model() + items = model.findItems(str(id_), column=0) + idx = model.indexFromItem(items[0]) + self.setCurrentIndex(idx.row()) + else: + self.setCurrentIndex(-1) + + # Unblock signals after setting the value + self.blockSignals(False) + def set_none(self): self.setCurrentIndex(0) diff --git a/app/frontwindow.py b/app/frontwindow.py index 0f13174..abc3a8b 100644 --- a/app/frontwindow.py +++ b/app/frontwindow.py @@ -1,14 +1,13 @@ -import os -import time -from datetime import date import logging +import os +from datetime import date from pathlib import Path -from PySide6.QtWidgets import QMainWindow, QLineEdit + from PySide6.QtGui import QGuiApplication +from PySide6.QtWidgets import QLineEdit, QMainWindow + from .commons.dialogs import QuickDialog -# from .commons.dblogin import safe_reconnect -from .proxy import Model, logout -from .constants import SCREENS +from .constants import DIALOG_REPLY_YES, SCREENS from .dialogs import ( Help, ControlPanel, SearchSale, SearchParty, SearchProduct, Position, Comment, DialogPayment, DialogVoucher, DialogPrintInvoice, ProductEdit, @@ -24,10 +23,9 @@ from .dialogs import ( DialogSaleToTransfer, DialogSearchFolioTransfer, DialogSearchSaleTransfer ) -from .constants import DIALOG_REPLY_YES +from .proxy import Model, logout from .version import __version__ - __all__ = ['FrontWindow'] parent = Path(__file__).parent @@ -246,14 +244,33 @@ class FrontWindow(QMainWindow): self.User = Model('res.user', self.ctx, main_window=self) self._user, = self.User.find([('login', '=', self.user)]) self.Company = Model('company.company', self.ctx, main_window=self) + self.Device = Model('sale.device', self.ctx, main_window=self) self._company, = self.Company.find([('id', '=', 1)]) self.logo = self._company['logo'] + sale_device = self._user['sale_device'] - if not sale_device: + if not sale_device and not self.sale_device_code: return 'user_not_permissions_device' + if self.sale_device_code: + dom_device = ('code', '=', self.sale_device_code) + else: + dom_device = ('id', '=', sale_device) + + devices = self.Device.find([dom_device]) + + if not devices: + return 'user_not_permissions_device' + + self.device = devices[0] + + shop_id = self.device['shop.']['id'] + if shop_id not in self._user['shops']: + return 'user_not_permissions_device' + + self.sale_device = self.device['id'] self.ctx['user'] = self._user['id'] - self.ctx['sale_device'] = sale_device + self.ctx['sale_device'] = self.device['id'] self.ctx['shop'] = self._user['shop'] self.SaleLine = Model('sale.line', self.ctx, main_window=self) @@ -264,7 +281,6 @@ class FrontWindow(QMainWindow): self.Employee = Model('company.employee', self.ctx, main_window=self) self.Shop = Model('sale.delivery_party', self.ctx, main_window=self) self.SaleDiscont = Model('sale.discount', self.ctx, main_window=self) - self.Device = Model('sale.device', self.ctx, main_window=self) self.Category = Model('product.category', self.ctx, main_window=self) self.PaymentTerm = Model('account.invoice.payment_term', self.ctx, main_window=self) self.Party = Model('party.party', self.ctx, main_window=self) @@ -278,15 +294,12 @@ class FrontWindow(QMainWindow): self.Agent = Model('commission.agent', self.ctx, main_window=self) self.Comission = Model('commission', self.ctx, main_window=self) - self.device, = self.Device.find([ - ('id', '=', self._user['sale_device']), - ]) self.shop = self.device['shop.'] self.shop_taxes = self.shop['taxes.'] self.company = self.shop['company'] self._journals = self.device['journals.'] - self.salesman_ids = [s['id'] for s in self.shop.get('salesmans', [])] + self.sellers = {s['code']: s for s in self.shop.get('salesmans.', [])} # dom_salesman = [ # ('company', '=', self.company), diff --git a/app/main.py b/app/main.py index 483ae02..074e9b3 100644 --- a/app/main.py +++ b/app/main.py @@ -1196,8 +1196,7 @@ class AppWindow(FrontWindow): return if not salesman: return self.dialog('error_salesman_wrong') - else: - self.salesman = salesman + self.salesman = salesman self.Sale.write([self.sale_id], {'salesman': salesman['id']}) self.store.update({'salesman': salesman}) @@ -1254,16 +1253,17 @@ class AppWindow(FrontWindow): return result = self.dialog_salesman_code.exec_() code = self.field_salesman_code_ask.text() - if result == 0: - # Cancelled the action - return result - if not code: - return - salesman_list = self.Employee.find([ - ('code', '=', code) - ]) - if salesman_list: - return salesman_list[0] + if result != 0 and code: + seller = None + if code in self.sellers: + seller = self.sellers[code] + else: + sellers = self.Employee.find([('code', '=', code)]) + if sellers: + seller = sellers[0] + self.sellers[code] = seller + return seller + return 0 def action_delivery_party(self): self.dialog_delivery_party.exec_() @@ -1290,7 +1290,7 @@ class AppWindow(FrontWindow): def open_statement_accepted(self, value): res = self.Sale.faster_open_statement({ - 'device': self.device['id'], + 'device': self.sale_device, 'total_money': Decimal(value), }) if res['result']: @@ -1313,7 +1313,7 @@ class AppWindow(FrontWindow): send_mail = self.field_send_mail.isChecked() self.field_send_mail.setChecked(False) res = self.Sale.faster_close_statement({ - 'device': self.device['id'], + 'device': self.sale_device, 'data': values, 'salesman': salesman['id'], 'send_mail': send_mail, @@ -1382,10 +1382,10 @@ class AppWindow(FrontWindow): 'state': 'draft', 'comment': _sale['comment'], } - sale = self.Sale.new_sale(to_create) + sale = self.Sale.new_sale(args=[to_create]) self.SaleLine.write(lines_ids, {'sale': sale['id']}) - number = self.Sale.set_sale_number({'sale_id': sale['id']}) + number = self.Sale.set_sale_number(args=[{'sale_id': sale['id']}]) self.dialog_split_sale.info(number) self.set_amounts() @@ -1520,7 +1520,9 @@ class AppWindow(FrontWindow): 'cash_received': to_numeric(float(amount)), 'voucher_number': voucher_number, 'extra_paid': False, - }, ctx={'advance': True, 'reservation': reservation}) + 'advance': True, + 'reservation': reservation + }) if res.get('msg') not in ('missing_money', 'ok'): self.dialog(res['msg']) @@ -2353,12 +2355,13 @@ class AppWindow(FrontWindow): ('state', '=', 'draft'), ('date', '=', values['date']), ('company', '=', company), - ('sale_device.shop', '=', shop) + ('sale_device.shop', '=', shop), ], fields=['id']) if statements: return values['company'] = company values['shop'] = shop + values['device'] = self.sale_device self.dialog_reports.open_report(report_name, values) def action_terminal_journal_report(self): @@ -2663,7 +2666,7 @@ class AppWindow(FrontWindow): 'invoice_type': invoice_type[0][0], 'company': self.company, 'party': self.default_party['id'], - 'sale_device': self.device['id'], + 'sale_device': self.sale_device, 'payment_method': 'cash', 'payment_term': self.default_payment_term['id'], 'kind': 'take_away', @@ -2704,7 +2707,6 @@ class AppWindow(FrontWindow): if self.type_pos_user == 'cashier': self.message_bar.set('not_sale') return - if self.salesman_required and not self.salesman: salesman = self.action_salesman_code() if salesman == 0: @@ -2712,8 +2714,7 @@ class AppWindow(FrontWindow): return if not salesman: return self.dialog('error_salesman_wrong') - else: - self.salesman = salesman + self.salesman = salesman if self.environment == 'restaurant' and self._sale_pos_restaurant: self.dialog_consumer.clear() @@ -2743,7 +2744,7 @@ class AppWindow(FrontWindow): 'invoice_type': invoice_type[0][0], 'company': self.company, 'party': self.default_party['id'], - 'sale_device': self.device['id'], + 'sale_device': self.sale_device, 'payment_method': 'cash', 'payment_term': self.default_payment_term['id'], 'kind': kind, @@ -2753,7 +2754,7 @@ class AppWindow(FrontWindow): to_create.update({'salesman': self.salesman['id']}) if self.environment != 'restaurant' and self._config.get('use_price_list'): self.field_list_price.set_from_id(self.shop['price_list.']['id']) - sale = self.Sale.new_sale(to_create) + sale = self.Sale.new_sale(args=[to_create]) self.store.set(sale) self.sale_id = sale['id'] @@ -3358,10 +3359,13 @@ class AppWindow(FrontWindow): res = self.Sale.faster_add_payment({ 'sale_id': self.sale_id, 'journal_id': journal['id'], + 'sale_device': self.sale_device, 'cash_received': to_numeric(amount), 'voucher_number': voucher_number, 'extra_paid': False, - }, ctx={'advance': False, 'reservation': False}) + 'advance': False, + 'reservation': False + }) if res.get("msg") and res.get('msg') not in ('missing_money', 'ok') or res.get('error'): if res.get("msg"): self.dialog(res['msg']) diff --git a/app/models.py b/app/models.py index 47eccd5..e0da3a4 100644 --- a/app/models.py +++ b/app/models.py @@ -15,7 +15,7 @@ MODELS_RESTAURANT = { }, 'res.user': { 'rec_name': 'name', - 'fields': ['name', 'sale_device', 'type_pos_user', 'shop'] + 'fields': ['name', 'sale_device', 'type_pos_user', 'shop', 'shops'] }, 'product.category': { 'rec_name': 'name', @@ -124,7 +124,7 @@ MODELS_RESTAURANT = { 'shop.invoice_copies', 'shop.pos_authorization', 'shop.discounts', 'shop.computer_authorization', 'shop.manual_authorization', 'shop.credit_note_electronic_authorization', - 'shop.salesmans.rec_name', 'shop.discount_pos_method', + 'shop.salesmans.rec_name', 'shop.salesmans.code', 'shop.discount_pos_method', 'shop.debit_note_electronic_authorization', 'shop.delivery_man.rec_name', 'shop.price_list.name', 'shop.order_copies', 'shop.delivery_man.active', @@ -134,7 +134,7 @@ MODELS_RESTAURANT = { 'rec_name': 'name', 'fields': [ 'taxes', 'product_categories', 'party', 'invoice_copies', - 'warehouse', 'payment_term', 'salesmans', 'delivery_man', + 'warehouse', 'payment_term', 'delivery_man', 'discounts', 'price_list', 'order_copies'] }, 'product.product': { @@ -242,7 +242,7 @@ MODELS_RETAIL = { }, 'res.user': { 'rec_name': 'name', - 'fields': ['name', 'sale_device', 'type_pos_user', 'shop'] + 'fields': ['name', 'sale_device', 'type_pos_user', 'shop', 'shops'] }, 'product.category': { 'rec_name': 'name', @@ -347,7 +347,7 @@ MODELS_RETAIL = { 'shop.invoice_copies', 'shop.pos_authorization', 'shop.discounts', 'shop.computer_authorization', 'shop.manual_authorization', 'shop.credit_note_electronic_authorization', - 'shop.salesmans.rec_name', 'shop.delivery_man.active', + 'shop.salesmans.rec_name', 'shop.salesmans.code', 'shop.delivery_man.active', 'shop.debit_note_electronic_authorization', 'shop.delivery_man.rec_name', 'shop.price_list.name', 'shop.order_copies' @@ -357,7 +357,7 @@ MODELS_RETAIL = { 'rec_name': 'name', 'fields': [ 'taxes', 'product_categories', 'party', 'invoice_copies', - 'warehouse', 'payment_term', 'salesmans', 'delivery_man', + 'warehouse', 'payment_term', 'delivery_man', 'discounts', 'price_list', 'order_copies'] }, 'product.product': { diff --git a/app/store.py b/app/store.py index 06f4584..113e428 100644 --- a/app/store.py +++ b/app/store.py @@ -53,10 +53,11 @@ class StoreView(object): val = tr(val) field.setText(str(val)) elif isinstance(field, ComboBox): - if v: - field.set_from_id(v) - else: - field.set_none() + field.updateComboBox(v) + # if v: + # field.set_from_id(v) + # else: + # field.set_none() def update(self, values): """ diff --git a/config_pos.ini b/config_pos.ini index c9f65e7..96ddc2b 100644 --- a/config_pos.ini +++ b/config_pos.ini @@ -5,6 +5,7 @@ port=8010 mode=http database=DBNAME user=admin +sale_device_code=001 ######################################### # Printer Interface and Printer name