mirror of
https://bitbucket.org/presik/presik_pos.git
synced 2023-12-14 06:03:00 +01:00
Add combine products
This commit is contained in:
parent
c0cd88f064
commit
5740970604
11 changed files with 327 additions and 310 deletions
|
@ -68,7 +68,7 @@ class QuickDialog(QDialog):
|
|||
elif kind == 'action':
|
||||
if widgets:
|
||||
data_widget = widgets[0]
|
||||
else:
|
||||
elif data:
|
||||
data_widget = GridForm(parent, OrderedDict(data))
|
||||
elif kind == 'selection':
|
||||
self.name = data['name']
|
||||
|
@ -116,7 +116,6 @@ class QuickDialog(QDialog):
|
|||
|
||||
def exec_(self, args=None):
|
||||
res = None
|
||||
# self.parent.releaseKeyboard()
|
||||
res = super(QuickDialog, self).exec()
|
||||
if self.kind == 'action':
|
||||
pass
|
||||
|
@ -137,6 +136,10 @@ class QuickDialog(QDialog):
|
|||
super(QuickDialog, self).hide()
|
||||
self.parent.setFocus()
|
||||
|
||||
def add_widget(self, widget):
|
||||
_ = self.sub_hbox.takeAt(0)
|
||||
self.sub_hbox.addLayout(widget, 0)
|
||||
|
||||
def set_info(self, info):
|
||||
if hasattr(self, 'label_info'):
|
||||
self.label_info.setText(info)
|
||||
|
|
|
@ -1,50 +0,0 @@
|
|||
|
||||
import os
|
||||
from pathlib import Path
|
||||
from functools import partial
|
||||
|
||||
from PyQt5.QtCore import Qt
|
||||
from PyQt5.QtWidgets import QLabel, QPushButton
|
||||
|
||||
css_small = 'product_button_small.css'
|
||||
css_high = 'product_button_hd.css'
|
||||
root_dir = str(Path(__file__).parent.parent)
|
||||
|
||||
__all__ = ['ProductButton']
|
||||
|
||||
|
||||
class ProductButton(QPushButton):
|
||||
|
||||
def __init__(self, parent, id, text_up, text_bottom, method, target, size='small'):
|
||||
super(ProductButton, self).__init__()
|
||||
|
||||
self.id = id
|
||||
styles = []
|
||||
if size == 'small':
|
||||
css_file_screen = css_small
|
||||
else:
|
||||
css_file_screen = css_high
|
||||
|
||||
css_file = os.path.join(root_dir, 'css', css_file_screen)
|
||||
|
||||
with open(css_file, 'r') as infile:
|
||||
styles.append(infile.read())
|
||||
|
||||
self.setStyleSheet(''.join(styles))
|
||||
self.setObjectName('product_button')
|
||||
if len(text_up) > 29:
|
||||
text_up = text_up[0:29]
|
||||
|
||||
label1 = QLabel(text_up, self)
|
||||
label1.setWordWrap(True)
|
||||
label1.setAlignment(Qt.AlignCenter | Qt.AlignCenter)
|
||||
label1.setObjectName('product_label_up')
|
||||
|
||||
label2 = QLabel(text_bottom, self)
|
||||
label2.setAlignment(Qt.AlignCenter | Qt.AlignCenter)
|
||||
label2.setObjectName('product_label_bottom')
|
||||
|
||||
method = getattr(parent, method)
|
||||
if target:
|
||||
method = partial(method, target)
|
||||
self.clicked.connect(method)
|
|
@ -1,5 +1,4 @@
|
|||
|
||||
from operator import itemgetter
|
||||
from .commons.dialogs import HelpDialog, QuickDialog
|
||||
from PyQt5.QtCore import QRect, Qt
|
||||
from PyQt5.QtWidgets import (
|
||||
|
@ -18,14 +17,14 @@ from .commons.custom_button import CustomButton
|
|||
from .tools import get_icon
|
||||
|
||||
__all__ = [
|
||||
'ControlPanel', 'SearchSale', 'SearchParty', 'SearchProduct', 'SaleLine',
|
||||
'ControlPanel', 'SearchSale', 'SearchParty', 'SearchProduct', 'EditLine',
|
||||
'Comment', 'Position', 'DialogPayment', 'DialogTaxes', 'DialogChannel',
|
||||
'DialogTableMoneyCount', 'DialogTableDeliveryParty', 'DialogDeliveryParty',
|
||||
'Help', 'DeliveryPartySelected', 'DialogPrintInvoice', 'DialogStock',
|
||||
'DialogGlobalDiscountTable', 'DialogSalesman', 'DialogAgent',
|
||||
'DialogOrder', 'DialogGlobalDiscount', 'DialogVoucher', 'DialogConsumer',
|
||||
'DialogManageTables', 'DialogTableSaleConsumer', 'SaleConsumerSelected',
|
||||
'DialogCancelInvoice', 'DialogForceAssign'
|
||||
'DialogCancelInvoice', 'DialogForceAssign', 'AdditionProduct'
|
||||
]
|
||||
|
||||
|
||||
|
@ -48,6 +47,8 @@ def create_vbox(parent, values, method, columns=4, dimension=None):
|
|||
vbox_ = QVBoxLayout()
|
||||
grid = QGridLayout()
|
||||
grid.setSpacing(2)
|
||||
if isinstance(method, str):
|
||||
method = getattr(parent, method)
|
||||
grid_buttons = GridButtons(parent, values, columns, action=method,
|
||||
style='standard_button')
|
||||
|
||||
|
@ -925,9 +926,9 @@ class DeliveryAmount(QWidget):
|
|||
return QuickDialog(self._parent, 'action', data=[(_field, _data)])
|
||||
|
||||
|
||||
class SaleLine(QWidget):
|
||||
class EditLine(QWidget):
|
||||
def __init__(self, parent):
|
||||
super(SaleLine, self).__init__(parent)
|
||||
super(EditLine, self).__init__(parent)
|
||||
self._parent = parent
|
||||
|
||||
def get(self):
|
||||
|
@ -996,17 +997,42 @@ class SaleLine(QWidget):
|
|||
id='button_delete',
|
||||
size='small',
|
||||
icon=get_icon('delete_line'),
|
||||
title='DELETE',
|
||||
title=self.tr('DELETE'),
|
||||
method='action_delete_line',
|
||||
name_style='mini_button',
|
||||
)
|
||||
button_addition = CustomButton(
|
||||
self._parent,
|
||||
id='button_addition',
|
||||
size='small',
|
||||
icon=get_icon('addition-product'),
|
||||
title=self.tr('ADDITION'),
|
||||
method='action_addition_line',
|
||||
name_style='mini_button',
|
||||
)
|
||||
hbox = QHBoxLayout()
|
||||
vbox_product.addLayout(grid, 1)
|
||||
vbox_product.addWidget(button_delete, 0)
|
||||
vbox_product.addLayout(hbox, 0)
|
||||
hbox.addWidget(button_delete, 0)
|
||||
|
||||
if self._parent.enviroment == 'restaurant':
|
||||
hbox.addWidget(button_addition, 0)
|
||||
dialog = QuickDialog(self._parent, 'action', widgets=[vbox_product], size=[600, 900])
|
||||
dialog.accepted.connect(self._parent.dialog_product_edit_accepted)
|
||||
return dialog
|
||||
|
||||
|
||||
class AdditionProduct(QuickDialog):
|
||||
def __init__(self, parent):
|
||||
super(AdditionProduct, self).__init__(parent, 'selection')
|
||||
self.setWindowTitle(self.tr('SELECT ADDITIONAL'))
|
||||
self._parent = parent
|
||||
|
||||
def set_products(self, products):
|
||||
vbox_ = create_vbox(self._parent, products, 'on_selected_item')
|
||||
self.add_widget(vbox_)
|
||||
|
||||
|
||||
class Help(HelpDialog):
|
||||
|
||||
def __init__(self, parent):
|
||||
|
|
|
@ -16,8 +16,8 @@ from .dialogs import (
|
|||
Help, ControlPanel, SearchSale, SearchParty, SearchProduct, Position,
|
||||
Comment, DialogPayment, DialogSalesman, DialogVoucher, DialogPrintInvoice,
|
||||
DialogGlobalDiscount, DialogPaymentTerm, DialogStock, DialogOrder,
|
||||
DialogForceAssign, DialogTaxes, DialogCancelInvoice, SaleLine, DialogAgent,
|
||||
DialogConsumer, DialogManageTables, DialogTableMoneyCount,
|
||||
DialogForceAssign, DialogTaxes, DialogCancelInvoice, EditLine, DialogAgent,
|
||||
DialogConsumer, DialogManageTables, DialogTableMoneyCount, AdditionProduct,
|
||||
DialogGlobalDiscountTable, DeliveryPartySelected, DialogTableDeliveryParty,
|
||||
DialogTableSaleConsumer, SaleConsumerSelected, DialogChannel,
|
||||
DialogDeliveryParty, TipAmount, DeliveryAmount
|
||||
|
@ -245,7 +245,7 @@ class FrontWindow(QMainWindow):
|
|||
self.field_password_force_assign_ask.setEchoMode(QLineEdit.Password)
|
||||
self.dialog_tax = DialogTaxes(self).get()
|
||||
self.dialog_cancel_invoice = DialogCancelInvoice(self).get()
|
||||
self.dialog_product_edit = SaleLine(self).get()
|
||||
self.dialog_product_edit = EditLine(self).get()
|
||||
self.dialog_table_delivery_party = DialogTableDeliveryParty(self).get()
|
||||
self.dialog_delivery_party_selected = DeliveryPartySelected(self).get()
|
||||
self.dialog_delivery_party = DialogDeliveryParty(self).get()
|
||||
|
@ -254,6 +254,7 @@ class FrontWindow(QMainWindow):
|
|||
if self._commission_activated:
|
||||
self.dialog_agent = DialogAgent(self).get()
|
||||
if self.enviroment == 'restaurant' and self._sale_pos_restaurant:
|
||||
self.dialog_addition_product = AdditionProduct(self)
|
||||
self.dialog_table_sale_consumer = DialogTableSaleConsumer(self).get()
|
||||
self.dialog_sale_consumer_selected = SaleConsumerSelected(self).get()
|
||||
self.dialog_search_consumer = DialogConsumer(self).get()
|
||||
|
|
Binary file not shown.
File diff suppressed because it is too large
Load diff
|
@ -1965,6 +1965,8 @@ class MainWindow(FrontWindow):
|
|||
def sale_line_selected(self, line):
|
||||
if self._state in ('cash', 'payment'):
|
||||
return
|
||||
print('xxxxxxxxxxx', line)
|
||||
self._current_line = line
|
||||
self._current_line_id = line['id']
|
||||
product_id = None
|
||||
if isinstance(line['product'], int):
|
||||
|
@ -2208,6 +2210,20 @@ class MainWindow(FrontWindow):
|
|||
def on_change_line_selected(self, key):
|
||||
self.table_sale_lines.moved_selection(key)
|
||||
|
||||
def action_addition_line(self):
|
||||
if not self._current_line:
|
||||
return
|
||||
|
||||
categories = self._current_line['product'].get('categories')
|
||||
if not categories:
|
||||
return
|
||||
categories_ids = [cat['id'] for cat in categories]
|
||||
mixables = self.Product.find([
|
||||
('categories', 'in', categories_ids),
|
||||
])
|
||||
self.dialog_addition_product.set_products(mixables)
|
||||
self.dialog_addition_product.exec_()
|
||||
|
||||
def action_delete_line(self):
|
||||
"""Delete Product """
|
||||
if self.model_sale_lines.rowCount() <= 0 or self._state == 'cash':
|
||||
|
@ -2219,7 +2235,6 @@ class MainWindow(FrontWindow):
|
|||
removed_item = self.table_sale_lines.delete_item(ignore_focus=True)
|
||||
self.SaleLine.delete([removed_item['id']])
|
||||
self.set_amounts()
|
||||
self.set_amounts()
|
||||
|
||||
self._current_line_id = None
|
||||
self.setFocus()
|
||||
|
|
|
@ -113,7 +113,7 @@ MODELS = {
|
|||
'name', 'code', 'barcode', 'write_date', 'description',
|
||||
'template.sale_price_w_tax', 'template.account_category',
|
||||
'location.name', 'image', 'image_icon', 'quantity',
|
||||
'encoded_sale_price', 'location', 'locations', 'uom'
|
||||
'encoded_sale_price', 'location', 'locations', 'uom', 'categories',
|
||||
],
|
||||
'binaries': ['image']
|
||||
},
|
||||
|
|
Binary file not shown.
Binary file not shown.
1
app/share/addition-product.svg
Normal file
1
app/share/addition-product.svg
Normal file
File diff suppressed because one or more lines are too long
After Width: | Height: | Size: 25 KiB |
Loading…
Reference in a new issue