Compare commits

...

6 Commits

Author SHA1 Message Date
Ambulance Clerc
d918e5b7aa Changement de version 2022-06-09 00:07:40 +02:00
Ambulance Clerc
d2c132bc24 Débug date de naissance 2022-06-09 00:04:08 +02:00
Ambulance Clerc
934ed40937 Changement popup check adresse 2022-06-08 23:57:16 +02:00
Ambulance Clerc
ff789f409c Changement popup check adresse 2022-06-08 23:44:11 +02:00
Ambulance Clerc
c8e1d42af0 Ajout check des codes débiteurs 2022-06-08 23:42:27 +02:00
Ambulance Clerc
b6ba37b3c9 Débug check_adresses 2022-06-06 18:32:38 +02:00
6 changed files with 292 additions and 127 deletions

146
class_debitors.py Normal file
View File

@@ -0,0 +1,146 @@
import pickle
import os
import shutil
class cls_debitors:
items = []
file_path = ""
def __init__(self, filepath=".temp"):
self.items = []
self.file_path = filepath
if not os.path.exists(self.file_path):
os.makedirs(os.path.abspath(self.file_path))
if not os.path.isfile(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()
def get_names_by_code(self, code):
for deb in self.items:
if deb.code == int(code):
return deb.names
return None
def is_in_debitor_name(self, code, search_name):
names = self.get_names_by_code(code)
if search_name in names:
return True
return False
def add_items(self, code, name):
for deb in self.items:
if deb.code == code:
deb.add_name(name)
return
deb = cls_debitor()
deb.code = code
deb.add_name(name)
self.items.append(deb)
def save_debitors(self):
if len(self.items) > 0:
with open(os.path.join(self.file_path, f"debitors.bin"), "wb") as file:
pickle.dump(self.items, file)
def load_debitors(self):
try:
with open(os.path.join(self.file_path, f"debitors.bin"), "rb") as file:
self.items = pickle.load(file)
except:
print("Erreur lecture fichier débiteur")
class cls_debitor:
code = ""
names = []
def __init__(self):
self.code = ""
self.names = []
def add_name(self, name):
self.names.append(name)
o_debs = cls_debitors(filepath=os.getenv('APPDATA') + '\Attrib2Biz\.temp')
'''
o_deb = cls_debitor()
o_deb.code = 100
o_deb.add_name("HRC Rennaz")
o_deb.add_name("Hôpital riviera chablais Rennaz")
o_debs.items.append(o_deb)
o_deb = cls_debitor()
o_deb.code = 101
o_deb.add_name("HVS")
o_debs.items.append(o_deb)
o_debs.add_items(102,"Clinique Bernoise Montana - Secrétariat médical")
o_debs.add_items(102,"Clinique Bernoise Montana")
o_debs.add_items(100,'Hôpital Riviera-Chablais Vaud-Valais - Fournisseurs ')
o_debs.add_items(101,'Hôpital du Valais - Direction des Finances/Service des fournisseurs ')
o_debs.add_items(102,'Clinique Bernoise Montana - Secrétariat médical ')
o_debs.add_items(103,'Clinique Genevoise de Montana - Comptabilité ')
o_debs.add_items(104,'Clinique SUVA - Comptabilité ')
o_debs.add_items(105,'Fondation de Nant - Comptabilité ')
o_debs.add_items(106,"Service de l'action sociale - Office de l'asile - Administration RAValais")
o_debs.add_items(107,'OCVS - Comptabilité')
o_debs.add_items(108,'Suva Aarau - Service Center')
o_debs.add_items(109,'Suva Basel - Service Center')
o_debs.add_items(110,'Suva Bellinzona - Assicurazione militare - Service Center')
o_debs.add_items(111,'Suva Bellinzona - Service Center')
o_debs.add_items(112,'Suva Bern - Militärversicherung - Service Center')
o_debs.add_items(113,'Suva Chur - Service Center')
o_debs.add_items(114,'Suva Delémont - Service Center')
o_debs.add_items(115,'Suva Fribourg - Service Center')
o_debs.add_items(116,'Suva Genève - Assurance militaire - Service Center')
o_debs.add_items(117,'Suva Genève - Service Center')
o_debs.add_items(118,'Suva La Chaux-de-Fonds - Service Center')
o_debs.add_items(119,'Suva Lausanne - Service Center')
o_debs.add_items(120,'Suva Luzern - Service Center')
o_debs.add_items(121,'Suva Sion - Service Center')
o_debs.add_items(122,'Suva Solothurn - Service Center')
o_debs.add_items(123,'Suva St-Gallen - Militärversicherung - Service Center')
o_debs.add_items(124,'Suva Zurich - Service Center')
o_debs.add_items(125,'Antaé - Allianz Worldwide Care')
o_debs.add_items(126,'Terre des Hommes - Soins aux Enfants ')
o_debs.add_items(127,'REGA')
o_debs.add_items(128,'CNAS Assistance')
o_debs.add_items(129,'Clinique Lucernoise Montana - Comptabilité ')
o_debs.add_items(130,'AAA Alpine Air Ambulance AG')
o_debs.add_items(131,'CHUV')
o_debs.add_items(132,'Clinique CIC Collombey SA - c/o Clinique CIC Suisse SA ')
o_debs.add_items(133,'Clinique CIC Montreux SA ')
o_debs.add_items(134,'Clinique CIC Saxon SA - c/o Clinique CIC Saxon SA ')
o_debs.add_items(135,'Clinique CIC Suisse SA ')
o_debs.add_items(136,'MedSTAR - Swiss Mobile Healthcare Alliance Sàrl')
o_debs.add_items(137,'RFSM - Réseau fribourgeois de santé mentale ')
o_debs.add_items(138,'Swiss Medical Network - GSMN Suisse SA - Clinique de Genolier')
o_debs.add_items(139,'Swiss Medical Network - GSMN Suisse SA - Clinique de Montchoisi')
o_debs.add_items(140,'Swiss Medical Network - GSMN Suisse SA - Clinique Valmont')
o_debs.add_items(141,'Swiss Medical Network - Swiss Medical Network Hospitals SA - Hôpital de la Providence')
o_debs.add_items(142,'Swiss Medical Network - Swiss Medical Network Hospitals SA - Clinique Montbrillant')
o_debs.add_items(143,'Swiss Medical Network - Swiss Medical Network Hospitals SA - Clinique Générale Ste-Anne')
o_debs.add_items(144,'Swiss Medical Network - Swiss Medical Network Hospitals SA - Clinique de Valère')
o_debs.add_items(146,'Leukerbad Clinic - Comptabilité')
o_debs.add_items(147,'Hôpital psychiatrique de Belle-Idée')
o_debs.add_items(148,'Direction générale de la Santé VD')
o_debs.add_items(149,'Swiss Risk & Care')
o_debs.save_debitors()
'''

123
custom_popup.py Normal file
View File

@@ -0,0 +1,123 @@
from tkinter import *
from tkinter import font
from datetime import datetime
class Check_addresses_popup(Toplevel):
x_row = 0
no_selection_possible = False
def __init__(self, parent, item_1=None, item_2=None, debitor=None):
super().__init__(parent)
self.geometry(f"700x300+{parent.winfo_x() + 25 }+{parent.winfo_y() +25 }")
self.resizable(True,True)
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.columnconfigure(0, weight=1)
self.columnconfigure(1, weight=1)
lbf_new = LabelFrame(self, text="Données Attrib")
lbf_new.grid(row=0, column=0, sticky='WE', padx=5, pady=5)
lbf_old = LabelFrame(self, text="Données Winbiz")
lbf_old.grid(row=0, column=1, sticky='NSEW', padx=5, pady=5)
str_address_1 = ""
fonts = []
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="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="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="NPA/Localité:", str1=f"{item_1['postal_code']} {item_1['city']}", str2=f"{item_2.npa} {item_2.city}")
str_address_1 += item_1['insurance_policy_number'].replace('.', '')
str_address_1 += item_1['lastname'].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 += f"{item_1['street']} {item_1['street_number']}"
str_address_1 += f"{item_1['postal_code']} {item_1['city']}"
str_address_2 = ""
str_address_2 += item_2.AVS
str_address_2 += item_2.lastName
str_address_2 += item_2.firstName
str_address_2 += item_2.birth
str_address_2 += f"{item_2.street.strip()}"
str_address_2 += f"{item_2.npa} {item_2.city}"
self.listbox = Listbox(self, height=3, width=35)
self.listbox.grid(row=1,column=0, columnspan= 2, pady=15,padx=15, sticky='NSEW')
self.btn = Button(self, text="Valider", command=self.select)
self.btn.grid(row=2,columnspan=2 , pady=10,padx=10, sticky='NSEW')
for (idd, info) in ((0, "Winbiz"), (1, "Attrib")) :
self.listbox.insert(END, info)
if int(debitor["code"]) >= 100:
self.listbox.delete(0,END)
self.listbox.delete(0, END)
self.listbox.insert(END, f"Aucun changement possible, code débiteur {debitor['code']}")
self.listbox.configure(state='disabled')
self.no_selection_possible = True
if int(debitor["code"]) == 1:
if str_address_1 == str_address_2:
self.listbox.selection_set(0)
print("adresse identique")
else:
self.listbox.selection_set(1)
print(f"adresse différente [{str_address_1}] ({str_address_2})")
def add_compares_element(self,new_frame, old_frame,str1, str2, label):
label_font = font.Font(weight='bold', size=9)
value_color = "black"
con = ""
if str1 != str2:
value_color = "red"
con = "*"
Label(new_frame, text=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(old_frame, text=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")
self.x_row += 1
self.selection = None
def destroy(self):
if self.selection is None:
self.selection = True
super().destroy()
def select(self):
selection = self.listbox.curselection()
if selection:
self.selection = self.listbox.get(selection[0])
self.selection = True if self.selection == "Attrib" else False
self.destroy()
if self.no_selection_possible:
self.destroy()
def show(self):
self.deiconify()
self.wm_protocol("WM_DELETE_WINDOW", self.destroy)
self.wait_window(self)
return self.selection

BIN
debitors_src.bin Normal file

Binary file not shown.

View File

@@ -1 +1 @@
20220606-1821 20220609-0006

146
main.py
View File

@@ -8,7 +8,7 @@ import textwrap
import time import time
import uuid import uuid
import tkinter import tkinter
from datetime import datetime from datetime import datetime
import tkinter.filedialog import tkinter.filedialog
from tkinter import * from tkinter import *
@@ -21,9 +21,11 @@ from threading import *
from class_invoices import * from class_invoices import *
from class_addresses import * from class_addresses import *
from auto_update import * from auto_update import *
from class_debitors import *
from version import * from version import *
#test master 2 from custom_popup import *
src_dir = os.getenv('APPDATA') + "\Attrib2Biz\src" src_dir = os.getenv('APPDATA') + "\Attrib2Biz\src"
dest_dir = os.getenv('APPDATA') + "\Attrib2Biz\output" dest_dir = os.getenv('APPDATA') + "\Attrib2Biz\output"
@@ -45,125 +47,6 @@ if not os.path.exists(temp_dir):
os.makedirs(temp_dir) os.makedirs(temp_dir)
class SuggestionPopup(Toplevel):
x_row = 0
no_selection_possible = False
def __init__(self, parent, item_1=None, item_2=None, debitor=None):
super().__init__(parent)
self.geometry(f"700x300+{parent.winfo_x() + 25 }+{parent.winfo_y() +25 }")
self.resizable(True,True)
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.columnconfigure(0, weight=1)
self.columnconfigure(1, weight=1)
lbf_new = LabelFrame(self, text="Nouveau patient")
lbf_new.grid(row=0, column=0, sticky='WE', padx=5, pady=5)
lbf_old = LabelFrame(self, text="Ancien patient")
lbf_old.grid(row=0, column=1, sticky='NSEW', padx=5, pady=5)
str_address_1 = ""
fonts = []
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="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="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="NPA/Localité:", str1=f"{item_1['postal_code']} {item_1['city']}", str2=f"{item_2.npa} {item_2.city}")
str_address_1 += item_1['insurance_policy_number'].replace('.', '')
str_address_1 += item_1['lastname'].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 += f"{item_1['street']} {item_1['street_number']}"
str_address_1 += f"{item_1['postal_code']} {item_1['city']}"
str_address_2 = ""
str_address_2 += item_2.AVS
str_address_2 += item_2.lastName
str_address_2 += item_2.firstName
str_address_2 += item_2.birth
str_address_2 += f"{item_2.street.strip()}"
str_address_2 += f"{item_2.npa} {item_2.city}"
self.listbox = Listbox(self, height=3, width=35)
self.listbox.grid(row=1,column=0, columnspan= 2, pady=15,padx=15, sticky='NSEW')
self.btn = Button(self, text="Valider", command=self.select)
self.btn.grid(row=2,columnspan=2 , pady=10,padx=10, sticky='NSEW')
for (idd, info) in ((0, "Ancienne"), (1, "Nouvelle")) :
self.listbox.insert(END, info)
if int(debitor["code"]) >= 100:
self.listbox.delete(0,END)
self.listbox.delete(0, END)
self.listbox.insert(END, f"Aucun changement possible, code débiteur {debitor['code']}")
self.listbox.configure(state='disabled')
self.no_selection_possible = True
if int(debitor["code"]) == 1:
if str_address_1 == str_address_2:
self.listbox.selection_set(0)
print("adresse identique")
else:
self.listbox.selection_set(1)
print(f"adresse différente [{str_address_1}] ({str_address_2})")
def add_compares_element(self,new_frame, old_frame,str1, str2, label):
label_font = font.Font(weight='bold', size=9)
value_color = "black"
con = ""
if str1 != str2:
value_color = "red"
con = "*"
Label(new_frame, text=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(old_frame, text=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")
self.x_row += 1
self.selection = None
def destroy(self):
if self.selection is None:
self.selection = 0
super().destroy()
def select(self):
selection = self.listbox.curselection()
if selection:
self.selection = self.listbox.get(selection[0])
self.selection = True if self.selection == "Nouvelle" else False
self.destroy()
if self.no_selection_possible:
self.destroy()
def show(self):
self.deiconify()
self.wm_protocol("WM_DELETE_WINDOW", self.destroy)
self.wait_window(self)
return self.selection
class TextHandler(logging.Handler): class TextHandler(logging.Handler):
"""This class allows you to log to a Tkinter Text or ScrolledText widget""" """This class allows you to log to a Tkinter Text or ScrolledText widget"""
@@ -218,6 +101,9 @@ class ClercAttrib2Biz():
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)
self.fenetre.mainloop() self.fenetre.mainloop()
@@ -227,6 +113,9 @@ class ClercAttrib2Biz():
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)
@@ -464,7 +353,7 @@ class ClercAttrib2Biz():
else: else:
data.Debtor["code"] = str(data.Debtor["code"]).replace('.', '') 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 int(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']}")
@@ -488,11 +377,18 @@ 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 data.Debtor["code"] == 1 and data.Patient["lastname"] + data.Patient["firstname"] != data.Debtor["lastname"] + data.Debtor["firstname"]: if int(data.Debtor["code"]) == 1 and data.Patient["lastname"] + data.Patient["firstname"] != data.Debtor["lastname"] + data.Debtor["firstname"]:
self.a_listings["to_check"].append(data.Patient["fip_number"]) 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 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'])}")
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"])
@@ -505,7 +401,7 @@ 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: if addresses_exist is not None:
popup = SuggestionPopup(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)
b_address_update = popup.show() b_address_update = popup.show()
print(f"Result Popup: {b_address_update}") print(f"Result Popup: {b_address_update}")
else: else:
@@ -635,7 +531,7 @@ class ClercAttrib2Biz():
else: else:
csv_col.data[21] = '' csv_col.data[21] = ''
csv_col.data[40] = data.Patient["birthdate"] csv_col.data[40] = datetime.strptime(data.Patient["birthdate"], "%Y-%m-%d").strftime("%d.%m.%Y")
csv_col.data[48] = 0 csv_col.data[48] = 0

View File

@@ -1 +1 @@
VERSION = "20220606-1821" VERSION = "20220609-0006"