Compare commits
65 Commits
20220609-0
...
20231128-1
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e8b52bcd17 | ||
|
|
90bb7e53b0 | ||
|
|
56c23ae53c | ||
|
|
5998bf48cb | ||
|
|
5311208184 | ||
|
|
86a2b99f39 | ||
|
|
eb0e4b4429 | ||
|
|
4387a1d00b | ||
|
|
c722af1091 | ||
|
|
92b3a76733 | ||
|
|
5adbc77555 | ||
|
|
1146ff01c7 | ||
|
|
e4c075f6ef | ||
|
|
f05a56bc5a | ||
|
|
b19340e149 | ||
|
|
d313ddefac | ||
|
|
f3d94d330c | ||
|
|
c198410cd3 | ||
|
|
48353c6f98 | ||
|
|
a94b2cc0d6 | ||
|
|
9ba8998c32 | ||
|
|
513556f0a3 | ||
|
|
81a9717716 | ||
|
|
3ff3416b39 | ||
|
|
e430117d40 | ||
|
|
5060490ac4 | ||
|
|
d4e5ff6f1b | ||
|
|
894a8bbfbb | ||
|
|
4d2e2f2351 | ||
|
|
6f09de76ab | ||
|
|
eee31f3a1d | ||
|
|
bf1533ccdb | ||
|
|
36ce8a2488 | ||
|
|
891a29e39b | ||
|
|
2f9d8c1da8 | ||
|
|
191821d81d | ||
|
|
99a89585b5 | ||
|
|
e60ed4b5fa | ||
|
|
4c75a6167b | ||
|
|
842ae5fb69 | ||
|
|
355d17810f | ||
|
|
510587d3eb | ||
|
|
ff22572e56 | ||
|
|
54873a2715 | ||
|
|
1ce77f4e08 | ||
|
|
7be1f15c63 | ||
|
|
cdc7205ab7 | ||
|
|
5b0f7a1119 | ||
|
|
5c7f9c1f4e | ||
|
|
975595b592 | ||
|
|
1907632dca | ||
|
|
6d9b991c04 | ||
|
|
e35a24030d | ||
|
|
1a7d649651 | ||
|
|
0d499cd0f6 | ||
|
|
94c8c64ced | ||
|
|
79f6c3df6d | ||
|
|
6a28aeaa16 | ||
|
|
42f32873ea | ||
|
|
e4137d4780 | ||
|
|
b10b14c420 | ||
|
|
0a1cbd31b8 | ||
|
|
dc7ace0446 | ||
|
|
6a46da5a89 | ||
|
|
e8d1bf7696 |
@@ -7,6 +7,7 @@ class cls_Addresses:
|
|||||||
self.items.append(items)
|
self.items.append(items)
|
||||||
def get_item_by_AVS(self, seek):
|
def get_item_by_AVS(self, seek):
|
||||||
for item in self.items:
|
for item in self.items:
|
||||||
|
|
||||||
if item.AVS == seek:
|
if item.AVS == seek:
|
||||||
return item
|
return item
|
||||||
|
|
||||||
@@ -18,5 +19,7 @@ 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
|
||||||
|
addr_2 = None
|
||||||
@@ -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)
|
||||||
@@ -33,11 +43,11 @@ class cls_debitors:
|
|||||||
|
|
||||||
def add_items(self, code, name):
|
def add_items(self, code, name):
|
||||||
for deb in self.items:
|
for deb in self.items:
|
||||||
if deb.code == code:
|
if deb.code == int(code):
|
||||||
deb.add_name(name)
|
deb.add_name(name)
|
||||||
return
|
return
|
||||||
deb = cls_debitor()
|
deb = cls_debitor()
|
||||||
deb.code = code
|
deb.code = int(code)
|
||||||
deb.add_name(name)
|
deb.add_name(name)
|
||||||
self.items.append(deb)
|
self.items.append(deb)
|
||||||
|
|
||||||
|
|||||||
@@ -16,6 +16,57 @@ class cls_Invoice:
|
|||||||
self.data = obj
|
self.data = obj
|
||||||
self.a_index = {"invoice": [], "intervention": [], "patient": [], "debtor": [], "articles": []}
|
self.a_index = {"invoice": [], "intervention": [], "patient": [], "debtor": [], "articles": []}
|
||||||
self.index_counter = 0
|
self.index_counter = 0
|
||||||
|
self.format_debitor_addr_2()
|
||||||
|
def format_debitor_addr_2(self):
|
||||||
|
debitor = self.Debtor
|
||||||
|
con = ""
|
||||||
|
concat_str = ""
|
||||||
|
if "name" in debitor.keys():
|
||||||
|
if debitor["name"] is not None:
|
||||||
|
concat_str += con + debitor["name"]
|
||||||
|
# con = "#chr(13)##chr(10)#"
|
||||||
|
con = "\n"
|
||||||
|
|
||||||
|
if debitor["gender"] is not None:
|
||||||
|
concat_str += con + "Monsieur" if debitor["gender"] == "Masculin" else con + "Madame"
|
||||||
|
# con = "#chr(13)##chr(10)#"
|
||||||
|
con = "\n"
|
||||||
|
if debitor["lastname"] is not None:
|
||||||
|
concat_str += con + self.ifNotNull(debitor["lastname"]) + " " + self.ifNotNull(
|
||||||
|
debitor["firstname"])
|
||||||
|
# con = "#chr(13)##chr(10)#"
|
||||||
|
con = "\n"
|
||||||
|
if debitor["complement"] is not None:
|
||||||
|
concat_str += con + debitor["complement"]
|
||||||
|
# con = "#chr(13)##chr(10)#"
|
||||||
|
con = "\n"
|
||||||
|
if debitor["street"] is not None:
|
||||||
|
concat_str += con + self.ifNotNull(debitor["street"]) + " " + self.ifNotNull(
|
||||||
|
debitor["street_number"])
|
||||||
|
# con = "#chr(13)##chr(10)#"
|
||||||
|
con = "\n"
|
||||||
|
if debitor["city"] is not None:
|
||||||
|
concat_str += con + self.ifNotNull(debitor["postal_code"]) + " " + self.ifNotNull(
|
||||||
|
debitor["city"])
|
||||||
|
# con = "#chr(13)##chr(10)#"
|
||||||
|
con = "\n"
|
||||||
|
if debitor["country_name"] != "Suisse":
|
||||||
|
concat_str += con + debitor["country_name"]
|
||||||
|
# con = "#chr(13)##chr(10)#"
|
||||||
|
con = "\n"
|
||||||
|
self.Patient["addr_2"] = concat_str
|
||||||
|
self.Patient["selfish"] = self.is_addr_2_selfish(self.Patient)
|
||||||
|
def is_addr_2_selfish(self, patient):
|
||||||
|
print(patient)
|
||||||
|
temp_addr_2 = str(patient["addr_2"]).replace("Monsieur","").replace("Madame","").replace("\n","").replace(" ","")
|
||||||
|
str_compare = self.ifNotNull(patient['lastname']).replace('.','') + self.ifNotNull(patient['firstname']).replace('.','') + self.ifNotNull(patient['complement']).strip()+ self.ifNotNull(patient['street']).strip() + self.ifNotNull(patient['street_number']).strip() + self.ifNotNull(patient['postal_code']).strip() +self.ifNotNull(patient['city']).strip()
|
||||||
|
str_compare = str_compare.replace(" ","")
|
||||||
|
print(f"is_addr_2_selfish ? {str_compare} <> {temp_addr_2} = {str_compare == temp_addr_2}")
|
||||||
|
return str_compare == temp_addr_2
|
||||||
|
def ifNotNull(self, value, ret=""):
|
||||||
|
if value == None or value == "None":
|
||||||
|
return ret
|
||||||
|
return value.strip()
|
||||||
|
|
||||||
class cls_Col:
|
class cls_Col:
|
||||||
data = []
|
data = []
|
||||||
|
|||||||
16
counter.py
Normal file
16
counter.py
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
import os
|
||||||
|
|
||||||
|
def count_chars_in_folder(folder_path):
|
||||||
|
total_chars = 0
|
||||||
|
for filename in os.listdir(folder_path):
|
||||||
|
filepath = os.path.join(folder_path, filename)
|
||||||
|
if os.path.isfile(filepath):
|
||||||
|
with open(filepath, 'r') as file:
|
||||||
|
content = file.read()
|
||||||
|
total_chars += len(content)
|
||||||
|
print(f"fichier {filepath} = { len(content)}")
|
||||||
|
return total_chars
|
||||||
|
|
||||||
|
folder_path = '.' # mettre le chemin absolu vers le dossier ici
|
||||||
|
total_chars = count_chars_in_folder(folder_path)
|
||||||
|
print(f"Le nombre total de caractères dans les fichiers du dossier {folder_path} est : {total_chars}")
|
||||||
215
custom_popup.py
215
custom_popup.py
@@ -1,17 +1,21 @@
|
|||||||
from tkinter import *
|
from tkinter import *
|
||||||
from tkinter import font
|
from tkinter import font
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
|
from tkinter import messagebox
|
||||||
|
|
||||||
class Check_addresses_popup(Toplevel):
|
class Check_addresses_popup(Toplevel):
|
||||||
x_row = 0
|
x_row = 0
|
||||||
no_selection_possible = False
|
no_selection_possible = False
|
||||||
def __init__(self, parent, item_1=None, item_2=None, debitor=None):
|
def __init__(self, parent, item_1=None, item_2=None, debitor=None, factureID=""):
|
||||||
super().__init__(parent)
|
super().__init__(parent)
|
||||||
|
|
||||||
self.geometry(f"700x300+{parent.winfo_x() + 25 }+{parent.winfo_y() +25 }")
|
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.resizable(True,True)
|
||||||
self.iconbitmap("./logo_clerc_03X_icon.ico")
|
self.iconbitmap("./logo_clerc_03X_icon.ico")
|
||||||
self.title(f"Choix de l'adresse à conserver {item_1['fip_number']}. Code débiteur: {debitor['code']}")
|
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(0, weight=1)
|
||||||
self.columnconfigure(1, weight=1)
|
self.columnconfigure(1, weight=1)
|
||||||
@@ -22,25 +26,42 @@ class Check_addresses_popup(Toplevel):
|
|||||||
lbf_old = LabelFrame(self, text="Données Winbiz")
|
lbf_old = LabelFrame(self, text="Données Winbiz")
|
||||||
lbf_old.grid(row=0, column=1, sticky='NSEW', padx=5, pady=5)
|
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 = ""
|
str_address_1 = ""
|
||||||
|
|
||||||
fonts = []
|
fonts = []
|
||||||
|
|
||||||
self.x_row = 0
|
self.x_row = 0
|
||||||
self.add_compares_element(new_frame=lbf_new,old_frame=lbf_old,label="N° AVS de l'adresse:",str1=item_1['insurance_policy_number'].replace('.',''), str2=item_2.AVS)
|
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=item_1['lastname'], str2=item_2.lastName)
|
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=item_1['firstname'], str2=item_2.firstName)
|
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(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(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"{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"{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="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="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}")
|
||||||
|
|
||||||
|
|
||||||
str_address_1 += item_1['insurance_policy_number'].replace('.', '')
|
if int(debitor["code"]) < 100:
|
||||||
str_address_1 += item_1['lastname'].strip()
|
if item_1["selfish"]:
|
||||||
str_address_1 += item_1['firstname'].strip()
|
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 += 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"{self.ifNotNull(item_1['street']).strip()} {self.ifNotNull(item_1['street_number']).strip()}"
|
||||||
str_address_1 += f"{item_1['postal_code']} {item_1['city']}"
|
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'])}"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -53,13 +74,14 @@ 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)
|
||||||
self.listbox.grid(row=1,column=0, columnspan= 2, pady=15,padx=15, sticky='NSEW')
|
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 = Button(self, text="Valider", command=self.select)
|
||||||
self.btn.grid(row=2,columnspan=2 , pady=10,padx=10, sticky='NSEW')
|
self.btn.grid(row=3,columnspan=2 , pady=10,padx=10, sticky='NSEW')
|
||||||
|
|
||||||
for (idd, info) in ((0, "Winbiz"), (1, "Attrib")) :
|
for (idd, info) in ((0, "Winbiz"), (1, "Attrib")) :
|
||||||
self.listbox.insert(END, info)
|
self.listbox.insert(END, info)
|
||||||
@@ -81,22 +103,28 @@ class Check_addresses_popup(Toplevel):
|
|||||||
self.listbox.selection_set(1)
|
self.listbox.selection_set(1)
|
||||||
print(f"adresse différente [{str_address_1}] ({str_address_2})")
|
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):
|
||||||
|
|
||||||
def add_compares_element(self,new_frame, old_frame,str1, str2, label):
|
|
||||||
label_font = font.Font(weight='bold', size=9)
|
label_font = font.Font(weight='bold', size=9)
|
||||||
|
|
||||||
value_color = "black"
|
value_color_1 = "black"
|
||||||
|
value_color_2 = "black"
|
||||||
con = ""
|
con = ""
|
||||||
if str1 != str2:
|
if str1 != str2:
|
||||||
value_color = "red"
|
value_color_1 = "red"
|
||||||
|
value_color_2 = "red"
|
||||||
con = "*"
|
con = "*"
|
||||||
|
if force_color_1 is not None:
|
||||||
|
value_color_1 = force_color_1
|
||||||
|
|
||||||
Label(new_frame, text=label, font=label_font).grid(row=self.x_row, column=0, sticky="W")
|
Label(new_frame, text=str(label), font=label_font).grid(row=self.x_row, column=0, sticky="W")
|
||||||
Label(new_frame, text=con + str1 + con, fg=value_color).grid(row=self.x_row, column=1, 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=label, font=label_font).grid(row=self.x_row, column=0, 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 + str2 + con, fg=value_color).grid(row=self.x_row, column=1, 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.x_row += 1
|
||||||
|
|
||||||
@@ -121,3 +149,140 @@ class Check_addresses_popup(Toplevel):
|
|||||||
self.wait_window(self)
|
self.wait_window(self)
|
||||||
return self.selection
|
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()
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
20220609-0006
|
20231128-1639
|
||||||
|
|||||||
589
main.py
589
main.py
@@ -1,4 +1,5 @@
|
|||||||
import csv
|
import csv
|
||||||
|
import re
|
||||||
import json
|
import json
|
||||||
import os
|
import os
|
||||||
import logging
|
import logging
|
||||||
@@ -9,6 +10,7 @@ import time
|
|||||||
import uuid
|
import uuid
|
||||||
import tkinter
|
import tkinter
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
|
import pickle
|
||||||
|
|
||||||
import tkinter.filedialog
|
import tkinter.filedialog
|
||||||
from tkinter import *
|
from tkinter import *
|
||||||
@@ -17,6 +19,7 @@ from tkinter import messagebox
|
|||||||
from tkinter.ttk import Progressbar
|
from tkinter.ttk import Progressbar
|
||||||
from tkinter.scrolledtext import ScrolledText
|
from tkinter.scrolledtext import ScrolledText
|
||||||
from threading import *
|
from threading import *
|
||||||
|
from dbfread import DBF
|
||||||
|
|
||||||
from class_invoices import *
|
from class_invoices import *
|
||||||
from class_addresses import *
|
from class_addresses import *
|
||||||
@@ -74,6 +77,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
|
||||||
@@ -86,22 +90,26 @@ class ClercAttrib2Biz():
|
|||||||
self.prompt = None
|
self.prompt = None
|
||||||
self.b_prompt_open = False
|
self.b_prompt_open = False
|
||||||
|
|
||||||
|
self.config = {}
|
||||||
|
|
||||||
self.check_addresses = BooleanVar(self.fenetre)
|
self.check_addresses = BooleanVar(self.fenetre)
|
||||||
self.delete_after_parse = 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.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.check_addresses.set(True)
|
||||||
self.export_one_file.set(True)
|
self.export_one_file.set(True)
|
||||||
self.run_excel_after_export.set(False)
|
self.delete_after_parse.set(False)
|
||||||
self.export_format_biz.set(True)
|
self.winbiz_folder_path.set(temp_dir)
|
||||||
|
|
||||||
|
|
||||||
|
self.load_config()
|
||||||
|
|
||||||
self.draw_mainWindows()
|
self.draw_mainWindows()
|
||||||
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)
|
||||||
@@ -114,10 +122,39 @@ 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):
|
||||||
|
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.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 add_statistique(self, stat_name, stat_value):
|
||||||
|
a_stats = None
|
||||||
|
if "a_stats" in self.config:
|
||||||
|
a_stats = self.config[""]
|
||||||
|
|
||||||
|
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):
|
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)
|
||||||
@@ -202,12 +239,21 @@ class ClercAttrib2Biz():
|
|||||||
lbf_3 = LabelFrame(self.fenetre, text="Options")
|
lbf_3 = LabelFrame(self.fenetre, text="Options")
|
||||||
lbf_3.grid(row=0, column=1, rowspan=2, sticky='NSEW', padx=5, pady=5)
|
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="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).grid(row=1, 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 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,
|
||||||
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')
|
command=self.save_config).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)
|
textEntry = Entry(lbf_3, textvariable=self.winbiz_folder_path, validate="focusout", validatecommand=self.save_config)
|
||||||
self.cb_run.grid(row=4, sticky='W')
|
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)
|
||||||
|
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)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -232,39 +278,33 @@ class ClercAttrib2Biz():
|
|||||||
self.prompt.destroy()
|
self.prompt.destroy()
|
||||||
self.b_prompt_open = False
|
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):
|
def read_addresses(self):
|
||||||
file_addresses_path = os.path.join(dest_dir, f"adresses.csv")
|
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):
|
if os.path.exists(file_addresses_path):
|
||||||
file = open(file_addresses_path)
|
for record in DBF(file_addresses_path, load=True):
|
||||||
csvreader = csv.reader(file, delimiter=';')
|
|
||||||
rows = []
|
|
||||||
for row in csvreader:
|
|
||||||
rows.append(row)
|
|
||||||
o_addresse = cls_addresse()
|
o_addresse = cls_addresse()
|
||||||
o_addresse.AVS = row[5]
|
o_addresse.AVS = str(record["AD_CODE"])
|
||||||
o_addresse.lastName = row[9]
|
o_addresse.lastName =str( record["AD_NOM"])
|
||||||
o_addresse.firstName = row[10]
|
o_addresse.firstName = str(record["AD_PRENOM"])
|
||||||
o_addresse.birth = row[38]
|
if record["AD_NAISSAN"] is not None:
|
||||||
o_addresse.street = row[12]
|
o_addresse.birth = datetime.strptime(str(record["AD_NAISSAN"]), "%Y-%m-%d").strftime("%d.%m.%Y")
|
||||||
o_addresse.npa = row[13]
|
|
||||||
o_addresse.city = row[15]
|
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"])
|
||||||
|
o_addresse.addr_2 = str(record["AD_ADR2"]).replace("\r\n","\n")
|
||||||
self.addresses.add_addresse(o_addresse)
|
self.addresses.add_addresse(o_addresse)
|
||||||
|
logging.warning(f"Chargement du fichier adresses.dbf terminé ! {len(self.addresses.items)} adresses trouvées ")
|
||||||
print(self.addresses.items)
|
|
||||||
file.close()
|
|
||||||
|
|
||||||
else:
|
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")
|
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")
|
||||||
|
|
||||||
@@ -275,9 +315,8 @@ 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_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)):
|
||||||
try:
|
try:
|
||||||
os.remove(os.path.join(dest_dir, self.export_filename))
|
os.remove(os.path.join(dest_dir, self.export_filename))
|
||||||
@@ -286,17 +325,9 @@ class ClercAttrib2Biz():
|
|||||||
return
|
return
|
||||||
|
|
||||||
print(f"remove {self.export_filename} => {os.path.join(dest_dir, self.export_filename)}")
|
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 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:
|
||||||
@@ -304,26 +335,102 @@ class ClercAttrib2Biz():
|
|||||||
with open(dir + "/" + filename, encoding="utf-8") as f:
|
with open(dir + "/" + filename, encoding="utf-8") as f:
|
||||||
data = json.load(f)
|
data = json.load(f)
|
||||||
|
|
||||||
if self.export_format_biz.get():
|
bRet = self.parseFile(data, filename)
|
||||||
self.parseFile(data, filename)
|
if bRet:
|
||||||
else:
|
messagebox.showinfo(title="Fin de conversion",
|
||||||
self.convertFile(data, filename)
|
message="La conversion s'est terminée avec succès")
|
||||||
if self.delete_after_parse.get():
|
|
||||||
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)
|
||||||
|
if self.delete_after_parse.get():
|
||||||
if self.run_excel_after_export.get():
|
os.remove(dir + "/" + filename)
|
||||||
self.open_export_file()
|
|
||||||
|
|
||||||
def ifNotNull(self,value, ret=""):
|
def ifNotNull(self,value, ret=""):
|
||||||
if value == None:
|
if value == None:
|
||||||
return ret
|
return ret
|
||||||
return value.strip()
|
return value.strip()
|
||||||
|
|
||||||
|
def trim_all_data(self, data):
|
||||||
|
if data.Patient["lastname"] is not None:
|
||||||
|
data.Patient["lastname"] = data.Patient["lastname"].strip()
|
||||||
|
if data.Patient["firstname"] is not None:
|
||||||
|
data.Patient["firstname"] = data.Patient["firstname"].strip()
|
||||||
|
if data.Patient["street"] is not None:
|
||||||
|
data.Patient["street"] = data.Patient["street"].strip()
|
||||||
|
if data.Debtor["lastname"] is not None:
|
||||||
|
data.Debtor["lastname"] = data.Debtor["lastname"].strip()
|
||||||
|
if data.Debtor["firstname"] is not None:
|
||||||
|
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
|
||||||
|
check_patients = ["firstname", "lastname", "street"]
|
||||||
|
check_Debtor = ["firstname", "lastname", "street"]
|
||||||
|
if code == 1:
|
||||||
|
for check in check_patients:
|
||||||
|
if data.Patient[check] is None:
|
||||||
|
ret = False
|
||||||
|
for check in check_Debtor:
|
||||||
|
if data.Debtor[check] is None:
|
||||||
|
ret = False
|
||||||
|
if not ret:
|
||||||
|
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 ret
|
||||||
|
|
||||||
|
def compare_old_and_new_adresses(self, new, old, code):
|
||||||
|
print(f"compare_old_and_new_adresses ")
|
||||||
|
if self.ifNotNull(new['insurance_policy_number']).replace('.','') != old.AVS:
|
||||||
|
print("compare adresse exit avs")
|
||||||
|
return False
|
||||||
|
if self.ifNotNull(new['lastname']).replace('.','') != old.lastName:
|
||||||
|
print("compare adresse exit lastname")
|
||||||
|
return False
|
||||||
|
if self.ifNotNull(new['firstname']).replace('.','') != old.firstName:
|
||||||
|
print("compare adresse exit firstname")
|
||||||
|
return False
|
||||||
|
if datetime.strptime(self.ifNotNull(new['birthdate']), "%Y-%m-%d").strftime("%d.%m.%Y") != old.birth:
|
||||||
|
print("compare adresse exit date")
|
||||||
|
return False
|
||||||
|
if f"{self.ifNotNull(new['street']).strip()} {self.ifNotNull(new['street_number']).strip()}" != f"{self.ifNotNull(old.street).strip()}":
|
||||||
|
print(f"compare adresse exit ({self.ifNotNull(new['street']).strip()} {self.ifNotNull(new['street_number']).strip()}) != [" + self.ifNotNull(old.street).strip()+"]")
|
||||||
|
return False
|
||||||
|
if f"{self.ifNotNull(new['postal_code'])} {self.ifNotNull(new['city'])}" != f"{self.ifNotNull(old.npa)} {self.ifNotNull(old.city)}":
|
||||||
|
print("compare adresse exit city")
|
||||||
|
return False
|
||||||
|
if new["addr_2"] != old.addr_2 and int(code) < 100:
|
||||||
|
if not new["selfish"]:
|
||||||
|
print(f"Exit selfish")
|
||||||
|
return False
|
||||||
|
if old.addr_2 != "None":
|
||||||
|
print(f"Exit addr_2 = {old.addr_2}/{new['selfish']}")
|
||||||
|
print(old.addr_2 != "None")
|
||||||
|
return False
|
||||||
|
print("return True (same)")
|
||||||
|
return True
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
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"])
|
||||||
@@ -335,28 +442,43 @@ 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
|
total_facture_total = 0
|
||||||
|
total_facture_amount = 0
|
||||||
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)
|
||||||
|
|
||||||
|
|
||||||
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")
|
print("ERROR code débiteur #1")
|
||||||
messagebox.showerror(title="Erreur code débiteur erroné", 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 ")
|
||||||
if data.Debtor["code"] is None:
|
inp_popup = Input_popup(self.fenetre, default=data.Debtor["code"], factureID=data.data['id'], fip=data.Patient['fip_number'])
|
||||||
data.Debtor["code"] = 1
|
data.Debtor["code"] = str(inp_popup.show())
|
||||||
else:
|
if data.Debtor["code"] is None or '.' in data.Debtor["code"]:
|
||||||
data.Debtor["code"] = str(data.Debtor["code"]).replace('.', '')
|
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" and data.Debtor["code"] != None and int(data.Debtor["code"]) < 100:
|
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"]:
|
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']}")
|
||||||
|
|
||||||
for elem in data.Debtor:
|
for elem in data.Debtor:
|
||||||
pass
|
pass
|
||||||
@@ -377,32 +499,74 @@ 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)
|
||||||
|
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
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
'''
|
||||||
|
Désactivé, plus utile
|
||||||
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"])
|
||||||
print(data.Patient["complement"])
|
print(data.Patient["complement"])
|
||||||
self.logger.warning(f"Complément patient: facture N°: {data.data['id']} / {data.Patient['fip_number']}")
|
self.logger.warning(f"Complément patient: facture N°: {data.data['id']} / {data.Patient['fip_number']}")
|
||||||
|
'''
|
||||||
|
|
||||||
if data.Patient['insurance_policy_number'] == None:
|
if data.Patient['insurance_policy_number'] == None:
|
||||||
data.Patient['insurance_policy_number'] = f"{uuid.uuid4()}"[:15]
|
data.Patient['insurance_policy_number'] = f"{uuid.uuid4()}"[:15]
|
||||||
|
|
||||||
if self.check_addresses.get():
|
if self.check_addresses.get():
|
||||||
addresses_exist = self.addresses.get_item_by_AVS(data.Patient['insurance_policy_number'].replace(".", ""))
|
addresses_exist = self.addresses.get_item_by_AVS(data.Patient['insurance_policy_number'].replace(".", ""))
|
||||||
if addresses_exist is not None:
|
if addresses_exist is not None and not self.compare_old_and_new_adresses(new=data.Patient, old=addresses_exist, code=data.Debtor['code']):
|
||||||
popup = Check_addresses_popup(self.fenetre, item_1=data.Patient, item_2=addresses_exist, debitor=data.Debtor)
|
|
||||||
|
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()
|
b_address_update = popup.show()
|
||||||
|
mode_selected = "Attrib" if b_address_update else "Winbiz"
|
||||||
|
self.logger.warning(
|
||||||
|
f"Adresse connue données {mode_selected} conservées: {data.data['id']} / {data.Patient['fip_number']} {data.Debtor['code']} {data.Debtor['lastname']} {data.Debtor['firstname']}")
|
||||||
print(f"Result Popup: {b_address_update}")
|
print(f"Result Popup: {b_address_update}")
|
||||||
else:
|
else:
|
||||||
b_address_update = True
|
b_address_update = True
|
||||||
@@ -412,7 +576,11 @@ class ClercAttrib2Biz():
|
|||||||
|
|
||||||
b_HRF = False
|
b_HRF = False
|
||||||
sHRF = ""
|
sHRF = ""
|
||||||
|
|
||||||
|
facture_total = 0
|
||||||
for article in data.Articles:
|
for article in data.Articles:
|
||||||
|
if 'price' in article:
|
||||||
|
facture_total += float(article['price'])
|
||||||
|
|
||||||
if "code" in article.keys():
|
if "code" in article.keys():
|
||||||
if article["code"] == "HRF":
|
if article["code"] == "HRF":
|
||||||
@@ -420,20 +588,30 @@ class ClercAttrib2Biz():
|
|||||||
sHRF = article["line_1"].replace("h", ":")
|
sHRF = article["line_1"].replace("h", ":")
|
||||||
print(f"pass HRF => {data.Patient['fip_number']} = {b_HRF}")
|
print(f"pass HRF => {data.Patient['fip_number']} = {b_HRF}")
|
||||||
#self.logger.warning(f"HRF: {data.data['id']}")
|
#self.logger.warning(f"HRF: {data.data['id']}")
|
||||||
break
|
|
||||||
|
|
||||||
|
|
||||||
|
print(f"Lecture de la facture #{cur_invoice_index} {ele['id']} montant total = {ele['total_price']} <> {facture_total}")
|
||||||
|
if float(ele['total_price']) != facture_total:
|
||||||
|
print(f"ERROR NOT SAME PRICE")
|
||||||
|
total_facture_total += facture_total
|
||||||
|
total_facture_amount += float(ele['total_price'])
|
||||||
|
|
||||||
for article in data.Articles:
|
for article in data.Articles:
|
||||||
self.bs_counter += 1
|
self.bs_counter += 1
|
||||||
csv_col = cls_Col(True)
|
csv_col = cls_Col(True)
|
||||||
|
|
||||||
|
print(article)
|
||||||
|
if "code" in article.keys() and article["code"] == "HRF":
|
||||||
|
break
|
||||||
|
|
||||||
|
|
||||||
##Donnée globales
|
##Donnée globales
|
||||||
csv_col.data[0] = data.data["id"] # N° document
|
csv_col.data[0] = data.data["id"] # N° document
|
||||||
csv_col.data[1] = 20 # Type of document 20 = facture débiteur
|
csv_col.data[1] = 20 # Type of document 20 = facture débiteur
|
||||||
csv_col.data[2] = datetime.strptime(data.data["date"], "%Y-%m-%d").strftime("%d.%m.%Y") # Date du document
|
csv_col.data[2] = datetime.strptime(data.data["date"], "%Y-%m-%d").strftime("%d.%m.%Y") # Date du document
|
||||||
csv_col.data[4] = data.Patient["fip_number"] # Référence
|
csv_col.data[4] = data.Patient["fip_number"] # Référence
|
||||||
csv_col.data[10] = "<AUTO>" # Compte collectif du tiers = <AUTO>
|
csv_col.data[10] = "<AUTO>" # Compte collectif du tiers = <AUTO>
|
||||||
|
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:
|
||||||
@@ -488,31 +666,7 @@ class ClercAttrib2Biz():
|
|||||||
print("NON mise à jour de l'adresse")
|
print("NON mise à jour de l'adresse")
|
||||||
|
|
||||||
if int(data.Debtor["code"]) > 1:
|
if int(data.Debtor["code"]) > 1:
|
||||||
con = ""
|
csv_col.data[42] = data.Patient["addr_2"].replace("\n", "#chr(13)##chr(10)#") #Adresse de livraison
|
||||||
concat_str = ""
|
|
||||||
if "name" in data.Debtor.keys():
|
|
||||||
concat_str += con + data.Debtor["name"]
|
|
||||||
con = "#chr(13)##chr(10)#"
|
|
||||||
|
|
||||||
if data.Debtor["gender"] is not None:
|
|
||||||
concat_str += con + "Monsieur" if data.Debtor["gender"] == "Masculin" else con + "Madame"
|
|
||||||
con = "#chr(13)##chr(10)#"
|
|
||||||
if data.Debtor["lastname"] is not None:
|
|
||||||
concat_str += con + self.ifNotNull(data.Debtor["lastname"]) + " " + self.ifNotNull(data.Debtor["firstname"])
|
|
||||||
con = "#chr(13)##chr(10)#"
|
|
||||||
if data.Debtor["street"] is not None:
|
|
||||||
concat_str += con + self.ifNotNull(data.Debtor["street"]) + " " + self.ifNotNull(data.Debtor["street_number"])
|
|
||||||
con = "#chr(13)##chr(10)#"
|
|
||||||
if data.Debtor["complement"] is not None:
|
|
||||||
concat_str += con + data.Debtor["complement"]
|
|
||||||
con = "#chr(13)##chr(10)#"
|
|
||||||
if data.Debtor["city"] is not None:
|
|
||||||
concat_str += con + self.ifNotNull(data.Debtor["postal_code"]) + " " + self.ifNotNull(data.Debtor["city"])
|
|
||||||
con = "#chr(13)##chr(10)#"
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
csv_col.data[42] = concat_str #Adresse de livraison
|
|
||||||
else:
|
else:
|
||||||
csv_col.data[19] = data.Debtor["code"] # Code adresse à récupérer dans recherche d'adresse automatisée
|
csv_col.data[19] = data.Debtor["code"] # Code adresse à récupérer dans recherche d'adresse automatisée
|
||||||
csv_col.data[22] = data.Debtor["lastname"]
|
csv_col.data[22] = data.Debtor["lastname"]
|
||||||
@@ -531,7 +685,11 @@ class ClercAttrib2Biz():
|
|||||||
else:
|
else:
|
||||||
csv_col.data[21] = ''
|
csv_col.data[21] = ''
|
||||||
|
|
||||||
|
if data.Patient["birthdate"] is not None:
|
||||||
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:
|
||||||
|
csv_col.data[40] = ""
|
||||||
|
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
|
||||||
|
|
||||||
|
|
||||||
@@ -582,15 +740,18 @@ class ClercAttrib2Biz():
|
|||||||
csv_col.data[72] = "BU - 73 - aff"
|
csv_col.data[72] = "BU - 73 - aff"
|
||||||
csv_col.data[73] = 0
|
csv_col.data[73] = 0
|
||||||
|
|
||||||
csv_col.data[115] = self.ifNotNull(data.Patient["lastname"]) + " " + self.ifNotNull(data.Patient["firstname"])
|
#Objet facture
|
||||||
csv_col.data[108] = data.Patient["complement"]
|
csv_col.data[108] = self.ifNotNull(data.Patient["lastname"]) + " " + self.ifNotNull(data.Patient["firstname"])
|
||||||
|
csv_col.data[115] = data.Patient["complement"]
|
||||||
csv_col.data[109] = datetime.strptime(data.Patient["birthdate"], "%Y-%m-%d").strftime("%d.%m.%Y") if data.Patient["birthdate"] is not None else ""
|
csv_col.data[109] = datetime.strptime(data.Patient["birthdate"], "%Y-%m-%d").strftime("%d.%m.%Y") if data.Patient["birthdate"] is not None else ""
|
||||||
if data.Patient["insurance_policy_number"] is not None and '-' not in data.Patient["insurance_policy_number"]:
|
if data.Patient["insurance_policy_number"] is not None and '-' not in data.Patient["insurance_policy_number"]:
|
||||||
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
|
||||||
|
|
||||||
@@ -610,13 +771,18 @@ 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
|
if data.Debtor["code"] == "100" or data.Debtor["code"] == "101" or data.Debtor["code"] == "158":
|
||||||
csv_col.data[146] = csv_col.data[136]
|
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[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']
|
||||||
|
|
||||||
lines.append(csv_col.data)
|
lines.append(csv_col.data)
|
||||||
csv_col = None
|
csv_col = None
|
||||||
|
|
||||||
|
print(f"total_facture_total = {total_facture_total} <> {total_facture_amount}")
|
||||||
if not self.export_one_file.get():
|
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:
|
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=';')
|
wr = csv.writer(csv_file, delimiter=';')
|
||||||
@@ -624,6 +790,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]:
|
||||||
@@ -631,206 +800,6 @@ 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):
|
|
||||||
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 str(data.Debtor["code"]):
|
|
||||||
print("ERROR code débiteur")
|
|
||||||
messagebox.showerror(title="Erreur code débiteur erroné", message=f"Le code débiteur de la facture {data.data['id']} est faux: [{data.Debtor['code']}], merci de le corriger ")
|
|
||||||
data.Debtor["code"] = str(data.Debtor["code"]).replace('.', '')
|
|
||||||
|
|
||||||
|
|
||||||
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:
|
|
||||||
data.Patient['insurance_policy_number'] = f"{uuid.uuid4()}"[:15]
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
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"):
|
def save_file(self,lines, fileName = "src.csv"):
|
||||||
with open(os.path.join(dest_dir, fileName), "a+", errors='replace',newline='') as csv_file:
|
with open(os.path.join(dest_dir, fileName), "a+", errors='replace',newline='') as csv_file:
|
||||||
wr = csv.writer(csv_file, delimiter=';')
|
wr = csv.writer(csv_file, delimiter=';')
|
||||||
|
|||||||
BIN
requirements.txt
BIN
requirements.txt
Binary file not shown.
@@ -1 +1,2 @@
|
|||||||
VERSION = "20220609-0006"
|
VERSION = "20231128-1639"
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user