diff --git a/app/commons/messages.py b/app/commons/messages.py index a2492ef..fc9d7e7 100644 --- a/app/commons/messages.py +++ b/app/commons/messages.py @@ -38,7 +38,8 @@ class MessageBar(QHBoxLayout): type_, msg_string = self.stack_messages.get(msg) if additional_info: msg_string = msg_string % additional_info - self.label_info.setText(msg_string) + print('----', msg_string) + self.label_info.setText(self.tr(msg_string)) self.type = type_ self.update_style() diff --git a/app/frontwindow.py b/app/frontwindow.py index 6141bda..c2ebd37 100644 --- a/app/frontwindow.py +++ b/app/frontwindow.py @@ -1,12 +1,10 @@ -# -*- coding: UTF-8 -*- import os import time from datetime import date import logging from pathlib import Path -from collections import OrderedDict -from PyQt5.QtWidgets import QMainWindow, QDesktopWidget, QLabel, QLineEdit -from PyQt5.QtCore import QTimer, QThread, pyqtSignal, Qt +from PyQt5.QtWidgets import QMainWindow, QDesktopWidget, QLineEdit +from PyQt5.QtCore import QTimer, QThread, pyqtSignal from .commons.dialogs import QuickDialog from .commons.dblogin import safe_reconnect @@ -71,11 +69,10 @@ class FrontWindow(QMainWindow): self.screen_size = 'medium' self.timeout = _DEFAULT_TIMEOUT - self.set_stack_messages() self.setFocus() self.global_timer = 0 - print('Screen Size: > ', self.screen_size) + # print('Screen Size: > ', self.screen_size) _theme = params['theme'] if params.get('theme') else None self.profile_printer = params['profile_printer'] if params.get('profile_printer') else 'TM-P80' self.set_style(SCREENS[self.screen_size], _theme) @@ -98,21 +95,6 @@ class FrontWindow(QMainWindow): screen = QDesktopWidget().screenGeometry() return screen.width(), screen.height() - def set_statusbar(self, values): - status_bar = self.statusBar() - status_bar.setSizeGripEnabled(False) - - for k, v in values.items(): - _label = QLabel(v['name'] + ':') - _label.setAlignment(Qt.AlignRight | Qt.AlignVCenter) - _label.setObjectName('label_status_bar') - status_bar.addWidget(_label, 1) - setattr(self, k, QLabel(str(v['value']))) - _field_info = getattr(self, k) - _field_info.setObjectName('field_status_bar') - _field_info.setAlignment(Qt.AlignLeft | Qt.AlignVCenter) - status_bar.addWidget(_field_info) - def set_style(self, file_css, theme_css=None): styles = [] if theme_css: @@ -146,7 +128,7 @@ class FrontWindow(QMainWindow): self.check_empty_sale() if self.active_weighing and self.reader_thread: self.reader_thread.onClose() - super(MainWindow, self).close() + super(FrontWindow, self).close() def dialog(self, name, response=False): res = QuickDialog( @@ -174,53 +156,6 @@ class FrontWindow(QMainWindow): def keyReleaseEvent(self, event): self._keyStates[event.key()] = False - def set_stack_messages(self): - messages = { - 'system_ready': ('info', self.tr('SYSTEM READY...')), - 'confirm_exit': ('warning', self.tr('DO YOU WANT TO EXIT?')), - 'confirm_credit': ('question', self.tr('PLEASE CONFIRM YOUR PAYMENT TERM AS CREDIT?')), - 'sale_number_not_found': ('warning', self.tr('SALE ORDER / INVOICE NUMBER NOT FOUND!')), - 'sale_closed': ('error', self.tr('THIS SALE IS CLOSED, YOU CAN NOT TO MODIFY!')), - 'discount_not_valid': ('warning', self.tr('DISCOUNT VALUE IS NOT VALID!')), - 'add_payment_sale_draft': ('info', self.tr('YOU CAN NOT ADD PAYMENTS TO SALE ON DRAFT STATE!')), - 'enter_quantity': ('question', self.tr('ENTER QUANTITY...')), - 'enter_discount': ('question', self.tr('ENTER DISCOUNT...')), - 'enter_payment': ('question', self.tr('ENTER PAYMENT AMOUNT BY: %s')), - 'enter_new_price': ('question', self.tr('ENTER NEW PRICE...')), - 'order_successfully': ('info', self.tr('ORDER SUCCESUFULLY SENT.')), - 'order_failed': ('warning', self.tr('FAILED SEND ORDER!')), - 'missing_agent': ('warning', self.tr('MISSING AGENT!')), - 'missing_salesman': ('warning', self.tr('THERE IS NOT SALESMAN FOR THE SALE!')), - 'sale_without_products': ('warning', self.tr('YOU CAN NOT CONFIRM A SALE WITHOUT PRODUCTS!')), - 'user_without_permission': ('error', self.tr('USER WITHOUT PERMISSION FOR SALE POS!')), - 'quantity_not_valid': ('error', self.tr('THE QUANTITY IS NOT VALID...!')), - 'user_not_permissions_device': ('error', self.tr('THE USER HAVE NOT PERMISSIONS FOR ACCESS TO DEVICE!')), - 'missing_party_configuration': ('warning', self.tr('MISSING THE DEFAULT PARTY ON SHOP CONFIGURATION!')), - 'missing_journal_device': ('error', self.tr('MISSING SET THE JOURNAL ON DEVICE!')), - 'statement_closed': ('error', self.tr('THERE IS NOT A STATEMENT OPEN FOR THIS DEVICE!')), - 'product_not_found': ('warning', self.tr('PRODUCT NOT FOUND!')), - 'must_load_or_create_sale': ('warning', self.tr('FIRST YOU MUST CREATE/LOAD A SALE!')), - 'new_sale': ('warning', self.tr('DO YOU WANT CREATE NEW SALE?')), - 'cancel_sale': ('question', self.tr('ARE YOU WANT TO CANCEL SALE?')), - 'not_permission_delete_sale': ('info', self.tr('YOU HAVE NOT PERMISSIONS FOR DELETE THIS SALE!')), - 'not_permission_for_cancel': ('info', self.tr('YOU HAVE NOT PERMISSIONS FOR CANCEL THIS SALE!')), - 'customer_not_credit': ('info', self.tr('THE CUSTOMER HAS NOT CREDIT!')), - 'agent_not_found': ('warning', self.tr('AGENT NOT FOUND!')), - 'invalid_commission': ('warning', self.tr('COMMISSION NOT VALID!')), - 'credit_limit_exceed': ('info', self.tr('CREDIT LIMIT FOR CUSTOMER EXCEED!')), - 'credit_limit_capacity': ('info', self.tr('THE CUSTOMER CREDIT CAPACITY IS ABOVE 80%')), - 'not_can_force_assign': ('warning', self.tr('YOU CAN NOT FORCE ASSIGN!')), - 'send_electronic_failed': ('info', self.tr('FALLO EL ENVIO DE FACTURA!')), - 'invoice_done_failed': ('info', self.tr('FALLO FINALIZACIÓN DE FACTURA!')), - 'without_stock_quantity': ('info', self.tr('PRODUCT WITHOUT STOCK: %s')), - 'not_sale': ('info', self.tr('NOT SALE!...')), - 'statement_created': ('info', self.tr('STATEMENTS CREATED!')), - 'statement_finish': ('info', self.tr('STATEMENTS CLOSED!')), - 'order_dispatched': ('info', self.tr('ORDER DISPATCHED!')), - 'error_order_dispatched': ('error', self.tr('ERROR TO DISPATCHED ORDER!')), - } - self.stack_msg = messages - def create_dialogs(self): self.dialog_control_panel = ControlPanel(self).get(self.menu_control_panel) self.dialog_money_count = DialogTableMoneyCount(self).get() @@ -407,16 +342,6 @@ class FrontWindow(QMainWindow): self.Channel = FastModel('sale.web_channel', self.ctx) return True - def create_statusbar(self): - values = OrderedDict([ - ('stb_shop', {'name': self.tr('SHOP'), 'value': self.shop['name']}), - ('stb_device', {'name': self.tr('DEVICE'), 'value': self.device['name']}), - ('stb_database', {'name': self.tr('DATABASE'), 'value': self.database}), - ('stb_user', {'name': self.tr('USER'), 'value': self.user}), - ('stb_printer', {'name': self.tr('PRINTER'), 'value': self.printer_sale_name}) - ]) - self.set_statusbar(values) - class ClearUi(QThread): sigActionClear = pyqtSignal() diff --git a/app/locale/__init__.py b/app/locale/__init__.py index c45ea38..e69de29 100644 --- a/app/locale/__init__.py +++ b/app/locale/__init__.py @@ -1,3 +0,0 @@ -import os - -locale_path = path_trans = os.path.join(os.path.abspath(os.path.dirname(__file__)), 'i18n_es') diff --git a/app/locale/i18n_es.qm b/app/locale/i18n_es.qm index 790ded6..31676ae 100644 Binary files a/app/locale/i18n_es.qm and b/app/locale/i18n_es.qm differ diff --git a/app/locale/i18n_es.ts b/app/locale/i18n_es.ts index d04591f..2c4c2e7 100644 --- a/app/locale/i18n_es.ts +++ b/app/locale/i18n_es.ts @@ -172,7 +172,7 @@ TYPE VEHICLE: - TIPO DE VEHÍCULO + TIPO DE VEHÍCULO: @@ -274,7 +274,7 @@ SALES HISTORY - HISTORIAL DE VENTAS: + HISTORIAL DE VENTAS @@ -415,7 +415,7 @@ TOTAL MONEY: - TOTAL DINERO + TOTAL DINERO: @@ -483,245 +483,10 @@ FrontWindow - + APPLICATION APLICACION - - - SYSTEM READY... - SISTEMA LISTO... - - - - DO YOU WANT TO EXIT? - DESEA SALIR? - - - - PLEASE CONFIRM YOUR PAYMENT TERM AS CREDIT? - CONFIRME QUE LA FORMA DE PAGO ES CREDITO? - - - - SALE ORDER / INVOICE NUMBER NOT FOUND! - ORDEN / FACTURA NO ENCONTRADA! - - - - THIS SALE IS CLOSED, YOU CAN NOT TO MODIFY! - ESTA CUENTA ESTA CERRADA NO PUEDE MODIFICARLA! - - - - DISCOUNT VALUE IS NOT VALID! - DESCUENTO NO VALIDO! - - - - YOU CAN NOT ADD PAYMENTS TO SALE ON DRAFT STATE! - NO PUEDE AGREGAR PAGOS A UNA VENTA EN BORRADOR! - - - - ENTER QUANTITY... - INGRESE LA CANTIDAD... - - - - ENTER DISCOUNT... - INGRESE EL DESCUENTO... - - - - ENTER PAYMENT AMOUNT BY: %s - INGRESE EL VALOR A PAGAR: %s - - - - ENTER NEW PRICE... - INGRESE EL NUEVO PRECIO... - - - - ORDER SUCCESUFULLY SENT. - ORDEN ENVIADA EXITOSAMENTE. - - - - FAILED SEND ORDER! - FALLO EL ENVIO DE LA ORDEN! - - - - MISSING AGENT! - FALTA EL AGENTE! - - - - THERE IS NOT SALESMAN FOR THE SALE! - NO HAY MESERO ASIGNADO! - - - - YOU CAN NOT CONFIRM A SALE WITHOUT PRODUCTS! - NO PUEDE CONFIRMAR UNA ORDEN SIN PRODUCTOS! - - - - USER WITHOUT PERMISSION FOR SALE POS! - USUARIO SIN PERMISOS DE EVNTAS POS! - - - - THE QUANTITY IS NOT VALID...! - LA CANTIDAD NO ES VÁLIDA...! - - - - THE USER HAVE NOT PERMISSIONS FOR ACCESS TO DEVICE! - EL USUARIO NO TIENE PERMISOS PARA ACCEDER AL DISPOSITIVO! - - - - MISSING THE DEFAULT PARTY ON SHOP CONFIGURATION! - FALTA EL TERCERO POR DEFECTO EN LA CONFIGURACION! - - - - MISSING SET THE JOURNAL ON DEVICE! - - - - - THERE IS NOT A STATEMENT OPEN FOR THIS DEVICE! - NO HAY ESTADOS DE CUENTA ABIERTOS PARA EL DISPOSITIVO! - - - - PRODUCT NOT FOUND! - PRODUCTO NO ENCONTRADO! - - - - FIRST YOU MUST CREATE/LOAD A SALE! - PRIMERO DEBES CREAR/CARGAR UNA VENTA! - - - - DO YOU WANT CREATE NEW SALE? - DESEA CREAR UNA NUEVA ORDER? - - - - ARE YOU WANT TO CANCEL SALE? - DESEA CANCELAR LA VENTA? - - - - YOU HAVE NOT PERMISSIONS FOR DELETE THIS SALE! - NO TIENES PERMISOS PARA BORRAR LA VENTA! - - - - YOU HAVE NOT PERMISSIONS FOR CANCEL THIS SALE! - NO TIENES PERMISOS PARA BORRAR LA VENTA! - - - - THE CUSTOMER HAS NOT CREDIT! - EL CLIENTE NO TIENE CREDITO! - - - - AGENT NOT FOUND! - AGENTE NO ENCONTRADO! - - - - COMMISSION NOT VALID! - COMISION NO VALIDA! - - - - CREDIT LIMIT FOR CUSTOMER EXCEED! - LIMITE DE CREDITO PARA CLIENTE EXCEDIDO! - - - - THE CUSTOMER CREDIT CAPACITY IS ABOVE 80% - EL CLIENTE ESTA EN UNA CAPACIDAD DE CREDITO POR ARRIBA DEL 80% - - - - YOU CAN NOT FORCE ASSIGN! - TU NO PUEDES FORZAR ASIGNACION! - - - - FALLO EL ENVIO DE FACTURA! - FALLO EL ENVIO DE FACTURA! - - - - FALLO FINALIZACIÓN DE FACTURA! - FALLO FINALIZACIÓN DE FACTURA! - - - - PRODUCT WITHOUT STOCK: %s - PRODUCTO SIN INVENTARIO: %s - - - - NOT SALE!... - NO HAY VENTA... - - - - STATEMENTS CREATED! - ESTADOS DE CUENTA CREADOS! - - - - STATEMENTS CLOSED! - ESTADOS DE CUENTA CERRADO! - - - - ORDER DISPATCHED! - ORDEN DESPACHADA! - - - - ERROR TO DISPATCHED ORDER! - ERROR EN EL DESAPACHO DE LA ORDEN! - - - - SHOP - TIENDA - - - - DEVICE - TERMINAL - - - - DATABASE - BASE DE DATOS - - - - USER - USUARIO - - - - PRINTER - IMPRESORA - Help @@ -811,7 +576,7 @@ Keys Shortcuts... - ATAJOS DE TECLADO + ATAJOS DE TECLADO... @@ -849,7 +614,7 @@ C&ANCEL - CANCELAR + CANC&ELAR @@ -865,287 +630,287 @@ MainWindow - + DATE FECHA - + SALESMAN VENDEDOR - + PAYMENT TERM PLAZO DE PAGO - + No ORDER No PEDIDO - + POSITION POSICION - + AGENT AGENTE - + DELIVERY CHARGE CARGO DOMICILIO - + SUBTOTAL SUBTOTAL - + TAXES IMPUESTOS - + DISCOUNT DESCUENTO - + TOTAL TOTAL - + PAID PAGADO - + CHANGE CAMBIO - + NAME NOMBRE - + DESCRIPTION DESCRIPCIÓN - + AMOUNT VALOR - + COD COD - + UNIT UND - + QTY CANT - + DISC DESC - + NOTE NOTA - + UNIT PRICE W TAX PRECIO UNIT CON IMP - + STATEMENT JOURNAL ESTADO DE CUENTA - + CUSTOMER CLIENTE - + COMPANY COMPAÑIA - + ASSIGNED TABLE MESA ASIGNADA - + FRAC FRAC - + VOUCHER COMPROBANTE - + DELIVERY MEN DOMICILIARIO - + CHANNEL CANAL - + OPEN STATEMENTS ABRIR ESTADOS DE CUENTA - + CLOSED STATEMENTS CERRAR ESTADOS DE CUENTA - + GLOBAL DISCOUNT DESCUENTO GLOBAL - + HELP AYUDA - + NUMBER NÚMERO - + INVOICE NUMBER NUMERO DE FACTURA - + CONSUMER CONSUMIDOR - + TOTAL AMOUNT VALOR TOTAL - + PARTY TERCERO - + NUMBER PLATE NÚMERO DE PLACA - + TYPE VEHICLE TIPO DE VEHICULO - + TAKE AWAY PARA LLEVAR - + DELIVERY DOMICILIO - + COMMANDED COMAN - + ID NUMBER NUMERO ID - + PHONE TELÉFONO - + TO TABLE A LA MESA - + KIND CLASE - + VR. PROPINA - + VR. DOMIC - + NETO TOTAL - + START INICIO - + No Invoice No. Factura - + PENDING PENDIENTE - + CASH EFECTIVO - + TERMINAL DATAFONO - + PAYMENT METHOD METODO DE PAGO @@ -1155,7 +920,7 @@ Menu... - Menu + Menu... @@ -1181,17 +946,17 @@ Warning... - Advertencia + Advertencia... Information... - Información + Información... Action... - Acción + Acción... @@ -1224,42 +989,42 @@ PARTY: - CLIENTE + CLIENTE: NUMBER: - NÚMERO + NÚMERO: DATE: - FECHA + FECHA: SALESMAN: - VENDEDOR + VENDEDOR: LINES: - LINEAS + LINEAS: UNTAXED AMOUNT: - BASE + BASE: TAX AMOUNT: - IMPUESTOS + IMPUESTOS: TOTAL AMOUNT: - TOTAL + TOTAL: @@ -1272,7 +1037,7 @@ Search Products... - Buscar Productos + Buscar Productos... @@ -1412,16 +1177,229 @@ SearchWindow - + SEARCH... BUSCAR... - + FILTER: FILTRO: + + StackMessages + + + SYSTEM READY... + SISTEMA LISTO... + + + + DO YOU WANT TO EXIT? + ESTA SEGURO QUE DESEA SALIR? + + + + PLEASE CONFIRM YOUR PAYMENT TERM AS CREDIT? + CONFIRME QUE EL PLAZO DE PAGO ES CREDITO? + + + + SALE ORDER / INVOICE NUMBER NOT FOUND! + PEDIDO / FACTURA NO ENCONTRADA! + + + + THIS SALE IS CLOSED, YOU CAN NOT TO MODIFY! + LA VENTA ESTA CERRA, NO PUEDES MODIFICARLA! + + + + DISCOUNT VALUE IS NOT VALID! + EL DESCUENTO NO ES VALIDO! + + + + YOU CAN NOT ADD PAYMENTS TO SALE ON DRAFT STATE! + NO PUEDE AGREGAR PAGO A UN PEDIDO EN BORRADOR! + + + + ENTER QUANTITY... + INGRESE LA CANTIDAD... + + + + ENTER DISCOUNT... + INGRESE EL DESCUENTO... + + + + ENTER PAYMENT AMOUNT BY: %s + INGRESE EL VALOR A PAGAR EN: %s + + + + ENTER NEW PRICE... + INGRESE EL PRECIO... + + + + ORDER SUCCESSFULLY SENT + ORDEN ENVIADA EXITOSAMENTE + + + + FAILED SEND ORDER! + FALLO EL ENVIO DE LA ORDEN! + + + + MISSING AGENT! + FALTA EL AGENTE! + + + + THERE IS NOT SALESMAN FOR THE SALE! + NO HAY VENDEDOR EN EL PEDIDO! + + + + YOU CAN NOT CONFIRM A SALE WITHOUT PRODUCTS! + NO PUEDE CONFIRMAR UNA VENTA SIN PRODUCTOS! + + + + USER WITHOUT PERMISSION FOR SALE POS! + USUARIO SIN PERMISOS PARA VENTAS EN POS! + + + + THE QUANTITY IS NOT VALID...! + LA CANTIDAD NO ES VALIDA! + + + + THE USER HAVE NOT PERMISSIONS FOR ACCESS TO DEVICE! + EL USUARIO NO TIENE PERMISOS PARA ACCEDER AL DISPOSITIVO! + + + + MISSING THE DEFAULT PARTY ON SHOP CONFIGURATION! + FALTA EL TERCERO POR DEFECTO EN LA SUCURSAL! + + + + MISSING SET THE JOURNAL ON DEVICE! + FALTA EL DIARIO EN EL TERMINAL! + + + + THERE IS NOT A STATEMENT OPEN FOR THIS DEVICE! + NO HAY ESTADOS DE CUENTA ABIERTOS PARA ESTE TERMINAL! + + + + PRODUCT NOT FOUND! + PRODUCTO NO ENCONTRADO! + + + + FIRST YOU MUST CREATE/LOAD A SALE! + PRIMERO DEBE CREAR/CARAGR UNA VENTA! + + + + DO YOU WANT CREATE NEW SALE? + DESEA CREAR UNA NUEVA VENTA! + + + + ARE YOU WANT TO CANCEL SALE? + DESEA CACELAR LA VENTA? + + + + YOU HAVE NOT PERMISSIONS FOR DELETE THIS SALE! + NO TIENE PERMISOS PARA BORAR VENTAS! + + + + YOU HAVE NOT PERMISSIONS FOR CANCEL THIS SALE! + NO TIENES PERMISOS PARA CANCELAR LA VENTA! + + + + THE CUSTOMER HAS NOT CREDIT! + EL CLIENTE NO TIENE CUPO DE CREDITO! + + + + AGENT NOT FOUND! + AGENTE NO ENCONTRADO! + + + + COMMISSION NOT VALID! + COMISION NO VALIDA! + + + + CREDIT LIMIT FOR CUSTOMER EXCEED! + LIMITE DE CREDITO DEL CLIENTE EXCEDIDO! + + + + THE CUSTOMER CREDIT CAPACITY IS ABOVE 80% + LA CAPACIDAD DE CREDITO DEL CLIENTE ESTA SOBRE EL 80% + + + + YOU CAN NOT FORCE ASSIGN! + + + + + FALLO EL ENVIO DE FACTURA! + FALLO EN EL ENVIO DE LA FACTURA! + + + + FALLO FINALIZACIÓN DE FACTURA! + FALLO EN EL PROCESAMIENTO DE LA FACTURA! + + + + PRODUCT WITHOUT STOCK: %s + + + + + NOT SALE!... + NO HAY VENTA! + + + + STATEMENTS CREATED! + ESTADOS DE CUENTA ABIERTOS! + + + + STATEMENTS CLOSED! + ESTADOS DE CUENTA CERRADOS! + + + + ORDER DISPATCHED! + ORDEN DESPACHADA! + + + + ERROR TO DISPATCHED ORDER! + ERROR EN EL DESPACHO DELA ORDEN! + + StartButtons @@ -1450,6 +1428,34 @@ IMPRIMIR + + StatusBar + + + SHOP + SUCURSAL + + + + DEVICE + TERMINAL + + + + DATABASE + BASE DE DATOS + + + + USER + USUARIO + + + + PRINTER + IMPRESORA + + TipAmount diff --git a/app/mainwindow.py b/app/mainwindow.py index 26c366e..b74d253 100644 --- a/app/mainwindow.py +++ b/app/mainwindow.py @@ -15,6 +15,8 @@ from PyQt5.QtWidgets import ( ) from .frontwindow import FrontWindow +from .status_bar import StatusBar +from .stack_messages import StackMessages from app.commons.action import Action from app.commons.forms import GridForm, ComboBox, FieldNumeric from app.commons.messages import MessageBar @@ -48,6 +50,8 @@ class MainWindow(FrontWindow): super(MainWindow, self).__init__(connection, params, title) self.payment_ctx = {} self.set_keys() + # self.set_stack_messages() + StackMessages(self) self.stock_context = None self._sale = {} self.ctx = self._context @@ -76,7 +80,7 @@ class MainWindow(FrontWindow): self.set_printers_usb(PATH_PRINTERS) self.set_printing_context() - self.create_statusbar() + self.statusbar = StatusBar(self) self.reader_thread = None self._current_line_id = None @@ -109,6 +113,53 @@ class MainWindow(FrontWindow): if j['id'] == self.default_journal['id']: self.default_journal = j + # def set_stack_messages(self): + # self.stack_msg = { + # 'system_ready': ('info', self.tr('SYSTEM READY...')), + # 'confirm_exit': ('warning', self.tr('DO YOU WANT TO EXIT?')), + # 'confirm_credit': ('question', self.tr('PLEASE CONFIRM YOUR PAYMENT TERM AS CREDIT?')), + # 'sale_number_not_found': ('warning', self.tr('SALE ORDER / INVOICE NUMBER NOT FOUND!')), + # 'sale_closed': ('error', self.tr('THIS SALE IS CLOSED, YOU CAN NOT TO MODIFY!')), + # 'discount_not_valid': ('warning', self.tr('DISCOUNT VALUE IS NOT VALID!')), + # 'add_payment_sale_draft': ('info', self.tr('YOU CAN NOT ADD PAYMENTS TO SALE ON DRAFT STATE!')), + # 'enter_quantity': ('question', self.tr('ENTER QUANTITY...')), + # 'enter_discount': ('question', self.tr('ENTER DISCOUNT...')), + # 'enter_payment': ('question', self.tr('ENTER PAYMENT AMOUNT BY: %s')), + # 'enter_new_price': ('question', self.tr('ENTER NEW PRICE...')), + # 'order_successfully': ('info', self.tr('ORDER SUCCESSFULLY SENT')), + # 'order_failed': ('warning', self.tr('FAILED SEND ORDER!')), + # 'missing_agent': ('warning', self.tr('MISSING AGENT!')), + # 'missing_salesman': ('warning', self.tr('THERE IS NOT SALESMAN FOR THE SALE!')), + # 'sale_without_products': ('warning', self.tr('YOU CAN NOT CONFIRM A SALE WITHOUT PRODUCTS!')), + # 'user_without_permission': ('error', self.tr('USER WITHOUT PERMISSION FOR SALE POS!')), + # 'quantity_not_valid': ('error', self.tr('THE QUANTITY IS NOT VALID...!')), + # 'user_not_permissions_device': ('error', self.tr('THE USER HAVE NOT PERMISSIONS FOR ACCESS TO DEVICE!')), + # 'missing_party_configuration': ('warning', self.tr('MISSING THE DEFAULT PARTY ON SHOP CONFIGURATION!')), + # 'missing_journal_device': ('error', self.tr('MISSING SET THE JOURNAL ON DEVICE!')), + # 'statement_closed': ('error', self.tr('THERE IS NOT A STATEMENT OPEN FOR THIS DEVICE!')), + # 'product_not_found': ('warning', self.tr('PRODUCT NOT FOUND!')), + # 'must_load_or_create_sale': ('warning', self.tr('FIRST YOU MUST CREATE/LOAD A SALE!')), + # 'new_sale': ('warning', self.tr('DO YOU WANT CREATE NEW SALE?')), + # 'cancel_sale': ('question', self.tr('ARE YOU WANT TO CANCEL SALE?')), + # 'not_permission_delete_sale': ('info', self.tr('YOU HAVE NOT PERMISSIONS FOR DELETE THIS SALE!')), + # 'not_permission_for_cancel': ('info', self.tr('YOU HAVE NOT PERMISSIONS FOR CANCEL THIS SALE!')), + # 'customer_not_credit': ('info', self.tr('THE CUSTOMER HAS NOT CREDIT!')), + # 'agent_not_found': ('warning', self.tr('AGENT NOT FOUND!')), + # 'invalid_commission': ('warning', self.tr('COMMISSION NOT VALID!')), + # 'credit_limit_exceed': ('info', self.tr('CREDIT LIMIT FOR CUSTOMER EXCEED!')), + # 'credit_limit_capacity': ('info', self.tr('THE CUSTOMER CREDIT CAPACITY IS ABOVE 80%')), + # 'not_can_force_assign': ('warning', self.tr('YOU CAN NOT FORCE ASSIGN!')), + # 'send_electronic_failed': ('info', self.tr('FALLO EL ENVIO DE FACTURA!')), + # 'invoice_done_failed': ('info', self.tr('FALLO FINALIZACIÓN DE FACTURA!')), + # 'without_stock_quantity': ('info', self.tr('PRODUCT WITHOUT STOCK: %s')), + # 'not_sale': ('info', self.tr('NOT SALE!...')), + # 'statement_created': ('info', self.tr('STATEMENTS CREATED!')), + # 'statement_finish': ('info', self.tr('STATEMENTS CLOSED!')), + # 'order_dispatched': ('info', self.tr('ORDER DISPATCHED!')), + # 'error_order_dispatched': ('error', self.tr('ERROR TO DISPATCHED ORDER!')), + # } + # # self.stack_msg = messages + def set_domains(self): self.domain_search_product = [ ('code', '!=', None), @@ -2747,5 +2798,3 @@ class MainWindow(FrontWindow): if self._consumer.get('birthday'): y, m, d = self._consumer['birthday'].split('-') self.row_field_birthday.setDate(QDate(int(y), int(m), int(d))) - -# 2798 diff --git a/app/stack_messages.py b/app/stack_messages.py new file mode 100644 index 0000000..140d24e --- /dev/null +++ b/app/stack_messages.py @@ -0,0 +1,53 @@ +from PyQt5.QtWidgets import QWidget + +__all__ = ['StackMessages'] + + +class StackMessages(QWidget): + + def __init__(self, parent): + super(StackMessages, self).__init__(parent) + parent.stack_msg = { + 'system_ready': ('info', self.tr('SYSTEM READY...')), + 'confirm_exit': ('warning', self.tr('DO YOU WANT TO EXIT?')), + 'confirm_credit': ('question', self.tr('PLEASE CONFIRM YOUR PAYMENT TERM AS CREDIT?')), + 'sale_number_not_found': ('warning', self.tr('SALE ORDER / INVOICE NUMBER NOT FOUND!')), + 'sale_closed': ('error', self.tr('THIS SALE IS CLOSED, YOU CAN NOT TO MODIFY!')), + 'discount_not_valid': ('warning', self.tr('DISCOUNT VALUE IS NOT VALID!')), + 'add_payment_sale_draft': ('info', self.tr('YOU CAN NOT ADD PAYMENTS TO SALE ON DRAFT STATE!')), + 'enter_quantity': ('question', self.tr('ENTER QUANTITY...')), + 'enter_discount': ('question', self.tr('ENTER DISCOUNT...')), + 'enter_payment': ('question', self.tr('ENTER PAYMENT AMOUNT BY: %s')), + 'enter_new_price': ('question', self.tr('ENTER NEW PRICE...')), + 'order_successfully': ('info', self.tr('ORDER SUCCESSFULLY SENT')), + 'order_failed': ('warning', self.tr('FAILED SEND ORDER!')), + 'missing_agent': ('warning', self.tr('MISSING AGENT!')), + 'missing_salesman': ('warning', self.tr('THERE IS NOT SALESMAN FOR THE SALE!')), + 'sale_without_products': ('warning', self.tr('YOU CAN NOT CONFIRM A SALE WITHOUT PRODUCTS!')), + 'user_without_permission': ('error', self.tr('USER WITHOUT PERMISSION FOR SALE POS!')), + 'quantity_not_valid': ('error', self.tr('THE QUANTITY IS NOT VALID...!')), + 'user_not_permissions_device': ('error', self.tr('THE USER HAVE NOT PERMISSIONS FOR ACCESS TO DEVICE!')), + 'missing_party_configuration': ('warning', self.tr('MISSING THE DEFAULT PARTY ON SHOP CONFIGURATION!')), + 'missing_journal_device': ('error', self.tr('MISSING SET THE JOURNAL ON DEVICE!')), + 'statement_closed': ('error', self.tr('THERE IS NOT A STATEMENT OPEN FOR THIS DEVICE!')), + 'product_not_found': ('warning', self.tr('PRODUCT NOT FOUND!')), + 'must_load_or_create_sale': ('warning', self.tr('FIRST YOU MUST CREATE/LOAD A SALE!')), + 'new_sale': ('warning', self.tr('DO YOU WANT CREATE NEW SALE?')), + 'cancel_sale': ('question', self.tr('ARE YOU WANT TO CANCEL SALE?')), + 'not_permission_delete_sale': ('info', self.tr('YOU HAVE NOT PERMISSIONS FOR DELETE THIS SALE!')), + 'not_permission_for_cancel': ('info', self.tr('YOU HAVE NOT PERMISSIONS FOR CANCEL THIS SALE!')), + 'customer_not_credit': ('info', self.tr('THE CUSTOMER HAS NOT CREDIT!')), + 'agent_not_found': ('warning', self.tr('AGENT NOT FOUND!')), + 'invalid_commission': ('warning', self.tr('COMMISSION NOT VALID!')), + 'credit_limit_exceed': ('info', self.tr('CREDIT LIMIT FOR CUSTOMER EXCEED!')), + 'credit_limit_capacity': ('info', self.tr('THE CUSTOMER CREDIT CAPACITY IS ABOVE 80%')), + 'not_can_force_assign': ('warning', self.tr('YOU CAN NOT FORCE ASSIGN!')), + 'send_electronic_failed': ('info', self.tr('SEND INVOICE FAILED!')), + 'invoice_done_failed': ('info', self.tr('PROCESSING INVOICE FAILED!')), + 'without_stock_quantity': ('info', self.tr('PRODUCT WITHOUT STOCK: %s')), + 'not_sale': ('info', self.tr('NOT SALE!...')), + 'statement_created': ('info', self.tr('STATEMENTS CREATED!')), + 'statement_finish': ('info', self.tr('STATEMENTS CLOSED!')), + 'order_dispatched': ('info', self.tr('ORDER DISPATCHED!')), + 'error_order_dispatched': ('error', self.tr('ERROR TO DISPATCHED ORDER!')), + } diff --git a/app/status_bar.py b/app/status_bar.py new file mode 100644 index 0000000..7cd9453 --- /dev/null +++ b/app/status_bar.py @@ -0,0 +1,33 @@ +from collections import OrderedDict +from PyQt5.QtWidgets import QWidget, QLabel +from PyQt5.QtCore import Qt + +__all__ = ['StatusBar'] + + +class StatusBar(QWidget): + + def __init__(self, parent): + super(StatusBar, self).__init__() + p = parent + values = OrderedDict([ + ('stb_shop', {'name': self.tr('SHOP'), 'value': p.shop['name']}), + ('stb_device', {'name': self.tr('DEVICE'), 'value': p.device['name']}), + ('stb_database', {'name': self.tr('DATABASE'), 'value': p.database}), + ('stb_user', {'name': self.tr('USER'), 'value': p.user}), + ('stb_printer', {'name': self.tr('PRINTER'), 'value': p.printer_sale_name}) + ]) + + status_bar = p.statusBar() + status_bar.setSizeGripEnabled(False) + + for k, v in values.items(): + _label = QLabel(v['name'] + ':') + _label.setAlignment(Qt.AlignRight | Qt.AlignVCenter) + _label.setObjectName('label_status_bar') + status_bar.addWidget(_label, 1) + setattr(parent, k, QLabel(str(v['value']))) + _field_info = getattr(parent, k) + _field_info.setObjectName('field_status_bar') + _field_info.setAlignment(Qt.AlignLeft | Qt.AlignVCenter) + status_bar.addWidget(_field_info) diff --git a/pospro.pyw b/pospro.pyw deleted file mode 100644 index 37ef1d5..0000000 --- a/pospro.pyw +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: UTF-8 -*- -import os -import sys - -from PyQt5.QtWidgets import QApplication -from PyQt5.QtCore import QTranslator -from app.commons.dblogin import Login -from app import mainwindow - -try: - DIR = os.path.abspath(os.path.normpath(os.path.join(__file__, - '..', '..', '..'))) - if os.path.isdir(DIR): - sys.path.insert(0, os.path.dirname(DIR)) -except NameError: - pass - -locale_app = os.path.join(os.path.abspath( - os.path.dirname(__file__)), 'app', 'locale', 'i18n_es.qm') - - -class Client(object): - - def __init__(self, parent=None): - self.app = QApplication(sys.argv) - self.translator = QTranslator() - self.translator.load(locale_app) - self.app.installTranslator(self.translator) - - def init_login(self): - login = Login(file_config='config_pos.ini') - - while not login.connection: - login.run() - login.exec_() - - return login.connection, login.params - - def main(self, conn, params): - mw = mainwindow.MainWindow(conn, params) - self.app.exec_() - - -client = Client() -conn, params = client.init_login() - -if conn: - client.main(conn, params) -sys.exit() diff --git a/posproc b/posproc deleted file mode 100644 index b3166a5..0000000 Binary files a/posproc and /dev/null differ diff --git a/project.pro b/project.pro index 4a18dff..4f8b30d 100644 --- a/project.pro +++ b/project.pro @@ -1,3 +1,3 @@ # Execute in terminal $ pylupdate5 project.pro -SOURCES = app/mainwindow.py app/dialogs.py app/reporting.py app/buttonpad.py app/commons/custom_button.py app/commons/buttons.py app/commons/dblogin.py app/commons/dialogs.py app/commons/forms.py app/frontwindow.py app/commons/menu_list.py app/commons/search_window.py +SOURCES = app/mainwindow.py app/frontwindow.py app/status_bar.py app/stack_messages.py app/dialogs.py app/reporting.py app/buttonpad.py app/commons/custom_button.py app/commons/buttons.py app/commons/dblogin.py app/commons/dialogs.py app/commons/forms.py app/commons/menu_list.py app/commons/search_window.py app/commons/messages.py TRANSLATIONS = app/locale/i18n_es.ts diff --git a/setup.py b/setup.py index 293ea34..bbbe982 100644 --- a/setup.py +++ b/setup.py @@ -15,7 +15,7 @@ args = {} data_files = [ ('app', glob.glob('*.ini')), - ('app/frontend', glob.glob('pos/share/*.css')), + ('app/commons', glob.glob('pos/share/*.css')), ('app/share', glob.glob('app/share/*.png')), ('app/locale', glob.glob('app/locale/*.qm')), ]