Supression des options depreciate avec adaptation du code
Ajout de la persistance des otpions
This commit is contained in:
293
main.py
293
main.py
@@ -94,20 +94,19 @@ class ClercAttrib2Biz():
|
||||
|
||||
self.check_addresses = BooleanVar(self.fenetre)
|
||||
self.delete_after_parse = BooleanVar(self.fenetre)
|
||||
self.export_format_biz = BooleanVar(self.fenetre)
|
||||
self.export_one_file = BooleanVar(self.fenetre)
|
||||
self.run_excel_after_export = BooleanVar(self.fenetre)
|
||||
self.winbiz_folder_path = StringVar(self.fenetre)
|
||||
|
||||
#Défault value for config
|
||||
self.check_addresses.set(True)
|
||||
self.export_one_file.set(True)
|
||||
self.run_excel_after_export.set(False)
|
||||
self.export_format_biz.set(True)
|
||||
self.delete_after_parse.set(False)
|
||||
self.winbiz_folder_path.set(temp_dir)
|
||||
|
||||
|
||||
self.load_config()
|
||||
|
||||
self.draw_mainWindows()
|
||||
self.refresh_ui()
|
||||
self.read_addresses()
|
||||
|
||||
|
||||
@@ -124,7 +123,11 @@ class ClercAttrib2Biz():
|
||||
|
||||
|
||||
def save_config(self, event=None):
|
||||
self.config["cfg_check_adresses"] = self.check_addresses.get()
|
||||
self.config["cfg_delete_after_parse"] = self.delete_after_parse.get()
|
||||
self.config["cfg_export_one_file"] = self.export_one_file.get()
|
||||
self.config["winbiz_folder_path"] = self.winbiz_folder_path.get()
|
||||
|
||||
with open(os.path.join(temp_dir,"config.dat"),"wb") as pickle_file:
|
||||
pickle.dump(self.config,pickle_file, pickle.HIGHEST_PROTOCOL)
|
||||
def load_config(self):
|
||||
@@ -133,7 +136,18 @@ class ClercAttrib2Biz():
|
||||
with open(os.path.join(temp_dir, "config.dat"), "rb") as pickle_file:
|
||||
self.config = pickle.load(pickle_file)
|
||||
|
||||
self.winbiz_folder_path.set(self.config.get("winbiz_folder_path"))
|
||||
self.check_addresses.set(self.read_config_element("cfg_check_adresses", True))
|
||||
self.delete_after_parse.set(self.read_config_element("cfg_delete_after_parse", False))
|
||||
self.export_one_file.set(self.read_config_element("cfg_export_one_file", True))
|
||||
self.winbiz_folder_path.set(self.read_config_element("winbiz_folder_path", temp_dir))
|
||||
|
||||
def read_config_element(self,name, default):
|
||||
val = self.config.get(name)
|
||||
if val is not None:
|
||||
return val
|
||||
else:
|
||||
return default
|
||||
|
||||
|
||||
def main_timer_fn(self):
|
||||
#print("Pass tick timer main app")
|
||||
@@ -221,12 +235,10 @@ class ClercAttrib2Biz():
|
||||
lbf_3 = LabelFrame(self.fenetre, text="Options")
|
||||
lbf_3.grid(row=0, column=1, rowspan=2, sticky='NSEW', padx=5, pady=5)
|
||||
|
||||
Checkbutton(lbf_3, text="Vérifier les Adresses", variable=self.check_addresses, onvalue=True, offvalue=False).grid(row=0, sticky='W')
|
||||
Checkbutton(lbf_3, text="Supprimer fichiers après conversion", variable= self.delete_after_parse, onvalue=True, offvalue=False).grid(row=1, sticky='W')
|
||||
Checkbutton(lbf_3, text="Export au format .biz", variable= self.export_format_biz, onvalue=True, offvalue=False, command=self.refresh_ui).grid(row=2, sticky='W')
|
||||
Checkbutton(lbf_3, text="Export en 1 seul fichier", variable= self.export_one_file, onvalue=True, offvalue=False, command=self.refresh_ui).grid(row=3, sticky='W')
|
||||
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')
|
||||
Checkbutton(lbf_3, text="Vérifier les Adresses", variable=self.check_addresses, onvalue=True, offvalue=False, command=self.save_config).grid(row=0, sticky='W')
|
||||
Checkbutton(lbf_3, text="Supprimer fichiers après conversion", variable= self.delete_after_parse, onvalue=True, offvalue=False, command=self.save_config).grid(row=1, sticky='W')
|
||||
Checkbutton(lbf_3, text="Export en 1 seul fichier", variable=self.export_one_file, onvalue=True, offvalue=False,
|
||||
command=self.save_config).grid(row=3, sticky='W')
|
||||
textEntry = Entry(lbf_3, textvariable=self.winbiz_folder_path, validate="focusout", validatecommand=self.save_config)
|
||||
textEntry.grid(row=5, sticky="WE", columnspan=3)
|
||||
textEntry.bind("<KeyRelease>", self.save_config)
|
||||
@@ -262,17 +274,6 @@ class ClercAttrib2Biz():
|
||||
self.prompt.destroy()
|
||||
self.b_prompt_open = False
|
||||
|
||||
def refresh_ui(self):
|
||||
#print("pass refresh UI")
|
||||
if self.export_one_file.get() and not self.export_format_biz.get():
|
||||
self.cb_run['state'] = "active"
|
||||
else:
|
||||
self.cb_run['state'] = "disabled"
|
||||
self.run_excel_after_export.set(False)
|
||||
if self.export_format_biz.get():
|
||||
self.cb_run['state'] = "disabled"
|
||||
self.run_excel_after_export.set(False)
|
||||
|
||||
|
||||
def read_addresses(self):
|
||||
if os.path.exists(os.path.join(self.winbiz_folder_path.get(),"adresses.dbf")):
|
||||
@@ -311,24 +312,15 @@ class ClercAttrib2Biz():
|
||||
|
||||
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_one_file.get() and os.path.exists(os.path.join(dest_dir, self.export_filename)):
|
||||
try:
|
||||
os.remove(os.path.join(dest_dir, self.export_filename))
|
||||
except:
|
||||
messagebox.showerror(title="Erreur fichier déjà ouvert", message=f"Le fichier {self.export_filename} est déjà ouvert. Veuillez le fermer et recommencer")
|
||||
return
|
||||
if self.export_one_file.get() and os.path.exists(os.path.join(dest_dir, self.export_filename)):
|
||||
try:
|
||||
os.remove(os.path.join(dest_dir, self.export_filename))
|
||||
except:
|
||||
messagebox.showerror(title="Erreur fichier déjà ouvert", message=f"Le fichier {self.export_filename} est déjà ouvert. Veuillez le fermer et recommencer")
|
||||
return
|
||||
|
||||
print(f"remove {self.export_filename} => {os.path.join(dest_dir, self.export_filename)}")
|
||||
else:
|
||||
if self.export_one_file.get() and os.path.exists(os.path.join(dest_dir, f"src.csv")):
|
||||
try:
|
||||
os.remove(os.path.join(dest_dir, f"src.csv"))
|
||||
except:
|
||||
messagebox.showerror(title="Erreur fichier déjà ouvert", message=f"Le fichier src.csv est déjà ouvert. Veuillez le fermer et recommencer")
|
||||
return
|
||||
print(f"remove {self.export_filename} => {os.path.join(dest_dir, self.export_filename)}")
|
||||
|
||||
print(f"remove src.csv => {os.path.join(dest_dir, 'src.csv')}")
|
||||
|
||||
self.progress_bar["value"] = 0
|
||||
for filename in os.listdir(dir):
|
||||
@@ -338,24 +330,20 @@ class ClercAttrib2Biz():
|
||||
with open(dir + "/" + filename, encoding="utf-8") as f:
|
||||
data = json.load(f)
|
||||
|
||||
if self.export_format_biz.get():
|
||||
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
|
||||
bRet = self.parseFile(data, filename)
|
||||
if bRet:
|
||||
messagebox.showinfo(title="Fin de conversion",
|
||||
message="La conversion s'est terminée avec succès")
|
||||
|
||||
|
||||
|
||||
|
||||
else:
|
||||
self.convertFile(data, filename)
|
||||
if self.delete_after_parse.get():
|
||||
os.remove(dir + "/" + filename)
|
||||
|
||||
self.progress_bar["value"] = x / len(os.listdir(dir)) * 100
|
||||
self.fenetre.update_idletasks()
|
||||
self.nb_facture_var.set(self.count_facture)
|
||||
|
||||
if self.run_excel_after_export.get():
|
||||
self.open_export_file()
|
||||
if self.delete_after_parse.get():
|
||||
os.remove(dir + "/" + filename)
|
||||
|
||||
def ifNotNull(self,value, ret=""):
|
||||
if value == None:
|
||||
@@ -813,207 +801,6 @@ class ClercAttrib2Biz():
|
||||
self.a_index["global"].append(key)
|
||||
obj.data.append(data)
|
||||
|
||||
def convertFile(self, data, filename): #à utiliser pour un export avec fichier excel de Thomas
|
||||
self.count_facture += len(data["invoices"])
|
||||
self.a_listings["to_check"] = []
|
||||
|
||||
|
||||
|
||||
|
||||
lines = []
|
||||
for ele in data["invoices"]:
|
||||
data = cls_Invoice()
|
||||
data.parse_item(ele)
|
||||
|
||||
b_update_debitor = True
|
||||
|
||||
print(f"Code débiteur => {data.data['id']}: {data.Debtor['code']}" )
|
||||
if data.Debtor["code"] == "None" or '.' in data.Debtor["code"]:
|
||||
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 ")
|
||||
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())
|
||||
|
||||
|
||||
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"] :
|
||||
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']}")
|
||||
|
||||
for elem in data.Debtor:
|
||||
pass
|
||||
''' TODO activer ce code quand les débiteur auront un bon numéro
|
||||
try:
|
||||
|
||||
if int(data.Debtor["code"]) > 100:
|
||||
print("code débiteur > 100 => no update data")
|
||||
b_update_debitor = False
|
||||
except:
|
||||
messagebox.showerror(title="Erreur de code débiteur", message=f"il y a une erreur dans le code débiteur, il faut le vérifier. \n(n'est pas un chiffre) {data.Patient['fip_number']}")
|
||||
exit()
|
||||
'''
|
||||
'''
|
||||
if data.Debtor["type"] == "Établissement":
|
||||
self.a_listings["to_check"].append(data.Patient["fip_number"])
|
||||
print(data.Patient["complement"])
|
||||
self.logger.warn(f"Débiteur établissement facture N°: {data.data['id']} / {data.Patient['fip_number']} {data.Debtor['name']}")
|
||||
'''
|
||||
|
||||
|
||||
if data.Debtor["code"] == 1 and 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 data.Patient["complement"] != None :
|
||||
self.a_listings["to_check"].append(data.Patient["fip_number"])
|
||||
print(data.Patient["complement"])
|
||||
self.logger.warning(f"Complément 22 patient: facture N°: {data.data['id']} / {data.Patient['fip_number']}")
|
||||
|
||||
|
||||
if data.Patient['insurance_policy_number'] == None:#Génération d'un code UUID pour remplacer le numéro AVS pour les patients étranger ou AVS inconu
|
||||
data.Patient['insurance_policy_number'] = f"{uuid.uuid4()}"[:10]
|
||||
|
||||
|
||||
|
||||
b_HRF = False
|
||||
sHRF = ""
|
||||
for article in data.Articles:
|
||||
if "code" in article.keys():
|
||||
if article["code"] == "HRF":
|
||||
b_HRF = True
|
||||
sHRF = article["line_1"].replace("h",":")
|
||||
print(f"pass HRF => {data.Patient['fip_number']}")
|
||||
|
||||
break
|
||||
|
||||
|
||||
for article in data.Articles:
|
||||
csv_col = cls_Col(False)
|
||||
pass_article = False
|
||||
|
||||
|
||||
##Donnée globales
|
||||
|
||||
self.addToIndexs(obj=csv_col,data=data.data["id"],cat="invoice",key="ID")
|
||||
self.addToIndexs(obj=csv_col,data=data.data["date"],cat="invoice",key="date") # Date du document
|
||||
self.addToIndexs(obj=csv_col, data=data.data["total_price"], cat="invoice", key="total_price")
|
||||
self.addToIndexs(obj=csv_col, data=data.data["comments"], cat="invoice", key="comments")
|
||||
|
||||
|
||||
whitout_transport = False
|
||||
for elem in data.Intervention:
|
||||
if elem == "without_transportation":
|
||||
whitout_transport = True
|
||||
print(f"without_transportation {data.Patient['fip_number']}")
|
||||
break
|
||||
|
||||
self.addToIndexs(obj=csv_col, data=data.Intervention[elem], cat="intervention", key=elem)
|
||||
|
||||
if whitout_transport:
|
||||
for x in range(8):
|
||||
pass
|
||||
#csv_col.data.append("")
|
||||
self.addToIndexs(obj=csv_col, data="", cat="intervention", key=x)
|
||||
|
||||
|
||||
self.addToIndexs(obj=csv_col, data=whitout_transport, cat="intervention", key="whitout_transport")
|
||||
|
||||
if b_HRF:
|
||||
print(f"pass Change end_time on b_HRF")
|
||||
dt = datetime.fromisoformat(csv_col.data[self.a_index["global"].index("end_time")])
|
||||
month = "0" + str(dt.month) if dt.month < 10 else dt.month
|
||||
csv_col.data[self.a_index["global"].index("end_time")] = f"{dt.year}-{month}-{dt.day}T"+sHRF+":00+01:00"
|
||||
print( csv_col.data[self.a_index["global"].index("end_time")])
|
||||
|
||||
|
||||
|
||||
for elem in data.Patient:
|
||||
if elem == "lastname":
|
||||
if data.Patient[elem] == None:
|
||||
data.Patient[elem] = "Patient inconnu"
|
||||
|
||||
if elem == "street_number":
|
||||
print(f"ADRESS: data.Patient[elem]")
|
||||
if data.Patient[elem] != None and "-" in data.Patient[elem] and "\t" not in data.Patient[elem]:
|
||||
data.Patient[elem] = f"\t{data.Patient[elem]}"
|
||||
print(f"ERROR DEBUG ADRESS: { data.Patient[elem]}")
|
||||
|
||||
|
||||
self.addToIndexs(obj=csv_col, data=data.Patient[elem], cat="patient", key=elem)
|
||||
|
||||
for elem in data.Debtor:
|
||||
if "name" in data.Debtor.keys():
|
||||
pass
|
||||
|
||||
if elem == "street_number":
|
||||
if data.Patient[elem] != None and "-" in data.Patient[elem] and "\t" not in data.Patient[elem]:
|
||||
data.Patient[elem] = f"\t{data.Patient[elem]}"
|
||||
|
||||
|
||||
if elem != "name":
|
||||
csv_col.data.append(data.Debtor[elem])
|
||||
|
||||
if "name" in data.Debtor.keys():
|
||||
csv_col.data.append(data.Debtor["name"])
|
||||
else:
|
||||
csv_col.data.append("")
|
||||
|
||||
# csv_col.data[126] = ' '.join(filter(None,temp_data)) # Débiteur nom
|
||||
|
||||
## Données prestations
|
||||
|
||||
if "code" in article.keys():
|
||||
if article["code"] == "HRF":
|
||||
csv_col = None
|
||||
break
|
||||
else:
|
||||
csv_col.data.append(article["code"])
|
||||
|
||||
|
||||
|
||||
|
||||
else:
|
||||
csv_col.data.append("")
|
||||
|
||||
|
||||
csv_col.data.append(article["line_1"])
|
||||
csv_col.data.append(article["line_2"])
|
||||
|
||||
if "quantity" in article.keys():
|
||||
csv_col.data.append(article["quantity"])
|
||||
else:
|
||||
csv_col.data.append("")
|
||||
|
||||
if "unit_price" in article.keys():
|
||||
csv_col.data.append(article["unit_price"])
|
||||
else:
|
||||
csv_col.data.append("")
|
||||
|
||||
if "unit" in article.keys():
|
||||
csv_col.data.append(article["unit"])
|
||||
else:
|
||||
csv_col.data.append("")
|
||||
|
||||
if "price" in article.keys():
|
||||
csv_col.data.append(article["price"])
|
||||
else:
|
||||
csv_col.data.append("")
|
||||
|
||||
|
||||
lines.append(csv_col.data)
|
||||
csv_col = None
|
||||
|
||||
|
||||
if not self.export_one_file.get():
|
||||
with open(os.path.join(dest_dir, f"bizexdoc_" + filename.replace(".json", "") + ".csv"), "w+", errors='replace', newline='') as csv_file:
|
||||
wr = csv.writer(csv_file, delimiter=';')
|
||||
for cdr in lines:
|
||||
wr.writerow(cdr)
|
||||
else:
|
||||
self.save_file(lines)
|
||||
|
||||
def save_file(self,lines, fileName = "src.csv"):
|
||||
with open(os.path.join(dest_dir, fileName), "a+", errors='replace',newline='') as csv_file:
|
||||
wr = csv.writer(csv_file, delimiter=';')
|
||||
|
Reference in New Issue
Block a user