refactory code in app pos

This commit is contained in:
Wilson Gomez 2023-10-12 10:57:17 -05:00
parent e94a7c868c
commit 50739286d6
26 changed files with 649 additions and 4060 deletions

16
INSTALL
View File

@ -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

View File

@ -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
View File

@ -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
----------

View File

@ -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',

View File

@ -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)

View File

@ -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')

View File

@ -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:

View File

@ -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)

View File

@ -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)

View File

@ -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 = []

View File

@ -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'
]

View File

@ -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)

View File

@ -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'),

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -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': {

View File

@ -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,

View File

@ -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'

20
app/stats.py Normal file
View File

@ -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

View File

@ -1 +1 @@
__version__ = "6.0.23"
__version__ = "6.0.24"

View File

@ -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"

View File

@ -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
View File

@ -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'

View File

@ -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'
]
)

View File

@ -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...!')

View File

@ -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)