from tkinter import * from tkinter import font from datetime import datetime from tkinter import messagebox class Check_addresses_popup(Toplevel): x_row = 0 no_selection_possible = False def __init__(self, parent, item_1=None, item_2=None, debitor=None, factureID=""): super().__init__(parent) if(item_1["complement"] is None): item_1["complement"] = "" self.geometry(f"700x450+{parent.winfo_x() + 25 }+{parent.winfo_y() +25 }") self.resizable(True,True) self.iconbitmap("./logo_clerc_03X_icon.ico") self.title(f"Choix de l'adresse à conserver {item_1['fip_number']} / {factureID}. Code débiteur: {debitor['code']}") self.columnconfigure(0, weight=1) self.columnconfigure(1, weight=1) lbf_new = LabelFrame(self, text="Données Attrib") lbf_new.grid(row=0, column=0, sticky='WE', padx=5, pady=5) lbf_old = LabelFrame(self, text="Données Winbiz") lbf_old.grid(row=0, column=1, sticky='NSEW', padx=5, pady=5) lbf_addr_2_new = LabelFrame(self, text="Livraison Attrib") lbf_addr_2_new.grid(row=1, column=0, sticky='WE', padx=5, pady=5) lbf_addr_2_old = LabelFrame(self, text="Livraison Winbiz") lbf_addr_2_old.grid(row=1, column=1, sticky='NSEW', padx=5, pady=5) str_address_1 = "" fonts = [] self.x_row = 0 self.add_compares_element(new_frame=lbf_new,old_frame=lbf_old,label="N° AVS de l'adresse:",str1=self.ifNotNull(item_1['insurance_policy_number']).replace('.',''), str2=item_2.AVS) self.add_compares_element(new_frame=lbf_new, old_frame=lbf_old, label="Nom:", str1=self.ifNotNull(item_1['lastname']), str2=item_2.lastName) self.add_compares_element(new_frame=lbf_new, old_frame=lbf_old, label="Prénom:", str1=self.ifNotNull(item_1['firstname']), str2=item_2.firstName) self.add_compares_element(new_frame=lbf_new, old_frame=lbf_old, label="Date de naissance:", str1=datetime.strptime(self.ifNotNull(item_1['birthdate']), "%Y-%m-%d").strftime("%d.%m.%Y"), str2=item_2.birth) self.add_compares_element(new_frame=lbf_new, old_frame=lbf_old, label="Adresse:", str1=f"{self.ifNotNull(item_1['street']).strip()} {self.ifNotNull(item_1['street_number']).strip()}", str2=item_2.street.strip()) self.add_compares_element(new_frame=lbf_new, old_frame=lbf_old, label="Complément:", str1=f"{self.ifNotNull(item_1['complement']).strip()}", str2=item_2.street_cpl.strip()) self.add_compares_element(new_frame=lbf_new, old_frame=lbf_old, label="NPA/Localité:", str1=f"{self.ifNotNull(item_1['postal_code'])} {self.ifNotNull(item_1['city'])}", str2=f"{item_2.npa} {item_2.city}") if int(debitor["code"]) < 100: if item_1["selfish"]: force_color = "green" else: force_color = None self.add_compares_element(new_frame=lbf_addr_2_new, old_frame=lbf_addr_2_old, label="Adresse livraison:", str1=item_1["addr_2"], str2=self.ifNotNull(item_2.addr_2),force_color_1=force_color) str_address_1 += self.ifNotNull(item_1['insurance_policy_number']).replace('.', '') str_address_1 += self.ifNotNull(item_1['lastname']).strip() str_address_1 +=self.ifNotNull( item_1['firstname']).strip() str_address_1 += datetime.strptime(item_1['birthdate'], "%Y-%m-%d").strftime("%d.%m.%Y") str_address_1 += f"{self.ifNotNull(item_1['street']).strip()} {self.ifNotNull(item_1['street_number']).strip()}" str_address_1 += f"{self.ifNotNull(item_1['complement']).strip()}" str_address_1 += f"{self.ifNotNull(item_1['postal_code'])} {self.ifNotNull(item_1['city'])}" str_address_2 = "" str_address_2 += item_2.AVS str_address_2 += item_2.lastName str_address_2 += item_2.firstName str_address_2 += item_2.birth str_address_2 += f"{item_2.street.strip()}" str_address_2 += f"{item_2.street_cpl.strip()}" str_address_2 += f"{item_2.npa} {item_2.city}" self.listbox = Listbox(self, height=3, width=35) self.listbox.grid(row=2,column=0, columnspan= 2, pady=15,padx=15, sticky='NSEW') self.btn = Button(self, text="Valider", command=self.select) self.btn.grid(row=3,columnspan=2 , pady=10,padx=10, sticky='NSEW') for (idd, info) in ((0, "Winbiz"), (1, "Attrib")) : self.listbox.insert(END, info) if int(debitor["code"]) >= 100: self.listbox.delete(0,END) self.listbox.delete(0, END) self.listbox.insert(END, f"Aucun changement possible, code débiteur {debitor['code']}") self.listbox.configure(state='disabled') self.no_selection_possible = True if int(debitor["code"]) == 1: if str_address_1 == str_address_2: self.listbox.selection_set(0) print("adresse identique") else: self.listbox.selection_set(1) print(f"adresse différente [{str_address_1}] ({str_address_2})") def ifNotNull(self, value, ret=""): if value == None or value == "None": return ret return value.strip() def add_compares_element(self,new_frame, old_frame,str1, str2, label, force_color_1=None): label_font = font.Font(weight='bold', size=9) value_color_1 = "black" value_color_2 = "black" con = "" if str1 != str2: value_color_1 = "red" value_color_2 = "red" con = "*" if force_color_1 is not None: value_color_1 = force_color_1 Label(new_frame, text=str(label), font=label_font).grid(row=self.x_row, column=0, sticky="W") Label(new_frame, text=con + str(str1) + con, fg=value_color_1, anchor="w", justify=LEFT).grid(row=self.x_row, column=1, sticky="W") Label(old_frame, text=str(label), font=label_font).grid(row=self.x_row, column=0, sticky="W") Label(old_frame, text=con + str(str2) + con, fg=value_color_2, anchor="w", justify=LEFT).grid(row=self.x_row, column=1, sticky="W") self.x_row += 1 self.selection = None def destroy(self): if self.selection is None: self.selection = True super().destroy() def select(self): selection = self.listbox.curselection() if selection: self.selection = self.listbox.get(selection[0]) self.selection = True if self.selection == "Attrib" else False self.destroy() if self.no_selection_possible: self.destroy() def show(self): self.deiconify() self.wm_protocol("WM_DELETE_WINDOW", self.destroy) self.wait_window(self) return self.selection class Check_debitor_popup(Toplevel): x_row = 0 no_selection_possible = False def __init__(self, parent, debitor=None, lists_available_names=None, factureID=None,fip=None,object=None): super().__init__(parent) self.object = object self.debitor = debitor self.inp_code = StringVar() self.inp_code.set(debitor['code']) self.geometry(f"900x275+{parent.winfo_x() + 25 }+{parent.winfo_y() +25 }") self.resizable(True,True) self.iconbitmap("./logo_clerc_03X_icon.ico") self.title(f"Incohérence sur les débiteurs {fip} / {factureID}. Code débiteur: {debitor['code']}") self.columnconfigure(0, weight=1) self.columnconfigure(1, weight=1) Label(self,text="Une incohérence a été trouvée entre le code débiteur saisi dans Attrib et le code débiteur saisi dans Attrib. \nIls ne correspondent pas.Le code débiteur présent dans le champs Code Saisi sera utiliser pour la facture winbiz \nMerci de vérifier et modifier le code débiteur puis cliquer sur Valider.", wraplength= 950, justify=LEFT).grid(row=0,column=0, columnspan=2, sticky="W") lbf_new = LabelFrame(self, text="Données Attrib") lbf_new.grid(row=1, column=0, sticky='WE', padx=5, pady=5) label_font = font.Font(weight='bold', size=9) Label(lbf_new, text="Code saisi", font=label_font).grid(row=0, column=0, sticky="W") Entry(lbf_new, textvariable=self.inp_code, width= 10).grid(row=0, column=1, sticky="W", pady= 10) Label(lbf_new, text="Débiteur sélectionné dans Attrib", font=label_font).grid(row=1, column=0, sticky="W") text_name = Text(lbf_new, fg="red", height=3,width= 30) text_name.grid(row=1, column=1, sticky="W") if 'name' not in debitor: debitor['name'] = "" text_name.insert(END,debitor['name']) text_name.configure(state='disabled') lbf_old = LabelFrame(self, text="Noms possibles") lbf_old.grid(row=1, column=1, sticky='NSEW', padx=5, pady=5) self.listbox = Text(lbf_old, height=5, width=50) self.listbox.grid(row=1,column=0, columnspan= 2, pady=15,padx=15, sticky='NSEW') for info in lists_available_names : self.listbox.insert(END, f"{info}\n") self.listbox.configure(state='disabled') self.no_selection_possible = True menu_bar = Menu(self) menu_param = Menu(menu_bar, tearoff=0) menu_param.add_command(label="Ajouter à la liste", command=self.add) menu_bar.add_cascade(label="Paramètre", menu=menu_param) self.config(menu=menu_bar) self.btn = Button(self, text="Valider", command=self.destroy) self.btn.grid(row=2,column=0, columnspan= 2, pady=10,padx=10, sticky='NSEW') def add(self): self.destroy() if self.object is not None: self.object.add_items(code=self.inp_code.get(), name=self.debitor["name"]) self.object.save_debitors() def destroy(self): super().destroy() def show(self): self.deiconify() self.wm_protocol("WM_DELETE_WINDOW", self.destroy) self.wait_window(self) print("nouveau code = "+ self.inp_code.get()) return self.inp_code.get() class Input_popup(Toplevel): x_row = 0 no_selection_possible = False def __init__(self, parent, text="Veuillez saisir la nouvelle valeur.", default="" ,factureID=None, fip=None, object=None): super().__init__(parent) self.object = object self.inp_value = StringVar() if default is not None: self.inp_value.set(default) self.geometry(f"650x120+{parent.winfo_x() + 25}+{parent.winfo_y() + 25}") self.resizable(True, True) self.iconbitmap("./logo_clerc_03X_icon.ico") self.title(f"Saisir une valeur {fip} / {factureID}.") self.columnconfigure(0, weight=1) self.columnconfigure(1, weight=1) lbf_new = LabelFrame(self, text=text) lbf_new.grid(row=0, column=0, sticky='WE', padx=5, pady=5) label_font = font.Font(weight='bold', size=9) Label(lbf_new, text="", font=label_font).grid(row=0, column=0, sticky="W") input_entry = Entry(lbf_new, textvariable=self.inp_value, width=100) input_entry.grid(row=0, column=1, sticky="W", pady=10) input_entry.focus() self.after(0,input_entry.focus) self.btn = Button(self, text="Valider", command=self.destroy) self.btn.grid(row=2, column=0, pady=10, padx=10, sticky='NSEW') def add(self): self.destroy() if self.object is not None: self.object.add_items(code=self.inp_code.get(), name=self.debitor["name"]) self.object.save_debitors() def destroy(self): if self.inp_value.get() is None or self.inp_value.get() == "": messagebox.showerror(title="ERREUR", message="Veuillez saisir une valeur !") self.focus() else: super().destroy() def show(self): self.deiconify() self.wm_protocol("WM_DELETE_WINDOW", self.destroy) self.wait_window(self) print("nouvelle valeur = " + self.inp_value.get()) return self.inp_value.get()