def __init__(self, parent=None): QWidget.__init__(self, parent) ModifyInfo.__init__(self) self._mainLayout = QGridLayout(self) self._toolbarLayout = QHBoxLayout() self._btnFilter = QPushButton(self) self._btnSave = QPushButton(self) self._tvSoll = TableViewExt(self) self._editFieldsLayout = QHBoxLayout() #self._cboMietverhaeltnisse = QComboBox( self ) self._sdVon = SmartDateEdit(self) self._sdBis = SmartDateEdit(self) self._feNetto = FloatEdit(self) self._feZusatz = FloatEdit(self) self._teBemerkung = QTextEdit(self) self._btnOk = QPushButton(self) self._btnClear = QPushButton(self) #callbacks self._submitChangesCallback = None self._saveActionCallback = None #TableModel für die anzuzeigenden Zahlungen self._tmSoll: SollzahlungenTableModel = None self._sollEdit: XSollzahlung = None self._createGui()
def __init__(self, mobjIdList: List[str] = None, x: XGeschaeftsreise = None, parent=None): QWidget.__init__(self, parent) self._xgeschaeftsreise = x self._layout = QFormLayout() self.setLayout(self._layout) self._cboMobjId = QComboBox() self._sdVon = SmartDateEdit() self._sdBis = SmartDateEdit() self._beZiel = BaseEdit() self._meZweck = MultiLineEdit() self._ieKm = IntEdit() self._iePersonen = IntEdit() self._beUebernachtung = BaseEdit() self._feUebernachtKosten = FloatEdit() # self._btnSave = QPushButton( "Speichern" ) # self._btnSaveClose = QPushButton( "Speichern und Schließen" ) # self._btnCancel = QPushButton( "Abbrechen" ) self._createGui() if mobjIdList: self.setMietobjekte(mobjIdList) if x: self.setData(x)
def __init__( self, masterList:List[str]=None, firmenlist:List[str]=None, x:XGeplant=None, parent=None ): QWidget.__init__( self, parent ) self._xgeplant = x self._layout = BaseGridLayout() self.setLayout( self._layout ) self._cboMasterObjekt = QComboBox() self._cboMasterObjekt.currentIndexChanged.connect( lambda x: self.masterobjektChanged.emit( self._cboMasterObjekt.currentText() ) ) self._cboMobjId = QComboBox() self._txtLeistung = MultiLineEdit() self._cboFirma = QComboBox() self._btnNewFirma = QPushButton() self._btnNewFirma.clicked.connect( self.createHandwerker.emit ) self._feKosten = FloatEdit() self._cbKostenvoranschlag = QCheckBox() self._cboJahr = QComboBox() self._cboMonat = QComboBox() self._cboMonat.addItems( datehelper.monthList ) self._cbBeauftragt = QCheckBox() self._sdErledigtAm = SmartDateEdit() self._txtBemerkung = MultiLineEdit() self._provideJahre() if masterList: self.setMasterobjekte( masterList ) if firmenlist: self.setFirmen( firmenlist ) if x: self.setData( x ) self._createGui()
def __init__(self, parent=None): QWidget.__init__(self, parent) #self.setWindowTitle( "Sonstige Ausgaben: Rechnungen, Abgaben, Gebühren etc." ) self._mainLayout = QtWidgets.QGridLayout(self) self._toolbarLayout = QHBoxLayout() self._summenLayout = QHBoxLayout() self._btnSave = QPushButton(self) self._editSearch = QLineEdit(self) self._btnSearchFwd = QPushButton(self) self._btnDbSearch = QPushButton(self) # self._idSummeAus = IntDisplay( self ) # self._idSummeW = IntDisplay( self ) # self._idSummeU = IntDisplay( self ) # self._summenfont = QFont( "Times New Roman", 16, weight=QFont.Bold ) # self._summenartfont = QFont( "Times New Roman", 9 ) self._cboBuchungsjahr = QtWidgets.QComboBox(self) self._tvAuszahlungen = TableViewExt(self) self._buchungsdatumLayout = QHBoxLayout() self._sdBuchungsdatum = SmartDateEdit(self) self._btnAddDay = QPushButton(self) self._btnClearBuchungsdatum = QPushButton(self) self._objektRefLayout = QHBoxLayout() self._cboMasterobjekt = QComboBox(self) self._cboMietobjekt = QComboBox(self) self._editRechnungLineLayout = QHBoxLayout() self._cboKreditor = EditableCombo(self) self._cboBuchungstext = EditableCombo(self) self._sdRechnungsdatum = SmartDateEdit(self) self._feBetrag = FloatEdit(self) self._cboKostenart = QComboBox(self) self._cbUmlegbar = QCheckBox(self) self._cbWerterhaltend = QCheckBox(self) self._teBemerkung = QTextEdit(self) self._btnOk = QPushButton(self) self._btnClear = QPushButton(self) # actions für ContextMenu #self._contextMenuActions:List[QAction] = None # Callbacks self._buchungsjahrChangedCallback = None self._saveActionCallback = None self._searchActionCallback = None self._dbSearchActionCallback = None self._masterobjektChangedCallback = None self._mietobjektChangedCallback = None self._kreditorChangedCallback = None self._submitChangesCallback = None self._justEditing: XSonstAus = None self._suspendCallbacks = False self._createGui()
def __init__(self, parent=None): IccView.__init__(self) #self.setWindowTitle( "Sonstige Ausgaben: Rechnungen, Abgaben, Gebühren etc." ) self._mainLayout = QtWidgets.QGridLayout(self) self._toolbarLayout = QHBoxLayout() self._summenLayout = QHBoxLayout() self._btnSave = QPushButton(self) self._btnComplexSort = QPushButton() self._editSearch = QLineEdit(self) self._btnSearchFwd = QPushButton(self) self._btnDbSearch = QPushButton(self) self._cboBuchungsjahr = QtWidgets.QComboBox(self) self._tvAuszahlungen = TableViewExt(self) self._buchungsdatumLayout = QHBoxLayout() self._sdBuchungsdatum = SmartDateEdit(self) self._btnAddDay = QPushButton(self) self._btnClearBuchungsdatum = QPushButton(self) self._objektRefLayout = QHBoxLayout() self._cboMasterobjekt = QComboBox(self) self._cboMietobjekt = QComboBox(self) self._editRechnungLineLayout = QHBoxLayout() self._cboKreditor = EditableCombo(self) self._cboBuchungstext = EditableCombo(self) self._sdRechnungsdatum = SmartDateEdit(self) self._feBetrag = FloatEdit(self) self._cboKostenart = QComboBox(self) self._cbUmlegbar = QCheckBox(self) self._cbWerterhaltend = QCheckBox(self) self._teBemerkung = QTextEdit(self) self._btnOk = QPushButton(self) self._btnClear = QPushButton(self) # Callbacks self._buchungsjahrChangedCallback = None self._saveActionCallback = None self._searchActionCallback = None self._dbSearchActionCallback = None self._masterobjektChangedCallback = None self._mietobjektChangedCallback = None self._kreditorChangedCallback = None self._submitChangesCallback = None self._justEditing: XSonstAus = None self._suspendCallbacks = False self._createGui()
def __init__(self, environment): QMainWindow.__init__(self) self.setWindowTitle("ImmoControlCenter " + environment) self._menubar: QMenuBar = None self._viewsMenu: QMenu = None self._submenuShowTableContent: QMenu = None self._toolbar: QToolBar = None self._sdLetzteBuchung: SmartDateEdit = SmartDateEdit(self) self._leLetzteBuchung: QLineEdit = QLineEdit(self) # Summen self._idSumMiete = self._createSumDisplay("Summe aller Bruttomieten") self._idSummeSonstAus = self._createSumDisplay( "Summe aller sonstigen Ausgaben") self._idSummeHGV = self._createSumDisplay( "Summe aller Hausgeld-Vorauszahlungen") self._idSaldo = self._createSumDisplay( "Bruttomieten minus Ausgaben minus HG-Vorauszahlungen") self._summenfont = QFont("Times New Roman", 16, weight=QFont.Bold) self._summenartfont = QFont("Times New Roman", 9) # give others access to sum fields via Singleton SumFieldsAccess: self._sumfieldsAccess = SumFieldsProvider( self._idSumMiete, self._idSummeSonstAus, self._idSummeHGV, self._idSaldo, self.onSumFieldsProvidingFailed) self._actionCallbackFnc = None #callback function for all action callbacks self._shutdownCallback = None # callback function for shutdown action self._createUI()
def __init__( self, x:XOffenerPosten, parent=None ): QWidget.__init__( self, parent ) self._layout = QGridLayout() self.setLayout( self._layout ) self._erfasstAm = SmartDateEdit() self._debiKredi = QLineEdit() self._btnAuswahlDebiKredi_Firma = QPushButton( text="..." ) self._btnAuswahlDebiKredi_Firma.clicked.connect( self._onDebiKrediAuswahl_Firma ) self._btnAuswahlDebiKredi_Vw = QPushButton( text="..." ) self._btnAuswahlDebiKredi_Vw.clicked.connect( self._onDebiKrediAuswahl_Vw ) self._betrag = FloatEdit() self._betragBeglichen = FloatEdit() self._letzteBuchungAm = SmartDateEdit() self._bemerkung = QPlainTextEdit() self._offenerPosten:XOffenerPosten = x self._createGui() self._dataToGui()
def __init__(self, x: XMietobjektExt): QWidget.__init__(self) ModifyInfo.__init__(self) Clearable.__init__(self) self._mietobjekt = x self._btnSave = QPushButton() self._layout = QGridLayout() self._anzCols = 12 self.setLayout(self._layout) # masterobjekt fields self._lblMasterId = FatLabel() self._bbeMasterName = LabelTimesBold12() self._bbeStrHnr = BaseBoldEdit() self._bbePlz = BaseBoldEdit() self._bbeOrt = BaseBoldEdit() self._bbeAnzWhg = BaseBoldEdit() self._bbeGesamtWfl = BaseBoldEdit() self._lblVerwalter = FatLabel() self._lblWEG = FatLabel() self._sdVeraeussertAm = SmartDateEdit() self._beHauswart = BaseBoldEdit() self._beHauswartTelefon = BaseBoldEdit() self._beHauswartMailto = BaseBoldEdit() self._meBemerkungMaster = MultiLineEdit() # mietobjekt fields self._lblMietobjekt = LabelTimesBold12() self._beWhgBez = LabelTimesBold12() self._bbeQm = BaseBoldEdit() self._beContainerNr = BaseBoldEdit() self._meBemerkungMobj = MultiLineEdit() self._lblMieter = FatLabel() self._lblTelefonMieter = FatLabel() self._lblMailtoMieter = FatLabel() self._lblNettoMiete = FatLabel() self._lblNkv = FatLabel() self._lblBruttoMiete = FatLabel() self._lblKaution = FatLabel() self._lblHgvNetto = FatLabel() self._lblRueZuFue = FatLabel() self._lblHgvBrutto = FatLabel() self._createGui(x) self.setData(x) self.connectWidgetsToChangeSlot(self.onChange, self.onResetChangeFlag)
def __init__(self): QWidget.__init__(self) ModifyInfo.__init__(self) self._layout = QGridLayout() self._btnSave = QPushButton() # altes Mietverhältnis self._edAlterMieter = BaseEdit() self._edAlteNettomiete = FloatEdit() self._edAlteNKV = FloatEdit() self._edAlteKaution = IntEdit() self._sdEndeMietverh = SmartDateEdit() self._sdEndeMietverh.textChanged.connect(self.onChange) # neues Mietverhältnis self._neuesMietvhView = MietverhaeltnisView(enableBrowsing=False) self._neuesMietvhView.dataChanged.connect(self.onChange) self._mieterwechsel: XMieterwechsel = None self._createGui() self.connectWidgetsToChangeSlot()
def __init__(self, parent=None): QWidget.__init__(self, parent) ModifyInfo.__init__(self) #self.setWindowTitle( "Sonstige Ausgaben: Rechnungen, Abgaben, Gebühren etc." ) self._mainLayout = QtWidgets.QGridLayout(self) self._toolbarLayout = QHBoxLayout() self._btnSave = QPushButton(self) self._tvAbrechnungen = TableViewExt(self) self._buchungsdatumLayout = QHBoxLayout() self._sdAbrechnungsdatum = SmartDateEdit(self) self._btnAddDayToAbrechnungsdatum = QPushButton(self) self._btnClearAbrechnungsdatum = QPushButton(self) self._sdBuchungsdatum = SmartDateEdit(self) self._btnAddDay = QPushButton(self) self._btnClearBuchungsdatum = QPushButton(self) self._abrechnungInfoLayout = QHBoxLayout() self._name = QLabel(self, text="") self._cboAbrechnungsjahr = QtWidgets.QComboBox(self) self._feBetrag: FloatEdit = FloatEdit(self) self._teBemerkung = QTextEdit(self) self._btnOk = QPushButton(self) self._btnClear = QPushButton(self) # actions für ContextMenu #self._contextMenuActions:List[QAction] = None # Callbacks self._abrechnungsjahrChangedCallback = None self._saveActionCallback = None self._submitChangesCallback = None self._justEditing: XAbrechnung = None self._suspendCallbacks = False self._createGui() self.connectWidgetsToChangeSlot(self.onChange, self.onResetChangeFlag)
def __init__(self, parent=None): QDialog.__init__(self, parent) self.setModal(True) self.setWindowTitle("Mietverhältnis beenden") layout = QGridLayout(self) font = QFont("Arial", 14, weight=QFont.Bold) # self.label = QtWidgets.QLabel( self ) # self.label.setText( "Summe:" ) # layout.addWidget( self.label, 0, 0 ) r = 0 lbl = QLabel(self, text="Mieter ") layout.addWidget(lbl, r, 0) self._lblName = QLabel(self) self._lblName.setFont(font) layout.addWidget(self._lblName, r, 1) r += 1 lbl = QLabel(self, text="kündigen zum") layout.addWidget(lbl, r, 0) self._sdKuenddatum = SmartDateEdit(self) self._sdKuenddatum.setFont(font) self._sdKuenddatum.setMaximumWidth(105) layout.addWidget(self._sdKuenddatum, r, 1) r += 1 self._btnKuendigen = QPushButton(self, text="Kündigen") layout.addWidget(self._btnKuendigen, r, 0) self._btnKuendigen.clicked.connect(self._onKuendige) self._btnCancel = QPushButton(self, text="Abbrechen") self._btnCancel.setMaximumWidth(105) layout.addWidget(self._btnCancel, r, 1) self._btnCancel.clicked.connect(self._onClose) self.setLayout(layout)
def __init__(self, mietverhaeltnis: XMietverhaeltnis = None, withSaveButton: bool = False, enableBrowsing=False, parent=None): QWidget.__init__(self, parent) ModifyInfo.__init__(self) self._mietverhaeltnis: XMietverhaeltnis = None self._withSaveButton = withSaveButton self._enableBrowsing = enableBrowsing # ob die Browse-Buttons angezeigt werden self._layout = QGridLayout() self._btnSave = QPushButton() self._btnVor = QPushButton() self._btnRueck = QPushButton() self._sdBeginnMietverh = SmartDateEdit() self._sdEndeMietverh = SmartDateEdit() self._edMieterName_1 = BaseEdit() self._edMieterVorname_1 = BaseEdit() self._edMieterName_2 = BaseEdit() self._edMieterVorname_2 = BaseEdit() self._edMieterTelefon = BaseEdit() self._edMieterMobil = BaseEdit() self._edMieterMailto = BaseEdit() self._edAnzPers = IntEdit() self._edNettomiete = FloatEdit() self._edNkv = FloatEdit() self._edKaution = IntEdit() self._sdKautionBezahltAm = SmartDateEdit() self._txtBemerkung1 = MultiLineEdit() self._txtBemerkung2 = MultiLineEdit() self._createGui() if mietverhaeltnis: self.setMietverhaeltnisData(mietverhaeltnis) #self.connectWidgetsToChangeSlot( self.onChange ) self.connectWidgetsToChangeSlot(self.onChange, self.onResetChangeFlag)
class MiniKuendigungDlg(QDialog): kuendigeMietverhaeltnis = Signal((str, str)) def __init__(self, parent=None): QDialog.__init__(self, parent) self.setModal(True) self.setWindowTitle("Mietverhältnis beenden") layout = QGridLayout(self) font = QFont("Arial", 14, weight=QFont.Bold) # self.label = QtWidgets.QLabel( self ) # self.label.setText( "Summe:" ) # layout.addWidget( self.label, 0, 0 ) r = 0 lbl = QLabel(self, text="Mieter ") layout.addWidget(lbl, r, 0) self._lblName = QLabel(self) self._lblName.setFont(font) layout.addWidget(self._lblName, r, 1) r += 1 lbl = QLabel(self, text="kündigen zum") layout.addWidget(lbl, r, 0) self._sdKuenddatum = SmartDateEdit(self) self._sdKuenddatum.setFont(font) self._sdKuenddatum.setMaximumWidth(105) layout.addWidget(self._sdKuenddatum, r, 1) r += 1 self._btnKuendigen = QPushButton(self, text="Kündigen") layout.addWidget(self._btnKuendigen, r, 0) self._btnKuendigen.clicked.connect(self._onKuendige) self._btnCancel = QPushButton(self, text="Abbrechen") self._btnCancel.setMaximumWidth(105) layout.addWidget(self._btnCancel, r, 1) self._btnCancel.clicked.connect(self._onClose) self.setLayout(layout) def setName(self, name: str) -> None: self._lblName.setText(name) def setDatum(self, yyyy: int, mm: int, dd: int) -> None: # setzt ein Kündigungsvorschlagsdatum self._sdKuenddatum.setDate(yyyy, mm, dd) def _onKuendige(self): if not self._sdKuenddatum.isDateValid(): msgbox = QtWidgets.QMessageBox() msgbox.setWindowTitle("Datum ungültig") msgbox.setIcon(QMessageBox.Critical) msgbox.setText("Das eingegebene Datum ist ungültig.") msgbox.exec_() return self.kuendigeMietverhaeltnis.emit(self._lblName.text(), self._sdKuenddatum.getDate()) self._onClose() def _onClose(self): self.close()
class MieterwechselView(QWidget, ModifyInfo): # IccView ): """ Enthält ein paar Felder für das aktive ("alte") Mietverhältnis, sowie eine MietverhaeltnisView für das Folge-MV. Die Methode onChange() der MietverhaeltnisView wird umgebogen auf die onChange()-Methode dieser View. """ mieterwechsel_save = Signal() def __init__(self): QWidget.__init__(self) ModifyInfo.__init__(self) self._layout = QGridLayout() self._btnSave = QPushButton() # altes Mietverhältnis self._edAlterMieter = BaseEdit() self._edAlteNettomiete = FloatEdit() self._edAlteNKV = FloatEdit() self._edAlteKaution = IntEdit() self._sdEndeMietverh = SmartDateEdit() self._sdEndeMietverh.textChanged.connect(self.onChange) # neues Mietverhältnis self._neuesMietvhView = MietverhaeltnisView(enableBrowsing=False) self._neuesMietvhView.dataChanged.connect(self.onChange) self._mieterwechsel: XMieterwechsel = None self._createGui() self.connectWidgetsToChangeSlot() def onChange(self): if not self._btnSave.isEnabled(): self.setSaveButtonEnabled() def isChanged(self) -> bool: return super().isChanged() or self._neuesMietvhView.isChanged() def resetChangeFlag(self): super().resetChangeFlag() self._neuesMietvhView.resetChangeFlag() def setSaveButtonEnabled(self, enabled: bool = True): self._btnSave.setEnabled(enabled) def _createGui(self): self._createSaveButton() r = self._createGuiAlterMieter() r += 1 self._layout.addWidget(QLabel(""), r, 0) r += 1 self._createGuiNeuerMieter(r) self.setLayout(self._layout) def _createSaveButton(self): btn = self._btnSave btn.clicked.connect(self.mieterwechsel_save.emit) btn.setFlat(True) btn.setEnabled(False) btn.setToolTip("Änderungen dieser View speichern") icon = QIcon("./images/save_30.png") btn.setIcon(icon) size = QSize(32, 32) btn.setFixedSize(size) iconsize = QSize(30, 30) btn.setIconSize(iconsize) hbox = QHBoxLayout() hbox.addWidget(btn) self._layout.addLayout(hbox, 0, 0, alignment=Qt.AlignLeft) def _createGuiAlterMieter(self) -> int: l = self._layout r = 1 c = 0 lbl = BaseLabel("Aktuelles / letztes Mietverhältnis ") lbl.setFont(QFont("Arial", 12, QFont.Bold)) l.addWidget(lbl, r, c, 1, 2) r += 1 lbl = QLabel("Mieter: ") l.addWidget(lbl, r, c) self._edAlterMieter.setReadOnly(True) l.addWidget(self._edAlterMieter, r, c + 1) r += 1 lbl = BaseLabel("Nettomiete / NKV : ") l.addWidget(lbl, r, c) c += 1 hbox = QHBoxLayout() self._edAlteNettomiete.setReadOnly(True) self._edAlteNettomiete.setMaximumWidth(100) hbox.addWidget(self._edAlteNettomiete) self._edAlteNKV.setReadOnly(True) self._edAlteNKV.setMaximumWidth(100) hbox.addWidget(self._edAlteNKV) l.addLayout(hbox, r, c, Qt.AlignLeft) c = 0 r += 1 lbl = BaseLabel("Kaution: ") l.addWidget(lbl, r, c) c += 1 self._edAlteKaution.setReadOnly(True) self._edAlteKaution.setMaximumWidth(100) l.addWidget(self._edAlteKaution, r, c) c = 0 r += 1 lbl = QLabel("Ende des Mietverhältnisses: ") l.addWidget(lbl, r, c) self._sdEndeMietverh.setMaximumWidth(100) l.addWidget(self._sdEndeMietverh, r, c + 1) return r def _createGuiNeuerMieter(self, r: int): c = 0 l = self._layout lbl = BaseLabel("Neues Mietverhältnis") lbl.setFont(QFont("Arial", 12, QFont.Bold)) l.addWidget(lbl, r, c) r += 1 l.addWidget(self._neuesMietvhView, r, c, 1, 2) def setMieterwechselData(self, xmieterwechsel: XMieterwechsel): self._mieterwechsel = xmieterwechsel self._setAltesMietverhaeltnisFields(xmieterwechsel.mietverhaeltnis_alt) self._setNeuesMietverhaeltnisFields( xmieterwechsel.mietverhaeltnis_next) self.setSaveButtonEnabled(False) self.resetChangeFlag() def getMieterwechselData(self) -> XMieterwechsel: return self._mieterwechsel def _setAltesMietverhaeltnisFields(self, xmv: XMietverhaeltnis): self._edAlterMieter.setText(xmv.name + ", " + xmv.vorname) self._edAlteNettomiete.setFloatValue(xmv.nettomiete) self._edAlteNKV.setFloatValue(xmv.nkv) if xmv.kaution: self._edAlteKaution.setIntValue(xmv.kaution) self._sdEndeMietverh.setDateFromIsoString(xmv.bis) def _setNeuesMietverhaeltnisFields(self, xmv: XMietverhaeltnis): self._neuesMietvhView.setMietverhaeltnisData(xmv) self._neuesMietvhView.resetChangeFlag() def getMieterwechselDataCopyWithChanges(self) -> XMieterwechsel: xmwcopy = copy.copy(self._mieterwechsel) mvneu: XMietverhaeltnis = self._neuesMietvhView.getMietverhaeltnisCopyWithChanges( ) xmwcopy.mietverhaeltnis_next = mvneu xmwcopy.mietverhaeltnis_alt.bis = self._sdEndeMietverh.getDate() return xmwcopy def applyChanges(self): if self.isChanged(): self._neuesMietvhView.applyChanges() # nur das Ende-Datum ist bei den Daten des alten MV änderbar self._mieterwechsel.mietverhaeltnis_alt.bis = self._sdEndeMietverh.getDate( ) def getModel(self): return None
class SollzahlungenView(QWidget, ModifyInfo): """ Ein View, der zweifach verwendet wird: - um die Soll-Mieten anzuzeigen (SollmietenView) - um die Soll-HGV anzuzeigen (SollHgvView) """ def __init__(self, parent=None): QWidget.__init__(self, parent) ModifyInfo.__init__(self) self._mainLayout = QGridLayout(self) self._toolbarLayout = QHBoxLayout() self._btnFilter = QPushButton(self) self._btnSave = QPushButton(self) self._tvSoll = TableViewExt(self) self._editFieldsLayout = QHBoxLayout() #self._cboMietverhaeltnisse = QComboBox( self ) self._sdVon = SmartDateEdit(self) self._sdBis = SmartDateEdit(self) self._feNetto = FloatEdit(self) self._feZusatz = FloatEdit(self) self._teBemerkung = QTextEdit(self) self._btnOk = QPushButton(self) self._btnClear = QPushButton(self) #callbacks self._submitChangesCallback = None self._saveActionCallback = None #TableModel für die anzuzeigenden Zahlungen self._tmSoll: SollzahlungenTableModel = None self._sollEdit: XSollzahlung = None self._createGui() # self.connectWidgetsToChangeSlot( self.onChange, self.onResetChangeFlag ) def _createGui(self): self._assembleToolbar() self._toolbarLayout.addStretch(50) self._mainLayout.addLayout(self._toolbarLayout, 0, 0, alignment=Qt.AlignLeft) ### tableView tv = self._tvSoll tv.setSortingEnabled(True) tv.setSelectionBehavior(QAbstractItemView.SelectRows) tv.setAlternatingRowColors(True) tv.verticalHeader().setVisible(False) tv.horizontalHeader().setMinimumSectionSize(0) self._mainLayout.addWidget(tv, 1, 0, 1, 1) self._assembleEditFields() self._mainLayout.addLayout(self._editFieldsLayout, 2, 0, alignment=Qt.AlignLeft) def _assembleToolbar(self): btn = self._btnFilter btn.setFlat(True) btn.setEnabled(True) btn.setToolTip("Alle Sollzahlungen anzeigen (nicht nur aktive)") icon = QIcon("./images/filter_20x28.png") btn.setIcon(icon) size = QSize(30, 30) btn.setFixedSize(size) iconsize = QSize(30, 30) btn.setIconSize(iconsize) self._toolbarLayout.addWidget(btn, stretch=0, alignment=Qt.AlignLeft) btn = self._btnSave btn.clicked.connect(self.onSave) btn.setFlat(True) btn.setEnabled(False) btn.setToolTip("Änderungen dieser View speichern") icon = QIcon("./images/save_30.png") btn.setIcon(icon) size = QSize(30, 30) btn.setFixedSize(size) iconsize = QSize(30, 30) btn.setIconSize(iconsize) self._toolbarLayout.addWidget(btn, stretch=0, alignment=Qt.AlignLeft) def _assembleEditFields(self): # cbo = self._cboMietverhaeltnisse # cbo.setPlaceholderText( "Mieter auswählen" if self._sollType == SollType.MIETE_SOLL else "Verwaltung auswählen" ) # self._editFieldsLayout.addWidget( cbo ) self._sdVon.setPlaceholderText("von") self._editFieldsLayout.addWidget(self._sdVon) self._sdBis.setPlaceholderText("bis") self._editFieldsLayout.addWidget(self._sdBis) self._feNetto.setPlaceholderText("Netto") self._editFieldsLayout.addWidget(self._feNetto) self._feZusatz.setPlaceholderText(self._getZusatzPlaceholderText()) self._editFieldsLayout.addWidget(self._feZusatz) self._teBemerkung.setPlaceholderText("Bemerkung") self._teBemerkung.setMaximumSize(QtCore.QSize(16777215, 50)) self._editFieldsLayout.addWidget(self._teBemerkung, stretch=1) ### buttons vbox = QVBoxLayout() self._btnOk.setIcon(QIcon("./images/checked.png")) self._btnOk.setDefault(True) self._btnOk.setToolTip( "Neue oder geänderte Daten in Tabelle übernehmen (kein Speichern)") self._btnOk.clicked.connect(self.onOkEditFields) vbox.addWidget(self._btnOk) self._btnClear.setIcon(QIcon("./images/cancel.png")) self._btnClear.setToolTip("Änderungen verwerfen und Felder leeren") self._btnClear.clicked.connect(self.onClearEditFields) vbox.addWidget(self._btnClear) self._editFieldsLayout.addLayout(vbox) @abstractmethod def _getZusatzPlaceholderText(self) -> str: pass def provideEditFields(self, x: XSollzahlung, editOnlyBemerkung: bool = False): self._sollEdit = x y, m, d = getDateParts(x.von) self._sdVon.setDate(y, m, d) if x.bis: y, m, d = getDateParts(x.bis) self._sdBis.setDate(y, m, d) self._setNettoValue(x) self._teBemerkung.setText(x.bemerkung) self._setZusatzValue(x) if editOnlyBemerkung: self._sdVon.setEnabled(False) self._sdBis.setEnabled(False) self._feNetto.setEnabled(False) self._feZusatz.setEnabled(False) @abstractmethod def _setNettoValue(self, x) -> None: pass @abstractmethod def _setZusatzValue(self, x) -> None: pass def setSollzahlungenTableModel(self, tm: SollzahlungenTableModel): self._tmSoll = tm self._tvSoll.setModel(tm) self._tvSoll.resizeColumnsToContents() def getModel(self) -> SollzahlungenTableModel: return self._tmSoll def getTableView(self) -> TableViewExt: return self._tvSoll def onOkEditFields(self, arg): """ OK gedrückt. Änderungen an Callback-Funktion melden. :param arg: :return: """ self._tvSoll.clearSelection() if self._submitChangesCallback: if self._sollEdit: soll = self._getEditedSoll() self._submitChangesCallback(self._getEditedSoll()) @abstractmethod def _getEditedSoll(self) -> XSollzahlung: pass def onClearEditFields(self, arg): self.clearEditFields() def clearEditFields(self): self._sdVon.clear() self._sdBis.clear() self._feNetto.clear() self._feZusatz.clear() self._teBemerkung.clear() self._sdVon.setEnabled(True) self._sdBis.setEnabled(True) self._feNetto.setEnabled(True) self._feZusatz.setEnabled(True) self._sollEdit = None def onSave(self): if self._saveActionCallback: self._saveActionCallback() def onChange(self): self._btnSave.setEnabled(True) def onResetChangeFlag(self): self._btnSave.setEnabled(False) def setSaveActionCallback(self, cbfnc) -> None: """ Die callback-FUnktion braucht keine Parameter empfangen. :param cbfnc: :return: """ self._saveActionCallback = cbfnc def setSaveButtonEnabled(self, enable: bool = True): self._btnSave.setEnabled(enable) def showException(self, title: str, exception: str, moretext: str = None): # todo: show Qt-Errordialog msgbox = QtWidgets.QMessageBox() msgbox.setWindowTitle(title) msgbox.setIcon(QMessageBox.Critical) msgbox.setText(exception) if moretext: msgbox.setInformativeText(moretext) msgbox.exec_() ################ SET CALLBACKS ######################## def setSubmitChangesCallback(self, cbfnc): """ sets the one and only callback when the user hits the OK button in the edit fields area. The given callback function has to accept two XSollzahlung objects: - in case of only editing the second one will not be provided - in case of a new intervall the first one will be the new one, the second will be the one to terminate. :param cbfnc: :return: """ self._submitChangesCallback = cbfnc
class OffenerPostenEditor( QWidget ): """ Zum Editieren eines einzelnen Offenen Postens. """ debiKrediAuswahlFirmaPressed = Signal() debiKrediAuswahlVwPressed = Signal() def __init__( self, x:XOffenerPosten, parent=None ): QWidget.__init__( self, parent ) self._layout = QGridLayout() self.setLayout( self._layout ) self._erfasstAm = SmartDateEdit() self._debiKredi = QLineEdit() self._btnAuswahlDebiKredi_Firma = QPushButton( text="..." ) self._btnAuswahlDebiKredi_Firma.clicked.connect( self._onDebiKrediAuswahl_Firma ) self._btnAuswahlDebiKredi_Vw = QPushButton( text="..." ) self._btnAuswahlDebiKredi_Vw.clicked.connect( self._onDebiKrediAuswahl_Vw ) self._betrag = FloatEdit() self._betragBeglichen = FloatEdit() self._letzteBuchungAm = SmartDateEdit() self._bemerkung = QPlainTextEdit() self._offenerPosten:XOffenerPosten = x self._createGui() self._dataToGui() def _createGui( self ): r = c = 0 l = self._layout self._erfasstAm.setPlaceholderText( "erfasst am" ) self._erfasstAm.setToolTip( "Erfassungsdatum des Offenen Postens" ) self._erfasstAm.setMaximumWidth( 90 ) l.addWidget( self._erfasstAm, r, c ) c += 1 self._debiKredi.setMinimumWidth( 250 ) self._debiKredi.setPlaceholderText( "Debitor oder Kreditor" ) self._debiKredi.setToolTip( "Debitor oder Kreditor eintragen" ) l.addWidget( self._debiKredi, r, c ) c += 1 vbox = QVBoxLayout() vbox.addWidget( self._btnAuswahlDebiKredi_Firma ) self._btnAuswahlDebiKredi_Firma.setFixedSize( QSize( 30, 30 ) ) self._btnAuswahlDebiKredi_Firma.setToolTip( "Öffnet einen Dialog zur Auswahl einer Firma " "als Debitor oder Kreditor" ) vbox.addWidget( self._btnAuswahlDebiKredi_Vw ) self._btnAuswahlDebiKredi_Vw.setFixedSize( QSize( 30, 30 ) ) self._btnAuswahlDebiKredi_Vw.setToolTip( "Öffnet einen Dialog zur Auswahl eines Verwalters " "als Debitor oder Kreditor" ) l.addLayout( vbox, r, c ) #l.addWidget( self._btnAuswahlDebiKredi, r, c ) c += 1 self._betrag.setPlaceholderText( "Betrag" ) self._betrag.setToolTip( "Ursprünglicher offener Betrag. '-' = Debit, '+' = Kredit" ) self._betrag.setFixedWidth( 80 ) l.addWidget( self._betrag, r, c ) c += 1 self._betragBeglichen.setPlaceholderText( "bezahlt" ) self._betragBeglichen.setToolTip( "Bereits bezahlter Betrag" ) self._betragBeglichen.setFixedWidth( 80 ) l.addWidget( self._betragBeglichen, r, c ) c += 1 self._letzteBuchungAm.setPlaceholderText( "letzte Buchg" ) self._letzteBuchungAm.setToolTip( "Datum der letzten (Teil-)Buchung" ) self._letzteBuchungAm.setMaximumWidth( 90 ) l.addWidget( self._letzteBuchungAm, r, c ) c += 1 self._bemerkung.setToolTip( "Bemerkung - z.B. Dokumentation von Teilzahlungen" ) self._bemerkung.setPlaceholderText( "Bemerkung" ) self._bemerkung.setMaximumHeight( 60 ) l.addWidget( self._bemerkung, r, c ) def _dataToGui( self ) -> None: x = self._offenerPosten self._erfasstAm.setDateFromIsoString( x.erfasst_am ) self._debiKredi.setText( x.debi_kredi ) self._betrag.setFloatValue( x.betrag ) self._betragBeglichen.setFloatValue( x.betrag_beglichen ) if x.letzte_buchung_am: self._letzteBuchungAm.setDateFromIsoString( x.letzte_buchung_am ) self._bemerkung.setPlainText( x.bemerkung ) def guiToData( self ) -> None: x = self._offenerPosten x.erfasst_am = self._erfasstAm.getDate() x.debi_kredi = self._debiKredi.text() x.betrag = self._betrag.getFloatValue() x.betrag_beglichen = self._betragBeglichen.getFloatValue() x.letzte_buchung_am = self._letzteBuchungAm.getDate() x.bemerkung = self._bemerkung.toPlainText() def getOposCopyWithChanges( self ) -> XOffenerPosten: """ liefert eine Kopie des in ARbeit befindlichen XOffenerPosten-Objekts. Die in der GUI vorgenommenen Änderungen sind darin enthalten. Die Änderungen sind NICHT im Original-OPOS enthalten! Das Einfügen der Änderungen in das Original-OPOS passiert durch Aufruf von guiToData(). :return: eine Kopie des Original-OPOS mit Änderungen """ xcopy = copy.copy( self._offenerPosten ) xcopy.erfasst_am = self._erfasstAm.getDate() xcopy.debi_kredi = self._debiKredi.text() xcopy.betrag = self._betrag.getFloatValue() xcopy.betrag_beglichen = self._betragBeglichen.getFloatValue() xcopy.letzte_buchung_am = self._letzteBuchungAm.getDate() xcopy.bemerkung = self._bemerkung.toPlainText() return xcopy def _onDebiKrediAuswahl_Firma( self ): self.debiKrediAuswahlFirmaPressed.emit() def _onDebiKrediAuswahl_Vw( self ): self.debiKrediAuswahlVwPressed.emit() def setOffenerPosten( self, x:XOffenerPosten ): self._offenerPosten = x if x.erfasst_am > "": self._erfasstAm.setDateFromIsoString( x.erfasst_am ) self._debiKredi.setText( x.debi_kredi ) self._betrag.setFloatValue( x.betrag ) self._betragBeglichen.setFloatValue( x.betrag_beglichen ) if x.letzte_buchung_am > "": self._letzteBuchungAm.setDateFromIsoString( x.letzte_buchung_am ) self._bemerkung.setPlainText( x.bemerkung ) def getOffenerPosten( self ) -> XOffenerPosten: x = self._offenerPosten if x is None: return XOffenerPosten() x.erfasst_am = self._erfasstAm.getDate() x.debi_kredi = self._debiKredi.text() x.betrag = self._betrag.getFloatValue() x.betrag_beglichen = self._betragBeglichen.getFloatValue() x.letzte_buchung_am = self._letzteBuchungAm.getDate() x.bemerkung = self._bemerkung.toPlainText() return x def setDebiKredi( self, debikredi:str ): self._debiKredi.setText( debikredi )
class GeschaeftsreiseEditView(QWidget): def __init__(self, mobjIdList: List[str] = None, x: XGeschaeftsreise = None, parent=None): QWidget.__init__(self, parent) self._xgeschaeftsreise = x self._layout = QFormLayout() self.setLayout(self._layout) self._cboMobjId = QComboBox() self._sdVon = SmartDateEdit() self._sdBis = SmartDateEdit() self._beZiel = BaseEdit() self._meZweck = MultiLineEdit() self._ieKm = IntEdit() self._iePersonen = IntEdit() self._beUebernachtung = BaseEdit() self._feUebernachtKosten = FloatEdit() # self._btnSave = QPushButton( "Speichern" ) # self._btnSaveClose = QPushButton( "Speichern und Schließen" ) # self._btnCancel = QPushButton( "Abbrechen" ) self._createGui() if mobjIdList: self.setMietobjekte(mobjIdList) if x: self.setData(x) def _createGui(self): """ :return: """ l = self._layout self._cboMobjId.setMaximumWidth(100) l.addRow("Mietobjekt: ", self._cboMobjId) self._sdVon.setMaximumWidth(100) l.addRow("Beginn: ", self._sdVon) self._sdBis.setMaximumWidth(100) l.addRow("Ende: ", self._sdBis) l.addRow("Ziel: ", self._beZiel) self._meZweck.setMaximumHeight(80) l.addRow("Zweck: ", self._meZweck) l.addRow("Übernachtung: ", self._beUebernachtung) self._feUebernachtKosten.setMaximumWidth(55) l.addRow("Übernacht.-Kosten: ", self._feUebernachtKosten) self._ieKm.setMaximumWidth(55) l.addRow("Gefahrene Kilometer: ", self._ieKm) self._iePersonen.setMaximumWidth(55) l.addRow("Anz.Personen: ", self._iePersonen) dummy = QWidget() dummy.setFixedHeight(20) l.addRow("", dummy) # boxl = QHBoxLayout() # boxl.addWidget( self._btnSave ) # boxl.addWidget( self._btnSaveClose ) # boxl.addWidget( self._btnCancel ) # l.addRow( boxl ) def _setFieldsFromData(self): """ :return: """ x = self._xgeschaeftsreise self._cboMobjId.setCurrentText(x.mobj_id) self._sdVon.setDateFromIsoString(x.von) self._sdBis.setDateFromIsoString(x.bis) self._beZiel.setText(x.ziel) self._meZweck.setText(x.zweck) self._ieKm.setIntValue(x.km) self._iePersonen.setIntValue(x.personen) self._beUebernachtung.setText(x.uebernachtung) self._feUebernachtKosten.setFloatValue(x.uebernacht_kosten) def _setDataFromFields(self, x: XGeschaeftsreise): x.mobj_id = self._cboMobjId.currentText() x.von = self._sdVon.getDate() x.bis = self._sdBis.getDate() x.ziel = self._beZiel.text() x.zweck = self._meZweck.toPlainText() x.km = self._ieKm.getIntValue() x.personen = self._iePersonen.getIntValue() x.uebernachtung = self._beUebernachtung.text() x.uebernacht_kosten = self._feUebernachtKosten.getFloatValue() def setMietobjekte(self, mobj_idList: List[str]): """ Versorgt die ComboBox mit den möglichen Werten (Mietobjekten) Diese Methode muss VOR setData() aufgerufen werden. :param mobj_idList: :return: """ self._cboMobjId.addItems(mobj_idList) def getDataCopyWithChanges(self) -> XGeschaeftsreise: x = copy.copy(self._xgeschaeftsreise) self._setDataFromFields(x) return x def applyChanges(self) -> XGeschaeftsreise: self._setDataFromFields(self._xgeschaeftsreise) return self._xgeschaeftsreise def setData(self, x: XGeschaeftsreise) -> None: self._xgeschaeftsreise = x self._setFieldsFromData()
class AbrechnungenView(QWidget, ModifyInfo): def __init__(self, parent=None): QWidget.__init__(self, parent) ModifyInfo.__init__(self) #self.setWindowTitle( "Sonstige Ausgaben: Rechnungen, Abgaben, Gebühren etc." ) self._mainLayout = QtWidgets.QGridLayout(self) self._toolbarLayout = QHBoxLayout() self._btnSave = QPushButton(self) self._tvAbrechnungen = TableViewExt(self) self._buchungsdatumLayout = QHBoxLayout() self._sdAbrechnungsdatum = SmartDateEdit(self) self._btnAddDayToAbrechnungsdatum = QPushButton(self) self._btnClearAbrechnungsdatum = QPushButton(self) self._sdBuchungsdatum = SmartDateEdit(self) self._btnAddDay = QPushButton(self) self._btnClearBuchungsdatum = QPushButton(self) self._abrechnungInfoLayout = QHBoxLayout() self._name = QLabel(self, text="") self._cboAbrechnungsjahr = QtWidgets.QComboBox(self) self._feBetrag: FloatEdit = FloatEdit(self) self._teBemerkung = QTextEdit(self) self._btnOk = QPushButton(self) self._btnClear = QPushButton(self) # actions für ContextMenu #self._contextMenuActions:List[QAction] = None # Callbacks self._abrechnungsjahrChangedCallback = None self._saveActionCallback = None self._submitChangesCallback = None self._justEditing: XAbrechnung = None self._suspendCallbacks = False self._createGui() self.connectWidgetsToChangeSlot(self.onChange, self.onResetChangeFlag) def _createGui(self): self._assembleToolbar() self._mainLayout.addLayout(self._toolbarLayout, 0, 0, alignment=Qt.AlignLeft) self._toolbarLayout.addStretch(50) ### tableView tv = self._tvAbrechnungen tv.setSelectionBehavior(QAbstractItemView.SelectRows) tv.setAlternatingRowColors(True) tv.verticalHeader().setVisible(False) tv.horizontalHeader().setMinimumSectionSize(0) self._mainLayout.addWidget(tv, 1, 0, 1, 1) #Buchungsdatum self._assembleBuchungsdatum() self._mainLayout.addLayout(self._buchungsdatumLayout, 2, 0, alignment=Qt.AlignLeft) # Name, Abrechnungsjahr, Betrag, Bemerkung, Buttons self._assembleAbrechnungInfo() self._mainLayout.addLayout(self._abrechnungInfoLayout, 3, 0, alignment=Qt.AlignLeft) # self._assembleRechnungsdaten() # self._mainLayout.addLayout( self._editRechnungLineLayout, 4, 0, alignment=Qt.AlignLeft ) def _assembleToolbar(self): #### Combobox Buchungsjahr font = QFont("Arial", 14, weight=QFont.Bold) self._cboAbrechnungsjahr.setFont(font) self._cboAbrechnungsjahr.setToolTip( "Das hier eingestellte Jahr bestimmt die NK-Abrechnungen, die in der Tabelle angezeigt werden." ) self._cboAbrechnungsjahr.currentIndexChanged.connect( self.onAbrechnungsjahrChanged) self._toolbarLayout.addWidget(self._cboAbrechnungsjahr, stretch=0, alignment=Qt.AlignLeft) #### save button btn = self._btnSave btn.clicked.connect(self.onSave) btn.setFlat(True) btn.setEnabled(False) btn.setToolTip("Änderungen dieser View speichern") icon = QIcon("./images/save_30.png") btn.setIcon(icon) size = QSize(30, 30) btn.setFixedSize(size) iconsize = QSize(30, 30) btn.setIconSize(iconsize) self._toolbarLayout.addWidget(btn, stretch=0) def _assembleBuchungsdatum(self): lbl = QLabel(self, text="Abrechng.datum: ") lbl.setFixedWidth(130) self._buchungsdatumLayout.addWidget(lbl) self._sdAbrechnungsdatum.setFixedWidth(85) self._sdAbrechnungsdatum.setToolTip("Datum der Forderung. Mussfeld.") self._buchungsdatumLayout.addWidget(self._sdAbrechnungsdatum) size = QSize(25, 25) self._btnAddDayToAbrechnungsdatum.setIcon(QIcon("./images/plus.png")) self._btnAddDayToAbrechnungsdatum.setFixedSize(size) self._btnAddDayToAbrechnungsdatum.setToolTip( "Abrechnungsdatum um 1 Tag erhöhen") self._btnAddDayToAbrechnungsdatum.clicked.connect( self.onAddDayToAbrechnungsdatum) self._buchungsdatumLayout.addWidget(self._btnAddDayToAbrechnungsdatum) self._btnClearAbrechnungsdatum.setIcon(QIcon("./images/cancel.png")) self._btnClearAbrechnungsdatum.setFixedSize(size) self._btnClearAbrechnungsdatum.setToolTip("Forderungsdatum löschen") self._btnClearAbrechnungsdatum.clicked.connect( self.onClearForderungsdatum) self._buchungsdatumLayout.addWidget(self._btnClearAbrechnungsdatum) lbl = QLabel(self, text="Buchungsdatum: ") lbl.setFixedWidth(120) self._buchungsdatumLayout.addWidget(lbl) self._sdBuchungsdatum.setFixedWidth(85) self._sdBuchungsdatum.setToolTip( "Buchungsdatum. Kann leer bleiben, wenn Buchung noch nicht erfolgt ist" ) self._buchungsdatumLayout.addWidget(self._sdBuchungsdatum) size = QSize(25, 25) self._btnAddDay.setIcon(QIcon("./images/plus.png")) self._btnAddDay.setFixedSize(size) self._btnAddDay.setToolTip("Buchungsdatum um 1 Tag erhöhen") self._btnAddDay.clicked.connect(self.onAddDayToBuchungsdatum) self._buchungsdatumLayout.addWidget(self._btnAddDay) self._btnClearBuchungsdatum.setIcon(QIcon("./images/cancel.png")) self._btnClearBuchungsdatum.setFixedSize(size) self._btnClearBuchungsdatum.setToolTip("Buchungsdatum löschen") self._btnClearBuchungsdatum.clicked.connect(self.onClearBuchungsdatum) self._buchungsdatumLayout.addWidget(self._btnClearBuchungsdatum) def _assembleAbrechnungInfo(self): lbl = QLabel(self, text="Mieter/Verwalter: ") lbl.setFixedWidth(130) self._abrechnungInfoLayout.addWidget(lbl) self._name.setFrameShape(QFrame.Panel) self._name.setFrameShadow(QFrame.Sunken) self._name.setFixedWidth(150) self._name.setFixedHeight(25) self._abrechnungInfoLayout.addWidget(self._name) # Gutschrift/Nachzahlung lbl = QLabel(self, text="Betrag: ") self._abrechnungInfoLayout.addWidget(lbl) self._feBetrag.setAlignment(Qt.AlignRight) self._feBetrag.setToolTip("'+' für Einnahme, '-' für Ausgabe") self._feBetrag.setFixedWidth(60) self._abrechnungInfoLayout.addWidget(self._feBetrag) self._teBemerkung.setPlaceholderText("Bemerkung zur Zahlung") self._teBemerkung.setMaximumSize(QtCore.QSize(16777215, 50)) self._abrechnungInfoLayout.addWidget(self._teBemerkung, stretch=1) # Buttons vbox = QVBoxLayout() self._btnOk.setIcon(QIcon("./images/checked.png")) self._btnOk.setDefault(True) self._btnOk.setToolTip("Daten in Tabelle übernehmen (kein Speichern)") self._btnOk.clicked.connect(self.onOkEditFields) vbox.addWidget(self._btnOk) self._btnClear.setIcon(QIcon("./images/cancel.png")) self._btnClear.setToolTip("Änderungen verwerfen und Felder leeren") self._btnClear.clicked.connect(self.onClearEditFields) vbox.addWidget(self._btnClear) self._abrechnungInfoLayout.addLayout(vbox) def onAbrechnungsjahrChanged(self, newindex): """ Slot für die Änderung des Buchungsjahrs. :param newindex: :return: """ if self._abrechnungsjahrChangedCallback and not self._suspendCallbacks: jahr = int(self._cboAbrechnungsjahr.currentText()) self._abrechnungsjahrChangedCallback(jahr) def onAddDayToBuchungsdatum(self): val = self._sdBuchungsdatum.getDate() if val: dt = getQDateFromIsoString(val) dt = dt.addDays(1) self._sdBuchungsdatum.setDate(dt.year(), dt.month(), dt.day()) def onClearBuchungsdatum(self): self._sdBuchungsdatum.clear() def onAddDayToAbrechnungsdatum(self): val = self._sdAbrechnungsdatum.getDate() if val: dt = getQDateFromIsoString(val) dt = dt.addDays(1) self._sdAbrechnungsdatum.setDate(dt.year(), dt.month(), dt.day()) def onClearForderungsdatum(self): self._sdAbrechnungsdatum.clear() def setSaveButtonEnabled(self, enable: bool = True): self._btnSave.setEnabled(enable) def onSave(self): if self._saveActionCallback: self._saveActionCallback() def onOkEditFields(self, arg): """ OK gedrückt. Änderungen an Callback-Funktion melden. :param arg: :return: """ if self._submitChangesCallback: x: XAbrechnung = self._getEditedXAbrechnung() ok: bool = self._submitChangesCallback(x) if ok: self._tvAbrechnungen.clearSelection() def _getEditedXAbrechnung(self) -> XAbrechnung: if self._justEditing is None: self.showException("Interner Fehler", "AbrechnungenView._getXAbrechnung()", "XAbrechnung ist leer") return x: XAbrechnung = self._justEditing x.ab_datum = self._sdAbrechnungsdatum.getDate() x.buchungsdatum = self._sdBuchungsdatum.getDate() x.betrag = self._feBetrag.getFloatValue() x.bemerkung = self._teBemerkung.toPlainText() return x def onClearEditFields(self, arg): self.clearEditFields() self._tvAbrechnungen.clearSelection() def getAbrechnungenTableView(self) -> QTableView: return self._tvAbrechnungen def setAbrechnungenTableModel(self, tm: SonstAusTableModel): self._tvAbrechnungen.setModel(tm) self._tvAbrechnungen.resizeColumnsToContents() #self._tvAuszahlungen.setColumnWidth( 0, 10 ) #self._tvAuszahlungen.setColumnWidth( 1, 10 ) def setAbrechnungsjahre(self, jahre: List[int]): """ setzt die Liste der auswählbaren Jahre für die Buchungsjahr-Combobox :param jahre: :return: """ self._suspendCallbacks = True for jahr in jahre: self._cboAbrechnungsjahr.addItem(str(jahr)) self._suspendCallbacks = False def clearEditFields(self): self._suspendCallbacks = True self._sdAbrechnungsdatum.clear() self._sdBuchungsdatum.clear() self._name.clear() self._feBetrag.clear() self._teBemerkung.clear() self._justEditing = None self._suspendCallbacks = False def provideEditFields(self, x: XAbrechnung): self.clearEditFields() #self._suspendCallbacks = True self._justEditing = x if x.ab_datum: y, m, d = getDateParts(x.ab_datum) self._sdAbrechnungsdatum.setDate(y, m, d) if x.buchungsdatum: y, m, d = getDateParts(x.buchungsdatum) self._sdBuchungsdatum.setDate(y, m, d) self._name.setText(x.getName()) if x.betrag == 0.0: self._feBetrag.setText("0") else: self._feBetrag.setText(str(x.betrag)) self._teBemerkung.setText(x.bemerkung) self._suspendCallbacks = False def getModel(self) -> IccTableModel: return self._tvAbrechnungen.model() def showException(self, title: str, exception: str, moretext: str = None): # todo: show Qt-Errordialog msgbox = QtWidgets.QMessageBox() msgbox.setWindowTitle(title) msgbox.setIcon(QMessageBox.Critical) msgbox.setText(exception) if moretext: msgbox.setInformativeText(moretext) msgbox.exec_() ################# SET CALLBACKS ############################ def setAbrechnungsjahrChangedCallback(self, cbfnc) -> None: """ Die callback-Funktion muss als Argument das neu eingestellte Jahr als integer akzeptieren :param cbfnc: :return: """ self._abrechnungsjahrChangedCallback = cbfnc def setSubmitChangesCallback(self, cbfnc): """ sets the one and only callback when the user hits the OK button in the edit fields area. The given callback function has to accept the edited XAbrechnung object, :param cbfnc: :return: """ self._submitChangesCallback = cbfnc def setSaveActionCallback(self, cbfnc) -> None: """ Die callback-FUnktion braucht keine Parameter empfangen. :param cbfnc: :return: """ self._saveActionCallback = cbfnc def onChange(self): self._btnSave.setEnabled(True) def onResetChangeFlag(self): self._btnSave.setEnabled(False)
class MietobjektView(QWidget, ModifyInfo): # IccView ): save = Signal( ) # speichere Änderungen am Hauswart, der Masterobjekt-Bemerkung, # des Mietobjekt-Containers und der Mietobjekt-Bemerkung edit_mieter = Signal() edit_miete = Signal() edit_verwaltung = Signal() edit_hausgeld = Signal() def __init__(self, x: XMietobjektExt): QWidget.__init__(self) ModifyInfo.__init__(self) Clearable.__init__(self) self._mietobjekt = x self._btnSave = QPushButton() self._layout = QGridLayout() self._anzCols = 12 self.setLayout(self._layout) # masterobjekt fields self._lblMasterId = FatLabel() self._bbeMasterName = LabelTimesBold12() self._bbeStrHnr = BaseBoldEdit() self._bbePlz = BaseBoldEdit() self._bbeOrt = BaseBoldEdit() self._bbeAnzWhg = BaseBoldEdit() self._bbeGesamtWfl = BaseBoldEdit() self._lblVerwalter = FatLabel() self._lblWEG = FatLabel() self._sdVeraeussertAm = SmartDateEdit() self._beHauswart = BaseBoldEdit() self._beHauswartTelefon = BaseBoldEdit() self._beHauswartMailto = BaseBoldEdit() self._meBemerkungMaster = MultiLineEdit() # mietobjekt fields self._lblMietobjekt = LabelTimesBold12() self._beWhgBez = LabelTimesBold12() self._bbeQm = BaseBoldEdit() self._beContainerNr = BaseBoldEdit() self._meBemerkungMobj = MultiLineEdit() self._lblMieter = FatLabel() self._lblTelefonMieter = FatLabel() self._lblMailtoMieter = FatLabel() self._lblNettoMiete = FatLabel() self._lblNkv = FatLabel() self._lblBruttoMiete = FatLabel() self._lblKaution = FatLabel() self._lblHgvNetto = FatLabel() self._lblRueZuFue = FatLabel() self._lblHgvBrutto = FatLabel() self._createGui(x) self.setData(x) self.connectWidgetsToChangeSlot(self.onChange, self.onResetChangeFlag) def _createGui(self, x: XMietobjektExt): self._layout.setVerticalSpacing(15) self._createToolBar(0) # self._createHLine( 1, self._anzCols ) # self._createDummyRow( 2, 10 ) row = self._createMasterDisplay(3) # self._createDummyRow( 4, 10 ) # self._createHLine( 5 ) self._createMietObjektDisplay(row) # cols = self._layout.columnCount() # self._layout.setColumnStretch( 7, 1 ) # rows = self._layout.rowCount() # self._layout.setRowStretch( rows, 1 ) def _createToolBar(self, r: int): self._btnSave.setFixedSize(QSize(30, 30)) self._btnSave.setIcon(QIcon(ICON_DIR + "save.png")) self._btnSave.setToolTip( "Änderungen des Hauswarts bzw. der Bemerkung des Master-Objekts speichern." ) self._btnSave.setEnabled(False) self._btnSave.clicked.connect(self.save.emit) tb = QHBoxLayout() tb.addWidget(self._btnSave) self._layout.addLayout(tb, r, 0, alignment=Qt.AlignLeft) def _createHLine(self, r: int, columns: int = -1): line = HLine() if columns < 0: columns = self._layout.columnCount() self._layout.addWidget(line, r, 0, 1, columns) def _createDummyRow(self, r: int, h: int): dummy = QWidget() dummy.setFixedHeight(h) self._layout.addWidget(dummy, r, 0) def _createMasterDisplay(self, row: int) -> int: #l = GridLayout() l = self._layout #self._layout.addLayout( l, row, 0, 1, self._anzCols ) # l.setVerticalSpacing( 15 ) r = row def _createMasterHeader(r: int) -> int: self._createHLine(r, self._anzCols) r += 1 wrapper = QWidget() wrapper.setStyleSheet("background: lightgray;") hbl = QHBoxLayout() wrapper.setLayout(hbl) self._layout.addWidget(wrapper, r, 0, 1, self._anzCols) #################### Master-ID lbl = LabelTimes12("Master-ID: ") hbl.addWidget(lbl, alignment=Qt.AlignRight) hbl.addWidget(self._lblMasterId, alignment=Qt.AlignLeft) #################### Master-Name lbl = LabelTimes12("Master-Name: ") hbl.addWidget(lbl, alignment=Qt.AlignRight) self._bbeMasterName.setText("Dummy-Master") #self._bbeMasterName.setStyleSheet( "background: white;" ) hbl.addWidget(self._bbeMasterName, alignment=Qt.AlignLeft) r += 1 self._createHLine(r) return r def _createMasterAddress(r: int) -> int: c = 0 lbl = BaseLabel("Adresse: ") l.addWidget(lbl, r, c) c = 1 self._bbePlz.setMaximumWidth(60) l.addWidget(self._bbePlz, r, c) c = 2 l.addWidget(self._bbeOrt, r, c, 1, 4) c = 6 l.addWidget(self._bbeStrHnr, r, c, 1, 7) return r def _createMasterMore(r: int) -> int: c = 0 lbl = BaseLabel("Anzahl Whg.: ") l.addWidget(lbl, r, c) c += 1 self._bbeAnzWhg.setEnabled(False) self._bbeAnzWhg.setMaximumWidth(40) l.addWidget(self._bbeAnzWhg, r, c) c = 4 lbl = BaseLabel("Gesamt-Wfl.(qm):") l.addWidget(lbl, r, c, 1, 1, alignment=Qt.AlignRight) c += 1 self._bbeGesamtWfl.setEnabled(False) self._bbeGesamtWfl.setMaximumWidth(40) l.addWidget(self._bbeGesamtWfl, r, c) return r def _createVerwalter(r: int) -> int: #################### Verwalter c = 0 lbl = BaseLabel("Verwalter: ") self._layout.addWidget(lbl, r, c) c = 1 self._layout.addWidget(self._lblVerwalter, r, c, 1, 3) # #################### WEG-Name c = 4 lbl = BaseLabel("WEG-Name: ") self._layout.addWidget(lbl, r, c, 1, 1, alignment=Qt.AlignRight) c = 5 self._layout.addWidget(self._lblWEG, r, c, 1, 4) # ######################## Button Edit Verwaltung c = 11 btn = EditButton() btn.clicked.connect(self.edit_verwaltung.emit) self._layout.addWidget(btn, r, c, 1, 1, alignment=Qt.AlignRight) return r + 1 def _createMasterHauswart(r: int) -> int: c = 0 lbl = BaseLabel("Hauswart: ") l.addWidget(lbl, r, c) c = 1 l.addWidget(self._beHauswart, r, c, 1, 3) c = 4 l.addWidget(BaseLabel("Telefon: "), r, c, 1, 1, alignment=Qt.AlignRight) c = 5 l.addWidget(self._beHauswartTelefon, r, c, 1, 2) c = 7 l.addWidget(BaseLabel("mailto:"), r, c, 1, 1, alignment=Qt.AlignRight) c = 8 l.addWidget(self._beHauswartMailto, r, c, 1, 4) return r def _createVeraeussertAm(r: int) -> int: c = 0 l.addWidget(BaseLabel("veräußert am:"), r, c) c = 1 self._sdVeraeussertAm.setMaximumWidth(90) l.addWidget(self._sdVeraeussertAm, r, c) return r r = _createMasterHeader(r) r = _createMasterAddress(r + 1) r = _createMasterMore(r + 1) r = _createVerwalter(r + 1) r = _createMasterHauswart(r + 1) r = _createVeraeussertAm(r + 1) r += 1 self._meBemerkungMaster.setMaximumHeight(50) l.addWidget(self._meBemerkungMaster, r, 0, 1, self._anzCols) l.setRowStretch(r, 1) return r + 1 def _createMietObjektDisplay(self, r: int): #, x: XMietobjektExt ): self._createHLine(r, self._anzCols) r += 1 wrapper = QWidget() wrapper.setStyleSheet("background: lightgray;") hbl = QHBoxLayout() wrapper.setLayout(hbl) self._layout.addWidget(wrapper, r, 0, 1, self._anzCols) #################### Mietobjekt lbl = LabelTimes12("Mietobjekt: ") hbl.addWidget(lbl, alignment=Qt.AlignRight) hbl.addWidget(self._lblMietobjekt, alignment=Qt.AlignLeft) #################### Wohnungsbezeichnung lbl = LabelTimes12("Bezeichnung: ") hbl.addWidget(lbl, alignment=Qt.AlignRight) #self._beWhgBez.setStyleSheet( "background: white;" ) hbl.addWidget(self._beWhgBez, alignment=Qt.AlignLeft) r += 1 self._createHLine(r) #################### Mieter r, c = r + 1, 0 lbl = BaseLabel("Mieter: ") self._layout.addWidget(lbl, r, c) c += 1 #self._lblMieter.setText() self._layout.addWidget(self._lblMieter, r, c, 1, 4) ############################# Telefon + mobil Mieter c += 5 lbl = BaseLabel("Tel.: ") self._layout.addWidget(lbl, r, c, alignment=Qt.AlignRight) c += 1 #self._lblTelefonMieter.setText( x.telefon_mieter ) self._layout.addWidget(self._lblTelefonMieter, r, c) ############################## Mailto Mieter c += 1 lbl = BaseLabel("mailto: ") self._layout.addWidget(lbl, r, c, 1, 1, alignment=Qt.AlignRight) c += 1 #self._lblMailtoMieter.setText( x.mailto_mieter ) self._layout.addWidget(self._lblMailtoMieter, r, c, 1, 2) ################################## Button Edit Mietverhältnis c = 11 btn = EditButton() btn.clicked.connect(self.edit_mieter.emit) self._layout.addWidget(btn, r, c, 1, 1, alignment=Qt.AlignRight) #################### Netto-Miete und NKV r, c = r + 1, 0 lbl = BaseLabel("Netto-Miete: ") self._layout.addWidget(lbl, r, c) c += 1 #self._lblNettoMiete.setText( str( x.nettomiete ) ) self._layout.addWidget(self._lblNettoMiete, r, c) c = 2 # NKV-Label soll linksbündig mit Tel.-Label des Master-Objekts sein lbl = BaseLabel("NKV: ") self._layout.addWidget(lbl, r, c, 1, 1, alignment=Qt.AlignRight) c = 3 #self._lblNkv.setText( str( x.nkv ) ) self._layout.addWidget(self._lblNkv, r, c) c = 4 lbl = BaseLabel("Miete brutto: ") self._layout.addWidget(lbl, r, c, alignment=Qt.AlignRight) c = 5 self._layout.addWidget(self._lblBruttoMiete, r, c) c = 8 lbl = BaseLabel("Kaution: ") self._layout.addWidget(lbl, r, c, alignment=Qt.AlignRight) c = 9 self._layout.addWidget(self._lblKaution, r, c) # ######################### Button Edit Miete c = 11 btn = EditButton() btn.clicked.connect(self.edit_miete.emit) self._layout.addWidget(btn, r, c, 1, 1, alignment=Qt.AlignRight) # #################### HGV und RüZuFü r, c = r + 1, 0 lbl = BaseLabel("HGV netto: ") self._layout.addWidget(lbl, r, c) c = 1 #self._lblHgvNetto.setText( str( x.hgv_netto ) ) self._layout.addWidget(self._lblHgvNetto, r, c) c = 2 lbl = BaseLabel("RüZuFü: ") self._layout.addWidget(lbl, r, c, 1, 1, alignment=Qt.AlignRight) c = 3 #self._lblRueZuFue.setText( str( x.ruezufue ) ) self._layout.addWidget(self._lblRueZuFue, r, c) c = 4 lbl = BaseLabel("HGV brutto: ") self._layout.addWidget(lbl, r, c, alignment=Qt.AlignRight) c = 5 #self._lblHgvBrutto.setText( str( x.hgv_brutto ) ) self._layout.addWidget(self._lblHgvBrutto, r, c) # ############################# Button Edit HGV c = 11 btn = EditButton() btn.clicked.connect(self.edit_hausgeld.emit) self._layout.addWidget(btn, r, c, 1, 1, alignment=Qt.AlignRight) # #################### qm r, c = r + 1, 0 lbl = LabelArial12("qm: ") self._layout.addWidget(lbl, r, c) c = 1 self._bbeQm.setMaximumWidth(40) #self._bbeQm.setText( str( x.qm ) ) self._bbeQm.setEnabled(False) self._layout.addWidget(self._bbeQm, r, c) #################### Container-Nr. c = 2 lbl = LabelArial12("Container-Nr.:") self._layout.addWidget(lbl, r, c, alignment=Qt.AlignRight) c = 3 self._layout.addWidget(self._beContainerNr, r, c, 1, 4) # ###################### Bemerkung zum Mietobjekt r, c = r + 1, 0 #self._meBemerkungMobj.setText( x.bemerkung_mietobjekt ) self._meBemerkungMobj.setPlaceholderText( "<Bemerkungen zur Wohnung (Mietobjekt)>") self._meBemerkungMobj.setMaximumHeight(46) self._layout.addWidget(self._meBemerkungMobj, r, c, 1, self._anzCols) self._layout.setRowStretch(r, 1) def setData(self, x: XMietobjektExt): self._dataToGui(x) def getMietobjektCopyWithChanges(self) -> XMietobjektExt: xcopy: XMietobjektExt = copy.copy(self._mietobjekt) self._guiToData(xcopy) return xcopy def _dataToGui(self, x: XMietobjektExt): # data für Masterobjekt self._lblMasterId.setText(str(x.master_id)) self._bbeMasterName.setText(x.master_name) self._bbeStrHnr.setText(x.strasse_hnr) self._bbeStrHnr.setCursorPosition(0) self._bbePlz.setText(x.plz) self._bbeOrt.setText(x.ort) self._bbeAnzWhg.setText(str(x.anz_whg)) self._bbeGesamtWfl.setText(str(x.gesamt_wfl)) self._lblVerwalter.setText(x.verwalter) self._lblWEG.setText(x.weg_name) self._beHauswart.setText(x.hauswart) self._beHauswart.setCursorPosition(0) self._beHauswartTelefon.setText(x.hauswart_telefon) self._beHauswartMailto.setText(x.hauswart_mailto) self._beHauswartMailto.setCursorPosition(0) if x.veraeussert_am: self._sdVeraeussertAm.setDateFromIsoString(x.veraeussert_am) self._meBemerkungMaster.setText(x.bemerkung_masterobjekt) # data für Mietobjekt self._lblMietobjekt.setText(x.mobj_id) self._beWhgBez.setText(x.whg_bez) self._lblMieter.setText(x.mieter) self._lblTelefonMieter.setText(x.telefon_mieter) self._lblMailtoMieter.setText(x.mailto_mieter) self._lblNettoMiete.setText(str(x.nettomiete)) self._lblNkv.setText(str(x.nkv)) self._lblBruttoMiete.setText(str(x.nettomiete + x.nkv)) self._lblKaution.setText(str(x.kaution)) self._lblHgvNetto.setText(str(x.hgv_netto)) self._lblRueZuFue.setText(str(x.ruezufue)) self._lblHgvBrutto.setText(str(x.hgv_brutto)) self._bbeQm.setText(str(x.qm)) self._beContainerNr.setText(x.container_nr) self._meBemerkungMobj.setText(x.bemerkung_mietobjekt) def _guiToData(self, x: XMietobjektExt): # Masterobjekt x.strasse_hnr = self._bbeStrHnr.text() x.plz = self._bbePlz.text() x.ort = self._bbeOrt.text() x.verwalter = self._lblVerwalter.text() x.weg_name = self._lblWEG.text() x.veraeussert_am = self._sdVeraeussertAm.getDate() x.hauswart = self._beHauswart.text() x.hauswart_telefon = self._beHauswartTelefon.text() x.hauswart_mailto = self._beHauswartMailto.text() x.bemerkung_masterobjekt = self._meBemerkungMaster.toPlainText() # Mietobjekt x.whg_bez = self._beWhgBez.text() x.container_nr = self._beContainerNr.text() x.bemerkung_mietobjekt = self._meBemerkungMobj.toPlainText() def applyChanges(self): self._guiToData(self._mietobjekt) def onChange(self): self._btnSave.setEnabled(True) def onResetChangeFlag(self): self._btnSave.setEnabled(False) def getModel(self): return self._mietobjekt
class SonstigeAusgabenView(IccView): def __init__(self, parent=None): IccView.__init__(self) #self.setWindowTitle( "Sonstige Ausgaben: Rechnungen, Abgaben, Gebühren etc." ) self._mainLayout = QtWidgets.QGridLayout(self) self._toolbarLayout = QHBoxLayout() self._summenLayout = QHBoxLayout() self._btnSave = QPushButton(self) self._btnComplexSort = QPushButton() self._editSearch = QLineEdit(self) self._btnSearchFwd = QPushButton(self) self._btnDbSearch = QPushButton(self) self._cboBuchungsjahr = QtWidgets.QComboBox(self) self._tvAuszahlungen = TableViewExt(self) self._buchungsdatumLayout = QHBoxLayout() self._sdBuchungsdatum = SmartDateEdit(self) self._btnAddDay = QPushButton(self) self._btnClearBuchungsdatum = QPushButton(self) self._objektRefLayout = QHBoxLayout() self._cboMasterobjekt = QComboBox(self) self._cboMietobjekt = QComboBox(self) self._editRechnungLineLayout = QHBoxLayout() self._cboKreditor = EditableCombo(self) self._cboBuchungstext = EditableCombo(self) self._sdRechnungsdatum = SmartDateEdit(self) self._feBetrag = FloatEdit(self) self._cboKostenart = QComboBox(self) self._cbUmlegbar = QCheckBox(self) self._cbWerterhaltend = QCheckBox(self) self._teBemerkung = QTextEdit(self) self._btnOk = QPushButton(self) self._btnClear = QPushButton(self) # Callbacks self._buchungsjahrChangedCallback = None self._saveActionCallback = None self._searchActionCallback = None self._dbSearchActionCallback = None self._masterobjektChangedCallback = None self._mietobjektChangedCallback = None self._kreditorChangedCallback = None self._submitChangesCallback = None self._justEditing: XSonstAus = None self._suspendCallbacks = False self._createGui() def _createGui(self): self._assembleToolbar() self._mainLayout.addLayout(self._toolbarLayout, 0, 0, alignment=Qt.AlignLeft) #self._assembleSummen() # self._toolbarLayout.addStretch( 50 ) # self._toolbarLayout.addLayout( self._summenLayout ) ### tableView tv = self._tvAuszahlungen tv.setSelectionBehavior(QAbstractItemView.SelectRows) tv.setAlternatingRowColors(True) tv.verticalHeader().setVisible(False) tv.horizontalHeader().setMinimumSectionSize(0) self._mainLayout.addWidget(tv, 1, 0, 1, 1) self._assembleBuchungsUndRechnungsdatum() self._mainLayout.addLayout(self._buchungsdatumLayout, 2, 0, alignment=Qt.AlignLeft) self._assembleObjektReference() self._mainLayout.addLayout(self._objektRefLayout, 3, 0, alignment=Qt.AlignLeft) self._assembleRechnungsdaten() self._mainLayout.addLayout(self._editRechnungLineLayout, 4, 0, alignment=Qt.AlignLeft) def _assembleToolbar(self): #### Combobox Buchungsjahr font = QFont("Arial", 14, weight=QFont.Bold) self._cboBuchungsjahr.setFont(font) self._cboBuchungsjahr.setToolTip( "Das hier eingestellte Jahr bestimmt die Rechnungen, die in der Tabelle angezeigt werden." ) self._cboBuchungsjahr.currentIndexChanged.connect( self.onBuchungsjahrChanged) self._toolbarLayout.addWidget(self._cboBuchungsjahr, stretch=0, alignment=Qt.AlignLeft) #### save button btn = self._btnSave btn.clicked.connect(self.onSave) btn.setFlat(True) btn.setEnabled(False) btn.setToolTip("Änderungen dieser View speichern") icon = QIcon(ICON_DIR + "save_30.png") btn.setIcon(icon) size = QSize(30, 30) btn.setFixedSize(size) iconsize = QSize(30, 30) btn.setIconSize(iconsize) self._toolbarLayout.addWidget(btn, stretch=0) ### complex sort button btn = self._btnComplexSort btn.clicked.connect(self.onSortComplex) btn.setFlat(True) btn.setEnabled(True) btn.setToolTip( "Nach Master, Kostenart, Kreditor, Mietobjekt, Buchungsdatum sortieren" ) icon = QIcon(ICON_DIR + "sort.png") btn.setIcon(icon) size = QSize(30, 30) btn.setFixedSize(size) iconsize = QSize(30, 30) btn.setIconSize(iconsize) self._toolbarLayout.addWidget(btn, stretch=0) ### search field for tableview search edi = self._editSearch edi.setPlaceholderText("Suche in Tabelle") edi.returnPressed.connect(self._onSearch) edi.setToolTip("Suchbegriff eingeben") self._toolbarLayout.addWidget(edi, stretch=0) btn = self._btnSearchFwd btn.clicked.connect(self._onSearch) size = QSize(30, 30) btn.setFixedSize(size) btn.setToolTip("Suche nach eingegebenem Begriff") icon = QIcon(ICON_DIR + "arrow_dn_30.png") btn.setIcon(icon) btn.setEnabled(True) self._toolbarLayout.addWidget(btn, stretch=0) def _assembleBuchungsUndRechnungsdatum(self): lbl = QLabel(self, text="Buchungsdatum: ") lbl.setFixedWidth(150) self._buchungsdatumLayout.addWidget(lbl) self._sdBuchungsdatum.setFixedWidth(85) self._sdBuchungsdatum.setToolTip( "Buchungsdatum. Kann leer bleiben, wenn Buchung noch nicht erfolgt ist" ) self._buchungsdatumLayout.addWidget(self._sdBuchungsdatum) size = QSize(25, 25) self._btnAddDay.setIcon(QIcon(ICON_DIR + "plus.png")) self._btnAddDay.setFixedSize(size) self._btnAddDay.setToolTip("Buchungsdatum um 1 Tag erhöhen") self._btnAddDay.clicked.connect(self.onAddDayToBuchungsdatum) self._buchungsdatumLayout.addWidget(self._btnAddDay) self._btnClearBuchungsdatum.setIcon(QIcon(ICON_DIR + "cancel.png")) self._btnClearBuchungsdatum.setFixedSize(size) self._btnClearBuchungsdatum.setToolTip("Buchungsdatum löschen") self._btnClearBuchungsdatum.clicked.connect(self.onClearBuchungsdatum) self._buchungsdatumLayout.addWidget(self._btnClearBuchungsdatum) self._sdRechnungsdatum.setPlaceholderText("Datum Rg.") self._sdRechnungsdatum.setMaximumWidth(85) self._sdRechnungsdatum.setToolTip("optional: Datum der Rechnung") self._buchungsdatumLayout.addSpacing(10) lbl = QLabel(text="Rechnungsdatum (optional): ") lbl.setFixedWidth(200) self._buchungsdatumLayout.addWidget(lbl) self._buchungsdatumLayout.addWidget(self._sdRechnungsdatum) def _assembleObjektReference(self): lbl = QLabel(self, text="Betroffenes Objekt: ") lbl.setFixedWidth(150) self._objektRefLayout.addWidget(lbl) self._cboMasterobjekt.setFixedWidth(155) self._cboMasterobjekt.setPlaceholderText("Haus") self._cboMasterobjekt.setToolTip( "Haus, auf das sich die Zahlung bezieht") self._cboMasterobjekt.currentIndexChanged.connect( self.onMasterobjektChanged) self._objektRefLayout.addWidget(self._cboMasterobjekt) self._cboMietobjekt.setPlaceholderText("Wohnung") self._cboMietobjekt.setToolTip( "optional: Wohnung, auf die sich die Zahlung bezieht") self._cboMietobjekt.currentIndexChanged.connect( self.onMietobjektChanged) self._objektRefLayout.addWidget(self._cboMietobjekt) def _assembleRechnungsdaten(self): self._cboKreditor.setToolTip("Kreditor") self._cboKreditor.setFixedWidth(200) self._cboKreditor.currentIndexChanged.connect(self.onKreditorChanged) self._editRechnungLineLayout.addWidget(self._cboKreditor) self._cboBuchungstext.setToolTip( "Identifikation der Zahlung durch Rechnungsnummer oder Buchungstext" ) self._cboBuchungstext.setMinimumWidth(100) self._editRechnungLineLayout.addWidget(self._cboBuchungstext, stretch=2) #Button for DB-Search btn = self._btnDbSearch btn.clicked.connect(self._onDbSearch) size = QSize(30, 30) btn.setFixedSize(size) btn.setToolTip("Suche Buchungstext in der DB") icon = QIcon(ICON_DIR + "search_30.png") btn.setIcon(icon) btn.setEnabled(True) self._editRechnungLineLayout.addWidget(btn) # Betragsfeld self._feBetrag.setPlaceholderText("Betrag") self._feBetrag.setMaximumWidth(70) self._feBetrag.setToolTip( "Positive Beträge sind Aus-, negative Einzahlungen (Gutschriften)") self._editRechnungLineLayout.addWidget(self._feBetrag, stretch=0, alignment=Qt.AlignLeft) # Combobox Kostenart self._cboKostenart.setPlaceholderText("Kostenart") self._cboKostenart.setFixedWidth(120) self._cboKostenart.setToolTip("Kostenart einstellen") self._editRechnungLineLayout.addWidget(self._cboKostenart, stretch=0, alignment=Qt.AlignLeft) vbox = QVBoxLayout() vbox.setSpacing(0) self._cbUmlegbar.setText("uml") self._cbUmlegbar.setToolTip( "Ob die Auszahlung auf den/die Mieter umlegbar sind") vbox.addWidget(self._cbUmlegbar) self._cbWerterhaltend.setText("wert") self._cbWerterhaltend.setToolTip( "Ob die Auszahlung der Werterhaltung der Wohnung dient") vbox.addWidget(self._cbWerterhaltend) self._editRechnungLineLayout.addLayout(vbox) self._teBemerkung.setPlaceholderText("Bemerkung zur Auszahlung") self._teBemerkung.setMaximumSize(QtCore.QSize(16777215, 50)) self._editRechnungLineLayout.addWidget(self._teBemerkung, stretch=1) vbox = QVBoxLayout() self._btnOk.setIcon(QIcon(ICON_DIR + "checked.png")) self._btnOk.setDefault(True) self._btnOk.setToolTip( "Neue oder geänderte Daten in Tabelle übernehmen (kein Speichern)") self._btnOk.clicked.connect(self.onOkEditFields) vbox.addWidget(self._btnOk) self._btnClear.setIcon(QIcon(ICON_DIR + "cancel.png")) self._btnClear.setToolTip("Änderungen verwerfen und Felder leeren") self._btnClear.clicked.connect(self.onClearEditFields) vbox.addWidget(self._btnClear) self._editRechnungLineLayout.addLayout(vbox) # def setContextMenuActions( self, actions:List[QAction] ) -> None: # self._contextMenuActions = actions def getSummen(self) -> XSonstAusSummen: summen = XSonstAusSummen() summen.summe_aus = self._idSummeAus.getIntValue() summen.summe_werterhaltend = self._idSummeW.getIntValue() summen.summe_umlegbar = self._idSummeU.getIntValue() return summen def onAddDayToBuchungsdatum(self): val = self._sdBuchungsdatum.getDate() if val: dt = getQDateFromIsoString(val) dt = dt.addDays(1) self._sdBuchungsdatum.setDate(dt.year(), dt.month(), dt.day()) def onClearBuchungsdatum(self): self._sdBuchungsdatum.clear() def setSaveButtonEnabled(self, enable: bool = True): self._btnSave.setEnabled(enable) def onSave(self): if self._saveActionCallback: self._saveActionCallback() def onSortComplex(self): sortoption1 = ("master_name", "kostenart", "kreditor", "mobj_id", "buchungsdatum") tm: SonstAusTableModel = self.getModel() tm.sortComplex(sortoption1) def _onSearch(self): if self._searchActionCallback: self._searchActionCallback(self._editSearch.text()) def _onDbSearch(self): if self._dbSearchActionCallback: #self._dbSearchActionCallback( self._editDbSearch.text() ) searchstring = self._cboBuchungstext.currentText() if searchstring: self._dbSearchActionCallback(searchstring) def onBuchungsjahrChanged(self, newindex): """ Slot für die Änderung des Buchungsjahrs. :param newindex: :return: """ if self._buchungsjahrChangedCallback: jahr = int(self._cboBuchungsjahr.currentText()) self._buchungsjahrChangedCallback(jahr) def onMasterobjektChanged(self, newindex: int): if self._masterobjektChangedCallback and not self._suspendCallbacks: self._masterobjektChangedCallback( self._cboMasterobjekt.currentText()) def onMietobjektChanged(self, newindex: int): pass def onKreditorChanged(self, newindex: int): if self._kreditorChangedCallback and not self._suspendCallbacks: self._kreditorChangedCallback(self._cboMasterobjekt.currentText(), self._cboMietobjekt.currentText(), self._cboKreditor.currentText()) def onOkEditFields(self, arg): """ OK gedrückt. Änderungen an Callback-Funktion melden. :param arg: :return: """ if self._submitChangesCallback: x: XSonstAus = self._getEditedXSonstAus() ok: bool = self._submitChangesCallback(x) if ok: self._tvAuszahlungen.clearSelection() if x.saus_id <= 0: # neuer Eintrag in Tabelle, nach unten scrollen self._tvAuszahlungen.scrollToBottom() def _getEditedXSonstAus(self) -> XSonstAus: x: XSonstAus = self._justEditing if self._justEditing else XSonstAus() x.buchungsjahr = int(self._cboBuchungsjahr.currentText()) x.buchungsdatum = self._sdBuchungsdatum.getDate() idx = self._cboMasterobjekt.currentIndex() x.master_name = "" if idx < 0 else self._cboMasterobjekt.currentText() idx = self._cboMietobjekt.currentIndex() x.mobj_id = "" if idx < 0 else self._cboMietobjekt.currentText() x.kreditor = self._cboKreditor.currentText() x.buchungstext = self._cboBuchungstext.currentText() x.rgdatum = self._sdRechnungsdatum.getDate() x.betrag = self._feBetrag.getFloatValue() * (-1) x.kostenart_lang = self._cboKostenart.currentText() x.umlegbar = self._cbUmlegbar.isChecked() x.werterhaltend = self._cbWerterhaltend.isChecked() x.rgtext = self._teBemerkung.toPlainText() return x def onClearEditFields(self, arg): self.clearEditFields() self._tvAuszahlungen.clearSelection() def getAuszahlungenTableView(self) -> QTableView: return self._tvAuszahlungen def setAuszahlungenTableModel(self, tm: SonstAusTableModel): self._tvAuszahlungen.setModel(tm) self._tvAuszahlungen.resizeColumnsToContents() #self._tvAuszahlungen.setColumnWidth( 0, 10 ) #self._tvAuszahlungen.setColumnWidth( 1, 10 ) def setBuchungsjahre(self, jahre: List[int]): """ setzt die Liste der auswählbaren Jahre für die Buchungsjahr-Combobox :param jahre: :return: """ for jahr in jahre: self._cboBuchungsjahr.addItem(str(jahr)) def setBuchungsjahr(self, jahr: int) -> None: """ setzt das Jahr, das in der Buchungsjahr-Combobox anzuzeigen ist :param jahr: :return: """ self._cboBuchungsjahr.setCurrentText(str(jahr)) def setBuchungsdatum(self, tag: int, monat: str): """ setzt Buchungstag und -monat. Das Jahr ergibt sich aus dem eingestellten Buchungsjahr :param tag: :param monat: :return: """ # self._sbTag.setValue( tag ) # self._cboMonat.setCurrentText( monat ) self._sdBuchungsdatum.\ setDate( int(self._cboBuchungsjahr.currentText()), getMonthIndex( monat ), tag ) def setMasterobjekte(self, masterobjekte: List[str]): for obj in masterobjekte: self._cboMasterobjekt.addItem(obj) def setMietobjekte(self, mietobjekte: List[str]): self._cboMietobjekt.clear() for obj in mietobjekte: self._cboMietobjekt.addItem(obj) self._cboMietobjekt.setCurrentIndex(0) def selectMietobjekt(self, mobj_id: str): self._cboMietobjekt.setCurrentText(mobj_id) def clearMietobjekte(self): self._cboMietobjekt.clear() def setKreditoren(self, kreditoren: List[str]): self._cboKreditor.clear() for k in kreditoren: self._cboKreditor.addItem(k) self._cboKreditor.setCurrentIndex(-1) def selectKreditor(self, kreditor: str): self._cboKreditor.setCurrentText(kreditor) def setLeistungsidentifikationen(self, idents: List[str]): self._cboBuchungstext.clear() for i in idents: self._cboBuchungstext.addItem(i) #self._cboRechnungsIdent.showPopup() def setCurrentLeistungsidentifikation(self, leistident: str) -> None: self._cboBuchungstext.setCurrentText(leistident) def getCurrentMasterobjekt(self) -> str: return self._cboMasterobjekt.currentText() def getCurrentMietobjekt(self) -> str: return self._cboMietobjekt.currentText() def getCurrentKreditor(self) -> str: return self._cboKreditor.currentText() def setCurrentKreditor(self, kreditor: str) -> None: self._cboKreditor.setCurrentText(kreditor) def getCurrentLeistungsidentifikation(self) -> str: return self._cboBuchungstext.currentText() def resetKreditoren(self): self._cboKreditor.setCurrentIndex(-1) def clearKreditoren(self): self._cboKreditor.clear() def setKostenarten(self, kostenarten: List[str]): self._cboKostenart.clear() for k in kostenarten: self._cboKostenart.addItem(k) self._cboKostenart.setCurrentIndex(-1) def getCurrentKostenart(self) -> str: return self._cboKostenart.currentText() def selectKostenart(self, kostenart: str): self._cboKostenart.setCurrentText(kostenart) def resetKostenart(self): self._cboKostenart.setCurrentIndex(-1) def clearEditFields(self): self._suspendCallbacks = True self._sdBuchungsdatum.clear() self._cboMasterobjekt.setCurrentIndex(-1) self._cboMietobjekt.setCurrentIndex(-1) self._cboKreditor.setCurrentIndex(-1) self._cboBuchungstext.setCurrentIndex(-1) self._sdRechnungsdatum.clear() self._feBetrag.clear() self._cboKostenart.setCurrentIndex(-1) self._cbUmlegbar.setChecked(False) self._cbWerterhaltend.setChecked(False) self._teBemerkung.clear() self._justEditing = None self._suspendCallbacks = False def provideEditFieldsPartly(self, umlegbar: bool, master_id: int, master_name: str, mobj_id: str, kreditor: str, kostenart_lang: str, buchungstext: str): self._cbUmlegbar.setChecked(umlegbar) self._cboMasterobjekt.setCurrentText(master_name) self._cboMietobjekt.setCurrentText(mobj_id) self._cboKreditor.setCurrentText(kreditor) self._cboBuchungstext.setCurrentText(buchungstext) self._cboKostenart.setCurrentText(kostenart_lang) #todo: weitermachen def provideEditFields(self, x: XSonstAus): self.clearEditFields() #self._suspendCallbacks = True self._justEditing = x if x.buchungsdatum: y, m, d = getDateParts(x.buchungsdatum) self._sdBuchungsdatum.setDate(y, m, d) else: self._sdBuchungsdatum.clear() if x.master_id is not None and x.master_id >= 0: #master_id kann auch 0 sein! (**alle**) self._cboMasterobjekt.setCurrentText(x.master_name) if x.mobj_id: self._cboMietobjekt.setCurrentText(x.mobj_id) if x.kreditor: self._cboKreditor.setCurrentText(x.kreditor) if x.kostenart: self._cboKostenart.setCurrentText(x.kostenart_lang) if x.buchungstext: self._cboBuchungstext.setCurrentText(x.buchungstext) if x.rgdatum: y, m, d = getDateParts(x.rgdatum) self._sdRechnungsdatum.setDate(y, m, d) self._feBetrag.setText(str(x.betrag * (-1))) self._cbUmlegbar.setChecked(x.umlegbar) self._cbWerterhaltend.setChecked(x.werterhaltend) self._teBemerkung.setText(x.rgtext) self._suspendCallbacks = False def getModel(self) -> IccTableModel: return self._tvAuszahlungen.model() def showException(self, title: str, exception: str, moretext: str = None): # todo: show Qt-Errordialog msgbox = QtWidgets.QMessageBox() msgbox.setWindowTitle(title) msgbox.setIcon(QMessageBox.Critical) msgbox.setText(exception) if moretext: msgbox.setInformativeText(moretext) msgbox.exec_() ################# SET CALLBACKS ############################ def setBuchungsjahrChangedCallback(self, cbfnc) -> None: """ Die callback-Funktion muss als Argument das neu eingestellte Jahr als integer akzeptieren :param cbfnc: :return: """ self._buchungsjahrChangedCallback = cbfnc def setSaveActionCallback(self, cbfnc) -> None: """ Die callback-FUnktion braucht keine Parameter empfangen. :param cbfnc: :return: """ self._saveActionCallback = cbfnc def setSearchActionCallback(self, cbfnc) -> None: """ Die callback-Funktion muss den Searchstring als Parameter empfangen. :param cbfnc: :return: """ self._searchActionCallback = cbfnc def setDbSearchActionCallback(self, cbfnc) -> None: """ Die callback-Funktion muss den Searchstring als Parameter empfangen. :param cbfnc: :return: """ self._dbSearchActionCallback = cbfnc def setMasterobjektChangedCallback(self, cbfnc): """ Die callback-Funktion muss einen String als Argument akzeptieren (Name des MAsterobjekts) :param cbfnc: :return: """ self._masterobjektChangedCallback = cbfnc def setMietobjektChangedCallback(self, cbfnc): """ Die callback-Funktion muss einen String als Argument akzeptieren (mobj_id) :param cbfnc: :return: """ self._mietobjektChangedCallback = cbfnc def setKreditorChangedCallback(self, cbfnc): """ Die callback Funktion muss 3 Argumente entgegennehmen können: master_name, mobj_id, neuer kreditor :param cbfnc: :return: """ self._kreditorChangedCallback = cbfnc def setSubmitChangesCallback(self, cbfnc): """ sets the one and only callback when the user hits the OK button in the edit fields area. The given callback function has to accept the edited XSonstAus object, :param cbfnc: :return: """ self._submitChangesCallback = cbfnc
class MietverhaeltnisView(QWidget, ModifyInfo): save = Signal() dataChanged = Signal() nextMv = Signal() prevMv = Signal() def __init__(self, mietverhaeltnis: XMietverhaeltnis = None, withSaveButton: bool = False, enableBrowsing=False, parent=None): QWidget.__init__(self, parent) ModifyInfo.__init__(self) self._mietverhaeltnis: XMietverhaeltnis = None self._withSaveButton = withSaveButton self._enableBrowsing = enableBrowsing # ob die Browse-Buttons angezeigt werden self._layout = QGridLayout() self._btnSave = QPushButton() self._btnVor = QPushButton() self._btnRueck = QPushButton() self._sdBeginnMietverh = SmartDateEdit() self._sdEndeMietverh = SmartDateEdit() self._edMieterName_1 = BaseEdit() self._edMieterVorname_1 = BaseEdit() self._edMieterName_2 = BaseEdit() self._edMieterVorname_2 = BaseEdit() self._edMieterTelefon = BaseEdit() self._edMieterMobil = BaseEdit() self._edMieterMailto = BaseEdit() self._edAnzPers = IntEdit() self._edNettomiete = FloatEdit() self._edNkv = FloatEdit() self._edKaution = IntEdit() self._sdKautionBezahltAm = SmartDateEdit() self._txtBemerkung1 = MultiLineEdit() self._txtBemerkung2 = MultiLineEdit() self._createGui() if mietverhaeltnis: self.setMietverhaeltnisData(mietverhaeltnis) #self.connectWidgetsToChangeSlot( self.onChange ) self.connectWidgetsToChangeSlot(self.onChange, self.onResetChangeFlag) def onChange(self, newcontent: str = None): if not self._btnSave.isEnabled(): self.setSaveButtonEnabled() self.dataChanged.emit() def onResetChangeFlag(self): self.setSaveButtonEnabled(False) def setSaveButtonEnabled(self, enabled: bool = True): self._btnSave.setEnabled(enabled) def _createGui(self): hbox = QHBoxLayout() if self._withSaveButton: self._createSaveButton(hbox) if self._enableBrowsing: self._createVorRueckButtons(hbox) self._layout.addLayout(hbox, 0, 0, alignment=Qt.AlignLeft) self._addHorizontalLine(1) self._createFelder(2) self.setLayout(self._layout) def _createSaveButton(self, hbox): btn = self._btnSave btn.clicked.connect(self.save.emit) btn.setFlat(True) btn.setEnabled(False) btn.setToolTip("Änderungen am Mietverhältnis speichern") icon = ImageFactory.inst().getSaveIcon() #icon = QIcon( "./images/save_30.png" ) btn.setIcon(icon) size = QSize(32, 32) btn.setFixedSize(size) iconsize = QSize(30, 30) btn.setIconSize(iconsize) hbox.addWidget(btn) def _createVorRueckButtons(self, hbox): self._prepareButton(self._btnRueck, ImageFactory.inst().getPrevIcon(), "Zum vorigen Mietverhältnis blättern", self.prevMv) hbox.addWidget(self._btnRueck) self._prepareButton(self._btnVor, ImageFactory.inst().getNextIcon(), "Zum nächsten Mietverhältnis blättern", self.nextMv) hbox.addWidget(self._btnVor) def _prepareButton(self, btn: QPushButton, icon: QIcon, tooltip: str, signal: Signal): btn.setFlat(True) btn.setEnabled(True) btn.setToolTip(tooltip) btn.setIcon(icon) size = QSize(32, 32) btn.setFixedSize(size) iconsize = QSize(30, 30) btn.setIconSize(iconsize) btn.clicked.connect(signal.emit) def _addHorizontalLine(self, r: int): hline = HLine() self._layout.addWidget(hline, r, 0, 1, 2) return r + 1 def _createFelder(self, r): c = 0 l = self._layout lbl = QLabel("Beginn: ") l.addWidget(lbl, r, c) c += 1 self._sdBeginnMietverh.setMaximumWidth(100) l.addWidget(self._sdBeginnMietverh, r, c) c = 0 r += 1 l.addWidget(BaseLabel("Ende: "), r, c) c += 1 self._sdEndeMietverh.setMaximumWidth(100) l.addWidget(self._sdEndeMietverh, r, c) c = 0 r += 1 lbl = BaseLabel("Name / Vorname 1. Mieter: ") l.addWidget(lbl, r, c) c += 1 hbox = QHBoxLayout() hbox.addWidget(self._edMieterName_1) hbox.addWidget(self._edMieterVorname_1) l.addLayout(hbox, r, c) c = 0 r += 1 lbl = BaseLabel("Name / Vorname 2. Mieter: ") l.addWidget(lbl, r, c) c += 1 hbox = QHBoxLayout() hbox.addWidget(self._edMieterName_2) hbox.addWidget(self._edMieterVorname_2) l.addLayout(hbox, r, c) c = 0 r += 1 l.addWidget(BaseLabel("Telefon: "), r, c) c += 1 l.addWidget(self._edMieterTelefon, r, c) c = 0 r += 1 l.addWidget(BaseLabel("Mobil: "), r, c) c += 1 l.addWidget(self._edMieterMobil, r, c) c = 0 r += 1 l.addWidget(BaseLabel("Mailadresse: "), r, c) c += 1 l.addWidget(self._edMieterMailto, r, c) c = 0 r += 1 l.addWidget(BaseLabel("Anzahl Personen i.d. Whg: "), r, c) c += 1 self._edAnzPers.setMaximumWidth(20) l.addWidget(self._edAnzPers, r, c) c = 0 r += 1 l.addWidget(BaseLabel("Nettomiete / NKV: "), r, c) c += 1 self._edNettomiete.setMaximumWidth(100) #self._edNettomiete.setEnabled( False ) self._edNkv.setMaximumWidth(100) #self._edNkv.setEnabled( False ) hbox = QHBoxLayout() hbox.addWidget(self._edNettomiete) hbox.addWidget(self._edNkv) hbox.addWidget( BaseLabel( " Änderungen der Miete und NKV über Dialog 'Sollmiete'")) l.addLayout(hbox, r, c, alignment=Qt.AlignLeft) c = 0 r += 1 l.addWidget(BaseLabel("Kaution: "), r, c) c += 1 self._edKaution.setMaximumWidth(100) l.addWidget(self._edKaution, r, c) c = 0 r += 1 l.addWidget(BaseLabel("Kaution bezahlt am: "), r, c) c += 1 self._sdKautionBezahltAm.setMaximumWidth(100) l.addWidget(self._sdKautionBezahltAm, r, c) c = 0 r += 1 l.addWidget(BaseLabel(""), r, c) r += 1 l.addWidget(BaseLabel("Bemerkungen: "), r, c) c += 1 hbox = QHBoxLayout() hbox.addWidget(self._txtBemerkung1) hbox.addWidget(self._txtBemerkung2) l.addLayout(hbox, r, c) # cols = self._layout.columnCount() # print( cols, " columns" ) def setNettoUndNkvEnabled(self, enabled: bool = True): self._edNettomiete.setEnabled(enabled) self._edNkv.setEnabled(enabled) def _guiToData(self, x: XMietverhaeltnis): """ Überträgt die Änderungen, die der User im GUI gemacht hat, in das übergebene XMietverhaeltnis-Objekt :param x: XMietverhaeltnis-Objekt, in das die geänderten Daten übertragen werden :return: """ x.von = self._sdBeginnMietverh.getDate() x.bis = self._sdEndeMietverh.getDate() x.name = self._edMieterName_1.text() x.vorname = self._edMieterVorname_1.text() x.name2 = self._edMieterName_2.text() x.vorname2 = self._edMieterVorname_2.text() x.telefon = self._edMieterTelefon.text() x.mobil = self._edMieterMobil.text() x.mailto = self._edMieterMailto.text() x.anzahl_pers = self._edAnzPers.getIntValue() x.nettomiete = self._edNettomiete.getFloatValue() x.nkv = self._edNkv.getFloatValue() x.kaution = self._edKaution.getIntValue() x.kaution_bezahlt_am = self._sdKautionBezahltAm.getDate() x.bemerkung1 = self._txtBemerkung1.toPlainText() x.bemerkung2 = self._txtBemerkung2.toPlainText() def getMietverhaeltnisCopyWithChanges(self) -> XMietverhaeltnis: """ gibt eine Kopie der Mietverhaeltnis-Schnittstellendaten mit Änderungen zurück. Diese Kopie kann für Validierungszwecke verwendet werden. :return: Kopie von XMietverhaeltnis """ mvcopy = copy.copy(self._mietverhaeltnis) self._guiToData(mvcopy) return mvcopy def applyChanges(self): """ überträgt die Änderungen, die der User im GUI gemacht hat, in das originale XMietverhaeltnis-Objekt. """ if self.isChanged(): self._guiToData(self._mietverhaeltnis) def setMietverhaeltnisData(self, mv: XMietverhaeltnis): """ Daten, die im GUI angezeigt und geändert werden können. :param mv: :return: """ self._mietverhaeltnis = mv if mv.von: self._sdBeginnMietverh.setDateFromIsoString(mv.von) if mv.bis: self._sdEndeMietverh.setDateFromIsoString(mv.bis) self._edMieterName_1.setText(mv.name) self._edMieterVorname_1.setText(mv.vorname) self._edMieterName_2.setText(mv.name2) self._edMieterVorname_2.setText(mv.vorname2) self._edMieterTelefon.setText(mv.telefon) self._edMieterMobil.setText(mv.mobil) self._edMieterMailto.setText(mv.mailto) self._edAnzPers.setIntValue(mv.anzahl_pers) self._edNettomiete.setFloatValue(mv.nettomiete) self._edNkv.setFloatValue(mv.nkv) if mv.kaution: self._edKaution.setIntValue(mv.kaution) if mv.kaution_bezahlt_am: self._sdKautionBezahltAm.setDateFromIsoString( mv.kaution_bezahlt_am) self._txtBemerkung1.setText(mv.bemerkung1) self._txtBemerkung2.setText(mv.bemerkung2) self.resetChangeFlag() def clear(self): self._sdBeginnMietverh.clear() self._sdEndeMietverh.clear() self._edMieterName_1.clear() self._edMieterVorname_1.clear() self._edMieterName_2.clear() self._edMieterVorname_2.clear() self._edMieterTelefon.clear() self._edMieterMobil.clear() self._edMieterMailto.clear() self._edAnzPers.clear() self._edNettomiete.clear() self._edNkv.clear() self._edKaution.clear() self._sdKautionBezahltAm.clear() self._txtBemerkung1.clear() self._txtBemerkung2.clear()
class GeplantEditView( QWidget ): """ Eine View, die zur Anlage und ÄNderung einer Planung dient. Dazu muss sie in einen Dialog eingebettet werden (wg. der OK- und Cancel-Buttons). """ masterobjektChanged = Signal( str ) createHandwerker = Signal() def __init__( self, masterList:List[str]=None, firmenlist:List[str]=None, x:XGeplant=None, parent=None ): QWidget.__init__( self, parent ) self._xgeplant = x self._layout = BaseGridLayout() self.setLayout( self._layout ) self._cboMasterObjekt = QComboBox() self._cboMasterObjekt.currentIndexChanged.connect( lambda x: self.masterobjektChanged.emit( self._cboMasterObjekt.currentText() ) ) self._cboMobjId = QComboBox() self._txtLeistung = MultiLineEdit() self._cboFirma = QComboBox() self._btnNewFirma = QPushButton() self._btnNewFirma.clicked.connect( self.createHandwerker.emit ) self._feKosten = FloatEdit() self._cbKostenvoranschlag = QCheckBox() self._cboJahr = QComboBox() self._cboMonat = QComboBox() self._cboMonat.addItems( datehelper.monthList ) self._cbBeauftragt = QCheckBox() self._sdErledigtAm = SmartDateEdit() self._txtBemerkung = MultiLineEdit() self._provideJahre() if masterList: self.setMasterobjekte( masterList ) if firmenlist: self.setFirmen( firmenlist ) if x: self.setData( x ) self._createGui() def _createGui( self ): """ :return: """ l = self._layout r = c = 0 self._cboMasterObjekt.setMaximumWidth( 170 ) l.addPair( "Masterobjekt: ", self._cboMasterObjekt, r, c, 1, 5 ) r, c = r+1, 0 self._cboMobjId.setMaximumWidth( 170 ) l.addPair( "Mietobjekt (optional): ", self._cboMobjId, r, c, 1, 5 ) r += 1 self._txtLeistung.setMaximumHeight( 50 ) l.addPair( "Leistung: ", self._txtLeistung, r, c, 1, 5 ) r += 1 l.addPair( "Firma: ", self._cboFirma, r, c, 1, 4 ) c = 5 self._btnNewFirma.setMaximumSize( QSize( 30, 30 ) ) self._btnNewFirma.setIcon( QIcon( ICON_DIR + "add_512x512.png" ) ) self._btnNewFirma.setToolTip( "Neue Firma erfassen" ) l.addWidget( self._btnNewFirma, r, c ) r, c = r+1, 0 self._feKosten.setMaximumWidth( 90 ) l.addPair( "Kosten: ", self._feKosten, r, c ) c += 2 l.addPair("Kostenvoranschlag: ", self._cbKostenvoranschlag, r, c ) r, c = r+1, 0 self._cboJahr.setMaximumWidth( 90 ) l.addPair("Geplant: ", self._cboJahr, r, c ) c += 2 l.addWidget( self._cboMonat, r, c ) r, c = r+1, 0 l.addPair( "Beauftragt: ", self._cbBeauftragt, r, c ) r, c = r + 1, 0 self._sdErledigtAm.setMaximumWidth( 90 ) l.addPair( "Erledigt am: ", self._sdErledigtAm, r, c ) r, c = r+1, 0 self._txtBemerkung.setMaximumHeight( 50 ) self._txtBemerkung.setPlaceholderText( "Bemerkung" ) l.addWidget( self._txtBemerkung, r, c, 1, 6 ) r, c = r+1, 0 dummy = QWidget() l.addWidget( dummy, r, c ) def _createGui_( self ): """ :return: """ l = self._layout r = c = 0 self._cboMasterObjekt.setMaximumWidth( 170 ) l.addPair( "Masterobjekt: ", self._cboMasterObjekt, r, c, 1, 5 ) r, c = r+1, 0 self._cboMobjId.setMaximumWidth( 170 ) l.addPair( "Mietobjekt (optional): ", self._cboMobjId, r, c, 1, 5 ) r += 1 self._txtLeistung.setMaximumHeight( 50 ) l.addPair( "Leistung: ", self._txtLeistung, r, c, 1, 4 ) r += 1 l.addPair( "Firma: ", self._cboFirma, r, c, 1, 4 ) c += 1 self._btnNewFirma.setMaximumSize( QSize( 30, 30 ) ) self._btnNewFirma.setIcon( QIcon( ICON_DIR + "save.png" ) ) self._btnNewFirma.setToolTip( "Neue Firma erfassen" ) #l.addWidget( self._btnNewFirma, r, c ) r, c = r+1, 0 self._feKosten.setMaximumWidth( 90 ) l.addPair( "Kosten: ", self._feKosten, r, c ) c += 2 l.addPair("Kostenvoranschlag: ", self._cbKostenvoranschlag, r, c ) r, c = r+1, 0 self._cboJahr.setMaximumWidth( 90 ) l.addPair("Geplant: ", self._cboJahr, r, c ) c += 2 l.addWidget( self._cboMonat, r, c ) r, c = r+1, 0 l.addPair( "Beauftragt: ", self._cbBeauftragt, r, c ) r, c = r + 1, 0 self._sdErledigtAm.setMaximumWidth( 90 ) l.addPair( "Erledigt am: ", self._sdErledigtAm, r, c ) r, c = r+1, 0 self._txtBemerkung.setMaximumHeight( 50 ) self._txtBemerkung.setPlaceholderText( "Bemerkung" ) l.addWidget( self._txtBemerkung, r, c, 1, 5 ) r, c = r+1, 0 dummy = QWidget() l.addWidget( dummy, r, c ) def _provideJahre( self ): y = datehelper.getCurrentYear() yearlist = [] for y_ in range( y-2, y+6 ): yearlist.append( str(y_) ) self._cboJahr.addItems( yearlist ) self._cboJahr.setCurrentText( str(y) ) def _setFieldsFromData( self ): """ :return: """ x = self._xgeplant self._cboMobjId.setCurrentText( x.mobj_id ) self._txtLeistung.setText( x.leistung ) self._cboFirma.setCurrentText( x.firma ) self._feKosten.setFloatValue( x.kosten ) self._cbKostenvoranschlag.setChecked( True if x.kostenvoranschlag > 0 else False ) self._cboJahr.setCurrentText( str( x.jahr ) ) monat = datehelper.monthList[x.monat-1] self._cboMonat.setCurrentText( monat ) self._sdErledigtAm.setDateFromIsoString( x.erledigtDatum ) self._txtBemerkung.setText( x.bemerkung ) def _setDataFromFields( self, x:XGeplant ): x.mobj_id = self._cboMobjId.currentText() x.leistung = self._txtLeistung.text() x.firma = self._cboFirma.currentText() x.kosten = self._feKosten.getFloatValue() x.kostenvoranschlag = 1 if self._cbKostenvoranschlag.isChecked() else 0 x.jahr = int( self._cboJahr.currentText() ) monat = self._cboMonat.getCurrentText() monIdx = datehelper.monthList.index( monat ) + 1 x.monat = monIdx x.erledigtDatum = self._sdErledigtAm.getDate() x.bemerkung = self._txtBemerkung.toPlainText() def setMasterobjekte( self, masterlist:List[str] ): self._cboMasterObjekt.addItems( masterlist ) def setMietobjekte( self, mobj_idList:List[str] ): """ Versorgt die ComboBox mit den möglichen Werten (Mietobjekten) Diese Methode muss VOR setData() aufgerufen werden. :param mobj_idList: :return: """ self._cboMobjId.addItems( mobj_idList ) def clearMietobjekte( self ): self._cboMobjId.clear() def setFirmen( self, firmenlist:List[str] ): self._cboFirma.addItems( firmenlist ) def getDataCopyWithChanges( self ) -> XGeplant: x = copy.copy( self._xgeschaeftsreise ) self._setDataFromFields( x ) return x def applyChanges( self ) -> XGeplant: self._setDataFromFields( self._xgeschaeftsreise ) return self._xgeplant def setData( self, x:XGeplant ) -> None: self._xgeplant = x self._setFieldsFromData()