class KilometergeldView(tk.Toplevel): def __init__(self, parent_view, **kwargs): super().__init__(parent_view) self.parent = parent_view if 'jahrarray' in kwargs: self.jahr_dropdown = Combobox(self, values=kwargs['jahrarray'], width=5, state="readonly") self.changebutton = tk.Button(self, text='Go!') text = '' for zeile in kwargs['data'].values(): text += str(zeile['count']) + ' Fahrten zwischen ' text += zeile['adresse_1'].strasse + ', ' + str( zeile['adresse_1'].plz) + ' ' + zeile['adresse_1'].stadt text += ' und ' text += zeile['adresse_2'].strasse + ', ' + str( zeile['adresse_2'].plz) + ' ' + zeile['adresse_2'].stadt text += ' => ' + str(zeile['count']) + ' * ' + "{:,.2f}".format(zeile['entfernung']) \ + 'km ' + ' * 0,30€ = ' + "{:,.2f}€".format(zeile['kmgeld']) text += '\n' self.textfeld = tk.Text(self, width=130, height=10) self.ys = ttk.Scrollbar(self, orient='vertical', command=self.textfeld.yview) # self.xs = ttk.Scrollbar(self, orient='horizontal', command=self.textfeld.xview) self.textfeld['yscrollcommand'] = self.ys.set # self.textfeld['xscrollcommand'] = self.xs.set self.textfeld.insert('1.0', text) self.draw() def draw(self): # ins Fenster packen headline = tk.Label(self, text="Reisekosten/Kilometergeld") headline.grid(row=0, column=0, columnspan=2) if hasattr(self, 'jahr_dropdown'): self.jahr_dropdown.grid(row=0, column=5) self.changebutton.grid(row=0, column=6) self.textfeld.grid(row=1, column=0, columnspan=6) # self.xs.grid(column=0, row=2, sticky='we') self.ys.grid(column=6, row=1, sticky='ns') self.grid_columnconfigure(0, weight=1) self.grid_rowconfigure(0, weight=1) def set_data(self, **kwargs): pass def get_data(self): pass
class NavigationView(tk.Frame): def __init__(self, parent_view, init_date=None, **kwargs): super().__init__(parent_view) self.config(highlightbackground="black", highlightcolor="black", highlightthickness=1, bd=0) self.akt_date = init_date if init_date else datetime.now() self.parent = parent_view # self.offset = offset # self.assistent = assistent # offset = 0 self.vormonat = tk.Button(self, text='einen Monat Zurück') self.arbeitsdate = self.akt_date # self.parent.seitenleiste.arbeitsdatum = self.arbeitsdate self.aktueller_monat = tk.Label( self, text=self.arbeitsdate.strftime("%B %Y")) self.naechster_monat = tk.Button(self, text='Nächster Monat') self.selected_month = tk.IntVar() if 'monatsarray' in kwargs: self.monats_dropdown = Combobox(self, values=kwargs['monatsarray'], width=5, state="readonly") if 'jahrarray' in kwargs: self.jahr_dropdown = Combobox(self, values=kwargs['jahrarray'], width=5, state="readonly") self.changebutton = tk.Button(self, text='Go!') self.draw() def draw(self): # in den frame packen self.vormonat.grid(row=0, column=0, sticky="w") self.aktueller_monat.grid(row=0, column=1) self.naechster_monat.grid(row=0, column=2, sticky="e") spacer = tk.Label(master=self, text='', width=20).grid(row=0, column=3) if hasattr(self, 'monats_dropdown'): self.monats_dropdown.grid(row=0, column=4) if hasattr(self, 'jahr_dropdown'): self.jahr_dropdown.grid(row=0, column=5) self.changebutton.grid(row=0, column=6)
class EbView(tk.Frame): def __init__(self, parent_view, ebliste): super().__init__(parent_view) self.eb_dropdown = Combobox(self, values=ebliste, width=38, state="readonly") self.eb_dropdown.set(0) self.vorname_input = tk.Entry(self, bd=5, width=40) self.name_input = tk.Entry(self, bd=5, width=40) self.email_input = tk.Entry(self, bd=5, width=40) headline = tk.Label(self, text="EB auswählen") headline.grid(row=0, column=0, sticky=tk.NW) self.eb_dropdown.grid(row=0, column=1, sticky=tk.NW) vorname_label = tk.Label(self, text="Vorname") vorname_label.grid(row=1, column=0, sticky=tk.NW) self.vorname_input.grid(row=1, column=1, columnspan=2, sticky=tk.NW) name_label = tk.Label(self, text="Nachname") name_label.grid(row=2, column=0, sticky=tk.NW) self.name_input.grid(row=2, column=1, columnspan=2, sticky=tk.NW) email_label = tk.Label(self, text="Email") email_label.grid(row=3, column=0, sticky=tk.NW) self.email_input.grid(row=3, column=1, columnspan=2, sticky=tk.NW) def set_data(self, **kwargs): self.vorname_input.delete(0, 'end') self.name_input.delete(0, 'end') self.email_input.delete(0, 'end') self.vorname_input.insert(0, kwargs['vorname']) self.name_input.insert(0, kwargs['name']) self.email_input.insert(0, kwargs['email']) if 'eb_id' in kwargs.keys(): self.eb_dropdown.set(kwargs['eb_id']) else: self.eb_dropdown.set(0) def get_data(self): return { 'id': self.eb_dropdown.get(), 'vorname': self.vorname_input.get(), 'name': self.name_input.get(), 'email': self.email_input.get() }
class VerpflegungsmehraufwandView(tk.Toplevel): def __init__(self, parent_view, **kwargs): super().__init__(parent_view) self.parent = parent_view if 'jahrarray' in kwargs: self.jahr_dropdown = Combobox(self, values=kwargs['jahrarray'], width=5, state="readonly") self.changebutton = tk.Button(self, text='Go!') self.u8 = tk.Label(master=self, text=str(kwargs['data']['<=8'])) self.ue8 = tk.Label(master=self, text=str(kwargs['data']['>8'])) self.ue24 = tk.Label(master=self, text=str(kwargs['data']['>24'])) self.draw() def draw(self): # ins Fenster packen headline = tk.Label(self, text="Verpflegungsmehraufwand") headline.grid(row=0, column=0, columnspan=2) if hasattr(self, 'jahr_dropdown'): self.jahr_dropdown.grid(row=0, column=5) self.changebutton.grid(row=0, column=6) u8_label = tk.Label(master=self, text="Unter 8 Stunden Abwesenheit:") u8_label.grid(row=1, column=0) self.u8.grid(row=1, column=1) ue8_label = tk.Label(master=self, text="Über 8 Stunden Abwesenheit:") ue8_label.grid(row=2, column=0) self.ue8.grid(row=2, column=1) ue24_label = tk.Label(master=self, text="Über 24 Stunden Abwesenheit:") ue24_label.grid(row=3, column=0) self.ue24.grid(row=3, column=1) def set_data(self, **kwargs): pass def get_data(self): pass
class SchichtView(tk.Toplevel): def __init__(self, parent_view, asn_liste, adressliste): super().__init__(parent_view) # unterframes zur optisch-logischen Einteilung self.asn_frame = tk.Frame(self) self.datetime_frame = tk.Frame(self) self.template_frame = tk.Frame(self.asn_frame) self.add_options_frame = tk.Frame(self) self.add_options_checkbuttons_frame = tk.Frame(self.add_options_frame) self.save_buttons_frame = tk.Frame(self) self.asn_dropdown = Combobox(self.asn_frame, values=asn_liste, width=38, state="readonly") self.asn_dropdown.set(-1) self.selected_template = tk.IntVar() self.asn_stammdaten_form = AsnStammdatenView( parent_view=self.asn_frame) self.startdatum_input = Calendar(self.datetime_frame, date_pattern='MM/dd/yyyy') # day=day, # month=month, # year=year) self.startzeit_input = TimePicker(self.datetime_frame) self.endzeit_input = TimePicker(self.datetime_frame) self.startzeit_input.bind('<FocusOut>', self.nachtschicht_durch_uhrzeit) self.endzeit_input.bind('<FocusOut>', self.nachtschicht_durch_uhrzeit) self.enddatum_input = Calendar(self.datetime_frame, date_pattern='MM/dd/yyyy') # , day=day, month=month, year=year) self.abweichende_adresse_beginn = PostadresseView( self.add_options_frame) self.abweichende_adresse_ende = PostadresseView(self.add_options_frame) self.abweichende_adresse_beginn_dropdown = Combobox( self.add_options_frame, values=adressliste, width=38, state="readonly") self.abweichende_adresse_beginn_dropdown.set(-2) self.abweichende_adresse_ende_dropdown = Combobox( self.add_options_frame, values=adressliste, width=38, state="readonly") self.abweichende_adresse_ende_dropdown.set(-2) self.ist_at = tk.IntVar() self.ist_pcg = tk.IntVar() self.ist_rb = tk.IntVar() self.ist_afg = tk.IntVar() self.ist_at_button = tk.Checkbutton( self.add_options_checkbuttons_frame, text="AT", onvalue=1, offvalue=0, variable=self.ist_at) self.ist_pcg_button = tk.Checkbutton( self.add_options_checkbuttons_frame, text="PCG", onvalue=1, offvalue=0, variable=self.ist_pcg) self.ist_rb_button = tk.Checkbutton( self.add_options_checkbuttons_frame, text="Kurzfristig (RB/BSD)", onvalue=1, offvalue=0, variable=self.ist_rb) self.ist_afg_button = tk.Checkbutton( self.add_options_checkbuttons_frame, text="Ausfallgeld", onvalue=1, offvalue=0, variable=self.ist_afg) # formbuttons self.save_button = tk.Button(self.save_buttons_frame, text="Daten speichern") self.exit_button = tk.Button(self.save_buttons_frame, text="Abbrechen") # command=self.destroy) self.saveandnew_button = tk.Button(self.save_buttons_frame, text="Daten speichern und neu") # command=lambda: self.action_save_neue_schicht(undneu=1)) def draw_templates(self, template_list): for child in self.template_frame.winfo_children(): child.destroy() if not template_list: self.add_template_text() else: for template in template_list: text = template.bezeichner text += " von " + template.beginn.strftime('%H:%M') \ + " bis " + template.ende.strftime('%H:%M') button = tk.Radiobutton( self.template_frame, text=text, variable=self.selected_template, value=template.id, command=lambda: self.change_template(template_list)) button.pack() def nachtschicht_durch_uhrzeit(self, event=None): start = time(hour=int(self.startzeit_input.hourstr.get()), minute=int(self.startzeit_input.minstr.get())) ende = time(hour=int(self.endzeit_input.hourstr.get()), minute=int(self.endzeit_input.minstr.get())) beginn = self.startdatum_input.selection_get() if ende < start: enddatum = beginn + timedelta(days=1) else: enddatum = beginn self.enddatum_input.selection_set(enddatum) def change_template(self, template_list): template_id = self.selected_template.get() for template in template_list: if template_id == template.id: self.startzeit_input.hourstr.set( template.beginn.strftime('%H')) self.startzeit_input.minstr.set(template.beginn.strftime('%M')) self.endzeit_input.hourstr.set(template.ende.strftime('%H')) self.endzeit_input.minstr.set(template.ende.strftime('%M')) self.nachtschicht_durch_uhrzeit() break def draw(self): # positionierung der Unterframes self.asn_frame.grid(row=0, column=0, sticky=tk.NW) self.datetime_frame.grid(row=0, column=1, sticky=tk.NW) self.template_frame.grid(row=1, column=0, sticky=tk.NW, columnspan=4) self.add_options_frame.grid(row=2, column=0, columnspan=2, sticky=tk.NW) self.add_options_checkbuttons_frame.grid(row=3, column=0, columnspan=2, sticky=tk.NW) self.save_buttons_frame.grid(row=3, column=0, columnspan=2, sticky=tk.NE) # asn-frame asn_label = tk.Label(self.asn_frame, text='ASN auswählen') asn_label.grid(row=0, column=0, sticky=tk.NW) self.asn_dropdown.grid(row=0, column=1, sticky=tk.NE) self.asn_stammdaten_form.grid(row=1, column=0, columnspan=2, sticky=tk.NW) # datetime-frame startdatum_label = tk.Label(self.datetime_frame, text='Beginn') startdatum_label.grid(row=0, column=0, sticky=tk.NW) self.startdatum_input.grid(row=1, column=0, sticky=tk.NW, columnspan=2) self.startzeit_input.grid(row=0, column=1, sticky=tk.NW) enddatum_label = tk.Label(self.datetime_frame, text='Ende') enddatum_label.grid(row=0, column=2, sticky=tk.NW) self.enddatum_input.grid(row=1, column=2, sticky=tk.NW, columnspan=2) self.endzeit_input.grid(row=0, column=3, sticky=tk.NW) # add-options-frame abweichende_adresse_beginn_label = tk.Label( self.add_options_frame, text="Adresse zu beginn der Schicht?") abweichende_adresse_ende_label = tk.Label( self.add_options_frame, text="Adresse zum Ende der Schicht?") abweichende_adresse_beginn_label.grid(row=0, column=0, sticky=tk.NW) self.abweichende_adresse_beginn_dropdown.grid(row=1, column=0, sticky=tk.NE) self.abweichende_adresse_beginn.grid(row=2, column=0, sticky=tk.NW) abweichende_adresse_ende_label.grid(row=0, column=1, sticky=tk.NW) self.abweichende_adresse_ende_dropdown.grid(row=1, column=1, sticky=tk.NE) self.abweichende_adresse_ende.grid(row=2, column=1, sticky=tk.NW) self.ist_at_button.grid(row=0, column=0, sticky=tk.NW) self.ist_pcg_button.grid(row=0, column=1, sticky=tk.NW) self.ist_rb_button.grid(row=0, column=2, sticky=tk.NW) self.ist_afg_button.grid(row=0, column=3, sticky=tk.NW) # save-button-frame self.save_button.grid(row=0, column=0) self.exit_button.grid(row=0, column=1) self.saveandnew_button.grid(row=0, column=2) @staticmethod def hide(frame: tk.Frame): frame.grid_remove() @staticmethod def show(frame: tk.Frame): frame.grid() def add_template_text(self): # template-frame template_text = tk.Label( self.template_frame, justify="left", text='Wenn der Assistent "Schicht-Vorlagen" hat,\n' 'stehen diese hier zur Auswahl.\n\n' 'Das ist absolut anzuraten, da es das Eintragen\n' 'von Schichten deutlich beschleunigt. \n\n' 'Die Möglichkeit dazu findest Du im Hauptfenster unter: \n' 'Bearbeiten -> ASN bearbeiten') template_text.pack() def set_data(self, **kwargs): """ parst alle daten ins Formular :param kwargs: :return: """ if 'asn' in kwargs.keys(): self.asn_dropdown.set(kwargs['asn']) if 'asn_stammdaten' in kwargs.keys(): self.asn_stammdaten_form.set_data(**kwargs['asn_stammdaten']) if 'beginn' in kwargs.keys(): self.startdatum_input.selection_set(date=kwargs['beginn']) self.startzeit_input.hourstr.set(kwargs['beginn'].strftime('%H')) self.startzeit_input.minstr.set(kwargs['beginn'].strftime('%M')) if 'ende' in kwargs.keys(): self.enddatum_input.selection_set(date=kwargs['ende']) self.endzeit_input.hourstr.set(kwargs['ende'].strftime('%H')) self.endzeit_input.minstr.set(kwargs['ende'].strftime('%M')) self.ist_at.set( 1 if 'ist_at' in kwargs.keys() and kwargs['ist_at'] else 0) self.ist_pcg.set( 1 if 'ist_pcg' in kwargs.keys() and kwargs['ist_pcg'] else 0) self.ist_rb.set( 1 if 'ist_rb' in kwargs.keys() and kwargs['ist_rb'] else 0) self.ist_afg.set( 1 if 'ist_afg' in kwargs.keys() and kwargs['ist_afg'] else 0) # TODO Zurücksetzen bei Change ASN if 'abweichende_adresse_beginn' in kwargs.keys(): if kwargs['abweichende_adresse_beginn']: self.abweichende_adresse_beginn_dropdown.set( kwargs['abweichende_adresse_beginn']) if 'abweichende_adresse_ende' in kwargs.keys(): if kwargs['abweichende_adresse_ende']: self.abweichende_adresse_ende_dropdown.set( kwargs['abweichende_adresse_ende']) def get_data(self): return { 'asn_id': self.asn_dropdown.get(), 'asn_stammdaten': self.asn_stammdaten_form.get_data(), 'startdatum': self.startdatum_input.get_date(), 'startzeit_stunde': self.startzeit_input.hourstr.get(), 'startzeit_minute': self.startzeit_input.minstr.get(), 'enddatum': self.enddatum_input.get_date(), 'endzeit_stunde': self.endzeit_input.hourstr.get(), 'endzeit_minute': self.endzeit_input.minstr.get(), 'abweichende_adresse_beginn': self.abweichende_adresse_beginn_dropdown.get(), 'abweichende_adresse_beginn_data': self.abweichende_adresse_beginn.get_data(), 'abweichende_adresse_ende': self.abweichende_adresse_ende_dropdown.get(), 'abweichende_adresse_ende_data': self.abweichende_adresse_ende.get_data(), 'ist at': self.ist_at.get(), 'ist pcg': self.ist_pcg.get(), 'ist rb': self.ist_rb.get(), 'ist afg': self.ist_afg.get() }