|
|
|
|
@@ -1,4 +1,5 @@
|
|
|
|
|
import csv
|
|
|
|
|
import re
|
|
|
|
|
import json
|
|
|
|
|
import os
|
|
|
|
|
import logging
|
|
|
|
|
@@ -9,6 +10,7 @@ import time
|
|
|
|
|
import uuid
|
|
|
|
|
import tkinter
|
|
|
|
|
from datetime import datetime
|
|
|
|
|
import pickle
|
|
|
|
|
|
|
|
|
|
import tkinter.filedialog
|
|
|
|
|
from tkinter import *
|
|
|
|
|
@@ -17,6 +19,7 @@ from tkinter import messagebox
|
|
|
|
|
from tkinter.ttk import Progressbar
|
|
|
|
|
from tkinter.scrolledtext import ScrolledText
|
|
|
|
|
from threading import *
|
|
|
|
|
from dbfread import DBF
|
|
|
|
|
|
|
|
|
|
from class_invoices import *
|
|
|
|
|
from class_addresses import *
|
|
|
|
|
@@ -87,17 +90,22 @@ class ClercAttrib2Biz():
|
|
|
|
|
self.prompt = None
|
|
|
|
|
self.b_prompt_open = False
|
|
|
|
|
|
|
|
|
|
self.config = {}
|
|
|
|
|
|
|
|
|
|
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)
|
|
|
|
|
|
|
|
|
|
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.load_config()
|
|
|
|
|
|
|
|
|
|
self.draw_mainWindows()
|
|
|
|
|
self.refresh_ui()
|
|
|
|
|
self.read_addresses()
|
|
|
|
|
@@ -115,7 +123,17 @@ class ClercAttrib2Biz():
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def save_config(self, event=None):
|
|
|
|
|
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):
|
|
|
|
|
if not os.path.exists(os.path.join(temp_dir, "config.dat")):
|
|
|
|
|
self.save_config()
|
|
|
|
|
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"))
|
|
|
|
|
|
|
|
|
|
def main_timer_fn(self):
|
|
|
|
|
#print("Pass tick timer main app")
|
|
|
|
|
@@ -209,6 +227,9 @@ class ClercAttrib2Biz():
|
|
|
|
|
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')
|
|
|
|
|
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)
|
|
|
|
|
|
|
|
|
|
menu_bar = Menu(self.fenetre)
|
|
|
|
|
menu_param = Menu(menu_bar, tearoff=0)
|
|
|
|
|
@@ -254,27 +275,30 @@ class ClercAttrib2Biz():
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def read_addresses(self):
|
|
|
|
|
file_addresses_path = os.path.join(dest_dir, f"adresses.txt")
|
|
|
|
|
if os.path.exists(os.path.join(self.winbiz_folder_path.get(),"adresses.dbf")):
|
|
|
|
|
shutil.copyfile(os.path.join(self.winbiz_folder_path.get(),"adresses.dbf"), os.path.join(temp_dir,"adresses.dbf"))
|
|
|
|
|
shutil.copyfile(os.path.join(self.winbiz_folder_path.get(), "adresses.FPT"),os.path.join(temp_dir, "adresses.FPT"))
|
|
|
|
|
else:
|
|
|
|
|
messagebox.showerror(title="Impossible d'ouvrir le fichier d'adresse existantes", message=f"Le fichier {self.winbiz_folder_path.get()} est introuvable. Aucune vérification des adresses possible")
|
|
|
|
|
|
|
|
|
|
file_addresses_path = os.path.join(temp_dir, f"adresses.dbf")
|
|
|
|
|
if os.path.exists(file_addresses_path):
|
|
|
|
|
file = open(file_addresses_path)
|
|
|
|
|
csvreader = csv.reader(file, delimiter=';')
|
|
|
|
|
rows = []
|
|
|
|
|
for row in csvreader:
|
|
|
|
|
rows.append(row)
|
|
|
|
|
for record in DBF(file_addresses_path):
|
|
|
|
|
o_addresse = cls_addresse()
|
|
|
|
|
o_addresse.AVS = row[5]
|
|
|
|
|
o_addresse.lastName = row[9]
|
|
|
|
|
o_addresse.firstName = row[10]
|
|
|
|
|
o_addresse.birth = row[38]
|
|
|
|
|
o_addresse.street = row[11]
|
|
|
|
|
o_addresse.street_cpl = row[12]
|
|
|
|
|
o_addresse.npa = row[13]
|
|
|
|
|
o_addresse.city = row[15]
|
|
|
|
|
o_addresse.AVS = str(record["AD_CODE"])
|
|
|
|
|
o_addresse.lastName =str( record["AD_NOM"])
|
|
|
|
|
o_addresse.firstName = str(record["AD_PRENOM"])
|
|
|
|
|
if record["AD_NAISSAN"] is not None:
|
|
|
|
|
o_addresse.birth = datetime.strptime(str(record["AD_NAISSAN"]), "%Y-%m-%d").strftime("%d.%m.%Y")
|
|
|
|
|
|
|
|
|
|
else:
|
|
|
|
|
o_addresse.birth = ""
|
|
|
|
|
o_addresse.street =str( record["AD_RUE_2"])
|
|
|
|
|
o_addresse.street_cpl =str( record["AD_RUE_1"])
|
|
|
|
|
o_addresse.npa =str( record["AD_NPA"])
|
|
|
|
|
o_addresse.city = str(record["AD_VILLE"])
|
|
|
|
|
self.addresses.add_addresse(o_addresse)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
file.close()
|
|
|
|
|
|
|
|
|
|
logging.warning(f"Chargement du fichier adresses.dbf terminé ! {len(self.addresses.items)} adresses trouvées ")
|
|
|
|
|
else:
|
|
|
|
|
messagebox.showwarning(title="Impossible d'ouvrir le fichier d'adresse existantes", message=f"Le fichier {file_addresses_path} est introuvable. Aucune vérification des adresses possible")
|
|
|
|
|
|
|
|
|
|
@@ -285,7 +309,7 @@ class ClercAttrib2Biz():
|
|
|
|
|
self.count_facture = 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_one_file.get() and os.path.exists(os.path.join(dest_dir, self.export_filename)):
|
|
|
|
|
@@ -306,7 +330,7 @@ class ClercAttrib2Biz():
|
|
|
|
|
|
|
|
|
|
print(f"remove src.csv => {os.path.join(dest_dir, 'src.csv')}")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
self.progress_bar["value"] = 0
|
|
|
|
|
for filename in os.listdir(dir):
|
|
|
|
|
x += 1
|
|
|
|
|
if ".json" in filename:
|
|
|
|
|
@@ -315,11 +339,17 @@ class ClercAttrib2Biz():
|
|
|
|
|
data = json.load(f)
|
|
|
|
|
|
|
|
|
|
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:
|
|
|
|
|
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)
|
|
|
|
|
@@ -345,6 +375,16 @@ class ClercAttrib2Biz():
|
|
|
|
|
data.Debtor["firstname"] = data.Debtor["firstname"].strip()
|
|
|
|
|
if data.Debtor["street"] is not None:
|
|
|
|
|
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):
|
|
|
|
|
ret = True
|
|
|
|
|
@@ -373,7 +413,8 @@ class ClercAttrib2Biz():
|
|
|
|
|
return False
|
|
|
|
|
if datetime.strptime(new['birthdate'], "%Y-%m-%d").strftime("%d.%m.%Y") != old.birth:
|
|
|
|
|
return False
|
|
|
|
|
if f"{new['street']} {new['street_number']}" != old.street:
|
|
|
|
|
if f"{new['street'].strip()} {new['street_number'].strip()}" != f"{old.street.strip()}":
|
|
|
|
|
print(f"({new['street'].strip()} {new['street_number'].strip()}) != [" + old.street.strip()+"]")
|
|
|
|
|
return False
|
|
|
|
|
if f"{new['postal_code']} {new['city']}" != f"{old.npa} {old.city}":
|
|
|
|
|
return False
|
|
|
|
|
@@ -382,6 +423,7 @@ class ClercAttrib2Biz():
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def parseFile(self, data, filename):
|
|
|
|
|
self.progress_bar["value"] = 0
|
|
|
|
|
self.index_counter += 1
|
|
|
|
|
lines = []
|
|
|
|
|
self.count_facture += len(data["invoices"])
|
|
|
|
|
@@ -393,32 +435,41 @@ class ClercAttrib2Biz():
|
|
|
|
|
csv_col.data[5] = f""
|
|
|
|
|
lines.append(csv_col.data)
|
|
|
|
|
|
|
|
|
|
cur_invoice_index = 0
|
|
|
|
|
|
|
|
|
|
x = 70
|
|
|
|
|
|
|
|
|
|
for ele in data["invoices"]:
|
|
|
|
|
cur_invoice_index += 1
|
|
|
|
|
self.progress_bar["value"] = cur_invoice_index / self.count_facture * 100
|
|
|
|
|
b_address_update = True
|
|
|
|
|
data = cls_Invoice()
|
|
|
|
|
data.parse_item(ele)
|
|
|
|
|
|
|
|
|
|
self.trim_all_data(data)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
print(f"Code débiteur => {data.data['id']}: {data.Debtor['code']}")
|
|
|
|
|
if data.Debtor["code"] is None or '.' in data.Debtor["code"]:
|
|
|
|
|
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 ")
|
|
|
|
|
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"] 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 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
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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']}")
|
|
|
|
|
#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
|
|
|
|
|
@@ -439,24 +490,61 @@ class ClercAttrib2Biz():
|
|
|
|
|
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"]:
|
|
|
|
|
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"]) == 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"])
|
|
|
|
|
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 "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"]):
|
|
|
|
|
#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)
|
|
|
|
|
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:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
'''
|
|
|
|
|
Désactivé, plus utile
|
|
|
|
|
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 patient: facture N°: {data.data['id']} / {data.Patient['fip_number']}")
|
|
|
|
|
|
|
|
|
|
'''
|
|
|
|
|
|
|
|
|
|
if data.Patient['insurance_policy_number'] == None:
|
|
|
|
|
data.Patient['insurance_policy_number'] = f"{uuid.uuid4()}"[:15]
|
|
|
|
|
@@ -464,8 +552,11 @@ class ClercAttrib2Biz():
|
|
|
|
|
if self.check_addresses.get():
|
|
|
|
|
addresses_exist = self.addresses.get_item_by_AVS(data.Patient['insurance_policy_number'].replace(".", ""))
|
|
|
|
|
if addresses_exist is not None and not self.compare_old_and_new_adresses(new=data.Patient, old=addresses_exist):
|
|
|
|
|
|
|
|
|
|
popup = Check_addresses_popup(self.fenetre, item_1=data.Patient, item_2=addresses_exist, debitor=data.Debtor, factureID=data.data['id'])
|
|
|
|
|
b_address_update = popup.show()
|
|
|
|
|
self.logger.warning(
|
|
|
|
|
f"Adresse connue donnée attrib conservé: [{b_address_update}]: {data.data['id']} / {data.Patient['fip_number']} {data.Debtor['code']} {data.Debtor['lastname']} {data.Debtor['firstname']}")
|
|
|
|
|
print(f"Result Popup: {b_address_update}")
|
|
|
|
|
else:
|
|
|
|
|
b_address_update = True
|
|
|
|
|
@@ -613,7 +704,7 @@ class ClercAttrib2Biz():
|
|
|
|
|
csv_col.data[40] = datetime.strptime(data.Patient["birthdate"], "%Y-%m-%d").strftime("%d.%m.%Y")
|
|
|
|
|
else:
|
|
|
|
|
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
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@@ -695,7 +786,10 @@ class ClercAttrib2Biz():
|
|
|
|
|
csv_col.data[116] = self.ifNotNull(data.Patient["category"]) + " - " + self.ifNotNull(data.Intervention["type"])
|
|
|
|
|
csv_col.data[118] = data.Intervention["kilometers"]
|
|
|
|
|
csv_col.data[135] = data.Intervention["base_name"]
|
|
|
|
|
csv_col.data[136] = 3 if data.Debtor["code"] != "101" else "EBILL" #code présentation de facture
|
|
|
|
|
if data.Debtor["code"] == "100" or data.Debtor["code"] == "101":
|
|
|
|
|
csv_col.data[136] = "EBILL" #code présentation de facture
|
|
|
|
|
else:
|
|
|
|
|
csv_col.data[136] = 3 #code présentation de facture
|
|
|
|
|
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[169] = data.Patient['insurance_policy_number']
|
|
|
|
|
@@ -709,6 +803,9 @@ class ClercAttrib2Biz():
|
|
|
|
|
wr.writerow(cdr)
|
|
|
|
|
else:
|
|
|
|
|
self.save_file(lines,fileName=self.export_filename)
|
|
|
|
|
|
|
|
|
|
return True
|
|
|
|
|
|
|
|
|
|
def addToIndexs(self,obj,data,cat, key):
|
|
|
|
|
#self.a_index[cat].append({"key":key,"index":len(obj.data)})
|
|
|
|
|
if key not in self.a_index[cat]:
|
|
|
|
|
@@ -775,8 +872,8 @@ class ClercAttrib2Biz():
|
|
|
|
|
self.logger.warning(f"Complément 22 patient: facture N°: {data.data['id']} / {data.Patient['fip_number']}")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if data.Patient['insurance_policy_number'] == None:
|
|
|
|
|
data.Patient['insurance_policy_number'] = f"{uuid.uuid4()}"[:15]
|
|
|
|
|
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]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|