refactory code in app pos
This commit is contained in:
parent
e94a7c868c
commit
50739286d6
16
INSTALL
16
INSTALL
|
@ -13,7 +13,6 @@ On Debian, Ubuntu and Derivatives, it is recommended to use: $ apt install packa
|
|||
|
||||
* Python 3.10 or later (http://www.python.org/)
|
||||
* python-setuptools
|
||||
* python3-pySide6
|
||||
* python3-dateutil
|
||||
* python3-pip
|
||||
* libusb-1.0-0
|
||||
|
@ -24,18 +23,15 @@ On Debian, Ubuntu and Derivatives, it is recommended to use: $ apt install packa
|
|||
* python3-dev
|
||||
* python3-pil
|
||||
|
||||
* neo (https://bitbucket.org/presik/neox)
|
||||
|
||||
The following packages must be installed using PIP
|
||||
|
||||
pip3 install pyusb
|
||||
pip3 install pillow
|
||||
pip3 install qrcode
|
||||
pip3 install paramiko
|
||||
pip3 install pycups
|
||||
pip3 install requests
|
||||
pip3 install simplejson
|
||||
pip3 install orjson
|
||||
pip3 install escpos
|
||||
pip3 install PySide6
|
||||
|
||||
|
||||
For Windows add:
|
||||
|
@ -170,14 +166,6 @@ This last one is optional if applicable.
|
|||
POS CLIENT INSTALLATION AND CONFIGURATION
|
||||
----------------------------------------------------------------------------
|
||||
|
||||
POS Client Requirements:
|
||||
|
||||
* libjpeg8
|
||||
* libjpeg62-dev
|
||||
* libfreetype6
|
||||
* libfreetype6-dev
|
||||
|
||||
|
||||
Download the POS Client, using the hg clone command:
|
||||
|
||||
https://bitbucket.org/presik/presik_pos
|
||||
|
|
21
INSTALL_es
21
INSTALL_es
|
@ -1,7 +1,7 @@
|
|||
Instalación de Tryton POS Client Qt5
|
||||
====================================
|
||||
|
||||
Esta versión solo es compatible con Tryton 5.0+, se asume que el usuario tiene
|
||||
Esta versión solo es compatible con Tryton 6.0+, se asume que el usuario tiene
|
||||
conocimientos básicos previos sobre la instalación y configuración de Tryton,
|
||||
especialmente los modulos oficiales relacionados con contabilidad y ventas, no
|
||||
es el objeto de esta guia abordar temas de configuración básica.
|
||||
|
@ -11,10 +11,8 @@ paquetes instalados en el sistema:
|
|||
|
||||
En Debian, Ubuntu y Derivados, se recomienda usar: $ apt install paquete
|
||||
|
||||
* Python 3.7 or later (http://www.python.org/)
|
||||
* Python 3.10 or later (http://www.python.org/)
|
||||
* python-setuptools
|
||||
* python3-pyqt5
|
||||
* python3-pyqt5.qtsvg
|
||||
* python3-dateutil
|
||||
* python3-pip
|
||||
* libusb-1.0-0
|
||||
|
@ -35,7 +33,7 @@ Los siguientes paquetes se deben instalar usando PIP
|
|||
pip3 install paramiko
|
||||
pip3 install orjson
|
||||
pip3 install escpos
|
||||
pip3 install PySide6>=6.4.1
|
||||
pip3 install PySide6
|
||||
|
||||
|
||||
Tener en cuenta que algunos paquetes se deben instalar con pip para python3.
|
||||
|
@ -43,7 +41,7 @@ Tener en cuenta que algunos paquetes se deben instalar con pip para python3.
|
|||
Nota: el Cliente POS de momento ha sido testeado en Windows parcialmente, asi que
|
||||
no hay garantia de que funcione al 100% en este OS.
|
||||
|
||||
Se recomienda instalar Tryton 5.0 creando un ambiente virtual con
|
||||
Se recomienda instalar Tryton 6.0 creando un ambiente virtual con
|
||||
virtualenv.
|
||||
|
||||
Los siguientes módulos se deben instalar en la base de datos Tryton
|
||||
|
@ -84,6 +82,7 @@ Modulos No Oficiales (Presik)
|
|||
* trytonpsk_sale_salesman (https://bitbucket.org/presik/trytonpsk_sale_salesman)
|
||||
* trytonpsk_sale_discount (https://bitbucket.org/presik/trytonpsk_sale_discount)
|
||||
* trytonpsk_sale_pos_frontend (https://bitbucket.org/presik/trytonpsk_sale_pos_frontend)
|
||||
* trytonpsk_sale_co (https://bitbucket.org/presik/trytonpsk_sale_co
|
||||
|
||||
Ingresar al directorio e instalar (dentro del ambiente virtual
|
||||
anteriormente creado):
|
||||
|
@ -165,14 +164,6 @@ Este último es opcional si es aplica.
|
|||
INSTALACION Y CONFIGURACION DEL CLIENTE POS
|
||||
----------------------------------------------------------------------------
|
||||
|
||||
Requisitos del Cliente POS:
|
||||
|
||||
* libjpeg8
|
||||
* libjpeg62-dev
|
||||
* libfreetype6
|
||||
* libfreetype6-dev
|
||||
|
||||
|
||||
Instalelos con: apt-get install paquete
|
||||
|
||||
Ahora se debe descargar e instalar el modulo python_escpos, el cual
|
||||
|
@ -283,7 +274,7 @@ Haga una venta desde Tryton sin POS
|
|||
-----------------------------------
|
||||
|
||||
Asi que en este punto sin necesidad del Cliente POS usted debería ser
|
||||
capaz a través del cliente Tryton 5.0, de hacer ventas:
|
||||
capaz a través del cliente Tryton 6.0, de hacer ventas:
|
||||
|
||||
>> Ventas > Ventas POS
|
||||
|
||||
|
|
2
README
2
README
|
@ -2,7 +2,7 @@ Presik POS Client for Tryton
|
|||
=========================================
|
||||
|
||||
The Point of Sale Client for Tryton application platform development
|
||||
in Qt5 and Python3.
|
||||
in Qt5(PySide6) and Python3.
|
||||
|
||||
Installing
|
||||
----------
|
||||
|
|
|
@ -44,7 +44,7 @@ class StartButtons(QVBoxLayout):
|
|||
['button_start_take_away', 'PARA LLEVAR', 'action_start_take_away', 'take_away'],
|
||||
['button_start_delivery', 'DOMICILIO', 'action_start_delivery', 'delivery'],
|
||||
])
|
||||
if parent.enviroment == 'restaurant':
|
||||
if parent.environment == 'restaurant':
|
||||
values_extend([
|
||||
['button_start_table', 'A LA MESA', 'action_start_table', 'table'],
|
||||
['button_start_catering', 'CATERING', 'action_start_catering', 'catering'],
|
||||
|
@ -54,7 +54,7 @@ class StartButtons(QVBoxLayout):
|
|||
['button_print_sale', 'IMPRIMIR', 'action_print_sale', 'print_sale'],
|
||||
])
|
||||
|
||||
if parent.enviroment == 'restaurant':
|
||||
if parent.environment == 'restaurant':
|
||||
values_extend([
|
||||
['button_tables', 'VER MESAS', 'action_tables', 'tables']
|
||||
])
|
||||
|
@ -70,7 +70,7 @@ class StartButtons(QVBoxLayout):
|
|||
['button_reports', 'REPORTES', 'action_reports', 'reports'],
|
||||
['button_historic_sales', 'HISTORIAL', 'action_historic_sales', 'sales_history'],
|
||||
])
|
||||
if parent.enviroment == 'retail':
|
||||
if parent.environment == 'retail':
|
||||
values_extend([
|
||||
['button_collection', 'RECAUDO', 'action_collection', 'collection']
|
||||
])
|
||||
|
@ -104,7 +104,7 @@ class ButtonsFunction(QGridLayout):
|
|||
self.setVerticalSpacing(2)
|
||||
self.parent = parent
|
||||
self.set_values(values)
|
||||
if self.parent.enviroment == 'restaurant':
|
||||
if self.parent.environment == 'restaurant':
|
||||
rows = 3
|
||||
columns = 5
|
||||
name_style = 'toolbar'
|
||||
|
@ -144,7 +144,7 @@ class ButtonsFunction(QGridLayout):
|
|||
['button_advance', 'ANTICIPO', 'action_add_advance'],
|
||||
])
|
||||
|
||||
if self.parent.enviroment == 'restaurant':
|
||||
if self.parent.environment == 'restaurant':
|
||||
rest_options = [
|
||||
['button_delivery', 'AGREGAR DOMICILIO', 'action_delivery'],
|
||||
['button_comment', 'NOTA', 'action_comment'],
|
||||
|
@ -250,7 +250,7 @@ class ButtonsStacked(QWidget):
|
|||
hbox.addWidget(self.stacked, 0)
|
||||
if pos_user in ('cashier', 'frontend_admin'):
|
||||
hbox.addWidget(self.button_payment_term, 0)
|
||||
if parent.enviroment == 'retail':
|
||||
if parent.environment == 'retail':
|
||||
if pos_user == 'cashier' and getattr(parent, 'button_to_draft_active', None):
|
||||
self.button_to_draft = CustomButton(
|
||||
id='button_to_draft',
|
||||
|
|
|
@ -33,9 +33,37 @@ class Params(object):
|
|||
config_file = self.file
|
||||
|
||||
settings = QSettings(config_file, QSettings.IniFormat)
|
||||
|
||||
self.params = {}
|
||||
self.params = {
|
||||
"server": "localhost",
|
||||
"port": "8010",
|
||||
"mode": "http",
|
||||
"database": "DBNAME",
|
||||
"user": None,
|
||||
"printer_sale_name": None,
|
||||
"profile_printer": "TM-P80",
|
||||
"row_characters": "48",
|
||||
"print_receipt": "manually", # manually or automatic
|
||||
"active_weighing": False,
|
||||
"print_order": False,
|
||||
"print_auto_order": False,
|
||||
"auto_print_commission": False,
|
||||
"button_to_draft_active": False,
|
||||
"server_printer": False,
|
||||
"active_timeout": True,
|
||||
"tasks_station": True,
|
||||
"timeout": 10000,
|
||||
"tablet_mode": False,
|
||||
"theme": "base",
|
||||
"mode_window": "maximized",
|
||||
"locale": "es_CO.UTF-8",
|
||||
"language": "es_CO",
|
||||
"environment": "retail",
|
||||
"profile_name": "MY DEMO"
|
||||
}
|
||||
for key in settings.allKeys():
|
||||
if key[0] == '#':
|
||||
continue
|
||||
self.params[key] = settings.value(key, None)
|
||||
if key == 'enviroment': # for remove this condition
|
||||
self.params['environment'] = settings.value(key, None)
|
||||
else:
|
||||
self.params[key] = settings.value(key, None)
|
||||
|
|
|
@ -65,7 +65,6 @@ class CustomButton(QPushButton):
|
|||
css_file = os.path.join(root_dir, 'css', css_screens[size])
|
||||
with open(css_file, 'r') as infile:
|
||||
styles.append(infile.read())
|
||||
|
||||
self.setStyleSheet(''.join(styles))
|
||||
if name_style == 'start':
|
||||
self.setObjectName('button_start')
|
||||
|
|
|
@ -169,7 +169,7 @@ def xconnection(mode, user, password, host, database, port):
|
|||
res = json.loads(response.read())
|
||||
if not res.get('status'):
|
||||
res['status'] = response.status
|
||||
except:
|
||||
except Exception:
|
||||
status = status
|
||||
msg = ''
|
||||
if response:
|
||||
|
|
|
@ -222,8 +222,8 @@ class FieldMoney(QLineEdit):
|
|||
if not amount:
|
||||
self.zero()
|
||||
|
||||
def __str__(self):
|
||||
return self.format_text()
|
||||
# def __str__(self):
|
||||
# return self.format_text()
|
||||
|
||||
def format_text(self, text_):
|
||||
amount = float(text_)
|
||||
|
@ -409,14 +409,14 @@ class ComboBox(QComboBox):
|
|||
def get_id(self):
|
||||
model = self.model()
|
||||
row = self.currentIndex()
|
||||
column = 0 # id ever is column Zero
|
||||
column = 0 # id ever is column Zero
|
||||
res = model.item(row, column)
|
||||
return res.text()
|
||||
|
||||
def get_label(self):
|
||||
model = self.model()
|
||||
row = self.currentIndex()
|
||||
column = 1 # id ever is column Zero
|
||||
column = 1 # id ever is column Zero
|
||||
res = model.item(row, column)
|
||||
return res.text()
|
||||
|
||||
|
@ -483,7 +483,7 @@ class GridForm(QGridLayout):
|
|||
expand = 1
|
||||
if type_ == 'text':
|
||||
align = 'left'
|
||||
except:
|
||||
except Exception:
|
||||
_field = Field(obj, key, value, form=self)
|
||||
if value.get('password') is True:
|
||||
_field.setEchoMode(QLineEdit.Password)
|
||||
|
|
|
@ -116,7 +116,7 @@ class MenuDash(QWidget):
|
|||
try:
|
||||
new_view = self.ctx_widgets[view_id]['items']
|
||||
new_view.show()
|
||||
except:
|
||||
except Exception:
|
||||
return
|
||||
|
||||
self.main.addWidget(new_view)
|
||||
|
@ -145,10 +145,7 @@ class MenuDash(QWidget):
|
|||
}
|
||||
main_cat_addWidget = self.main_categories.addWidget
|
||||
for value in self.values:
|
||||
# print(value, type(value['id']))
|
||||
cat_id = str(value['id'])
|
||||
# if not value:
|
||||
# continue
|
||||
if col_cat > num_cat_cols - 1:
|
||||
col_cat = 0
|
||||
row_cat += 1
|
||||
|
@ -263,10 +260,9 @@ class GridButtons(QWidget):
|
|||
self.set_items()
|
||||
|
||||
def create_list_items(self):
|
||||
self.list_items, button_size, style = [], self.button_size, self.style
|
||||
list_items_append = self.list_items.append
|
||||
for value in self.values:
|
||||
_button = CustomButton(
|
||||
button_size, style = self.button_size, self.style
|
||||
self.list_items = [
|
||||
CustomButton(
|
||||
parent=self,
|
||||
id=value['id'],
|
||||
desc_extractor='name',
|
||||
|
@ -275,7 +271,8 @@ class GridButtons(QWidget):
|
|||
size=button_size,
|
||||
name_style=style,
|
||||
)
|
||||
list_items_append(_button)
|
||||
for value in self.values
|
||||
]
|
||||
|
||||
def action_selected(self, idx):
|
||||
self.action(idx)
|
||||
|
|
|
@ -132,7 +132,7 @@ class SearchWindow(QDialog):
|
|||
self.filter_layout.addWidget(self.label_control)
|
||||
|
||||
def set_counter_control(self, val):
|
||||
self.label_control.setText(str(len(val)))
|
||||
self.label_control.setText(str(val))
|
||||
|
||||
def set_from_objects(self, objects):
|
||||
self.rows = []
|
||||
|
|
|
@ -73,7 +73,7 @@ MONEY = [
|
|||
SALE_FIELDS = [
|
||||
'number', 'party', 'sale_date', 'comment', 'position',
|
||||
'description', 'invoice_number', 'tip_amount', 'delivery_amount',
|
||||
'salesman', 'state', 'kind', 'channel', 'reference',
|
||||
'salesman', 'state', 'kind', 'reference',
|
||||
'invoice_type', 'consumer', 'delivery_party', 'table_assigned'
|
||||
]
|
||||
|
||||
|
|
|
@ -230,7 +230,7 @@ class SearchSale(SearchWindow):
|
|||
size='mini_button',
|
||||
)
|
||||
|
||||
if self.parent.enviroment == 'restaurant':
|
||||
if self.parent.environment == 'restaurant':
|
||||
self.pushButtonReservation = CustomButton(
|
||||
id='button_search_sale_reservation',
|
||||
parent=self,
|
||||
|
@ -320,7 +320,7 @@ class SearchProduct(SearchWindow):
|
|||
headers['template.brand.name'] = {'desc': 'MARCA', 'type': 'char'}
|
||||
_cols_width_append(100)
|
||||
|
||||
if parent.enviroment == 'retail':
|
||||
if parent.environment == 'retail':
|
||||
headers['template.reference'] = {'desc': 'REFERENCIA', 'type': 'char'}
|
||||
_cols_width_append(200)
|
||||
|
||||
|
@ -639,7 +639,7 @@ class DialogAgent(QuickDialog):
|
|||
'domain': [],
|
||||
'fields': [
|
||||
('id', 'ID'),
|
||||
('party.rec_name', 'NOMBRE'),
|
||||
('party.name', 'NOMBRE'),
|
||||
('party.id_number', 'NUMERO ID'),
|
||||
]
|
||||
}),
|
||||
|
@ -700,7 +700,7 @@ class DialogPrintInvoice(QuickDialog):
|
|||
('invoice', 'FACTURA'),
|
||||
('order', 'ORDEN'),
|
||||
]
|
||||
if parent.enviroment == 'restaurant':
|
||||
if parent.environment == 'restaurant':
|
||||
options_type.append(('quotation', 'COTIZACION'))
|
||||
view = (
|
||||
('invoice_number_ask', {'name': 'ORDEN / FACTURA'}),
|
||||
|
@ -817,7 +817,7 @@ class DeliveryPartySelected(QuickDialog):
|
|||
parent.row_delivery_party = QLineEdit()
|
||||
parent.row_delivery_party.setObjectName('row_delivery_party')
|
||||
parent.row_delivery_party.textChanged.connect(
|
||||
lambda: parent.update_delivery_party('delivery_party'))
|
||||
lambda: parent.update_delivery_party('party'))
|
||||
grid.addWidget(parent.row_delivery_party, 1, 2)
|
||||
|
||||
label_id_number = QLabel('NUMERO ID:')
|
||||
|
@ -847,7 +847,7 @@ class DeliveryPartySelected(QuickDialog):
|
|||
parent.row_phone = QLineEdit()
|
||||
parent.row_phone.setObjectName('row_phone')
|
||||
parent.row_phone.textChanged.connect(
|
||||
lambda: parent.update_delivery_party('row_phone'))
|
||||
lambda: parent.update_delivery_party('phone'))
|
||||
grid.addWidget(parent.row_phone, 4, 2)
|
||||
|
||||
label_type_vehicle = QLabel('TIPO DE VEHICULO:')
|
||||
|
@ -868,7 +868,7 @@ class DeliveryPartySelected(QuickDialog):
|
|||
parent.row_delivery_party_active = QCheckBox()
|
||||
parent.row_delivery_party_active.setObjectName('row_delivery_party_active')
|
||||
parent.row_delivery_party_active.stateChanged.connect(
|
||||
lambda: parent.update_delivery_party('delivery_party_active'))
|
||||
lambda: parent.update_delivery_party('active'))
|
||||
grid.addWidget(parent.row_delivery_party_active, 6, 2)
|
||||
|
||||
vbox_.addLayout(grid)
|
||||
|
@ -1179,7 +1179,7 @@ class TipAmount(QuickDialog):
|
|||
label_tip_amount_ask.setObjectName('label_tip_amount_ask')
|
||||
grid.addWidget(label_tip_amount_ask, 1, 1)
|
||||
parent.field_tip_amount_ask = QLineEdit()
|
||||
parent.field_tip_amount_ask.setObjectName('field_delivery_amount_ask')
|
||||
parent.field_tip_amount_ask.setObjectName('field_tip_amount_ask')
|
||||
grid.addWidget(parent.field_tip_amount_ask, 1, 2)
|
||||
vbox_.addLayout(grid)
|
||||
parent.field_tip_amount_invoice = QCheckBox()
|
||||
|
@ -1335,7 +1335,7 @@ class ProductEdit(QuickDialog):
|
|||
self.checkbox_base.setText('PRECIO BASE')
|
||||
self.checkbox_base.setMaximumSize(120, 0)
|
||||
|
||||
if parent.enviroment == 'restaurant':
|
||||
if parent.environment == 'restaurant':
|
||||
hbox.addWidget(button_discounts_bono, 0)
|
||||
hbox.addWidget(button_combo, 0)
|
||||
hbox.addWidget(button_addition, 0)
|
||||
|
|
|
@ -172,7 +172,7 @@ class FrontWindow(QMainWindow):
|
|||
self.dialog_info_product = DialogInfoProduct(self)
|
||||
if self._commission_activated:
|
||||
self.dialog_agent = DialogAgent(self)
|
||||
if self.enviroment == 'restaurant' and self._sale_pos_restaurant:
|
||||
if self.environment == 'restaurant' and self._sale_pos_restaurant:
|
||||
self.dialog_combine_product = CombineProduct(self)
|
||||
self.dialog_combo_product = DialogComboProduct(self)
|
||||
self.dialog_historic_sales = DialogHistoricSales(self)
|
||||
|
@ -209,7 +209,7 @@ class FrontWindow(QMainWindow):
|
|||
self.discount_method = self._config.get('discount_pos_method')
|
||||
self.allow_discount_handle = self._config.get('allow_discount_handle', None)
|
||||
self.sale_automatic = False
|
||||
if self.enviroment == 'retail' and self._config.get('new_sale_automatic'):
|
||||
if self.environment == 'retail' and self._config.get('new_sale_automatic'):
|
||||
self.sale_automatic = True
|
||||
res = self.Sale.fields_get(['commission'])
|
||||
self._commission_activated = True if res.get('commission') else False
|
||||
|
@ -218,38 +218,29 @@ class FrontWindow(QMainWindow):
|
|||
('state', '=', 'activated'),
|
||||
])
|
||||
|
||||
_product = {
|
||||
'name': 'product.product',
|
||||
'fields': [
|
||||
'template.name', 'code', 'write_date',
|
||||
'description', 'template.sale_price_w_tax',
|
||||
'template.account_category'
|
||||
]
|
||||
}
|
||||
# self.cache_local = self._config.get('cache_products_local')
|
||||
# _product = {
|
||||
# 'name': 'product.product',
|
||||
# 'fields': [
|
||||
# 'template.name', 'code', 'write_date',
|
||||
# 'description', 'template.sale_price_w_tax',
|
||||
# 'template.account_category'
|
||||
# ]
|
||||
# }
|
||||
# # self.cache_local = self._config.get('cache_products_local')
|
||||
|
||||
if self._config['show_location_pos']:
|
||||
_product['fields'].append('location_')
|
||||
# if self._config['show_location_pos']:
|
||||
# _product['fields'].append('location_')
|
||||
|
||||
if self._config['show_stock_pos'] in ('value', 'icon'):
|
||||
if self._config['show_stock_pos'] == 'value':
|
||||
_product['fields'].append('quantity')
|
||||
if self._config['show_brand']:
|
||||
_product['fields'].append('template.brand.name')
|
||||
# if self._config['show_stock_pos'] in ('value', 'icon'):
|
||||
# if self._config['show_stock_pos'] == 'value':
|
||||
# _product['fields'].append('quantity')
|
||||
# if self._config['show_brand']:
|
||||
# _product['fields'].append('template.brand.name')
|
||||
|
||||
if self._config['encoded_sale_price']:
|
||||
_product['fields'].extend(
|
||||
['image', 'image_icon', 'encoded_sale_price'])
|
||||
# if self._config['encoded_sale_price']:
|
||||
# _product['fields'].extend(
|
||||
# ['image', 'image_icon', 'encoded_sale_price'])
|
||||
|
||||
if self.enviroment == 'restaurant':
|
||||
self._sale_pos_restaurant = self.Module.find([
|
||||
('name', '=', 'sale_pos_frontend_rest'),
|
||||
('state', '=', 'activated'),
|
||||
])
|
||||
if self._sale_pos_restaurant:
|
||||
self.PartyConsumer = Model('party.consumer', self.ctx)
|
||||
if self._config['delivery_product.']:
|
||||
self._delivery_product = 0
|
||||
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)
|
||||
|
@ -284,9 +275,7 @@ class FrontWindow(QMainWindow):
|
|||
if self._commission_activated:
|
||||
self.Agent = Model('commission.agent', self.ctx, main_window=self)
|
||||
self.Comission = Model('commission', self.ctx, main_window=self)
|
||||
if self._sale_pos_restaurant:
|
||||
self.RestTables = Model('sale.shop.table', self.ctx, main_window=self)
|
||||
self.Consumer = Model('party.consumer', self.ctx, main_window=self)
|
||||
|
||||
self.device, = self.Device.find([
|
||||
('id', '=', self._user['sale_device']),
|
||||
])
|
||||
|
@ -297,19 +286,20 @@ class FrontWindow(QMainWindow):
|
|||
self._journals = self.device['journals.']
|
||||
self.salesman_ids = [s['id'] for s in self.shop.get('salesmans', [])]
|
||||
|
||||
dom_salesman = [
|
||||
('company', '=', self.company),
|
||||
]
|
||||
if self.salesman_ids:
|
||||
dom_salesman.append(('id', 'in', self.salesman_ids))
|
||||
# dom_salesman = [
|
||||
# ('company', '=', self.company),
|
||||
# ]
|
||||
# if self.salesman_ids:
|
||||
# dom_salesman.append(('id', 'in', self.salesman_ids))
|
||||
|
||||
self.discounts = self.Discount.find([
|
||||
('type_discount', '=', 'percentage')
|
||||
])
|
||||
# self.discounts = self.Discount.find([
|
||||
# ('type_discount', '=', 'percentage')
|
||||
# ])
|
||||
self.discounts_fixed = self.Discount.find([])
|
||||
self.discounts = [dsc for dsc in self.discounts_fixed if dsc['type_discount'] == 'percentage']
|
||||
self.delivery_man_table = self.shop.get('delivery_man.', [])
|
||||
if self.delivery_man_table:
|
||||
self.delivery_man = [d for d in self.delivery_man_table if d['active']]
|
||||
self.delivery_man_table = [d for d in self.delivery_man_table if d['active']]
|
||||
self._payment_terms = self.PaymentTerm.find([
|
||||
('active', '=', True)
|
||||
], order=[('name', 'ASC')])
|
||||
|
@ -334,6 +324,17 @@ class FrontWindow(QMainWindow):
|
|||
self.default_payment_term = self.shop['payment_term.']
|
||||
self._password_admin = self._config.get('password_admin_pos')
|
||||
self._password_force_assign = self._config.get('password_force_assign')
|
||||
if self.environment == 'restaurant':
|
||||
self._sale_pos_restaurant = self.Module.find([
|
||||
('name', '=', 'sale_pos_frontend_rest'),
|
||||
('state', '=', 'activated'),
|
||||
])
|
||||
if self._sale_pos_restaurant:
|
||||
self.RestTables = Model('sale.shop.table', self.ctx, main_window=self)
|
||||
self.Consumer = Model('party.consumer', self.ctx, main_window=self)
|
||||
# TODO get product and printers
|
||||
self.printers_shop, self.products_printers = self.Sale.get_product_printers(
|
||||
self.shop['id'])
|
||||
|
||||
self._action_report_invoice, = self.ActionReport.find([
|
||||
('report_name', '=', 'account.invoice'),
|
||||
|
|
3488
app/main (copy).py
3488
app/main (copy).py
File diff suppressed because it is too large
Load Diff
878
app/main.py
878
app/main.py
File diff suppressed because it is too large
Load Diff
|
@ -26,7 +26,7 @@ MODELS_RESTAURANT = {
|
|||
'sale.sale': {
|
||||
'rec_name': 'number',
|
||||
'fields': [
|
||||
'number', 'party.rec_name', 'lines', 'sale_date', 'state',
|
||||
'number', 'party.name', 'lines', 'sale_date', 'state',
|
||||
'total_amount_cache', 'salesman.rec_name',
|
||||
'payment_term.rec_name', 'payments', 'tip_amount',
|
||||
'total_amount', 'residual_amount', 'paid_amount', 'untaxed_amount',
|
||||
|
@ -63,7 +63,7 @@ MODELS_RESTAURANT = {
|
|||
'rec_name': 'rec_name',
|
||||
'fields': [
|
||||
# 'active',
|
||||
'party.id_number', 'party.rec_name', 'rec_name', 'plan.percentage'
|
||||
'party.id_number', 'party.name', 'rec_name', 'plan.percentage'
|
||||
]
|
||||
},
|
||||
'sale.delivery_party': {
|
||||
|
@ -247,12 +247,12 @@ MODELS_RETAIL = {
|
|||
'sale.sale': {
|
||||
'rec_name': 'number',
|
||||
'fields': [
|
||||
'number', 'party.rec_name', 'lines', 'sale_date', 'state',
|
||||
'number', 'party.name', 'lines', 'sale_date', 'state',
|
||||
'total_amount_cache', 'salesman.rec_name',
|
||||
'payment_term.rec_name', 'payments', 'tip_amount',
|
||||
'total_amount', 'residual_amount', 'paid_amount', 'untaxed_amount',
|
||||
'tax_amount', 'delivery_charge', 'price_list', 'invoice_number',
|
||||
'shipment_address', 'kind', 'shop',
|
||||
'shipment_address', 'kind', 'shop', 'turn',
|
||||
'delivery_party', 'reference', 'comment', 'payment_method',
|
||||
'delivery_state', 'invoice_type', 'net_amount',
|
||||
'delivery_amount', 'source.rec_name', 'position',
|
||||
|
@ -282,7 +282,7 @@ MODELS_RETAIL = {
|
|||
'rec_name': 'rec_name',
|
||||
'fields': [
|
||||
# 'active',
|
||||
'party.id_number', 'party.rec_name', 'rec_name', 'plan.percentage'
|
||||
'party.id_number', 'party.name', 'rec_name', 'plan.percentage'
|
||||
]
|
||||
},
|
||||
'sale.delivery_party': {
|
||||
|
|
14
app/proxy.py
14
app/proxy.py
|
@ -80,8 +80,8 @@ class Model(object):
|
|||
self.conn = HTTPSConnection
|
||||
self.context_http = context_http
|
||||
|
||||
enviroment = ctx['params']['enviroment']
|
||||
if enviroment == 'retail':
|
||||
environment = ctx['params']['environment']
|
||||
if environment == 'retail':
|
||||
_model = MODELS_RETAIL.get(model)
|
||||
else:
|
||||
_model = MODELS_RESTAURANT.get(model)
|
||||
|
@ -123,6 +123,7 @@ class Model(object):
|
|||
res = self.get_connection('POST', '/fields_get', args_)
|
||||
return res
|
||||
|
||||
# deprecated
|
||||
def write_many(self, ids, values, fields=None):
|
||||
if not fields:
|
||||
fields = self.fields
|
||||
|
@ -162,6 +163,15 @@ class Model(object):
|
|||
res = self.get_connection('POST', '/create', args_)
|
||||
return res
|
||||
|
||||
def search_count(self, domain):
|
||||
args_ = {
|
||||
'model': self.model,
|
||||
'domain': domain,
|
||||
'context': self.ctx,
|
||||
}
|
||||
res = self.get_connection('POST', '/search_count', args_)
|
||||
return res
|
||||
|
||||
def method_instance(self, method, instance):
|
||||
args_ = {
|
||||
'model': self.model,
|
||||
|
|
|
@ -63,7 +63,7 @@ SSH_PORT = 23
|
|||
def money(value):
|
||||
if type(value) is int:
|
||||
value = int(value)
|
||||
return '{:,}'.format(value)
|
||||
return '{:,.2f}'.format(value)
|
||||
|
||||
|
||||
dev_printers = {}
|
||||
|
@ -95,9 +95,9 @@ class Receipt(object):
|
|||
self._print_invoice_payment = context.get('print_invoice_payment')
|
||||
self._delta_locale = context.get('delta_locale')
|
||||
self._environment = environment
|
||||
self.order_copies = context.get('order_copies')
|
||||
self.invoice_copies = context.get('invoice_copies')
|
||||
self.order_kind = 'dispatch' if environment == 'restaurant' else 'command'
|
||||
self.order_copies = context.get('order_copies') or 0
|
||||
self.invoice_copies = context.get('invoice_copies') or 0
|
||||
self.order_kind = 'command' if environment == 'restaurant' else 'dispatch'
|
||||
|
||||
self._row_characters = _ROW_CHARACTERS
|
||||
if context.get('row_characters'):
|
||||
|
@ -830,10 +830,10 @@ class Receipt(object):
|
|||
self._printer.cashdraw(2)
|
||||
self.print_enter()
|
||||
|
||||
def print_orders(self, orders, reversion=None, kind='command'):
|
||||
def print_orders(self, orders, reversion=None):
|
||||
res = []
|
||||
self.order_kind = kind
|
||||
for order in orders.values():
|
||||
kind = self.order_kind
|
||||
for order in orders:
|
||||
try:
|
||||
self._printer = None
|
||||
if dev_printers.get(order['host']) and kind != 'command':
|
||||
|
@ -906,6 +906,7 @@ class Receipt(object):
|
|||
self._printer.text('TURNO: %s' % str(turn))
|
||||
self._printer.ln(2)
|
||||
kind = order.get('kind', None)
|
||||
_kind = ''
|
||||
if self._environment != 'retail' and kind:
|
||||
if kind == 'take_away':
|
||||
_kind = 'PARA LLEVAR'
|
||||
|
|
|
@ -0,0 +1,20 @@
|
|||
import cProfile
|
||||
import pstats
|
||||
|
||||
# wrapper
|
||||
def profile_filter(func):
|
||||
def profiled_func(*args, **kwargs):
|
||||
profiler = cProfile.Profile()
|
||||
profiler.enable()
|
||||
result = profiler.runcall(func, *args, **kwargs)
|
||||
|
||||
# Captura las estadísticas
|
||||
stats = pstats.Stats(profiler)
|
||||
profiler.disable()
|
||||
stats.sort_stats('cumulative')
|
||||
|
||||
# Imprime las estadísticas en la salida estándar
|
||||
stats.print_stats()
|
||||
|
||||
return result
|
||||
return profiled_func
|
|
@ -1 +1 @@
|
|||
__version__ = "6.0.23"
|
||||
__version__ = "6.0.24"
|
||||
|
|
|
@ -1,15 +0,0 @@
|
|||
Tryton POS Client (Using Qt5 and Python3)
|
||||
=========================================
|
||||
|
||||
# FOR WINDOWS
|
||||
|
||||
Download and install python-3.7.9-amd64
|
||||
|
||||
> pip install PyQt5==5.8.1.1
|
||||
|
||||
Copy config_pos.ini on user AppData/Local/tryton
|
||||
|
||||
Modify config_pos.ini
|
||||
|
||||
Put launcher on desktop and set icon change
|
||||
name "pospro.pyw"
|
|
@ -1,15 +0,0 @@
|
|||
# Three steps for translating Qt App
|
||||
|
||||
From main directory:
|
||||
|
||||
1. Clean obsolete translations:
|
||||
|
||||
pylupdate5 -noobsolete project.pro
|
||||
|
||||
2. Do translate .ts file, opening linguist tool:
|
||||
|
||||
/usr/bin/linguist
|
||||
|
||||
3. Release translation
|
||||
|
||||
lrelease app/locale/i18n_es.ts
|
4
pospro
4
pospro
|
@ -25,6 +25,10 @@ class Client(object):
|
|||
|
||||
def __init__(self, parent=None):
|
||||
self.app = QApplication(sys.argv)
|
||||
self.app.setOrganizationName("PRESIK SAS")
|
||||
self.app.setOrganizationDomain("presik.com")
|
||||
self.app.setApplicationName("SMART POS")
|
||||
self.app.setStyle("Fusion")
|
||||
|
||||
def init_login(self):
|
||||
_file_config = 'config_pos.ini'
|
||||
|
|
18
setup.py
18
setup.py
|
@ -49,7 +49,7 @@ setup(
|
|||
'app/css',
|
||||
'app/locale',
|
||||
'app/tests'
|
||||
],
|
||||
],
|
||||
data_files=data_files,
|
||||
scripts=['pospro'],
|
||||
classifiers=[
|
||||
|
@ -60,17 +60,17 @@ setup(
|
|||
'Operating System :: OS Independent',
|
||||
'Natural Language :: English',
|
||||
'Natural Language :: Spanish',
|
||||
'Programming Language :: Python',
|
||||
'Programming Language :: Python3.10',
|
||||
'Topic :: Office/Business',
|
||||
],
|
||||
license='GPL',
|
||||
install_requires=[
|
||||
'pyusb',
|
||||
'pillow',
|
||||
'qrcode',
|
||||
'paramiko',
|
||||
'orjson',
|
||||
'escpos',
|
||||
'PySide6>=6.4.1'
|
||||
'pyusb',
|
||||
'pillow',
|
||||
'qrcode',
|
||||
'paramiko',
|
||||
'orjson',
|
||||
'escpos',
|
||||
'PySide6>=6.4.1'
|
||||
]
|
||||
)
|
||||
|
|
|
@ -1,6 +1,8 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
from app.reporting import Receipt
|
||||
import traceback
|
||||
import time
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
|
@ -69,6 +71,10 @@ if __name__ == '__main__':
|
|||
receipt = Receipt(ctx_printing)
|
||||
# try:
|
||||
receipt.config_printer(printer_test)
|
||||
receipt.test_printer()
|
||||
for i in range(20):
|
||||
receipt.test_printer()
|
||||
time.sleep(1)
|
||||
# receipt._printer.close()
|
||||
# print('impresion numero', i)
|
||||
# except :
|
||||
# print('Printing failed...!')
|
||||
|
|
|
@ -53,5 +53,5 @@ fake_data = {
|
|||
}
|
||||
|
||||
receipt = Receipt(context={}, environment='restaurant')
|
||||
for i in range(12):
|
||||
for i in range(20):
|
||||
receipt.print_tasks(fake_data)
|
||||
|
|
Loading…
Reference in New Issue