Compare commits
29 Commits
20220813-0
...
20230425-1
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
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 |
@@ -18,5 +18,6 @@ class cls_addresse:
|
|||||||
firstName = None
|
firstName = None
|
||||||
birth = None
|
birth = None
|
||||||
street = None
|
street = None
|
||||||
|
street_cpl = None
|
||||||
npa = None
|
npa = None
|
||||||
city = None
|
city = None
|
||||||
@@ -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)
|
||||||
|
|||||||
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}")
|
||||||
@@ -9,6 +9,9 @@ class Check_addresses_popup(Toplevel):
|
|||||||
def __init__(self, parent, item_1=None, item_2=None, debitor=None, factureID=""):
|
def __init__(self, parent, item_1=None, item_2=None, debitor=None, factureID=""):
|
||||||
super().__init__(parent)
|
super().__init__(parent)
|
||||||
|
|
||||||
|
if(item_1["complement"] is None):
|
||||||
|
item_1["complement"] = ""
|
||||||
|
|
||||||
self.geometry(f"700x300+{parent.winfo_x() + 25 }+{parent.winfo_y() +25 }")
|
self.geometry(f"700x300+{parent.winfo_x() + 25 }+{parent.winfo_y() +25 }")
|
||||||
self.resizable(True,True)
|
self.resizable(True,True)
|
||||||
self.iconbitmap("./logo_clerc_03X_icon.ico")
|
self.iconbitmap("./logo_clerc_03X_icon.ico")
|
||||||
@@ -32,7 +35,8 @@ class Check_addresses_popup(Toplevel):
|
|||||||
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=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=item_1['firstname'], str2=item_2.firstName)
|
||||||
self.add_compares_element(new_frame=lbf_new, old_frame=lbf_old, label="Date de naissance:", str1=datetime.strptime(item_1['birthdate'], "%Y-%m-%d").strftime("%d.%m.%Y"), str2=item_2.birth)
|
self.add_compares_element(new_frame=lbf_new, old_frame=lbf_old, label="Date de naissance:", str1=datetime.strptime(item_1['birthdate'], "%Y-%m-%d").strftime("%d.%m.%Y"), str2=item_2.birth)
|
||||||
self.add_compares_element(new_frame=lbf_new, old_frame=lbf_old, label="Adresse:", str1=f"{item_1['street']} {item_1['street_number']}", str2=item_2.street)
|
self.add_compares_element(new_frame=lbf_new, old_frame=lbf_old, label="Adresse:", str1=f"{item_1['street'].strip()} {item_1['street_number'].strip()}", str2=item_2.street.strip())
|
||||||
|
self.add_compares_element(new_frame=lbf_new, old_frame=lbf_old, label="Complément:", str1=f"{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"{item_1['postal_code']} {item_1['city']}", str2=f"{item_2.npa} {item_2.city}")
|
self.add_compares_element(new_frame=lbf_new, old_frame=lbf_old, label="NPA/Localité:", str1=f"{item_1['postal_code']} {item_1['city']}", str2=f"{item_2.npa} {item_2.city}")
|
||||||
|
|
||||||
|
|
||||||
@@ -40,7 +44,8 @@ class Check_addresses_popup(Toplevel):
|
|||||||
str_address_1 += item_1['lastname'].strip()
|
str_address_1 += item_1['lastname'].strip()
|
||||||
str_address_1 += item_1['firstname'].strip()
|
str_address_1 += item_1['firstname'].strip()
|
||||||
str_address_1 += datetime.strptime(item_1['birthdate'], "%Y-%m-%d").strftime("%d.%m.%Y")
|
str_address_1 += datetime.strptime(item_1['birthdate'], "%Y-%m-%d").strftime("%d.%m.%Y")
|
||||||
str_address_1 += f"{item_1['street']} {item_1['street_number']}"
|
str_address_1 += f"{item_1['street'].strip()} {item_1['street_number'].strip()}"
|
||||||
|
str_address_1 += f"{item_1['complement'].strip()}"
|
||||||
str_address_1 += f"{item_1['postal_code']} {item_1['city']}"
|
str_address_1 += f"{item_1['postal_code']} {item_1['city']}"
|
||||||
|
|
||||||
|
|
||||||
@@ -54,6 +59,7 @@ class Check_addresses_popup(Toplevel):
|
|||||||
str_address_2 += item_2.firstName
|
str_address_2 += item_2.firstName
|
||||||
str_address_2 += item_2.birth
|
str_address_2 += item_2.birth
|
||||||
str_address_2 += f"{item_2.street.strip()}"
|
str_address_2 += f"{item_2.street.strip()}"
|
||||||
|
str_address_2 += f"{item_2.street_cpl.strip()}"
|
||||||
str_address_2 += f"{item_2.npa} {item_2.city}"
|
str_address_2 += f"{item_2.npa} {item_2.city}"
|
||||||
|
|
||||||
self.listbox = Listbox(self, height=3, width=35)
|
self.listbox = Listbox(self, height=3, width=35)
|
||||||
@@ -94,10 +100,10 @@ class Check_addresses_popup(Toplevel):
|
|||||||
value_color = "red"
|
value_color = "red"
|
||||||
con = "*"
|
con = "*"
|
||||||
|
|
||||||
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).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).grid(row=self.x_row, column=1, sticky="W")
|
||||||
|
|
||||||
self.x_row += 1
|
self.x_row += 1
|
||||||
|
|
||||||
@@ -134,7 +140,7 @@ class Check_debitor_popup(Toplevel):
|
|||||||
self.inp_code = StringVar()
|
self.inp_code = StringVar()
|
||||||
self.inp_code.set(debitor['code'])
|
self.inp_code.set(debitor['code'])
|
||||||
|
|
||||||
self.geometry(f"850x300+{parent.winfo_x() + 25 }+{parent.winfo_y() +25 }")
|
self.geometry(f"900x275+{parent.winfo_x() + 25 }+{parent.winfo_y() +25 }")
|
||||||
self.resizable(True,True)
|
self.resizable(True,True)
|
||||||
self.iconbitmap("./logo_clerc_03X_icon.ico")
|
self.iconbitmap("./logo_clerc_03X_icon.ico")
|
||||||
self.title(f"Incohérence sur les débiteurs {fip} / {factureID}. Code débiteur: {debitor['code']}")
|
self.title(f"Incohérence sur les débiteurs {fip} / {factureID}. Code débiteur: {debitor['code']}")
|
||||||
@@ -142,8 +148,10 @@ class Check_debitor_popup(Toplevel):
|
|||||||
self.columnconfigure(0, weight=1)
|
self.columnconfigure(0, weight=1)
|
||||||
self.columnconfigure(1, weight=1)
|
self.columnconfigure(1, weight=1)
|
||||||
|
|
||||||
|
Label(self,text="Une incohérence a été trouvée entre le code débiteur saisi dans Attrib et le code débiteur saisi dans Attrib. \nIls ne correspondent pas.Le code débiteur présent dans le champs Code Saisi sera utiliser pour la facture winbiz \nMerci de vérifier et modifier le code débiteur puis cliquer sur Valider.", wraplength= 950, justify=LEFT).grid(row=0,column=0, columnspan=2, sticky="W")
|
||||||
|
|
||||||
lbf_new = LabelFrame(self, text="Données Attrib")
|
lbf_new = LabelFrame(self, text="Données Attrib")
|
||||||
lbf_new.grid(row=0, column=0, sticky='WE', padx=5, pady=5)
|
lbf_new.grid(row=1, column=0, sticky='WE', padx=5, pady=5)
|
||||||
|
|
||||||
label_font = font.Font(weight='bold', size=9)
|
label_font = font.Font(weight='bold', size=9)
|
||||||
Label(lbf_new, text="Code saisi", font=label_font).grid(row=0, column=0, sticky="W")
|
Label(lbf_new, text="Code saisi", font=label_font).grid(row=0, column=0, sticky="W")
|
||||||
@@ -151,15 +159,15 @@ class Check_debitor_popup(Toplevel):
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
Label(lbf_new, text="Débiteur sélectionné", font=label_font).grid(row=1, column=0, sticky="W")
|
Label(lbf_new, text="Débiteur sélectionné dans Attrib", font=label_font).grid(row=1, column=0, sticky="W")
|
||||||
text_name = Text(lbf_new, fg="red", height=3,width= 30)
|
text_name = Text(lbf_new, fg="red", height=3,width= 30)
|
||||||
text_name.grid(row=1, column=1, sticky="W")
|
text_name.grid(row=1, column=1, sticky="W")
|
||||||
text_name.insert(END,debitor['name'])
|
text_name.insert(END,debitor['name'])
|
||||||
text_name.configure(state='disabled')
|
text_name.configure(state='disabled')
|
||||||
|
|
||||||
|
|
||||||
lbf_old = LabelFrame(self, text="Nom possible")
|
lbf_old = LabelFrame(self, text="Noms possibles")
|
||||||
lbf_old.grid(row=0, column=1, sticky='NSEW', padx=5, pady=5)
|
lbf_old.grid(row=1, column=1, sticky='NSEW', padx=5, pady=5)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -172,8 +180,12 @@ class Check_debitor_popup(Toplevel):
|
|||||||
self.listbox.configure(state='disabled')
|
self.listbox.configure(state='disabled')
|
||||||
self.no_selection_possible = True
|
self.no_selection_possible = True
|
||||||
|
|
||||||
self.btn = Button(lbf_old, text="Ajouter", command=self.add)
|
menu_bar = Menu(self)
|
||||||
self.btn.grid(row=2, column=0, columnspan= 2, pady=10, padx=10, sticky='NSEW')
|
menu_param = Menu(menu_bar, tearoff=0)
|
||||||
|
menu_param.add_command(label="Ajouter à la liste", command=self.add)
|
||||||
|
menu_bar.add_cascade(label="Paramètre", menu=menu_param)
|
||||||
|
|
||||||
|
self.config(menu=menu_bar)
|
||||||
|
|
||||||
self.btn = Button(self, text="Valider", command=self.destroy)
|
self.btn = Button(self, text="Valider", command=self.destroy)
|
||||||
self.btn.grid(row=2,column=0, columnspan= 2, pady=10,padx=10, sticky='NSEW')
|
self.btn.grid(row=2,column=0, columnspan= 2, pady=10,padx=10, sticky='NSEW')
|
||||||
@@ -223,7 +235,10 @@ class Input_popup(Toplevel):
|
|||||||
|
|
||||||
label_font = font.Font(weight='bold', size=9)
|
label_font = font.Font(weight='bold', size=9)
|
||||||
Label(lbf_new, text="", font=label_font).grid(row=0, column=0, sticky="W")
|
Label(lbf_new, text="", font=label_font).grid(row=0, column=0, sticky="W")
|
||||||
Entry(lbf_new, textvariable=self.inp_value, width=100).grid(row=0, column=1, sticky="W", pady=10)
|
input_entry = Entry(lbf_new, textvariable=self.inp_value, width=100)
|
||||||
|
input_entry.grid(row=0, column=1, sticky="W", pady=10)
|
||||||
|
input_entry.focus()
|
||||||
|
self.after(0,input_entry.focus)
|
||||||
|
|
||||||
|
|
||||||
self.btn = Button(self, text="Valider", command=self.destroy)
|
self.btn = Button(self, text="Valider", command=self.destroy)
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
20220813-0700
|
20230425-1636
|
||||||
185
main.py
185
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,27 @@ 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_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.run_excel_after_export = BooleanVar(self.fenetre)
|
||||||
|
self.winbiz_folder_path = StringVar(self.fenetre)
|
||||||
|
|
||||||
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.run_excel_after_export.set(False)
|
||||||
self.export_format_biz.set(True)
|
self.export_format_biz.set(True)
|
||||||
|
|
||||||
|
self.load_config()
|
||||||
|
|
||||||
self.draw_mainWindows()
|
self.draw_mainWindows()
|
||||||
self.refresh_ui()
|
self.refresh_ui()
|
||||||
self.read_addresses()
|
self.read_addresses()
|
||||||
|
|
||||||
self.o_debs = cls_debitors(filepath=temp_dir)
|
|
||||||
|
|
||||||
|
|
||||||
self.timer = self.fenetre.after(1000, self.main_timer_fn)
|
self.timer = self.fenetre.after(1000, self.main_timer_fn)
|
||||||
@@ -114,10 +123,20 @@ 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):
|
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)
|
||||||
@@ -208,6 +227,17 @@ 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')
|
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 = Checkbutton(lbf_3, text="Lancer la conversion excel", variable=self.run_excel_after_export, onvalue=True, offvalue=False)
|
||||||
self.cb_run.grid(row=4, sticky='W')
|
self.cb_run.grid(row=4, sticky='W')
|
||||||
|
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)
|
||||||
|
menu_param.add_command(label="Affichage des débiteurs", command=self.o_debs.print_all_debs)
|
||||||
|
menu_bar.add_cascade(label="Paramètre", menu=menu_param)
|
||||||
|
|
||||||
|
self.fenetre.config(menu=menu_bar)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -233,7 +263,7 @@ class ClercAttrib2Biz():
|
|||||||
self.b_prompt_open = False
|
self.b_prompt_open = False
|
||||||
|
|
||||||
def refresh_ui(self):
|
def refresh_ui(self):
|
||||||
print("pass refresh UI")
|
#print("pass refresh UI")
|
||||||
if self.export_one_file.get() and not self.export_format_biz.get():
|
if self.export_one_file.get() and not self.export_format_biz.get():
|
||||||
self.cb_run['state'] = "active"
|
self.cb_run['state'] = "active"
|
||||||
else:
|
else:
|
||||||
@@ -245,26 +275,30 @@ class ClercAttrib2Biz():
|
|||||||
|
|
||||||
|
|
||||||
def read_addresses(self):
|
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):
|
if os.path.exists(file_addresses_path):
|
||||||
file = open(file_addresses_path)
|
for record in DBF(file_addresses_path):
|
||||||
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"])
|
||||||
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 ")
|
||||||
|
|
||||||
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,7 +309,7 @@ class ClercAttrib2Biz():
|
|||||||
self.count_facture = 0
|
self.count_facture = 0
|
||||||
x = 0
|
x = 0
|
||||||
|
|
||||||
self.export_filename = f"bizexdoc_export_Attrib_v{datetime.now().year}{datetime.now().month}{datetime.now().month}{datetime.now().hour}{datetime.now().minute}.csv"
|
self.export_filename = f"bizexdoc_export_Attrib_v{datetime.now().year}{datetime.now().month}{datetime.now().day}{datetime.now().hour}{datetime.now().minute}.csv"
|
||||||
|
|
||||||
if self.export_format_biz:
|
if self.export_format_biz:
|
||||||
if self.export_one_file.get() and os.path.exists(os.path.join(dest_dir, self.export_filename)):
|
if self.export_one_file.get() and os.path.exists(os.path.join(dest_dir, self.export_filename)):
|
||||||
@@ -296,7 +330,7 @@ class ClercAttrib2Biz():
|
|||||||
|
|
||||||
print(f"remove src.csv => {os.path.join(dest_dir, 'src.csv')}")
|
print(f"remove src.csv => {os.path.join(dest_dir, 'src.csv')}")
|
||||||
|
|
||||||
|
self.progress_bar["value"] = 0
|
||||||
for filename in os.listdir(dir):
|
for filename in os.listdir(dir):
|
||||||
x += 1
|
x += 1
|
||||||
if ".json" in filename:
|
if ".json" in filename:
|
||||||
@@ -305,11 +339,17 @@ class ClercAttrib2Biz():
|
|||||||
data = json.load(f)
|
data = json.load(f)
|
||||||
|
|
||||||
if self.export_format_biz.get():
|
if self.export_format_biz.get():
|
||||||
self.parseFile(data, filename)
|
bRet = self.parseFile(data, filename)
|
||||||
|
if bRet:
|
||||||
|
messagebox.showinfo(title="Fin de conversion",
|
||||||
|
message="La conversion s'est terminée avec succès")
|
||||||
|
return False
|
||||||
|
|
||||||
else:
|
else:
|
||||||
self.convertFile(data, filename)
|
self.convertFile(data, filename)
|
||||||
if self.delete_after_parse.get():
|
if self.delete_after_parse.get():
|
||||||
os.remove(dir + "/" + filename)
|
os.remove(dir + "/" + filename)
|
||||||
|
|
||||||
self.progress_bar["value"] = x / len(os.listdir(dir)) * 100
|
self.progress_bar["value"] = x / len(os.listdir(dir)) * 100
|
||||||
self.fenetre.update_idletasks()
|
self.fenetre.update_idletasks()
|
||||||
self.nb_facture_var.set(self.count_facture)
|
self.nb_facture_var.set(self.count_facture)
|
||||||
@@ -335,6 +375,16 @@ class ClercAttrib2Biz():
|
|||||||
data.Debtor["firstname"] = data.Debtor["firstname"].strip()
|
data.Debtor["firstname"] = data.Debtor["firstname"].strip()
|
||||||
if data.Debtor["street"] is not None:
|
if data.Debtor["street"] is not None:
|
||||||
data.Debtor["street"] = data.Debtor["street"].strip()
|
data.Debtor["street"] = data.Debtor["street"].strip()
|
||||||
|
if data.data["comments"] is not None:
|
||||||
|
data.data["comments"] = data.data["comments"].strip().replace("\n",'')
|
||||||
|
if data.Debtor["code"] is not None:
|
||||||
|
data.Debtor["code"] = data.Debtor["code"].strip()
|
||||||
|
data.Debtor["code"] = re.sub(r'[^0-9]', '', data.Debtor["code"])
|
||||||
|
|
||||||
|
if "name" in data.Debtor.keys() and data.Debtor["name"] is not None:
|
||||||
|
data.Debtor["name"] = data.Debtor["name"].replace("(facturation)","")
|
||||||
|
data.Debtor["name"] = data.Debtor["name"].strip()
|
||||||
|
|
||||||
|
|
||||||
def check_code_validity(self, code,data):
|
def check_code_validity(self, code,data):
|
||||||
ret = True
|
ret = True
|
||||||
@@ -363,7 +413,8 @@ class ClercAttrib2Biz():
|
|||||||
return False
|
return False
|
||||||
if datetime.strptime(new['birthdate'], "%Y-%m-%d").strftime("%d.%m.%Y") != old.birth:
|
if datetime.strptime(new['birthdate'], "%Y-%m-%d").strftime("%d.%m.%Y") != old.birth:
|
||||||
return False
|
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
|
return False
|
||||||
if f"{new['postal_code']} {new['city']}" != f"{old.npa} {old.city}":
|
if f"{new['postal_code']} {new['city']}" != f"{old.npa} {old.city}":
|
||||||
return False
|
return False
|
||||||
@@ -372,6 +423,7 @@ class ClercAttrib2Biz():
|
|||||||
|
|
||||||
|
|
||||||
def parseFile(self, data, filename):
|
def parseFile(self, data, filename):
|
||||||
|
self.progress_bar["value"] = 0
|
||||||
self.index_counter += 1
|
self.index_counter += 1
|
||||||
lines = []
|
lines = []
|
||||||
self.count_facture += len(data["invoices"])
|
self.count_facture += len(data["invoices"])
|
||||||
@@ -383,32 +435,41 @@ class ClercAttrib2Biz():
|
|||||||
csv_col.data[5] = f""
|
csv_col.data[5] = f""
|
||||||
lines.append(csv_col.data)
|
lines.append(csv_col.data)
|
||||||
|
|
||||||
|
cur_invoice_index = 0
|
||||||
|
|
||||||
x = 70
|
|
||||||
|
|
||||||
for ele in data["invoices"]:
|
for ele in data["invoices"]:
|
||||||
|
cur_invoice_index += 1
|
||||||
|
self.progress_bar["value"] = cur_invoice_index / self.count_facture * 100
|
||||||
b_address_update = True
|
b_address_update = True
|
||||||
data = cls_Invoice()
|
data = cls_Invoice()
|
||||||
data.parse_item(ele)
|
data.parse_item(ele)
|
||||||
|
|
||||||
self.trim_all_data(data)
|
self.trim_all_data(data)
|
||||||
|
|
||||||
|
|
||||||
print(f"Code débiteur => {data.data['id']}: {data.Debtor['code']}")
|
print(f"Code débiteur => {data.data['id']}: {data.Debtor['code']}")
|
||||||
if data.Debtor["code"] is None or '.' in str(data.Debtor["code"]):
|
if data.Debtor["code"] is None or '.' in data.Debtor["code"]:
|
||||||
print("ERROR code débiteur #1")
|
print("ERROR code débiteur #1")
|
||||||
messagebox.showerror(title="Erreur code débiteur", message=f"Le code débiteur de la facture {data.data['id']} est faux: [{data.Debtor['code']}], merci de le corriger ")
|
messagebox.showerror(title="Erreur code débiteur", message=f"Le code débiteur de la facture {data.data['id']} est faux: [{data.Debtor['code']}], merci de le corriger ")
|
||||||
inp_popup = Input_popup(self.fenetre, default=data.Debtor["code"], factureID=data.data['id'], fip=data.Patient['fip_number'])
|
inp_popup = Input_popup(self.fenetre, default=data.Debtor["code"], factureID=data.data['id'], fip=data.Patient['fip_number'])
|
||||||
data.Debtor["code"] = int(inp_popup.show())
|
data.Debtor["code"] = str(inp_popup.show())
|
||||||
|
if data.Debtor["code"] is None or '.' in data.Debtor["code"]:
|
||||||
|
messagebox.showerror(title="Erreur Critique",
|
||||||
|
message=f"Les informations de la factures [{data.data['id']}] comportes trop d'erreur arrêt du processus ")
|
||||||
|
return False
|
||||||
|
|
||||||
if data.Debtor["code"] == 1:
|
if int(data.Debtor["code"]) == 1:
|
||||||
if not self.check_code_validity(data.Debtor["code"],data):
|
if not self.check_code_validity(data.Debtor["code"],data):
|
||||||
|
messagebox.showerror(title="Erreur Critique",
|
||||||
|
message=f"Les informations de la factures [{data.data['id']}] comportes trop d'erreur arrêt du processus ")
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
|
||||||
if int(data.Debtor["code"]) != "1" and data.Debtor["code"] != None and int(data.Debtor["code"]) < 100:
|
if data.Debtor["code"] != "1" and data.Debtor["code"] != None and int(data.Debtor["code"]) < 100:
|
||||||
if data.Patient["fip_number"] not in self.a_listings["to_check"]:
|
if data.Patient["fip_number"] not in self.a_listings["to_check"]:
|
||||||
self.a_listings["to_check"].append(data.Patient["fip_number"])
|
self.a_listings["to_check"].append(data.Patient["fip_number"])
|
||||||
self.logger.warning(f"Vérifier facture N°: {data.data['id']} / {data.Patient['fip_number']} {data.Debtor['code']} {data.Debtor['lastname']} {data.Debtor['firstname']}")
|
#self.logger.warning(f"Vérifier facture N°: {data.data['id']} / {data.Patient['fip_number']} {data.Debtor['code']} {data.Debtor['lastname']} {data.Debtor['firstname']}")
|
||||||
|
|
||||||
for elem in data.Debtor:
|
for elem in data.Debtor:
|
||||||
pass
|
pass
|
||||||
@@ -429,24 +490,61 @@ class ClercAttrib2Biz():
|
|||||||
self.logger.warn(f"Débiteur établissement facture N°: {data.data['id']} / {data.Patient['fip_number']} {data.Debtor['name']}")
|
self.logger.warn(f"Débiteur établissement facture N°: {data.data['id']} / {data.Patient['fip_number']} {data.Debtor['name']}")
|
||||||
'''
|
'''
|
||||||
|
|
||||||
if int(data.Debtor["code"]) == 1 and data.Patient["lastname"] + data.Patient["firstname"] != data.Debtor["lastname"] + data.Debtor["firstname"]:
|
if int(data.Debtor["code"]) == 1:
|
||||||
|
b_check_debitor = False
|
||||||
|
if data.Debtor["lastname"] == None:
|
||||||
|
b_check_debitor = True
|
||||||
|
data.Debtor["lastname"] = ""
|
||||||
|
messagebox.showerror(title="Erreur",
|
||||||
|
message=f"Le débiteur n'a pas de nom, vérifier la facture ATTRIB et vérifier le code débiteur: facture N°: {data.data['id']} / {data.Patient['fip_number']}")
|
||||||
|
if data.Debtor["firstname"] == None:
|
||||||
|
b_check_debitor = True
|
||||||
|
data.Debtor["firstname"] = ""
|
||||||
|
messagebox.showerror(title="Erreur",
|
||||||
|
message=f"Le débiteur n'a pas de prénom, vérifier la facture ATTRIB et vérifier le code débiteur: facture N°: {data.data['id']} / {data.Patient['fip_number']}")
|
||||||
|
if b_check_debitor:
|
||||||
|
debitor_popup = Check_debitor_popup(self.fenetre, data.Debtor,
|
||||||
|
self.o_debs.get_names_by_code(data.Debtor['code']),
|
||||||
|
data.data['id'],
|
||||||
|
data.Patient['fip_number'], object=self.o_debs)
|
||||||
|
data.Debtor["code"] = debitor_popup.show()
|
||||||
|
if data.Patient["lastname"] + data.Patient["firstname"] != data.Debtor["lastname"] + data.Debtor["firstname"]:
|
||||||
self.a_listings["to_check"].append(data.Patient["fip_number"])
|
self.a_listings["to_check"].append(data.Patient["fip_number"])
|
||||||
print(data.Patient["complement"])
|
print(data.Patient["complement"])
|
||||||
self.logger.warning(f"Débiteur différents: facture N°: {data.data['id']} / {data.Patient['fip_number']}")
|
self.logger.warning(f"Débiteur différents: facture N°: {data.data['id']} / {data.Patient['fip_number']}")
|
||||||
|
|
||||||
if int(data.Debtor["code"]) >= 100:
|
if int(data.Debtor["code"]) >= 100:
|
||||||
|
if "name" not in data.Debtor.keys():
|
||||||
|
data.Debtor["name"] = "Invalide"
|
||||||
|
self.logger.warning(
|
||||||
|
f"Débiteur > 100 sans nom, vérifier la facture ATTRIB et vérifier le code débiteur: facture N°: {data.data['id']} / {data.Patient['fip_number']}")
|
||||||
|
messagebox.showerror(title="Erreur",
|
||||||
|
message=f"Débiteur > 100 sans nom de débiteur ou d'établissement, vérifier la facture ATTRIB et vérifier le code débiteur: facture N°: {data.data['id']} / {data.Patient['fip_number']}")
|
||||||
|
self.a_listings["to_check"].append(data.Patient["fip_number"])
|
||||||
|
|
||||||
if not self.o_debs.is_in_debitor_name(code=data.Debtor["code"],search_name=data.Debtor["name"]):
|
if not self.o_debs.is_in_debitor_name(code=data.Debtor["code"],search_name=data.Debtor["name"]):
|
||||||
#messagebox.showerror(title="Erreur code débiteur erroné", message=f"Information débiteur incohérente: facture N°: {data.data['id']} / {data.Patient['fip_number']}.\nCode débiteur: {data.Debtor['code']}\nNom du débiteur: {data.Debtor['name']}. \nAurait dû être: {self.o_debs.get_names_by_code(data.Debtor['code'])}")
|
#messagebox.showerror(title="Erreur code débiteur erroné", message=f"Information débiteur incohérente: facture N°: {data.data['id']} / {data.Patient['fip_number']}.\nCode débiteur: {data.Debtor['code']}\nNom du débiteur: {data.Debtor['name']}. \nAurait dû être: {self.o_debs.get_names_by_code(data.Debtor['code'])}")
|
||||||
debitor_popup = Check_debitor_popup(self.fenetre,data.Debtor,self.o_debs.get_names_by_code(data.Debtor['code']),data.data['id'],data.Patient['fip_number'], object=self.o_debs)
|
debitor_popup = Check_debitor_popup(self.fenetre,data.Debtor,self.o_debs.get_names_by_code(data.Debtor['code']),data.data['id'],data.Patient['fip_number'], object=self.o_debs)
|
||||||
data.Debtor["code"] = int(debitor_popup.show())
|
data.Debtor["code"] = debitor_popup.show()
|
||||||
|
|
||||||
|
|
||||||
|
if data.Debtor["code"] is None or '.' in data.Debtor["code"]:
|
||||||
|
messagebox.showerror(title="Erreur Critique",
|
||||||
|
message=f"Les informations de la factures [{data.data['id']}] comportes trop d'erreur arrêt du processus ")
|
||||||
|
return False
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if data.Patient["complement"] != None:
|
|
||||||
|
|
||||||
|
|
||||||
|
'''
|
||||||
|
Désactivé, plus utile
|
||||||
|
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]
|
||||||
@@ -454,8 +552,11 @@ class ClercAttrib2Biz():
|
|||||||
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 and not self.compare_old_and_new_adresses(new=data.Patient, old=addresses_exist):
|
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'])
|
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()
|
||||||
|
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}")
|
print(f"Result Popup: {b_address_update}")
|
||||||
else:
|
else:
|
||||||
b_address_update = True
|
b_address_update = True
|
||||||
@@ -603,7 +704,7 @@ class ClercAttrib2Biz():
|
|||||||
csv_col.data[40] = datetime.strptime(data.Patient["birthdate"], "%Y-%m-%d").strftime("%d.%m.%Y")
|
csv_col.data[40] = datetime.strptime(data.Patient["birthdate"], "%Y-%m-%d").strftime("%d.%m.%Y")
|
||||||
else:
|
else:
|
||||||
csv_col.data[40] = ""
|
csv_col.data[40] = ""
|
||||||
messagebox.showerror(title="Erreur date de naissance", message=f"La date de naissance de la facture {data.data['id']} est faux: [{data.Patient['birthdate']}], merci de le corriger ")
|
messagebox.showerror(title="Erreur date de naissance", message=f"La date de naissance de la facture {data.data['id']} ({data.Patient['lastname']}) est faux: [{data.Patient['birthdate']}], merci de le corriger ")
|
||||||
csv_col.data[48] = 0
|
csv_col.data[48] = 0
|
||||||
|
|
||||||
|
|
||||||
@@ -685,7 +786,10 @@ 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] = 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[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']
|
||||||
@@ -699,6 +803,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]:
|
||||||
@@ -721,7 +828,7 @@ class ClercAttrib2Biz():
|
|||||||
b_update_debitor = True
|
b_update_debitor = True
|
||||||
|
|
||||||
print(f"Code débiteur => {data.data['id']}: {data.Debtor['code']}" )
|
print(f"Code débiteur => {data.data['id']}: {data.Debtor['code']}" )
|
||||||
if data.Debtor["code"] == "None" or '.' in str(data.Debtor["code"]):
|
if data.Debtor["code"] == "None" or '.' in data.Debtor["code"]:
|
||||||
print("ERROR code débiteur")
|
print("ERROR code débiteur")
|
||||||
messagebox.showerror(title="Erreur code débiteur", message=f"Le code débiteur de la facture {data.data['id']} est faux: [{data.Debtor['code']}], merci de le corriger ")
|
messagebox.showerror(title="Erreur code débiteur", message=f"Le code débiteur de la facture {data.data['id']} est faux: [{data.Debtor['code']}], merci de le corriger ")
|
||||||
inp_popup = Input_popup(self.fenetre,default=data.Debtor["code"],factureID=data.data['id'], fip=data.Patient['fip_number'])
|
inp_popup = Input_popup(self.fenetre,default=data.Debtor["code"],factureID=data.data['id'], fip=data.Patient['fip_number'])
|
||||||
@@ -765,8 +872,8 @@ class ClercAttrib2Biz():
|
|||||||
self.logger.warning(f"Complément 22 patient: facture N°: {data.data['id']} / {data.Patient['fip_number']}")
|
self.logger.warning(f"Complément 22 patient: facture N°: {data.data['id']} / {data.Patient['fip_number']}")
|
||||||
|
|
||||||
|
|
||||||
if data.Patient['insurance_policy_number'] == None:
|
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()}"[:15]
|
data.Patient['insurance_policy_number'] = f"{uuid.uuid4()}"[:10]
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
BIN
requirements.txt
BIN
requirements.txt
Binary file not shown.
@@ -1 +1 @@
|
|||||||
VERSION = "20220813-0700"
|
VERSION = "20230425-1636"
|
||||||
Reference in New Issue
Block a user