Beispiel #1
0
def receive_status_backend(belegliste):
    if type(belegliste) != type([]):
        belegliste = [
            belegliste,
        ]
    import requests
    try:
        rq = requests.get(
            'http://sms.mosterei-wurst.de/read.py',
            params={'vorgang': [vorgang.ID for vorgang in belegliste]},
            timeout=1)
        data = rq.json()
        s = Speicher()
        for vorgang in belegliste:
            if vorgang.ID in data.keys():
                anrufe = s.getAnrufe(vorgang)
                for ts, status in data[vorgang.ID]:
                    found = False
                    for a in anrufe:
                        if a['ergebnis'] == 'sms-' + status:
                            found = True
                    if not found:
                        s.speichereAnruf(
                            vorgang, 'sms-' + status, 'SMS-Status von ' +
                            datetime.datetime.fromtimestamp(ts).isoformat())
    except:
        pass
Beispiel #2
0
class DialogAnrufen(QtWidgets.QDialog):
    def __init__(self, vorgang):
        # Konstruktor der Superklasse aufrufen
        QtWidgets.QDialog.__init__(self,
                                   flags=QtCore.Qt.Window
                                   | QtCore.Qt.FramelessWindowHint)
        try:
            self.ui = uic.loadUi('ressource/ui/dialog_anrufen.ui', self)
        except:
            print('Kann UI-Datei nicht laden!')
            sys.exit(1)

        self.showFullScreen()

        self.speicher = Speicher()
        self.vorgang = vorgang

        self.ui.button_edit.clicked.connect(self.edit)
        self.ui.button_erreicht.clicked.connect(self.erreicht)
        self.ui.button_ab.clicked.connect(self.ab)
        self.ui.button_nichterreicht.clicked.connect(self.nichterreicht)
        self.ui.button_abbrechen.clicked.connect(self.reject)
        self.update()

    def erreicht(self):
        zeiten = [
            'Sofort', 'Heute Nachmittag', 'Heute Abend', u'Morgen früh',
            'Morgen Nachmittag', 'Morgen Abend', '13:00', '18:00', '20:00',
            '8:00'
        ]
        self.vorgang.setAbholung(showTextInputDialog('Abholung', zeiten, ''))
        self.speicher.speichereVorgang(self.vorgang)
        self.speicher.speichereAnruf(
            self.vorgang, 'erreicht',
            'Abholung: %s' % self.vorgang.getAbholung())
        self.accept()

    def ab(self):
        self.speicher.speichereAnruf(self.vorgang, 'ab', '')
        self.accept()

    def nichterreicht(self):
        self.speicher.speichereAnruf(self.vorgang, 'nichterreicht', '')
        self.accept()

    def edit(self):
        invoice = self.vorgang
        kunde = invoice.getKunde()
        showPhoneNumberInputDialog(kunde)
        self.speicher.speichereKunde(kunde)
        telefonnummern = ' / '.join([
            formatPhoneNumber(e['wert']) for e in kunde.listKontakteTelefon()
        ])
        self.ui.label_telefon.setText(telefonnummern)

    def update(self):
        invoice = self.vorgang
        kunde = invoice.getKunde()
        if kunde.getName():
            self.ui.label_kundenname.setText(kunde.getName())
        else:
            self.ui.label_kundenname.setText(u'<i>Barverkauf</i>')

        zeitpunkt = invoice.getZeitpunkt()
        if zeitpunkt:
            self.ui.label_zeitpunkt.setText(
                '%s, %s Uhr' % (Wochentage[zeitpunkt.weekday()],
                                zeitpunkt.strftime('%d.%m.%Y / %H:%M')))
        else:
            self.ui.label_zeitpunkt.setText('unbekannt')
        kontakte = kunde.listKontakteTelefon()
        if len(kontakte) == 0:
            showPhoneNumberInputDialog(kunde)
            if len(kunde.listKontakteTelefon()) > 0:
                self.speicher.speichereKunde(kunde)
        telefonnummern = ' / '.join([
            formatPhoneNumber(e['wert']) for e in kunde.listKontakteTelefon()
        ])
        self.ui.label_telefon.setText(telefonnummern)
        anrufe = self.speicher.getAnrufe(self.vorgang)
        text = u''
        for anruf in anrufe:
            if anruf['ergebnis'] == 'erreicht':
                text += u'%s - Erreicht - %s' % (anruf['timestamp'],
                                                 anruf['bemerkung'])
            elif anruf['ergebnis'] == 'ab':
                text += u'%s - AB' % (anruf['timestamp'], )
            elif anruf['ergebnis'] == 'nichterreicht':
                text += u'%s - NICHT erreicht' % (anruf['timestamp'], )
            else:
                text += u'%s - %s' % (anruf['ergebnis'], anruf['timestamp'])
            text += '\n'
        self.ui.textBrowser_ergebnisse.setText(text)

        html = BelegHTML(self.vorgang)
        self.ui.textBrowser_beleg.setText(html)
Beispiel #3
0
def BelegHTML(vorgang, public=True):
    fussnoten = {}

    def fussnote(msg):
        candidate = 1
        while candidate in fussnoten:
            if fussnoten[candidate] == msg:
                return u'<sup style="color: red;">%i</sup>' % candidate
            candidate += 1
        fussnoten[candidate] = msg
        return u'<sup style="color: red;">%i</sup>' % candidate

    html = ''
    if not public:
        name = vorgang.getKundenname()
        html += '<h3>' + name + '</h3>\n'

        html += '<p>&nbsp;</p>\n'

    datumswerte = set()
    for item in vorgang.getEntries():
        datumswerte.add(item.getDatum())

    posten = {}
    for item in vorgang.getEntries():
        if item.getDatum() not in posten.keys():
            posten[item.getDatum()] = []
        posten[item.getDatum()].append(item)
    for datum in sorted(posten.keys()):
        entries = posten[datum]
        if len(datumswerte) > 1:
            html += "<strong>Leistung vom %s</strong>\n" % datum.strftime(
                '%d. %m. %Y')
        for entry in entries:
            subject = entry['beschreibung']
            if not entry.autoupdate:
                subject = subject + fussnote('Kein Update aus der Preisliste')
            if not entry.preisliste_link:
                subject = subject + fussnote('Manuell eingegebener Artikel')
            html += '<p><strong>%s</strong></p>\n' % subject

            html += '<pre>'
            if entry['anzahl'] != 1 or entry['einheit'] not in ['', 'Psch.']:
                html += u'%6.0f' % entry['anzahl']
                ep = getMoneyValue(entry.getNormalpreis())
                fn = ''
                if not entry.istStandardpreis():
                    fn += fussnote('Manuell gesetzter Preis')
                elif entry.getRabattstufe(
                ) != entry.getAutomatischeRabattstufe():
                    fn += fussnote('Manuell gesetzte Rabattstufe')
                html += u' %-8sx %10s%s  =' % (entry['einheit'], ep, fn)
            else:
                html += ' ' * 32
            html += u'   %11s (%4.1f%%)</pre>\n' % (getMoneyValue(
                entry.getNormalsumme()), entry.getSteuersatz())

    html += u'<p style="font-size: 25pt; margin-top: 2em; font-weight: bold;">Gesamtbetrag: &nbsp; &nbsp; %11s </p>\n' % getMoneyValue(
        vorgang.getNormalsumme())

    zahlungen = vorgang.getZahlungen()
    if len(zahlungen) > 0:
        for z in zahlungen:
            bemerkung = ''
            if z['bemerkung']:
                bemerkung = ' (%s)' % z['bemerkung']
            html += u'<p>Zahlung (%s) am %s%s: %11s</p>' % (
                z['zahlart'], z['timestamp'], bemerkung,
                getMoneyValue(z['betrag']))
        html += u'<p style="font-size: 25pt; font-weight: bold;">Restbetrag: &nbsp; &nbsp; %11s </p>\n' % getMoneyValue(
            vorgang.getZahlbetrag())

    html += '<p>Gesamtmenge Bag-in-Box: %i Liter</p>\n' % vorgang.getLiterzahl(
    )
    if not public:
        html += '<hr />'
        html += '<p>Anzahl Paletten: <strong>%i</strong></p>\n' % vorgang.getPaletten(
        )
        if vorgang.getAbholung():
            html += '<p>Abholung: %s</p>\n' % vorgang.getAbholung()
        if vorgang.getTelefon():
            html += '<p>Telefon: %s</p>\n' % vorgang.getTelefon()

        if vorgang.getPayed():
            html += u'<p><strong>*** BEZAHLT ***</strong></p>'

        s = Speicher()
        anrufe = s.getAnrufe(vorgang)
        for anruf in anrufe:
            if anruf['ergebnis'] == 'erreicht':
                html += '<p>Anruf %s - Erreicht - %s</p>\n' % (
                    anruf['timestamp'], anruf['bemerkung'])
            elif anruf['ergebnis'] == 'ab':
                html += '<p>Anruf %s - AB</p>\n' % (anruf['timestamp'], )
            elif anruf['ergebnis'] == 'nichterreicht':
                html += '<p>Anruf %s - NICHT erreicht</p>\n' % (
                    anruf['timestamp'], )
            else:
                html += '<p>Anruf %s - %s</p>\n' % (anruf['ergebnis'],
                                                    anruf['timestamp'])

    for key, msg in fussnoten.items():
        html += '<p>%i: %s</p>' % (key, msg)

    return html
Beispiel #4
0
class WidgetAbfuellung(QtWidgets.QWidget):
    def __init__(self, mainwindow):
        QtWidgets.QWidget.__init__(self)
        self.mainwindow = mainwindow

        try:
            self.ui = uic.loadUi('ressource/ui/widget_abfuellung.ui', self)
        except:
            print('Kann UI-Datei nicht laden!')
            sys.exit(1)

        self.speicher = Speicher()

        self.pl = Preisliste()
        self.rabattStufen = [i[1] for i in self.pl.rabattStufen('5er')]

        while self.ui.combo_manuelleLiter.count() > 0:
            self.ui.combo_manuelleLiter.removeItem(0)
        for liter in self.rabattStufen:
            self.ui.combo_manuelleLiter.addItem('%s' % liter)

        self.connectSlots()

        self.stylesheetInputHighlighted = 'background-color: #faa; font-style: italic; border: 1px solid black;'
        self.stylesheetInputRegular = 'border: 1px solid black; background-color: white;'

        #for widget in self.ui.stackedWidget.findChildren(QtWidgets.QToolButton):
        #    widget.setStyleSheet('border: 1px solid black;\nbackground-color: white;')

        self.ui.stackedWidget.widget(0).setStyleSheet(
            'background-color: #96ff96;')
        self.ui.stackedWidget.widget(1).setStyleSheet(
            'background-color: #ffffff;')
        self.ui.stackedWidget.widget(2).setStyleSheet(
            'background-color: #9696ff;')
        self.ui.stackedWidget.widget(3).setStyleSheet(
            'background-color: #ff9696;')

        self.alte_kundenvorgaenge = None
        self.liter_alte_abfuellungen = 0
        self.rabattstufe_berechnen = True
        self.modus = 'speichern'
        self.neuerVorgang()

    def closeEvent(self, closeEvent):
        if self.vorgang.changed:
            if QtWidgets.QMessageBox.No == QtWidgets.QMessageBox.question(
                    self,
                    u'Änderungen verwerfen',
                    u'Die aktuell geöffnete Abfüllung wurde noch nicht gespeichert. Trotzdem beenden?',
                    buttons=QtWidgets.QMessageBox.Yes
                    | QtWidgets.QMessageBox.No,
                    defaultButton=QtWidgets.QMessageBox.No):
                closeEvent.ignore()

    def updateVorgang(self):
        if self.alte_kundenvorgaenge and self.rabattstufe_berechnen:
            liter_gesamt = self.liter_alte_abfuellungen + self.vorgang.getLiterzahl(
            )
            stufe = 0
            for s in self.rabattStufen:
                if liter_gesamt + self.pl.TOLERANZ >= s:
                    stufe = s
            if stufe != self.vorgang.getManuelleLiterzahl():
                self.vorgang.setManuelleLiterzahl(stufe)
                self.update()

        self.ui.listWidget.clear()
        for entry in self.vorgang.getEntries():
            entry = ListEntry(self, entry)
            entry.itemChanged.connect(self.itemChanged)
            item = QtWidgets.QListWidgetItem()
            item.setSizeHint(
                QtCore.QSize(self.ui.listWidget.size().width() - 2, 60))
            self.ui.listWidget.addItem(item)
            self.ui.listWidget.setItemWidget(item, entry)
        self.ui.listWidget.scrollToBottom()
        self.ui.label_gesamtpreis.setText(u'%.2f €' % self.vorgang.getSumme())
        self.ui.label_literzahl.setText(u'%i Liter' %
                                        self.vorgang.getLiterzahl())

    def isShown(self):
        self.rabattstufe_berechnen = True
        if not self.vorgang.kunde and self.modus == 'speichern':
            self.showKundenAuswahlDialog()

    def update(self):
        self.ui.stackedWidget.setCurrentIndex(0)
        self.ui.listWidget_kundenhinweise.clear()
        if self.vorgang.kunde.ID():
            self.alte_kundenvorgaenge = self.speicher.listVorgaengeByKunde(
                self.vorgang.kunde.ID())
            if self.alte_kundenvorgaenge:
                self.liter_alte_abfuellungen = 0
                for b in self.alte_kundenvorgaenge:
                    if b.ID == self.vorgang.ID:
                        continue
                    self.liter_alte_abfuellungen += b.getLiterzahl()
                    hinweis = u'Abfüllung am %s: %s Liter' % (b.getZeitpunkt(),
                                                              b.getLiterzahl())
                    self.ui.listWidget_kundenhinweise.addItem(hinweis)
                self.ui.listWidget_kundenhinweise.addItem(
                    u'Vorherige Abfüllungen dieses Jahr insgesamt: %s Liter' %
                    (self.liter_alte_abfuellungen, ))
        if self.vorgang.getKundenname() == '' and self.modus == 'speichern':
            self.ui.input_kundenname.setMinimumHeight(200)
            self.ui.input_kundenname.setStyleSheet(
                self.stylesheetInputHighlighted)
            self.ui.input_kundenname.setText(u'Hier Kunde wählen')
        else:
            self.ui.input_kundenname.setMinimumHeight(0)
            self.ui.input_kundenname.setStyleSheet(self.stylesheetInputRegular)
            self.ui.input_kundenname.setText(
                self.vorgang.getKundenname().replace('&', '&&'))
        if self.vorgang.getManuelleLiterzahl():
            state_checkbox = self.ui.checkBox_manuelleLiter.blockSignals(True)
            state_combo = self.ui.combo_manuelleLiter.blockSignals(True)
            self.ui.checkBox_manuelleLiter.setChecked(True)
            self.ui.combo_manuelleLiter.setEnabled(True)
            self.ui.checkBox_manuelleLiter.setStyleSheet('color: #f00;')
            index = self.ui.combo_manuelleLiter.findText(
                str(self.vorgang.getManuelleLiterzahl()))
            self.ui.combo_manuelleLiter.setCurrentIndex(index)
            self.ui.checkBox_manuelleLiter.blockSignals(state_checkbox)
            self.ui.combo_manuelleLiter.blockSignals(state_combo)
        else:
            self.ui.checkBox_manuelleLiter.setChecked(False)
            self.ui.checkBox_manuelleLiter.setStyleSheet('color: #000;')
            self.ui.combo_manuelleLiter.setEnabled(False)
            self.ui.combo_manuelleLiter.setCurrentIndex(
                self.ui.combo_manuelleLiter.count() - 1)
        self.updateVorgang()

    def itemChanged(self):
        self.updateVorgang()

    def removeListEntryCallback(self):
        return lambda: self.ui.tableWidget.removeRow(self.ui.tableWidget.
                                                     currentRow())

    def newDoubleEntry(self, id1, id2, default2=None):
        def function():
            handle = self.vorgang.newItem(0, id1)
            entry = self.vorgang.getEntry(handle)
            icon = None
            text = None
            try:
                button = getattr(self.ui, 'button_%s' % id1)
                icon = button.icon()
                text = button.text()
            except:
                print('Keinen button gefunden für %s' % id1)
                pass
            if not showNumberInputDialog(entry, icon=icon,
                                         text=text) or entry['anzahl'] == 0:
                self.vorgang.deleteItem(handle)
            else:
                self.updateVorgang()
                anz = entry['anzahl']
                if default2 != None:
                    anz = default2
                handle = self.vorgang.newItem(anz, id2)
                entry = self.vorgang.getEntry(handle)
                if not showNumberInputDialog(
                        entry, gebrauchte=True, icon=icon,
                        text=text) or entry['anzahl'] == 0:
                    self.vorgang.deleteItem(handle)
            self.updateVorgang()

        return function

    def newEntryCallback(self, preislistenID):
        def showDialog():
            handle = self.vorgang.newItem(0, preislistenID)
            entry = self.vorgang.getEntry(handle)
            icon = None
            text = None
            try:
                button = getattr(self.ui, 'button_%s' % preislistenID)
                icon = button.icon()
                text = button.text()
            except:
                print('Keinen button gefunden für %s' % preislistenID)
                pass
            if not showNumberInputDialog(
                    entry, gebrauchte=False, icon=icon,
                    text=text) or entry['anzahl'] == 0:
                self.vorgang.deleteItem(handle)
            self.updateVorgang()

        def insertSingleItem():
            found = False
            for entry in self.vorgang.getEntries():
                if entry.preislistenID == preislistenID:
                    entry.setStueckzahl(entry.getStueckzahl() + 1)
                    found = True
                    break
            if not found:
                self.vorgang.newItem(1, preislistenID)
            self.updateVorgang()

        if preislistenID in [
                'frischsaft', 'frischsaft_q', 'saft_offen', '3er', '3er_q',
                'ohnepressen'
        ]:
            return showDialog
        else:
            return insertSingleItem

    def newFreeEntry(self, initvalue=0.0):
        handle = self.vorgang.newItem(1)
        entry = self.vorgang.getEntry(handle)
        entry.setEinheit('')
        entry.setSteuersatz(19.0)
        entry.setBeschreibung(
            showTextInputDialog('Beschreibung', [
                'Gutschein', 'Mosten', 'Kleinteile', 'Obstankauf', 'Sonstiges',
                'Zeitschriften', 'Mindermengenzuschlag', 'Anzahlung'
            ], ''))
        if entry.getBeschreibung() == '':
            del entry
            self.vorgang.deleteItem(handle)
            return
        entry.setPreis(initvalue)
        showValueInputDialog(entry)
        if entry.getSumme() == 0:
            del entry
            self.vorgang.deleteItem(handle)
        self.update()

    def newBetragEntry(self):
        # Positiver Betrag
        self.newFreeEntry(0.0)

    def newAbzugEntry(self):
        # Negativer Betrag
        self.newFreeEntry(-0.0)

    def showKundenAuswahlDialog(self):
        self.vorgang.setKunde(showKundenAuswahlDialog(self.vorgang.getKunde()))
        self.update()

    def editKundendaten(self):
        self.vorgang.kunde = showKundendatenDialog(self.vorgang.kunde)
        self.speicher.speichereKunde(self.vorgang.kunde)
        self.update()

    def setzeManuellePreiskategorie(self, nonsense=None):
        liter = None
        if self.ui.checkBox_manuelleLiter.isChecked():
            self.rabattstufe_berechnen = False
            try:
                liter = int(self.ui.combo_manuelleLiter.currentText())
            except ValueError:
                liter = None
        else:
            self.rabattstufe_berechnen = False
        self.vorgang.setManuelleLiterzahl(liter)
        self.update()

    def plausibilitaetsCheck(self):
        errors = []
        _10er = 0
        _5er = 0
        _3er = 0
        _3er_gebraucht = 0
        _5er_gebraucht = 0
        _10er_gebraucht = 0
        for item in self.vorgang.getEntries():
            if item.preislistenID == '3er_gebraucht':
                _3er_gebraucht += item['anzahl']
            elif item.preislistenID == '5er_gebraucht':
                _5er_gebraucht += item['anzahl']
            elif item.preislistenID == '10er_gebraucht':
                _10er_gebraucht += item['anzahl']
            elif item.preislistenID and '3er' in item.preislistenID:
                _3er += item['anzahl']
            elif item.preislistenID and '5er' in item.preislistenID:
                _5er += item['anzahl']
            elif item.preislistenID and '10er' in item.preislistenID:
                _10er += item['anzahl']
        if _3er_gebraucht > _3er:
            errors.append(
                u'Mehr gebrauchte 3er-Kartons als insgesamt abgefüllt wurden!')
        if _5er_gebraucht > _5er:
            errors.append(
                u'Mehr gebrauchte 5er-Kartons als insgesamt abgefüllt wurden!')
        if _10er_gebraucht > _10er:
            errors.append(
                u'Mehr gebrauchte 10er-Kartons als insgesamt abgefüllt wurden!'
            )

        if self.vorgang.getSumme() < 0.0:
            errors.append(
                u'Betrag ist Negativ, es wird eine Gutschrift erstellt!')
        if self.vorgang.getSumme() == 0.0:
            errors.append(u'Betrag ist 0!')
        return errors

    def speichern(self):
        self.speicher.speichereVorgang(self.vorgang)

    def regalschilder_drucken(self):
        for i in range(self.vorgang.getPaletten()):
            if not RegalschildThermo(self.vorgang, self.mainwindow.printer):
                QtWidgets.QMessageBox.warning(
                    self,
                    u'Fehler beim Drucken',
                    'Drucker nicht angeschlossen, nicht eingeschaltet oder Rechte falsch?',
                    buttons=QtWidgets.QMessageBox.Ok,
                    defaultButton=QtWidgets.QMessageBox.Ok)
                break

    def beleg_drucken(self):
        if not VorgangThermo(self.vorgang, self.mainwindow.printer):
            QtWidgets.QMessageBox.warning(
                self,
                u'Fehler beim Drucken',
                'Drucker nicht angeschlossen, nicht eingeschaltet oder Rechte falsch?',
                buttons=QtWidgets.QMessageBox.Ok,
                defaultButton=QtWidgets.QMessageBox.Ok)
        #pdfdata = BelegA5(self.vorgang)
        #t = tempfile.NamedTemporaryFile(delete=False)
        #t.write(pdfdata)
        #t.close()
        #c = cups.Connection()
        #c.printFile(c.getDefault(), t.name, 'Vorgang %s' % self.vorgang.getKundenname(), PRINTER_OPTIONS)
        #subprocess.call(['/usr/bin/xdg-open', t.name], shell=False)
        # xdg-open beendet sich sofort!
        #os.unlink(t.name)

    def speichereVorgang(self):
        fehler = self.plausibilitaetsCheck()
        for f in fehler:
            if (QtWidgets.QMessageBox.No == QtWidgets.QMessageBox.warning(
                    self,
                    u'Möglicher Fehler',
                    f + '\nIst das korrekt?',
                    buttons=QtWidgets.QMessageBox.Yes
                    | QtWidgets.QMessageBox.No,
                    defaultButton=QtWidgets.QMessageBox.No)):
                return False
        dialog = SpeichernDialog(self.vorgang)
        dialog.show()
        dialog.exec_()
        if dialog.result() == 1:
            # OK gedrückt!
            if not dialog.speicherungErsetzen():
                self.vorgang.setID(None)
                self.vorgang.setZeitpunkt(datetime.datetime.now())
            self.speichern()
            if dialog.isBio:
                l = dialog.gewaehlterBioLieferschein()
                if l and not l['produktionsdatum']:
                    l['produktionsdatum'] = datetime.date.today()
                    self.speicher.speichereBioLieferschein(l)
            drucken = dialog.belegDrucken()
            if drucken:
                self.regalschilder_drucken()
            anrufe = self.speicher.getAnrufe(self.vorgang)
            if not anrufe and not dialog.kunde_nimmt_mit:
                telefon = self.vorgang.getTelefon()
                if telefon:
                    for num in telefon.split(' / '):
                        if num.startswith('+491') or num.startswith('01'):
                            if (QtWidgets.QMessageBox.Yes ==
                                    QtWidgets.QMessageBox.question(
                                        self,
                                        u'SMS senden?',
                                        u'Soll eine SMS an die Handynummer\n%s\ngesendet werden?'
                                        % num,
                                        buttons=QtWidgets.QMessageBox.Yes
                                        | QtWidgets.QMessageBox.No)):
                                try:
                                    send_sms(self.vorgang)
                                except RuntimeError as e:
                                    QtWidgets.QMessageBox.warning(
                                        self, u'Fehler', str(e.args))
                                except ValueError as e:
                                    QtWidgets.QMessageBox.warning(
                                        self, u'Fehler', str(e.args))
                                else:
                                    self.speicher.speichereAnruf(
                                        self.vorgang, 'sms', '')
                            break

            self.neuerVorgang()
            self.mainwindow.reset()
        self.update()

    def kassieren(self):
        fehler = self.plausibilitaetsCheck()
        for f in fehler:
            if (QtWidgets.QMessageBox.No == QtWidgets.QMessageBox.warning(
                    self,
                    u'Möglicher Fehler',
                    f + '\nIst das korrekt?',
                    buttons=QtWidgets.QMessageBox.Yes
                    | QtWidgets.QMessageBox.No,
                    defaultButton=QtWidgets.QMessageBox.No)):
                return False
        self.speichern()
        self.mainwindow.vorgangKassieren(self.vorgang)

    def neuerVorgang(self):
        self.vorgang = Vorgang()
        self.alte_kundenvorgaenge = None
        self.liter_alte_abfuellungen = 0
        self.rabattstufe_berechnen = True
        self.modusSpeichern()
        self.update()

    def vorgangOeffnen(self, vorgang, kassiervorgang=False):
        self.vorgang = self.speicher.getVorgang(vorgang.ID)
        self.modusKassieren(kassiervorgang=kassiervorgang)
        self.update()
        return True

    def modusDirektverkauf(self):
        self.modus = 'kassieren'

        self.ui.button_speichern.setVisible(False)

        self.ui.button_kassieren.setVisible(True)
        self.ui.button_kassieren.setStyleSheet(
            'background-color: #0f0; color: #000; border: 1px solid black;')
        self.ui.button_kassieren.setMinimumHeight(100)
        self.ui.button_kassieren.setText(u'Kassieren')

    def modusKassieren(self, kassiervorgang):
        self.modus = 'kassieren'

        if kassiervorgang:
            self.ui.button_speichern.setVisible(False)
        else:
            self.ui.button_speichern.setVisible(True)
            self.ui.button_speichern.setText(u'Nur Änderungen\nSpeichern')
            self.ui.button_speichern.setStyleSheet(
                'border: 1px solid black; background-color: white;')
            self.ui.button_speichern.setMinimumHeight(100)

        self.ui.button_kassieren.setVisible(True)
        self.ui.button_kassieren.setText(u'Kassieren')
        self.ui.button_kassieren.setStyleSheet(
            'background-color: #0f0; color: #000; border: 1px solid black;')
        self.ui.button_kassieren.setMinimumHeight(100)

    def modusSpeichern(self):
        self.modus = 'speichern'

        self.ui.button_speichern.setVisible(True)
        self.ui.button_speichern.setStyleSheet(
            'background-color: #0f0; color: #000; border: 1px solid black;')
        self.ui.button_speichern.setMinimumHeight(100)
        self.ui.button_speichern.setText(u'Speichern')

        self.ui.button_kassieren.setVisible(False)

    def eventFilter(self, qobject, qevent):
        if qevent.type() == QtCore.QEvent.MouseButtonPress:
            qobject.clicked()
        return False

    def abbrechen(self):
        if self.vorgang.changed:
            if QtWidgets.QMessageBox.Yes == QtWidgets.QMessageBox.question(
                    self,
                    u'Alles Löschen',
                    u'Wirklich alle Änderungen verwerfen und von vorne anfangen?',
                    buttons=QtWidgets.QMessageBox.Yes
                    | QtWidgets.QMessageBox.No,
                    defaultButton=QtWidgets.QMessageBox.No):
                if self.vorgang.ID:
                    self.speicher.ladeVorgang(self.vorgang.ID)
                self.neuerVorgang()
                return True
        else:
            self.neuerVorgang()
            return True
        # Wenn die Frage von oben mit Nein beantwortet wurde
        return False

    def itemClicked(self, listItem):
        self.ui.listWidget.itemWidget(listItem).edit()

    def connectSlots(self):
        self.ui.label_kundenname.clicked = self.showKundenAuswahlDialog
        self.ui.label_kundenname.installEventFilter(self)
        self.ui.input_kundenname.clicked = self.showKundenAuswahlDialog
        self.ui.input_kundenname.installEventFilter(self)

        self.ui.button_kundendaten.clicked.connect(self.editKundendaten)

        self.ui.button_3er.clicked.connect(self.newEntryCallback('3er'))
        self.ui.button_5er.clicked.connect(
            self.newDoubleEntry('5er', '5er_gebraucht'))
        self.ui.button_10er.clicked.connect(
            self.newDoubleEntry('10er', '10er_gebraucht'))
        self.ui.button_frischsaft.clicked.connect(
            self.newEntryCallback('frischsaft'))
        self.ui.button_3er_q.clicked.connect(self.newEntryCallback('3er_q'))
        self.ui.button_5er_q.clicked.connect(
            self.newDoubleEntry('5er_q', '5er_gebraucht'))
        self.ui.button_10er_q.clicked.connect(
            self.newDoubleEntry('10er_q', '10er_gebraucht'))
        self.ui.button_frischsaft_q.clicked.connect(
            self.newEntryCallback('frischsaft_q'))
        self.ui.button_holzstaender_klassisch.clicked.connect(
            self.newEntryCallback('holzstaender_klassisch'))
        self.ui.button_holzstaender_5er_ablage.clicked.connect(
            self.newEntryCallback('holzstaender_eh_5er_ablage'))
        self.ui.button_holzstaender_5er_ohne.clicked.connect(
            self.newEntryCallback('holzstaender_eh_5er_ohne'))
        self.ui.button_holzstaender_10er.clicked.connect(
            self.newEntryCallback('holzstaender_eh_10er'))
        self.ui.button_unsersaft_5er.clicked.connect(
            self.newDoubleEntry('5er_abfuellung_vk', '5er_gebraucht'))
        self.ui.button_unsersaft_10er.clicked.connect(
            self.newDoubleEntry('10er_abfuellung_vk', '10er_gebraucht'))

        self.ui.button_vk_quittensaft_3er.clicked.connect(
            self.newEntryCallback('quitte_3er_vk'))
        self.ui.button_vk_quittensaft_5er.clicked.connect(
            self.newEntryCallback('quitte_5er_vk'))

        self.ui.button_vk5er.clicked.connect(self.newEntryCallback('5er_vk'))
        self.ui.button_vk10er.clicked.connect(self.newEntryCallback('10er_vk'))
        self.ui.button_vkbirnen.clicked.connect(
            self.newEntryCallback('birnen_5er_vk'))
        self.ui.button_vkbirnen_3er.clicked.connect(
            self.newEntryCallback('birnen_3er_vk'))
        self.ui.button_vkmost5er.clicked.connect(
            self.newEntryCallback('most_5er_vk'))
        self.ui.button_vkmost10er.clicked.connect(
            self.newEntryCallback('most_10er_vk'))
        self.ui.button_5lkanister.clicked.connect(
            self.newEntryCallback('kanister_5l'))
        self.ui.button_saft_offen.clicked.connect(
            self.newEntryCallback('saft_offen'))

        self.ui.button_obstler_025.clicked.connect(
            self.newEntryCallback('obstler_025'))
        self.ui.button_obstler_050.clicked.connect(
            self.newEntryCallback('obstler_050'))
        self.ui.button_obstler_100.clicked.connect(
            self.newEntryCallback('obstler_100'))

        self.ui.button_gelee_apfel.clicked.connect(
            self.newEntryCallback('gelee_apfel'))
        self.ui.button_gelee_apfel_zimt.clicked.connect(
            self.newEntryCallback('gelee_apfel_zimt'))
        self.ui.button_gelee_apfel_rum.clicked.connect(
            self.newEntryCallback('gelee_apfel_rum'))
        self.ui.button_gelee_quitten.clicked.connect(
            self.newEntryCallback('gelee_quitten'))

        self.ui.button_3er_gebraucht.clicked.connect(
            self.newEntryCallback('3er_gebraucht'))
        self.ui.button_5er_gebraucht.clicked.connect(
            self.newEntryCallback('5er_gebraucht'))
        self.ui.button_10er_gebraucht.clicked.connect(
            self.newEntryCallback('10er_gebraucht'))
        self.ui.button_ohnepressen.clicked.connect(
            self.newEntryCallback('ohnepressen'))
        self.ui.button_betrag.clicked.connect(self.newBetragEntry)
        self.ui.button_abzug.clicked.connect(self.newAbzugEntry)

        self.ui.button_speichern.clicked.connect(self.speichereVorgang)
        self.ui.button_kassieren.clicked.connect(self.kassieren)

        self.ui.checkBox_manuelleLiter.toggled.connect(
            self.setzeManuellePreiskategorie)
        self.ui.checkBox_manuelleLiter.toggled.connect(
            self.ui.combo_manuelleLiter.setEnabled)
        self.ui.combo_manuelleLiter.currentIndexChanged.connect(
            self.setzeManuellePreiskategorie)

        self.ui.listWidget.itemClicked.connect(self.itemClicked)

        self.ui.button_section_abfuellung.clicked.connect(
            lambda: self.ui.stackedWidget.setCurrentIndex(0))
        self.ui.button_section_verkauf_saft.clicked.connect(
            lambda: self.ui.stackedWidget.setCurrentIndex(1))
        self.ui.button_section_verkauf_sonstiges.clicked.connect(
            lambda: self.ui.stackedWidget.setCurrentIndex(2))
        self.ui.button_section_besonderes.clicked.connect(
            lambda: self.ui.stackedWidget.setCurrentIndex(3))