Compare commits

...

15 Commits

Author SHA1 Message Date
Ambulance Clerc
d4e5ff6f1b nettoyage du code débiteur 2023-01-24 16:12:08 +01:00
Ambulance Clerc
894a8bbfbb nettoyage du code débiteur 2023-01-24 15:47:51 +01:00
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
5 changed files with 85 additions and 13 deletions

View File

@@ -27,10 +27,13 @@ class cls_debitors:
return None 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

@@ -235,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 @@
20220822-1735 20230124-1611

84
main.py
View File

@@ -1,4 +1,5 @@
import csv import csv
import re
import json import json
import os import os
import logging import logging
@@ -285,7 +286,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)):
@@ -306,7 +307,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:
@@ -315,11 +316,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)
@@ -345,6 +352,16 @@ 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 data.Debtor["code"] is not None:
data.Debtor["code"] = data.Debtor["code"].strip()
data.Debtor["code"] = re.sub(r'[^0-9]', '', data.Debtor["code"])
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
@@ -382,6 +399,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"])
@@ -393,25 +411,34 @@ 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 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"] = str(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 int(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
@@ -439,18 +466,54 @@ 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:
self.a_listings["to_check"].append(data.Patient["fip_number"]) b_check_debitor = False
print(data.Patient["complement"]) if data.Debtor["lastname"] == None:
self.logger.warning(f"Débiteur différents: facture N°: {data.data['id']} / {data.Patient['fip_number']}") 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"])
print(data.Patient["complement"])
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"] = 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
if data.Patient["complement"] != None: if data.Patient["complement"] != None:
self.a_listings["to_check"].append(data.Patient["fip_number"]) self.a_listings["to_check"].append(data.Patient["fip_number"])
@@ -613,7 +676,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
@@ -709,6 +772,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]:

View File

@@ -1 +1 @@
VERSION = "20220822-1735" VERSION = "20230124-1611"