Exemplo n.º 1
0
    def __init__(self):
        super(StockDiaryPage, self).__init__()

        self.products = ProductCatalog()
        self.products.childSelected.connect(self.onProductChange)

        self.operations = QtGui.QComboBox()
        self.operations.setEditable(False)
        self.operations.addItems(
            (cbpos.tr.stock_('In'), cbpos.tr.stock_('Modification')))
        self.operations.currentIndexChanged.connect(self.onOperationChange)

        self.quantity = QtGui.QDoubleSpinBox()
        self.quantity.setRange(0, sys.maxint)

        buttonBox = QtGui.QDialogButtonBox()

        self.editBtn = buttonBox.addButton("Edit",
                                           QtGui.QDialogButtonBox.ActionRole)
        self.editBtn.pressed.connect(self.onEditButton)

        self.okBtn = buttonBox.addButton("Save",
                                         QtGui.QDialogButtonBox.AcceptRole)
        self.okBtn.pressed.connect(self.onOkButton)

        self.cancelBtn = buttonBox.addButton("Cancel",
                                             QtGui.QDialogButtonBox.RejectRole)
        self.cancelBtn.pressed.connect(self.onCancelButton)

        form = QtGui.QFormLayout()
        form.setSpacing(10)

        form.addRow(cbpos.tr.stock_("Operation"), self.operations)
        form.addRow(cbpos.tr.stock_("Quantity"), self.quantity)

        layout = QtGui.QVBoxLayout()
        layout.setSpacing(10)

        layout.addWidget(self.products)
        layout.addLayout(form)
        layout.addWidget(buttonBox)

        self.setLayout(layout)

        self.setItem(None)
Exemplo n.º 2
0
    def __init__(self):
        super(StockDiaryPage, self).__init__()
        
        self.products = ProductCatalog()
        self.products.childSelected.connect(self.onProductChange)
        
        self.operations = QtGui.QComboBox()
        self.operations.setEditable(False)
        self.operations.addItems((cbpos.tr.stock_('In'), cbpos.tr.stock_('Modification')))
        self.operations.currentIndexChanged.connect(self.onOperationChange)

        self.quantity = QtGui.QDoubleSpinBox()
        self.quantity.setRange(0, sys.maxint)
        
        buttonBox = QtGui.QDialogButtonBox()
        
        self.editBtn = buttonBox.addButton("Edit", QtGui.QDialogButtonBox.ActionRole)
        self.editBtn.pressed.connect(self.onEditButton)
        
        self.okBtn = buttonBox.addButton("Save", QtGui.QDialogButtonBox.AcceptRole)
        self.okBtn.pressed.connect(self.onOkButton)
        
        self.cancelBtn = buttonBox.addButton("Cancel", QtGui.QDialogButtonBox.RejectRole)
        self.cancelBtn.pressed.connect(self.onCancelButton)

        form = QtGui.QFormLayout()
        form.setSpacing(10)
        
        form.addRow(cbpos.tr.stock_("Operation"), self.operations)
        form.addRow(cbpos.tr.stock_("Quantity"), self.quantity)

        layout = QtGui.QVBoxLayout()
        layout.setSpacing(10)
        
        layout.addWidget(self.products)
        layout.addLayout(form)
        layout.addWidget(buttonBox)
        
        self.setLayout(layout)

        self.setItem(None)
Exemplo n.º 3
0
class StockDiaryPage(BasePage):
    def __init__(self):
        super(StockDiaryPage, self).__init__()

        self.products = ProductCatalog()
        self.products.childSelected.connect(self.onProductChange)

        self.operations = QtGui.QComboBox()
        self.operations.setEditable(False)
        self.operations.addItems(
            (cbpos.tr.stock_('In'), cbpos.tr.stock_('Modification')))
        self.operations.currentIndexChanged.connect(self.onOperationChange)

        self.quantity = QtGui.QDoubleSpinBox()
        self.quantity.setRange(0, sys.maxint)

        buttonBox = QtGui.QDialogButtonBox()

        self.editBtn = buttonBox.addButton("Edit",
                                           QtGui.QDialogButtonBox.ActionRole)
        self.editBtn.pressed.connect(self.onEditButton)

        self.okBtn = buttonBox.addButton("Save",
                                         QtGui.QDialogButtonBox.AcceptRole)
        self.okBtn.pressed.connect(self.onOkButton)

        self.cancelBtn = buttonBox.addButton("Cancel",
                                             QtGui.QDialogButtonBox.RejectRole)
        self.cancelBtn.pressed.connect(self.onCancelButton)

        form = QtGui.QFormLayout()
        form.setSpacing(10)

        form.addRow(cbpos.tr.stock_("Operation"), self.operations)
        form.addRow(cbpos.tr.stock_("Quantity"), self.quantity)

        layout = QtGui.QVBoxLayout()
        layout.setSpacing(10)

        layout.addWidget(self.products)
        layout.addLayout(form)
        layout.addWidget(buttonBox)

        self.setLayout(layout)

        self.setItem(None)

    def populate(self):
        self.products.populate()

    def canEdit(self):
        return (self.item is not None and self.item.in_stock)

    def setItem(self, item, edit=False):
        self.item = item

        self.products.setEnabled(not edit)
        self.operations.setEnabled(item is not None and edit)
        self.quantity.setEnabled(item is not None and edit)
        self.okBtn.setEnabled(item is not None and edit)
        self.cancelBtn.setEnabled(item is not None and edit)
        self.editBtn.setEnabled(self.canEdit() and not edit)

        self.quantity.setValue(0)
        self.operations.setCurrentIndex(0)

    def saveChanges(self):
        quantity = self.quantity.value()
        operation = 'in' if self.operations.currentIndex() == 0 else 'edit'
        if operation == 'in':
            self.item.quantity_in(quantity)
        else:
            self.item.quantity = quantity
        return True

    def onProductChange(self, p):
        self.setItem(p, False)

    def onOperationChange(self):
        operation = 'in' if self.operations.currentIndex() == 0 else 'edit'
        if operation == 'in':
            self.quantity.setValue(0)
        else:
            self.quantity.setValue(self.item.quantity)

    def onEditButton(self):
        self.setItem(self.item, True)

    def onOkButton(self):
        if self.saveChanges():
            self.setItem(None, False)

    def onCancelButton(self):
        self.setItem(self.item, False)
Exemplo n.º 4
0
class StockDiaryPage(BasePage):
    def __init__(self):
        super(StockDiaryPage, self).__init__()
        
        self.products = ProductCatalog()
        self.products.childSelected.connect(self.onProductChange)
        
        self.operations = QtGui.QComboBox()
        self.operations.setEditable(False)
        self.operations.addItems((cbpos.tr.stock_('In'), cbpos.tr.stock_('Modification')))
        self.operations.currentIndexChanged.connect(self.onOperationChange)

        self.quantity = QtGui.QDoubleSpinBox()
        self.quantity.setRange(0, sys.maxint)
        
        buttonBox = QtGui.QDialogButtonBox()
        
        self.editBtn = buttonBox.addButton("Edit", QtGui.QDialogButtonBox.ActionRole)
        self.editBtn.pressed.connect(self.onEditButton)
        
        self.okBtn = buttonBox.addButton("Save", QtGui.QDialogButtonBox.AcceptRole)
        self.okBtn.pressed.connect(self.onOkButton)
        
        self.cancelBtn = buttonBox.addButton("Cancel", QtGui.QDialogButtonBox.RejectRole)
        self.cancelBtn.pressed.connect(self.onCancelButton)

        form = QtGui.QFormLayout()
        form.setSpacing(10)
        
        form.addRow(cbpos.tr.stock_("Operation"), self.operations)
        form.addRow(cbpos.tr.stock_("Quantity"), self.quantity)

        layout = QtGui.QVBoxLayout()
        layout.setSpacing(10)
        
        layout.addWidget(self.products)
        layout.addLayout(form)
        layout.addWidget(buttonBox)
        
        self.setLayout(layout)

        self.setItem(None)

    def populate(self):
        self.products.populate()

    def canEdit(self):
        return (self.item is not None and self.item.in_stock)

    def setItem(self, item, edit=False):
        self.item = item
        
        self.products.setEnabled(not edit)
        self.operations.setEnabled(item is not None and edit)
        self.quantity.setEnabled(item is not None and edit)
        self.okBtn.setEnabled(item is not None and edit)
        self.cancelBtn.setEnabled(item is not None and edit)
        self.editBtn.setEnabled(self.canEdit() and not edit)
        
        self.quantity.setValue(0)
        self.operations.setCurrentIndex(0)

    def saveChanges(self):
        quantity = self.quantity.value()
        operation = 'in' if self.operations.currentIndex() == 0 else 'edit'
        if operation == 'in':
            self.item.quantity_in(quantity)
        else:
            self.item.quantity = quantity
        return True

    def onProductChange(self, p):
        self.setItem(p, False)

    def onOperationChange(self):
        operation = 'in' if self.operations.currentIndex() == 0 else 'edit'
        if operation == 'in':
            self.quantity.setValue(0)
        else:
            self.quantity.setValue(self.item.quantity)

    def onEditButton(self):
        self.setItem(self.item, True)
    
    def onOkButton(self):
        if self.saveChanges():
            self.setItem(None, False)

    def onCancelButton(self):
        self.setItem(self.item, False)
Exemplo n.º 5
0
 def __init__(self):
     super(SalesPage, self).__init__()
     
     self.manager = SalesManager()
     
     self.customer = QtGui.QLineEdit()
     self.customer.setReadOnly(True)
     self.customer.setPlaceholderText(cbpos.tr.sales_('No customer selected'))
     
     self.customerBtn = QtGui.QPushButton(cbpos.tr.sales_('Choose'))
     
     self.tickets = QtGui.QComboBox()
     self.tickets.setEditable(False)
     
     self.newTicketBtn = QtGui.QPushButton(cbpos.tr.sales_("New"))
     
     self.ticketTable = TicketTable(self.manager)
     
     self.currency = QtGui.QComboBox()
     self.currency.setEditable(False)
     
     self.discount = QtGui.QSpinBox()
     self.discount.setRange(0, 100)
     self.discount.setSingleStep(5)
     self.discount.setSuffix('%')
     
     self.total = TotalPanel(self.manager)
     
     self.logo = LogoPanel(self.manager)
     
     self.catalogLbl = QtGui.QLabel(cbpos.tr.sales_("Choose a product"))
     self.catalog = ProductCatalog()
     
     self.payBtn = QtGui.QPushButton(cbpos.tr.sales_("Pay"))
     self.cancelBtn = QtGui.QPushButton(cbpos.tr.sales_("Cancel"))
     
     layout = QtGui.QVBoxLayout()
     
     topOptions = QtGui.QHBoxLayout()
     topOptions.addWidget(self.customer)
     topOptions.addWidget(self.customerBtn)
     topOptions.addWidget(self.tickets)
     topOptions.addWidget(self.newTicketBtn)
     
     topOptions.setStretch(0, 1)
     topOptions.setStretch(1, 0)
     topOptions.setStretch(2, 1)
     topOptions.setStretch(3, 0)
     
     bottomOptions = QtGui.QHBoxLayout()
     bottomOptions.addWidget(self.currency)
     bottomOptions.addStretch(1)
     bottomOptions.addWidget(self.discount)
     
     bottomOptions.setStretch(0, 1)
     bottomOptions.setStretch(1, 1)
     bottomOptions.setStretch(2, 0)
     
     buttons = QtGui.QHBoxLayout()
     buttons.addWidget(self.payBtn)
     buttons.addWidget(self.cancelBtn)
     
     buttons.setStretch(0, 1)
     buttons.setStretch(1, 1)
     
     size_policy = QtGui.QSizePolicy(QtGui.QSizePolicy.Ignored, QtGui.QSizePolicy.Ignored)
     size_policy.setVerticalStretch(1)
     size_policy.setHorizontalStretch(1)
     self.payBtn.setSizePolicy(size_policy)
     self.cancelBtn.setSizePolicy(QtGui.QSizePolicy(size_policy))
     
     left = QtGui.QVBoxLayout()
     left.addLayout(topOptions)
     left.addWidget(self.ticketTable)
     left.addLayout(bottomOptions)
     
     right = QtGui.QVBoxLayout()
     right.addWidget(self.logo)
     right.addWidget(self.catalogLbl)
     right.addWidget(self.catalog)
     
     top = QtGui.QHBoxLayout()
     top.addLayout(left)
     top.addLayout(right)
     
     bottom = QtGui.QHBoxLayout()
     bottom.addWidget(self.total)
     bottom.addLayout(buttons)
     
     bottom.setStretch(0, 1)
     bottom.setStretch(1, 1)
     
     layout.addLayout(top)
     layout.addLayout(bottom)
     
     self.setLayout(layout)
     
     # Signals
     self.customerBtn.pressed.connect(self.onCustomerButton)
     self.tickets.activated[int].connect(self.onTicketChanged)
     self.newTicketBtn.pressed.connect(self.onNewTicketButton)
     
     #self.ticketTable.currentCellChanged.connect(self.onTicketlineItemChanged)
     #self.ticketTable.cellDoubleClicked.connect(self.onTicketlineItemActivate)
     self.ticketTable.lineDeleted.connect(self.onTicketlineDeleted)
     
     self.currency.activated[int].connect(self.onCurrencyChanged)
     self.discount.editingFinished.connect(self.onDiscountValueChanged)
     
     self.payBtn.pressed.connect(self.onCloseTicketButton)
     self.cancelBtn.pressed.connect(self.onCancelTicketButton)
     
     self.catalog.childSelected.connect(self.onProductCatalogItemActivate)
     
     self.setCurrentTicket(None)
Exemplo n.º 6
0
class SalesPage(BasePage):
    def __init__(self):
        super(SalesPage, self).__init__()
        
        self.manager = SalesManager()
        
        self.customer = QtGui.QLineEdit()
        self.customer.setReadOnly(True)
        self.customer.setPlaceholderText(cbpos.tr.sales_('No customer selected'))
        
        self.customerBtn = QtGui.QPushButton(cbpos.tr.sales_('Choose'))
        
        self.tickets = QtGui.QComboBox()
        self.tickets.setEditable(False)
        
        self.newTicketBtn = QtGui.QPushButton(cbpos.tr.sales_("New"))
        
        self.ticketTable = TicketTable(self.manager)
        
        self.currency = QtGui.QComboBox()
        self.currency.setEditable(False)
        
        self.discount = QtGui.QSpinBox()
        self.discount.setRange(0, 100)
        self.discount.setSingleStep(5)
        self.discount.setSuffix('%')
        
        self.total = TotalPanel(self.manager)
        
        self.logo = LogoPanel(self.manager)
        
        self.catalogLbl = QtGui.QLabel(cbpos.tr.sales_("Choose a product"))
        self.catalog = ProductCatalog()
        
        self.payBtn = QtGui.QPushButton(cbpos.tr.sales_("Pay"))
        self.cancelBtn = QtGui.QPushButton(cbpos.tr.sales_("Cancel"))
        
        layout = QtGui.QVBoxLayout()
        
        topOptions = QtGui.QHBoxLayout()
        topOptions.addWidget(self.customer)
        topOptions.addWidget(self.customerBtn)
        topOptions.addWidget(self.tickets)
        topOptions.addWidget(self.newTicketBtn)
        
        topOptions.setStretch(0, 1)
        topOptions.setStretch(1, 0)
        topOptions.setStretch(2, 1)
        topOptions.setStretch(3, 0)
        
        bottomOptions = QtGui.QHBoxLayout()
        bottomOptions.addWidget(self.currency)
        bottomOptions.addStretch(1)
        bottomOptions.addWidget(self.discount)
        
        bottomOptions.setStretch(0, 1)
        bottomOptions.setStretch(1, 1)
        bottomOptions.setStretch(2, 0)
        
        buttons = QtGui.QHBoxLayout()
        buttons.addWidget(self.payBtn)
        buttons.addWidget(self.cancelBtn)
        
        buttons.setStretch(0, 1)
        buttons.setStretch(1, 1)
        
        size_policy = QtGui.QSizePolicy(QtGui.QSizePolicy.Ignored, QtGui.QSizePolicy.Ignored)
        size_policy.setVerticalStretch(1)
        size_policy.setHorizontalStretch(1)
        self.payBtn.setSizePolicy(size_policy)
        self.cancelBtn.setSizePolicy(QtGui.QSizePolicy(size_policy))
        
        left = QtGui.QVBoxLayout()
        left.addLayout(topOptions)
        left.addWidget(self.ticketTable)
        left.addLayout(bottomOptions)
        
        right = QtGui.QVBoxLayout()
        right.addWidget(self.logo)
        right.addWidget(self.catalogLbl)
        right.addWidget(self.catalog)
        
        top = QtGui.QHBoxLayout()
        top.addLayout(left)
        top.addLayout(right)
        
        bottom = QtGui.QHBoxLayout()
        bottom.addWidget(self.total)
        bottom.addLayout(buttons)
        
        bottom.setStretch(0, 1)
        bottom.setStretch(1, 1)
        
        layout.addLayout(top)
        layout.addLayout(bottom)
        
        self.setLayout(layout)
        
        # Signals
        self.customerBtn.pressed.connect(self.onCustomerButton)
        self.tickets.activated[int].connect(self.onTicketChanged)
        self.newTicketBtn.pressed.connect(self.onNewTicketButton)
        
        #self.ticketTable.currentCellChanged.connect(self.onTicketlineItemChanged)
        #self.ticketTable.cellDoubleClicked.connect(self.onTicketlineItemActivate)
        self.ticketTable.lineDeleted.connect(self.onTicketlineDeleted)
        
        self.currency.activated[int].connect(self.onCurrencyChanged)
        self.discount.editingFinished.connect(self.onDiscountValueChanged)
        
        self.payBtn.pressed.connect(self.onCloseTicketButton)
        self.cancelBtn.pressed.connect(self.onCancelTicketButton)
        
        self.catalog.childSelected.connect(self.onProductCatalogItemActivate)
        
        self.setCurrentTicket(None)
        
    def populate(self):
        
        # Set the Ticket field
        t = self.manager.ticket
        selected_index = -1
        
        self.tickets.clear()
        for i, item in enumerate(self.manager.list_tickets()):
            self.tickets.addItem(item.display, item)
            if item == t:
                selected_index = i
        self.tickets.setCurrentIndex(selected_index)
        
        # Set the Currency field
        tc = self.manager.currency
        self.currency.clear()
        for i, item in enumerate(self.manager.list_currencies()):
            self.currency.addItem(item.display, item)
            if item == tc:
                self.currency.setCurrentIndex(i)

        # Set the Customer field
        if self.manager.customer is None:
            self.customer.setText("")
        else:
            self.customer.setText(self.manager.customer.display)
        
        # Set the Discount field
        self.discount.setValue(self.manager.discount)
        
        # Set the Total field
        self.total.updateValues()

        # Fill the ticketlines table
        if self.manager.ticket is None:
            self.ticketTable.empty()
        else:
            self.ticketTable.fill()
        
        # Fill the catalog
        self.catalog.populate()

    def setCurrentTicket(self, t):
        self.manager.ticket = t
        
        enabled = t is not None
        self.currency.setEnabled(enabled)
        self.customer.setEnabled(enabled)
        self.customerBtn.setEnabled(enabled)
        self.discount.setEnabled(enabled)
        self.payBtn.setEnabled(enabled)
        self.cancelBtn.setEnabled(enabled)

    def warnTicketSelection(self):
        QtGui.QMessageBox.warning(self, cbpos.tr.sales_('No ticket'), cbpos.tr.sales_('Select a ticket.'))
    
    def warnTicketlineSelection(self):
        QtGui.QMessageBox.warning(self, cbpos.tr.sales_('No ticketline'), cbpos.tr.sales_('Select a ticketline.'))

    def addAmount(self, inc):
        if self.manager.ticket is None:
            self.warnTicketSelection()
            return
        
        tl = self.ticketTable.currentLine()
        if tl is None:
            self.warnTicketlineSelection()
            return
        
        try:
            self.manager.set_ticketline_amount(tl.amount+inc)
        except ValueError as e:
            QtGui.QMessageBox.warning(self, 'Warning', 'Amount exceeds the product quantity in stock!')
            self.manager.set_ticketline_amount(tl.amount+inc, force=True)
        #self.enableTicketlineActions()
        self.populate()

    #####################
    #########   #########
    ##     onEvent     ##
    #########   #########
    #####################
    
    def onNewTicketButton(self):
        self.setCurrentTicket(self.manager.new_ticket())
        self.populate()
    
    def onCloseTicketButton(self):
        t = self.manager.ticket
        if t is None:
            self.warnTicketSelection()
            return
        
        dlg = PayDialog(self.manager)
        dlg.exec_()
        if dlg.payment is not None:
            payment_method, paid = dlg.payment
            self.manager.close_ticket(payment_method, paid)
            self.setCurrentTicket(None)
            self.populate()
    
    def onCancelTicketButton(self):
        try:
            self.manager.cancel_ticket()
        except TicketSelectionException as e:
            self.warnTicketSelection()
        else:
            self.setCurrentTicket(None)
            self.populate()
    
    def onTicketChanged(self, index):
        t = self.tickets.itemData(index)
        self.setCurrentTicket(t)
        self.populate()
    
    def onTicketlineItemChanged(self, currentRow, currentColumn, previousRow, previousColumn):
        self.enableTicketlineActions()
    
    def onNewTicketlineButton(self):
        t = self.manager.ticket
        if t is None:
            self.warnTicketSelection()
            return
        
        data = {'description': '', 'amount': 1, 'sell_price': 0, 'discount': 0, 'ticket': t,
                'product': None, 'is_edited': False}
        _init_data = data.copy()
        dlg = EditDialog(data)
        dlg.exec_()
        if data != _init_data:
            self.manager.add_ticketline(data)
            self.populate()
    
    def onEditTicketlineButton(self):
        t = self.manager.ticket
        if t is None:
            self.warnTicketSelection()
            return
        
        tl = self.ticketTable.currentLine()
        if tl is None:
            self.warnTicketlineSelection()
            return
        
        data = {'description': '', 'sell_price': 0, 'amount': 1, 'discount': 0, 'product': None, 'is_edited': False}
        tl.fillDict(data)
        _init_data = data.copy()
        dlg = EditDialog(data)
        dlg.exec_()
        if data != _init_data:
            self.manager.add_ticketline(data)
            self.populate()
    
    def onPlusTicketlineButton(self):
        self.addAmount(+1)
    
    def onMinusTicketlineButton(self):
        self.addAmount(-1)

    def onTicketlineDeleted(self, tl):
        try:
            self.manager.remove_ticketline(tl)
        except TicketSelectionException as e:
            self.warnTicketSelection()
        finally:
            self.populate()

    def onProductCatalogItemActivate(self, p):
        if p is not None:
            try:
                self.manager.add_product(p)
            except TicketSelectionException as e:
                self.warnTicketSelection()
            finally:
                self.populate()

    def onCustomerButton(self):
        t = self.manager.ticket
        if t is None:
            self.warnTicketSelection()
            return
        
        dlg = CustomerChooserDialog()
        dlg.setCustomer(t.customer)
        dlg.exec_()
        if dlg.result() == QtGui.QDialog.Accepted:
            self.manager.customer = dlg.customer
            self.populate()

    def onCurrencyChanged(self, index):
        index = self.currency.currentIndex()
        c = self.currency.itemData(index)
        
        try:
            self.manager.currency = c
        except TicketSelectionException as e:
            self.warnTicketSelection()
        else:
            self.populate()
    
    def onDiscountValueChanged(self):
        value = self.discount.value()
        try:
            self.manager.discount = value
        except TicketSelectionException as e:
            self.warnTicketSelection()
        else:
            self.populate()
Exemplo n.º 7
0
    def __init__(self):
        super(SalesPage, self).__init__()

        self.manager = SalesManager()

        self.customer = QtGui.QLineEdit()
        self.customer.setReadOnly(True)
        self.customer.setPlaceholderText(
            cbpos.tr.sales_('No customer selected'))

        self.customerBtn = QtGui.QPushButton(cbpos.tr.sales_('Choose'))

        self.tickets = QtGui.QComboBox()
        self.tickets.setEditable(False)

        self.newTicketBtn = QtGui.QPushButton(cbpos.tr.sales_("New"))

        self.ticketTable = TicketTable(self.manager)

        self.currency = QtGui.QComboBox()
        self.currency.setEditable(False)

        self.discount = QtGui.QSpinBox()
        self.discount.setRange(0, 100)
        self.discount.setSingleStep(5)
        self.discount.setSuffix('%')

        self.total = TotalPanel(self.manager)

        self.logo = LogoPanel(self.manager)

        self.catalogLbl = QtGui.QLabel(cbpos.tr.sales_("Choose a product"))
        self.catalog = ProductCatalog()

        self.payBtn = QtGui.QPushButton(cbpos.tr.sales_("Pay"))
        self.cancelBtn = QtGui.QPushButton(cbpos.tr.sales_("Cancel"))

        layout = QtGui.QVBoxLayout()

        topOptions = QtGui.QHBoxLayout()
        topOptions.addWidget(self.customer)
        topOptions.addWidget(self.customerBtn)
        topOptions.addWidget(self.tickets)
        topOptions.addWidget(self.newTicketBtn)

        topOptions.setStretch(0, 1)
        topOptions.setStretch(1, 0)
        topOptions.setStretch(2, 1)
        topOptions.setStretch(3, 0)

        bottomOptions = QtGui.QHBoxLayout()
        bottomOptions.addWidget(self.currency)
        bottomOptions.addStretch(1)
        bottomOptions.addWidget(self.discount)

        bottomOptions.setStretch(0, 1)
        bottomOptions.setStretch(1, 1)
        bottomOptions.setStretch(2, 0)

        buttons = QtGui.QHBoxLayout()
        buttons.addWidget(self.payBtn)
        buttons.addWidget(self.cancelBtn)

        buttons.setStretch(0, 1)
        buttons.setStretch(1, 1)

        size_policy = QtGui.QSizePolicy(QtGui.QSizePolicy.Ignored,
                                        QtGui.QSizePolicy.Ignored)
        size_policy.setVerticalStretch(1)
        size_policy.setHorizontalStretch(1)
        self.payBtn.setSizePolicy(size_policy)
        self.cancelBtn.setSizePolicy(QtGui.QSizePolicy(size_policy))

        left = QtGui.QVBoxLayout()
        left.addLayout(topOptions)
        left.addWidget(self.ticketTable)
        left.addLayout(bottomOptions)

        right = QtGui.QVBoxLayout()
        right.addWidget(self.logo)
        right.addWidget(self.catalogLbl)
        right.addWidget(self.catalog)

        top = QtGui.QHBoxLayout()
        top.addLayout(left)
        top.addLayout(right)

        bottom = QtGui.QHBoxLayout()
        bottom.addWidget(self.total)
        bottom.addLayout(buttons)

        bottom.setStretch(0, 1)
        bottom.setStretch(1, 1)

        layout.addLayout(top)
        layout.addLayout(bottom)

        self.setLayout(layout)

        # Signals
        self.customerBtn.pressed.connect(self.onCustomerButton)
        self.tickets.activated[int].connect(self.onTicketChanged)
        self.newTicketBtn.pressed.connect(self.onNewTicketButton)

        #self.ticketTable.currentCellChanged.connect(self.onTicketlineItemChanged)
        #self.ticketTable.cellDoubleClicked.connect(self.onTicketlineItemActivate)
        self.ticketTable.lineDeleted.connect(self.onTicketlineDeleted)

        self.currency.activated[int].connect(self.onCurrencyChanged)
        self.discount.editingFinished.connect(self.onDiscountValueChanged)

        self.payBtn.pressed.connect(self.onCloseTicketButton)
        self.cancelBtn.pressed.connect(self.onCancelTicketButton)

        self.catalog.childSelected.connect(self.onProductCatalogItemActivate)

        self.setCurrentTicket(None)
Exemplo n.º 8
0
class SalesPage(BasePage):
    def __init__(self):
        super(SalesPage, self).__init__()

        self.manager = SalesManager()

        self.customer = QtGui.QLineEdit()
        self.customer.setReadOnly(True)
        self.customer.setPlaceholderText(
            cbpos.tr.sales_('No customer selected'))

        self.customerBtn = QtGui.QPushButton(cbpos.tr.sales_('Choose'))

        self.tickets = QtGui.QComboBox()
        self.tickets.setEditable(False)

        self.newTicketBtn = QtGui.QPushButton(cbpos.tr.sales_("New"))

        self.ticketTable = TicketTable(self.manager)

        self.currency = QtGui.QComboBox()
        self.currency.setEditable(False)

        self.discount = QtGui.QSpinBox()
        self.discount.setRange(0, 100)
        self.discount.setSingleStep(5)
        self.discount.setSuffix('%')

        self.total = TotalPanel(self.manager)

        self.logo = LogoPanel(self.manager)

        self.catalogLbl = QtGui.QLabel(cbpos.tr.sales_("Choose a product"))
        self.catalog = ProductCatalog()

        self.payBtn = QtGui.QPushButton(cbpos.tr.sales_("Pay"))
        self.cancelBtn = QtGui.QPushButton(cbpos.tr.sales_("Cancel"))

        layout = QtGui.QVBoxLayout()

        topOptions = QtGui.QHBoxLayout()
        topOptions.addWidget(self.customer)
        topOptions.addWidget(self.customerBtn)
        topOptions.addWidget(self.tickets)
        topOptions.addWidget(self.newTicketBtn)

        topOptions.setStretch(0, 1)
        topOptions.setStretch(1, 0)
        topOptions.setStretch(2, 1)
        topOptions.setStretch(3, 0)

        bottomOptions = QtGui.QHBoxLayout()
        bottomOptions.addWidget(self.currency)
        bottomOptions.addStretch(1)
        bottomOptions.addWidget(self.discount)

        bottomOptions.setStretch(0, 1)
        bottomOptions.setStretch(1, 1)
        bottomOptions.setStretch(2, 0)

        buttons = QtGui.QHBoxLayout()
        buttons.addWidget(self.payBtn)
        buttons.addWidget(self.cancelBtn)

        buttons.setStretch(0, 1)
        buttons.setStretch(1, 1)

        size_policy = QtGui.QSizePolicy(QtGui.QSizePolicy.Ignored,
                                        QtGui.QSizePolicy.Ignored)
        size_policy.setVerticalStretch(1)
        size_policy.setHorizontalStretch(1)
        self.payBtn.setSizePolicy(size_policy)
        self.cancelBtn.setSizePolicy(QtGui.QSizePolicy(size_policy))

        left = QtGui.QVBoxLayout()
        left.addLayout(topOptions)
        left.addWidget(self.ticketTable)
        left.addLayout(bottomOptions)

        right = QtGui.QVBoxLayout()
        right.addWidget(self.logo)
        right.addWidget(self.catalogLbl)
        right.addWidget(self.catalog)

        top = QtGui.QHBoxLayout()
        top.addLayout(left)
        top.addLayout(right)

        bottom = QtGui.QHBoxLayout()
        bottom.addWidget(self.total)
        bottom.addLayout(buttons)

        bottom.setStretch(0, 1)
        bottom.setStretch(1, 1)

        layout.addLayout(top)
        layout.addLayout(bottom)

        self.setLayout(layout)

        # Signals
        self.customerBtn.pressed.connect(self.onCustomerButton)
        self.tickets.activated[int].connect(self.onTicketChanged)
        self.newTicketBtn.pressed.connect(self.onNewTicketButton)

        #self.ticketTable.currentCellChanged.connect(self.onTicketlineItemChanged)
        #self.ticketTable.cellDoubleClicked.connect(self.onTicketlineItemActivate)
        self.ticketTable.lineDeleted.connect(self.onTicketlineDeleted)

        self.currency.activated[int].connect(self.onCurrencyChanged)
        self.discount.editingFinished.connect(self.onDiscountValueChanged)

        self.payBtn.pressed.connect(self.onCloseTicketButton)
        self.cancelBtn.pressed.connect(self.onCancelTicketButton)

        self.catalog.childSelected.connect(self.onProductCatalogItemActivate)

        self.setCurrentTicket(None)

    def populate(self):

        # Set the Ticket field
        t = self.manager.ticket
        selected_index = -1

        self.tickets.clear()
        for i, item in enumerate(self.manager.list_tickets()):
            self.tickets.addItem(item.display, item)
            if item == t:
                selected_index = i
        self.tickets.setCurrentIndex(selected_index)

        # Set the Currency field
        tc = self.manager.currency
        self.currency.clear()
        for i, item in enumerate(self.manager.list_currencies()):
            self.currency.addItem(item.display, item)
            if item == tc:
                self.currency.setCurrentIndex(i)

        # Set the Customer field
        if self.manager.customer is None:
            self.customer.setText("")
        else:
            self.customer.setText(self.manager.customer.display)

        # Set the Discount field
        self.discount.setValue(self.manager.discount)

        # Set the Total field
        self.total.updateValues()

        # Fill the ticketlines table
        if self.manager.ticket is None:
            self.ticketTable.empty()
        else:
            self.ticketTable.fill()

        # Fill the catalog
        self.catalog.populate()

    def setCurrentTicket(self, t):
        self.manager.ticket = t

        enabled = t is not None
        self.currency.setEnabled(enabled)
        self.customer.setEnabled(enabled)
        self.customerBtn.setEnabled(enabled)
        self.discount.setEnabled(enabled)
        self.payBtn.setEnabled(enabled)
        self.cancelBtn.setEnabled(enabled)

    def warnTicketSelection(self):
        QtGui.QMessageBox.warning(self, cbpos.tr.sales_('No ticket'),
                                  cbpos.tr.sales_('Select a ticket.'))

    def warnTicketlineSelection(self):
        QtGui.QMessageBox.warning(self, cbpos.tr.sales_('No ticketline'),
                                  cbpos.tr.sales_('Select a ticketline.'))

    def addAmount(self, inc):
        if self.manager.ticket is None:
            self.warnTicketSelection()
            return

        tl = self.ticketTable.currentLine()
        if tl is None:
            self.warnTicketlineSelection()
            return

        try:
            self.manager.set_ticketline_amount(tl.amount + inc)
        except ValueError as e:
            QtGui.QMessageBox.warning(
                self, 'Warning',
                'Amount exceeds the product quantity in stock!')
            self.manager.set_ticketline_amount(tl.amount + inc, force=True)
        #self.enableTicketlineActions()
        self.populate()

    #####################
    #########   #########
    ##     onEvent     ##
    #########   #########
    #####################

    def onNewTicketButton(self):
        self.setCurrentTicket(self.manager.new_ticket())
        self.populate()

    def onCloseTicketButton(self):
        t = self.manager.ticket
        if t is None:
            self.warnTicketSelection()
            return

        dlg = PayDialog(self.manager)
        dlg.exec_()
        if dlg.payment is not None:
            payment_method, paid = dlg.payment
            self.manager.close_ticket(payment_method, paid)
            self.setCurrentTicket(None)
            self.populate()

    def onCancelTicketButton(self):
        try:
            self.manager.cancel_ticket()
        except TicketSelectionException as e:
            self.warnTicketSelection()
        else:
            self.setCurrentTicket(None)
            self.populate()

    def onTicketChanged(self, index):
        t = self.tickets.itemData(index)
        self.setCurrentTicket(t)
        self.populate()

    def onTicketlineItemChanged(self, currentRow, currentColumn, previousRow,
                                previousColumn):
        self.enableTicketlineActions()

    def onNewTicketlineButton(self):
        t = self.manager.ticket
        if t is None:
            self.warnTicketSelection()
            return

        data = {
            'description': '',
            'amount': 1,
            'sell_price': 0,
            'discount': 0,
            'ticket': t,
            'product': None,
            'is_edited': False
        }
        _init_data = data.copy()
        dlg = EditDialog(data)
        dlg.exec_()
        if data != _init_data:
            self.manager.add_ticketline(data)
            self.populate()

    def onEditTicketlineButton(self):
        t = self.manager.ticket
        if t is None:
            self.warnTicketSelection()
            return

        tl = self.ticketTable.currentLine()
        if tl is None:
            self.warnTicketlineSelection()
            return

        data = {
            'description': '',
            'sell_price': 0,
            'amount': 1,
            'discount': 0,
            'product': None,
            'is_edited': False
        }
        tl.fillDict(data)
        _init_data = data.copy()
        dlg = EditDialog(data)
        dlg.exec_()
        if data != _init_data:
            self.manager.add_ticketline(data)
            self.populate()

    def onPlusTicketlineButton(self):
        self.addAmount(+1)

    def onMinusTicketlineButton(self):
        self.addAmount(-1)

    def onTicketlineDeleted(self, tl):
        try:
            self.manager.remove_ticketline(tl)
        except TicketSelectionException as e:
            self.warnTicketSelection()
        finally:
            self.populate()

    def onProductCatalogItemActivate(self, p):
        if p is not None:
            try:
                self.manager.add_product(p)
            except TicketSelectionException as e:
                self.warnTicketSelection()
            finally:
                self.populate()

    def onCustomerButton(self):
        t = self.manager.ticket
        if t is None:
            self.warnTicketSelection()
            return

        dlg = CustomerChooserDialog()
        dlg.setCustomer(t.customer)
        dlg.exec_()
        if dlg.result() == QtGui.QDialog.Accepted:
            self.manager.customer = dlg.customer
            self.populate()

    def onCurrencyChanged(self, index):
        index = self.currency.currentIndex()
        c = self.currency.itemData(index)

        try:
            self.manager.currency = c
        except TicketSelectionException as e:
            self.warnTicketSelection()
        else:
            self.populate()

    def onDiscountValueChanged(self):
        value = self.discount.value()
        try:
            self.manager.discount = value
        except TicketSelectionException as e:
            self.warnTicketSelection()
        else:
            self.populate()