Compare commits

...

24 Commits

Author SHA1 Message Date
Ambulance Clerc
4d2e2f2351 supression de "(facturation)" 2023-01-24 15:10:03 +01:00
Ambulance Clerc
6f09de76ab Divers débug sur erreur de saisi lors d'un code débiteur 3 et si code débiteur pas encore connu 2023-01-03 16:18:16 +01:00
Ambulance Clerc
eee31f3a1d Ajout d'une captation de bug si débiteur n'existe pas. 2023-01-03 15:15:11 +01:00
Ambulance Clerc
bf1533ccdb Changement de version 2022-09-07 18:10:27 +02:00
Ambulance Clerc
36ce8a2488 Strip et replace \n en "" sur le numéro opale 2022-09-07 18:05:53 +02:00
Ambulance Clerc
891a29e39b Changement de version 2022-09-07 11:17:48 +02:00
Ambulance Clerc
2f9d8c1da8 Changement de version 2022-09-07 11:12:46 +02:00
Ambulance Clerc
191821d81d Changement de version 2022-09-02 15:13:13 +02:00
Ambulance Clerc
99a89585b5 Changement de version 2022-09-02 15:09:10 +02:00
Ambulance Clerc
e60ed4b5fa Arrêt critique si la saisi du débiteur est à nouveau faux 2022-09-02 15:08:37 +02:00
Ambulance Clerc
4c75a6167b Ajout d'un focus sur l'input dans popup de saisi 2022-09-02 14:57:58 +02:00
Ambulance Clerc
842ae5fb69 Adaptation du fonctionnement de la progessbar 2022-09-02 14:39:11 +02:00
Ambulance Clerc
355d17810f Débug génération nom du fichier d'export 2022-09-02 14:13:14 +02:00
Ambulance Clerc
510587d3eb Ajout du complément d'adresse dans le check adresse 2022-08-22 17:36:03 +02:00
Ambulance Clerc
ff22572e56 Ajout du complément d'adresse dans le check adresse 2022-08-22 17:35:46 +02:00
Ambulance Clerc
54873a2715 Print all debs et ajout barre de menu 2022-08-22 11:43:15 +02:00
Ambulance Clerc
1ce77f4e08 Débug des code débiteur saisi manuellement concidéré comme int à la place de str 2022-08-20 11:35:38 +02:00
Ambulance Clerc
7be1f15c63 Débug des code débiteur saisi manuellement concidéré comme int à la place de str 2022-08-20 11:30:17 +02:00
Ambulance Clerc
cdc7205ab7 Débug version 2022-08-13 07:00:40 +02:00
Ambulance Clerc
5b0f7a1119 Ajout de la date d'intervention dans chaque ligne article => But essayer d'envoyer la date d'intervention comme date Comptable 2022-08-10 18:16:27 +02:00
Ambulance Clerc
5c7f9c1f4e Ajout du commentaire dans référence client 2022-07-29 10:19:10 +02:00
Ambulance Clerc
975595b592 Ajout du commentaire dans référence client 2022-07-29 09:51:21 +02:00
Ambulance Clerc
1907632dca Ajout du pays dans adresse livraison si pas suisse 2022-07-29 09:37:05 +02:00
Ambulance Clerc
6d9b991c04 Changement dans les colonnes code présentation et méthode de payement toujours = 3
Prise en charge des EBILL pour code 101
2022-07-15 10:12:49 +02:00
6 changed files with 141 additions and 36 deletions

View File

@@ -18,5 +18,6 @@ class cls_addresse:
firstName = None firstName = None
birth = None birth = None
street = None street = None
street_cpl = None
npa = None npa = None
city = None city = None

View File

@@ -17,13 +17,23 @@ class cls_debitors:
shutil.copy("debitors_src.bin", os.path.join(self.file_path, f"debitors.bin")) shutil.copy("debitors_src.bin", os.path.join(self.file_path, f"debitors.bin"))
self.load_debitors() self.load_debitors()
def print_all_debs(self):
for elem in self.items:
print(f"Débiteur:{elem.code} {elem.names}")
def get_deb_by_code(self, code):
for deb in self.items:
if deb.code == int(code):
return deb
return None
def get_names_by_code(self, code): def get_names_by_code(self, code):
default = []
if int(code) < 100:
return default
for deb in self.items: for deb in self.items:
if deb.code == int(code): if deb.code == int(code):
return deb.names return deb.names
return None return default
def is_in_debitor_name(self, code, search_name): def is_in_debitor_name(self, code, search_name):
names = self.get_names_by_code(code) names = self.get_names_by_code(code)

View File

@@ -9,6 +9,9 @@ class Check_addresses_popup(Toplevel):
def __init__(self, parent, item_1=None, item_2=None, debitor=None, factureID=""): def __init__(self, parent, item_1=None, item_2=None, debitor=None, factureID=""):
super().__init__(parent) super().__init__(parent)
if(item_1["complement"] is None):
item_1["complement"] = ""
self.geometry(f"700x300+{parent.winfo_x() + 25 }+{parent.winfo_y() +25 }") self.geometry(f"700x300+{parent.winfo_x() + 25 }+{parent.winfo_y() +25 }")
self.resizable(True,True) self.resizable(True,True)
self.iconbitmap("./logo_clerc_03X_icon.ico") self.iconbitmap("./logo_clerc_03X_icon.ico")
@@ -33,6 +36,7 @@ class Check_addresses_popup(Toplevel):
self.add_compares_element(new_frame=lbf_new, old_frame=lbf_old, label="Prénom:", str1=item_1['firstname'], str2=item_2.firstName) self.add_compares_element(new_frame=lbf_new, old_frame=lbf_old, label="Prénom:", str1=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(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="Date de naissance:", str1=datetime.strptime(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"{item_1['street']} {item_1['street_number']}", str2=item_2.street) self.add_compares_element(new_frame=lbf_new, old_frame=lbf_old, label="Adresse:", str1=f"{item_1['street']} {item_1['street_number']}", str2=item_2.street)
self.add_compares_element(new_frame=lbf_new, old_frame=lbf_old, label="Complément:", str1=f"{item_1['complement']}", str2=item_2.street_cpl)
self.add_compares_element(new_frame=lbf_new, old_frame=lbf_old, label="NPA/Localité:", str1=f"{item_1['postal_code']} {item_1['city']}", str2=f"{item_2.npa} {item_2.city}") self.add_compares_element(new_frame=lbf_new, old_frame=lbf_old, label="NPA/Localité:", str1=f"{item_1['postal_code']} {item_1['city']}", str2=f"{item_2.npa} {item_2.city}")
@@ -41,6 +45,7 @@ class Check_addresses_popup(Toplevel):
str_address_1 += item_1['firstname'].strip() str_address_1 += item_1['firstname'].strip()
str_address_1 += datetime.strptime(item_1['birthdate'], "%Y-%m-%d").strftime("%d.%m.%Y") str_address_1 += datetime.strptime(item_1['birthdate'], "%Y-%m-%d").strftime("%d.%m.%Y")
str_address_1 += f"{item_1['street']} {item_1['street_number']}" str_address_1 += f"{item_1['street']} {item_1['street_number']}"
str_address_1 += f"{item_1['complement']}"
str_address_1 += f"{item_1['postal_code']} {item_1['city']}" str_address_1 += f"{item_1['postal_code']} {item_1['city']}"
@@ -54,6 +59,7 @@ class Check_addresses_popup(Toplevel):
str_address_2 += item_2.firstName str_address_2 += item_2.firstName
str_address_2 += item_2.birth str_address_2 += item_2.birth
str_address_2 += f"{item_2.street.strip()}" 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}" str_address_2 += f"{item_2.npa} {item_2.city}"
self.listbox = Listbox(self, height=3, width=35) self.listbox = Listbox(self, height=3, width=35)
@@ -134,7 +140,7 @@ class Check_debitor_popup(Toplevel):
self.inp_code = StringVar() self.inp_code = StringVar()
self.inp_code.set(debitor['code']) self.inp_code.set(debitor['code'])
self.geometry(f"850x300+{parent.winfo_x() + 25 }+{parent.winfo_y() +25 }") self.geometry(f"900x275+{parent.winfo_x() + 25 }+{parent.winfo_y() +25 }")
self.resizable(True,True) self.resizable(True,True)
self.iconbitmap("./logo_clerc_03X_icon.ico") self.iconbitmap("./logo_clerc_03X_icon.ico")
self.title(f"Incohérence sur les débiteurs {fip} / {factureID}. Code débiteur: {debitor['code']}") self.title(f"Incohérence sur les débiteurs {fip} / {factureID}. Code débiteur: {debitor['code']}")
@@ -142,8 +148,10 @@ class Check_debitor_popup(Toplevel):
self.columnconfigure(0, weight=1) self.columnconfigure(0, weight=1)
self.columnconfigure(1, 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 = LabelFrame(self, text="Données Attrib")
lbf_new.grid(row=0, column=0, sticky='WE', padx=5, pady=5) lbf_new.grid(row=1, column=0, sticky='WE', padx=5, pady=5)
label_font = font.Font(weight='bold', size=9) label_font = font.Font(weight='bold', size=9)
Label(lbf_new, text="Code saisi", font=label_font).grid(row=0, column=0, sticky="W") Label(lbf_new, text="Code saisi", font=label_font).grid(row=0, column=0, sticky="W")
@@ -151,15 +159,15 @@ class Check_debitor_popup(Toplevel):
Label(lbf_new, text="Débiteur sélectionné", font=label_font).grid(row=1, column=0, sticky="W") 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 = Text(lbf_new, fg="red", height=3,width= 30)
text_name.grid(row=1, column=1, sticky="W") text_name.grid(row=1, column=1, sticky="W")
text_name.insert(END,debitor['name']) text_name.insert(END,debitor['name'])
text_name.configure(state='disabled') text_name.configure(state='disabled')
lbf_old = LabelFrame(self, text="Nom possible") lbf_old = LabelFrame(self, text="Noms possibles")
lbf_old.grid(row=0, column=1, sticky='NSEW', padx=5, pady=5) lbf_old.grid(row=1, column=1, sticky='NSEW', padx=5, pady=5)
@@ -172,8 +180,12 @@ class Check_debitor_popup(Toplevel):
self.listbox.configure(state='disabled') self.listbox.configure(state='disabled')
self.no_selection_possible = True self.no_selection_possible = True
self.btn = Button(lbf_old, text="Ajouter", command=self.add) menu_bar = Menu(self)
self.btn.grid(row=2, column=0, columnspan= 2, pady=10, padx=10, sticky='NSEW') 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 = Button(self, text="Valider", command=self.destroy)
self.btn.grid(row=2,column=0, columnspan= 2, pady=10,padx=10, sticky='NSEW') self.btn.grid(row=2,column=0, columnspan= 2, pady=10,padx=10, sticky='NSEW')
@@ -223,7 +235,10 @@ class Input_popup(Toplevel):
label_font = font.Font(weight='bold', size=9) label_font = font.Font(weight='bold', size=9)
Label(lbf_new, text="", font=label_font).grid(row=0, column=0, sticky="W") Label(lbf_new, text="", font=label_font).grid(row=0, column=0, sticky="W")
Entry(lbf_new, textvariable=self.inp_value, width=100).grid(row=0, column=1, sticky="W", pady=10) 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 = Button(self, text="Valider", command=self.destroy)

View File

@@ -1 +1 @@
20220708-1015 20230124-1508

121
main.py
View File

@@ -74,6 +74,7 @@ class ClercAttrib2Biz():
self.count_facture = 0 self.count_facture = 0
self.a_index = {"invoice": [], "intervention": [], "patient": [], "debtor": [], "articles": [], "global": []} self.a_index = {"invoice": [], "intervention": [], "patient": [], "debtor": [], "articles": [], "global": []}
self.addresses = cls_Addresses() self.addresses = cls_Addresses()
self.o_debs = cls_debitors(filepath=temp_dir)
self.index_counter = 0 self.index_counter = 0
self.bs_counter = 70 self.bs_counter = 70
@@ -101,7 +102,7 @@ class ClercAttrib2Biz():
self.refresh_ui() self.refresh_ui()
self.read_addresses() self.read_addresses()
self.o_debs = cls_debitors(filepath=temp_dir)
self.timer = self.fenetre.after(1000, self.main_timer_fn) self.timer = self.fenetre.after(1000, self.main_timer_fn)
@@ -117,7 +118,7 @@ class ClercAttrib2Biz():
def main_timer_fn(self): def main_timer_fn(self):
print("Pass tick timer main app") #print("Pass tick timer main app")
self.timer = self.fenetre.after(5000, self.main_timer_fn) self.timer = self.fenetre.after(5000, self.main_timer_fn)
self.nb_facture_var.set(self.count_facture) self.nb_facture_var.set(self.count_facture)
@@ -209,6 +210,14 @@ class ClercAttrib2Biz():
self.cb_run = Checkbutton(lbf_3, text="Lancer la conversion excel", variable=self.run_excel_after_export, onvalue=True, offvalue=False) self.cb_run = Checkbutton(lbf_3, text="Lancer la conversion excel", variable=self.run_excel_after_export, onvalue=True, offvalue=False)
self.cb_run.grid(row=4, sticky='W') self.cb_run.grid(row=4, sticky='W')
menu_bar = Menu(self.fenetre)
menu_param = Menu(menu_bar, tearoff=0)
menu_param.add_command(label="Affichage des débiteurs", command=self.o_debs.print_all_debs)
menu_bar.add_cascade(label="Paramètre", menu=menu_param)
self.fenetre.config(menu=menu_bar)
@@ -233,7 +242,7 @@ class ClercAttrib2Biz():
self.b_prompt_open = False self.b_prompt_open = False
def refresh_ui(self): def refresh_ui(self):
print("pass refresh UI") #print("pass refresh UI")
if self.export_one_file.get() and not self.export_format_biz.get(): if self.export_one_file.get() and not self.export_format_biz.get():
self.cb_run['state'] = "active" self.cb_run['state'] = "active"
else: else:
@@ -257,7 +266,8 @@ class ClercAttrib2Biz():
o_addresse.lastName = row[9] o_addresse.lastName = row[9]
o_addresse.firstName = row[10] o_addresse.firstName = row[10]
o_addresse.birth = row[38] o_addresse.birth = row[38]
o_addresse.street = row[12] o_addresse.street = row[11]
o_addresse.street_cpl = row[12]
o_addresse.npa = row[13] o_addresse.npa = row[13]
o_addresse.city = row[15] o_addresse.city = row[15]
self.addresses.add_addresse(o_addresse) self.addresses.add_addresse(o_addresse)
@@ -275,7 +285,7 @@ class ClercAttrib2Biz():
self.count_facture = 0 self.count_facture = 0
x = 0 x = 0
self.export_filename = f"bizexdoc_export_Attrib_v{datetime.now().year}{datetime.now().month}{datetime.now().month}{datetime.now().hour}{datetime.now().minute}.csv" self.export_filename = f"bizexdoc_export_Attrib_v{datetime.now().year}{datetime.now().month}{datetime.now().day}{datetime.now().hour}{datetime.now().minute}.csv"
if self.export_format_biz: if self.export_format_biz:
if self.export_one_file.get() and os.path.exists(os.path.join(dest_dir, self.export_filename)): if self.export_one_file.get() and os.path.exists(os.path.join(dest_dir, self.export_filename)):
@@ -296,7 +306,7 @@ class ClercAttrib2Biz():
print(f"remove src.csv => {os.path.join(dest_dir, 'src.csv')}") print(f"remove src.csv => {os.path.join(dest_dir, 'src.csv')}")
self.progress_bar["value"] = 0
for filename in os.listdir(dir): for filename in os.listdir(dir):
x += 1 x += 1
if ".json" in filename: if ".json" in filename:
@@ -305,11 +315,17 @@ class ClercAttrib2Biz():
data = json.load(f) data = json.load(f)
if self.export_format_biz.get(): if self.export_format_biz.get():
self.parseFile(data, filename) bRet = self.parseFile(data, filename)
if bRet:
messagebox.showinfo(title="Fin de conversion",
message="La conversion s'est terminée avec succès")
return False
else: else:
self.convertFile(data, filename) self.convertFile(data, filename)
if self.delete_after_parse.get(): if self.delete_after_parse.get():
os.remove(dir + "/" + filename) os.remove(dir + "/" + filename)
self.progress_bar["value"] = x / len(os.listdir(dir)) * 100 self.progress_bar["value"] = x / len(os.listdir(dir)) * 100
self.fenetre.update_idletasks() self.fenetre.update_idletasks()
self.nb_facture_var.set(self.count_facture) self.nb_facture_var.set(self.count_facture)
@@ -335,6 +351,13 @@ class ClercAttrib2Biz():
data.Debtor["firstname"] = data.Debtor["firstname"].strip() data.Debtor["firstname"] = data.Debtor["firstname"].strip()
if data.Debtor["street"] is not None: if data.Debtor["street"] is not None:
data.Debtor["street"] = data.Debtor["street"].strip() data.Debtor["street"] = data.Debtor["street"].strip()
if data.data["comments"] is not None:
data.data["comments"] = data.data["comments"].strip().replace("\n",'')
if "name" in data.Debtor.keys() and data.Debtor["name"] is not None:
data.Debtor["name"] = data.Debtor["name"].replace("(facturation)","")
data.Debtor["name"] = data.Debtor["name"].strip()
def check_code_validity(self, code,data): def check_code_validity(self, code,data):
ret = True ret = True
@@ -372,6 +395,7 @@ class ClercAttrib2Biz():
def parseFile(self, data, filename): def parseFile(self, data, filename):
self.progress_bar["value"] = 0
self.index_counter += 1 self.index_counter += 1
lines = [] lines = []
self.count_facture += len(data["invoices"]) self.count_facture += len(data["invoices"])
@@ -383,29 +407,38 @@ class ClercAttrib2Biz():
csv_col.data[5] = f"" csv_col.data[5] = f""
lines.append(csv_col.data) lines.append(csv_col.data)
cur_invoice_index = 0
x = 70
for ele in data["invoices"]: for ele in data["invoices"]:
cur_invoice_index += 1
self.progress_bar["value"] = cur_invoice_index / self.count_facture * 100
b_address_update = True b_address_update = True
data = cls_Invoice() data = cls_Invoice()
data.parse_item(ele) data.parse_item(ele)
self.trim_all_data(data) self.trim_all_data(data)
print(f"Code débiteur => {data.data['id']}: {data.Debtor['code']}") print(f"Code débiteur => {data.data['id']}: {data.Debtor['code']}")
if data.Debtor["code"] is None or '.' in str(data.Debtor["code"]): if data.Debtor["code"] is None or '.' in data.Debtor["code"]:
print("ERROR code débiteur #1") print("ERROR code débiteur #1")
messagebox.showerror(title="Erreur code débiteur", message=f"Le code débiteur de la facture {data.data['id']} est faux: [{data.Debtor['code']}], merci de le corriger ") messagebox.showerror(title="Erreur code débiteur", message=f"Le code débiteur de la facture {data.data['id']} est faux: [{data.Debtor['code']}], merci de le corriger ")
inp_popup = Input_popup(self.fenetre, default=data.Debtor["code"], factureID=data.data['id'], fip=data.Patient['fip_number']) inp_popup = Input_popup(self.fenetre, default=data.Debtor["code"], factureID=data.data['id'], fip=data.Patient['fip_number'])
data.Debtor["code"] = int(inp_popup.show()) data.Debtor["code"] = str(inp_popup.show())
if data.Debtor["code"] is None or '.' in data.Debtor["code"]:
messagebox.showerror(title="Erreur Critique",
message=f"Les informations de la factures [{data.data['id']}] comportes trop d'erreur arrêt du processus ")
return False
if data.Debtor["code"] == 1: if int(data.Debtor["code"]) == 1:
if not self.check_code_validity(data.Debtor["code"],data): if not self.check_code_validity(data.Debtor["code"],data):
messagebox.showerror(title="Erreur Critique",
message=f"Les informations de la factures [{data.data['id']}] comportes trop d'erreur arrêt du processus ")
return False return False
if int(data.Debtor["code"]) != "1" and data.Debtor["code"] != None and int(data.Debtor["code"]) < 100: if data.Debtor["code"] != "1" and data.Debtor["code"] != None and int(data.Debtor["code"]) < 100:
if data.Patient["fip_number"] not in self.a_listings["to_check"]: if data.Patient["fip_number"] not in self.a_listings["to_check"]:
self.a_listings["to_check"].append(data.Patient["fip_number"]) self.a_listings["to_check"].append(data.Patient["fip_number"])
self.logger.warning(f"Vérifier facture N°: {data.data['id']} / {data.Patient['fip_number']} {data.Debtor['code']} {data.Debtor['lastname']} {data.Debtor['firstname']}") self.logger.warning(f"Vérifier facture N°: {data.data['id']} / {data.Patient['fip_number']} {data.Debtor['code']} {data.Debtor['lastname']} {data.Debtor['firstname']}")
@@ -429,16 +462,52 @@ class ClercAttrib2Biz():
self.logger.warn(f"Débiteur établissement facture N°: {data.data['id']} / {data.Patient['fip_number']} {data.Debtor['name']}") self.logger.warn(f"Débiteur établissement facture N°: {data.data['id']} / {data.Patient['fip_number']} {data.Debtor['name']}")
''' '''
if int(data.Debtor["code"]) == 1 and data.Patient["lastname"] + data.Patient["firstname"] != data.Debtor["lastname"] + data.Debtor["firstname"]: if int(data.Debtor["code"]) == 1:
b_check_debitor = False
if data.Debtor["lastname"] == None:
b_check_debitor = True
data.Debtor["lastname"] = ""
messagebox.showerror(title="Erreur",
message=f"Le débiteur n'a pas de nom, vérifier la facture ATTRIB et vérifier le code débiteur: facture N°: {data.data['id']} / {data.Patient['fip_number']}")
if data.Debtor["firstname"] == None:
b_check_debitor = True
data.Debtor["firstname"] = ""
messagebox.showerror(title="Erreur",
message=f"Le débiteur n'a pas de prénom, vérifier la facture ATTRIB et vérifier le code débiteur: facture N°: {data.data['id']} / {data.Patient['fip_number']}")
if b_check_debitor:
debitor_popup = Check_debitor_popup(self.fenetre, data.Debtor,
self.o_debs.get_names_by_code(data.Debtor['code']),
data.data['id'],
data.Patient['fip_number'], object=self.o_debs)
data.Debtor["code"] = debitor_popup.show()
if data.Patient["lastname"] + data.Patient["firstname"] != data.Debtor["lastname"] + data.Debtor["firstname"]:
self.a_listings["to_check"].append(data.Patient["fip_number"]) self.a_listings["to_check"].append(data.Patient["fip_number"])
print(data.Patient["complement"]) print(data.Patient["complement"])
self.logger.warning(f"Débiteur différents: facture N°: {data.data['id']} / {data.Patient['fip_number']}") self.logger.warning(f"Débiteur différents: facture N°: {data.data['id']} / {data.Patient['fip_number']}")
if int(data.Debtor["code"]) >= 100: if int(data.Debtor["code"]) >= 100:
if "name" not in data.Debtor.keys():
data.Debtor["name"] = "Invalide"
self.logger.warning(
f"Débiteur > 100 sans nom, vérifier la facture ATTRIB et vérifier le code débiteur: facture N°: {data.data['id']} / {data.Patient['fip_number']}")
messagebox.showerror(title="Erreur",
message=f"Débiteur > 100 sans nom de débiteur ou d'établissement, vérifier la facture ATTRIB et vérifier le code débiteur: facture N°: {data.data['id']} / {data.Patient['fip_number']}")
self.a_listings["to_check"].append(data.Patient["fip_number"])
if not self.o_debs.is_in_debitor_name(code=data.Debtor["code"],search_name=data.Debtor["name"]): if not self.o_debs.is_in_debitor_name(code=data.Debtor["code"],search_name=data.Debtor["name"]):
#messagebox.showerror(title="Erreur code débiteur erroné", message=f"Information débiteur incohérente: facture N°: {data.data['id']} / {data.Patient['fip_number']}.\nCode débiteur: {data.Debtor['code']}\nNom du débiteur: {data.Debtor['name']}. \nAurait dû être: {self.o_debs.get_names_by_code(data.Debtor['code'])}") #messagebox.showerror(title="Erreur code débiteur erroné", message=f"Information débiteur incohérente: facture N°: {data.data['id']} / {data.Patient['fip_number']}.\nCode débiteur: {data.Debtor['code']}\nNom du débiteur: {data.Debtor['name']}. \nAurait dû être: {self.o_debs.get_names_by_code(data.Debtor['code'])}")
debitor_popup = Check_debitor_popup(self.fenetre,data.Debtor,self.o_debs.get_names_by_code(data.Debtor['code']),data.data['id'],data.Patient['fip_number'], object=self.o_debs) debitor_popup = Check_debitor_popup(self.fenetre,data.Debtor,self.o_debs.get_names_by_code(data.Debtor['code']),data.data['id'],data.Patient['fip_number'], object=self.o_debs)
data.Debtor["code"] = int(debitor_popup.show()) data.Debtor["code"] = debitor_popup.show()
if data.Debtor["code"] is None or '.' in data.Debtor["code"]:
messagebox.showerror(title="Erreur Critique",
message=f"Les informations de la factures [{data.data['id']}] comportes trop d'erreur arrêt du processus ")
return False
@@ -495,6 +564,7 @@ class ClercAttrib2Biz():
csv_col.data[139] = "COND-30" # Conditions de payement à 30, COND-30 selon config dans winbiz csv_col.data[139] = "COND-30" # Conditions de payement à 30, COND-30 selon config dans winbiz
if "without_transportation" in data.Intervention.keys() and data.Intervention["without_transportation"] == True: if "without_transportation" in data.Intervention.keys() and data.Intervention["without_transportation"] == True:
csv_col.data[15] = "Sans transport" csv_col.data[15] = "Sans transport"
print(f"->NO DEST** {data.data['id']}") print(f"->NO DEST** {data.data['id']}")
@@ -572,6 +642,10 @@ class ClercAttrib2Biz():
if data.Debtor["city"] is not None: if data.Debtor["city"] is not None:
concat_str += con + self.ifNotNull(data.Debtor["postal_code"]) + " " + self.ifNotNull(data.Debtor["city"]) concat_str += con + self.ifNotNull(data.Debtor["postal_code"]) + " " + self.ifNotNull(data.Debtor["city"])
con = "#chr(13)##chr(10)#" con = "#chr(13)##chr(10)#"
if data.Debtor["country_name"] != "Suisse":
concat_str += con + data.Debtor["country_name"]
con = "#chr(13)##chr(10)#"
@@ -598,7 +672,7 @@ class ClercAttrib2Biz():
csv_col.data[40] = datetime.strptime(data.Patient["birthdate"], "%Y-%m-%d").strftime("%d.%m.%Y") csv_col.data[40] = datetime.strptime(data.Patient["birthdate"], "%Y-%m-%d").strftime("%d.%m.%Y")
else: else:
csv_col.data[40] = "" csv_col.data[40] = ""
messagebox.showerror(title="Erreur date de naissance", message=f"La date de naissance de la facture {data.data['id']} est faux: [{data.Patient['birthdate']}], merci de le corriger ") messagebox.showerror(title="Erreur date de naissance", message=f"La date de naissance de la facture {data.data['id']} ({data.Patient['lastname']}) est faux: [{data.Patient['birthdate']}], merci de le corriger ")
csv_col.data[48] = 0 csv_col.data[48] = 0
@@ -657,8 +731,10 @@ class ClercAttrib2Biz():
csv_col.data[109] += ", " + data.Patient["insurance_policy_number"] csv_col.data[109] += ", " + data.Patient["insurance_policy_number"]
csv_col.data[110] = data.Patient["insurance_name"] csv_col.data[110] = data.Patient["insurance_name"]
csv_col.data[111] = datetime.strptime(data.Intervention["start_time"], "%Y-%m-%dT%H:%M:%S%z").strftime( date_PEC = datetime.strptime(data.Intervention["start_time"], "%Y-%m-%dT%H:%M:%S%z").strftime(
"%d.%m.%Y") # Date PEC "%d.%m.%Y")
csv_col.data[51] = date_PEC # Date de ligne articles
csv_col.data[111] =date_PEC # Date PEC
csv_col.data[111] += " - " + datetime.strptime(data.Intervention["start_time"], "%Y-%m-%dT%H:%M:%S%z").strftime( csv_col.data[111] += " - " + datetime.strptime(data.Intervention["start_time"], "%Y-%m-%dT%H:%M:%S%z").strftime(
"%H:%M") # Heure START PEC "%H:%M") # Heure START PEC
@@ -678,8 +754,8 @@ class ClercAttrib2Biz():
csv_col.data[116] = self.ifNotNull(data.Patient["category"]) + " - " + self.ifNotNull(data.Intervention["type"]) csv_col.data[116] = self.ifNotNull(data.Patient["category"]) + " - " + self.ifNotNull(data.Intervention["type"])
csv_col.data[118] = data.Intervention["kilometers"] csv_col.data[118] = data.Intervention["kilometers"]
csv_col.data[135] = data.Intervention["base_name"] csv_col.data[135] = data.Intervention["base_name"]
csv_col.data[136] = 2 if data.Intervention["base_name"] == "Uvrier" else 3 csv_col.data[136] = 3 if data.Debtor["code"] != "101" else "EBILL" #code présentation de facture
csv_col.data[146] = csv_col.data[136] csv_col.data[146] = 3 #Code méthode de payement définit à 3
csv_col.data[168] = 1 if data.Intervention["team_name"] == "Planification" else 2 csv_col.data[168] = 1 if data.Intervention["team_name"] == "Planification" else 2
csv_col.data[169] = data.Patient['insurance_policy_number'] csv_col.data[169] = data.Patient['insurance_policy_number']
@@ -692,6 +768,9 @@ class ClercAttrib2Biz():
wr.writerow(cdr) wr.writerow(cdr)
else: else:
self.save_file(lines,fileName=self.export_filename) self.save_file(lines,fileName=self.export_filename)
return True
def addToIndexs(self,obj,data,cat, key): def addToIndexs(self,obj,data,cat, key):
#self.a_index[cat].append({"key":key,"index":len(obj.data)}) #self.a_index[cat].append({"key":key,"index":len(obj.data)})
if key not in self.a_index[cat]: if key not in self.a_index[cat]:
@@ -699,7 +778,7 @@ class ClercAttrib2Biz():
self.a_index["global"].append(key) self.a_index["global"].append(key)
obj.data.append(data) obj.data.append(data)
def convertFile(self, data, filename): def convertFile(self, data, filename): #à utiliser pour un export avec fichier excel de Thomas
self.count_facture += len(data["invoices"]) self.count_facture += len(data["invoices"])
self.a_listings["to_check"] = [] self.a_listings["to_check"] = []
@@ -714,7 +793,7 @@ class ClercAttrib2Biz():
b_update_debitor = True b_update_debitor = True
print(f"Code débiteur => {data.data['id']}: {data.Debtor['code']}" ) print(f"Code débiteur => {data.data['id']}: {data.Debtor['code']}" )
if data.Debtor["code"] == "None" or '.' in str(data.Debtor["code"]): if data.Debtor["code"] == "None" or '.' in data.Debtor["code"]:
print("ERROR code débiteur") print("ERROR code débiteur")
messagebox.showerror(title="Erreur code débiteur", message=f"Le code débiteur de la facture {data.data['id']} est faux: [{data.Debtor['code']}], merci de le corriger ") messagebox.showerror(title="Erreur code débiteur", message=f"Le code débiteur de la facture {data.data['id']} est faux: [{data.Debtor['code']}], merci de le corriger ")
inp_popup = Input_popup(self.fenetre,default=data.Debtor["code"],factureID=data.data['id'], fip=data.Patient['fip_number']) inp_popup = Input_popup(self.fenetre,default=data.Debtor["code"],factureID=data.data['id'], fip=data.Patient['fip_number'])

View File

@@ -1 +1 @@
VERSION = "20220708-1015" VERSION = "20230124-1508"