Signed-off-by: Cherif <cbalde@mysy-training.com>
master_Elyos_FI
Cherif 2025-09-10 22:03:58 +02:00
parent b53cc9d622
commit 756d308c9a
182 changed files with 63408 additions and 13513 deletions

View File

@ -4,25 +4,30 @@
<option name="autoReloadType" value="SELECTIVE" />
</component>
<component name="ChangeListManager">
<list default="true" id="c6d0259a-16e1-410d-91a1-830590ee2a08" name="Changes" comment="30/07/2025 -18h">
<list default="true" id="c6d0259a-16e1-410d-91a1-830590ee2a08" name="Changes" comment="10/08/2025 - 10h">
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
<change beforePath="$PROJECT_DIR$/E_Sign_Document.py" beforeDir="false" afterPath="$PROJECT_DIR$/E_Sign_Document.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/Collection_Historique.py" beforeDir="false" afterPath="$PROJECT_DIR$/Collection_Historique.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/GlobalVariable.py" beforeDir="false" afterPath="$PROJECT_DIR$/GlobalVariable.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/Inscription_mgt.py" beforeDir="false" afterPath="$PROJECT_DIR$/Inscription_mgt.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/Job_Cron.py" beforeDir="false" afterPath="$PROJECT_DIR$/Job_Cron.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/Job_Cron_Common.py" beforeDir="false" afterPath="$PROJECT_DIR$/Job_Cron_Common.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/Log/log_file.log" beforeDir="false" afterPath="$PROJECT_DIR$/Log/log_file.log" afterDir="false" />
<change beforePath="$PROJECT_DIR$/Session_Formation.py" beforeDir="false" afterPath="$PROJECT_DIR$/Session_Formation.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/Session_Formation_Sequence.py" beforeDir="false" afterPath="$PROJECT_DIR$/Session_Formation_Sequence.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/Template/invoice_RIB_PortCities_perso_tpl.html" beforeDir="false" afterPath="$PROJECT_DIR$/Template/invoice_RIB_PortCities_perso_tpl.html" afterDir="false" />
<change beforePath="$PROJECT_DIR$/crm_opportunite.py" beforeDir="false" afterPath="$PROJECT_DIR$/crm_opportunite.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/base_partner_catalog_config.py" beforeDir="false" afterPath="$PROJECT_DIR$/base_partner_catalog_config.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/class_mgt.py" beforeDir="false" afterPath="$PROJECT_DIR$/class_mgt.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/competence.py" beforeDir="false" afterPath="$PROJECT_DIR$/competence.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/email_inscription_mgt.py" beforeDir="false" afterPath="$PROJECT_DIR$/email_inscription_mgt.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/email_mgt.py" beforeDir="false" afterPath="$PROJECT_DIR$/email_mgt.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/emargement.py" beforeDir="false" afterPath="$PROJECT_DIR$/emargement.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/formulaire_mgt.py" beforeDir="false" afterPath="$PROJECT_DIR$/formulaire_mgt.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/invoice_paiement_mgt.py" beforeDir="false" afterPath="$PROJECT_DIR$/invoice_paiement_mgt.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/main.py" beforeDir="false" afterPath="$PROJECT_DIR$/main.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/partner_client.py" beforeDir="false" afterPath="$PROJECT_DIR$/partner_client.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/partner_base_setup.py" beforeDir="false" afterPath="$PROJECT_DIR$/partner_base_setup.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/partner_invoice.py" beforeDir="false" afterPath="$PROJECT_DIR$/partner_invoice.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/partner_order.py" beforeDir="false" afterPath="$PROJECT_DIR$/partner_order.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/prj_common.py" beforeDir="false" afterPath="$PROJECT_DIR$/prj_common.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/ressources_humaines.py" beforeDir="false" afterPath="$PROJECT_DIR$/ressources_humaines.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/survey_mgt.py" beforeDir="false" afterPath="$PROJECT_DIR$/survey_mgt.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/temp_direct/Attestation_Ftion435_00131.pdf" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/temp_direct/Attestation_Ftion435_06813.pdf" beforeDir="false" />
@ -180,6 +185,7 @@
<change beforePath="$PROJECT_DIR$/temp_direct/templateimportstagiairescbv2_20250721135300.csv" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/temp_direct/templateimportstagiairescbv2_20250721135322.csv" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/tools_cherif/tools_cherif.py" beforeDir="false" afterPath="$PROJECT_DIR$/tools_cherif/tools_cherif.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/unite_enseignement_mgt.py" beforeDir="false" afterPath="$PROJECT_DIR$/unite_enseignement_mgt.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/wrapper.py" beforeDir="false" afterPath="$PROJECT_DIR$/wrapper.py" afterDir="false" />
</list>
<option name="SHOW_DIALOG" value="false" />
@ -623,7 +629,7 @@
<option name="project" value="LOCAL" />
<updated>1747251650255</updated>
</task>
<option name="localTasksCounter" value="493" />
<option name="localTasksCounter" value="495" />
<servers />
</component>
<component name="Vcs.Log.Tabs.Properties">
@ -665,7 +671,6 @@
</option>
</component>
<component name="VcsManagerConfiguration">
<MESSAGE value="14/05/2025 - 20h" />
<MESSAGE value="Init - 29/05/2025" />
<MESSAGE value="Init - 29/05/2025 - FI" />
<MESSAGE value="31/05/2025 - 20h" />
@ -690,6 +695,7 @@
<MESSAGE value="12/07/2025 - 12h" />
<MESSAGE value="qsd" />
<MESSAGE value="30/07/2025 -18h" />
<option name="LAST_COMMIT_MESSAGE" value="30/07/2025 -18h" />
<MESSAGE value="10/08/2025 - 10h" />
<option name="LAST_COMMIT_MESSAGE" value="10/08/2025 - 10h" />
</component>
</project>

View File

@ -192,6 +192,8 @@ Recupération de l'historique des actions associé à un element.
Un element est defini par :
- related_collection
- related_collection_recid
IMPORTANT : On
"""
def Get_Action_Historique_List(diction):
try:
@ -207,7 +209,7 @@ def Get_Action_Historique_List(diction):
if val not in field_list and val.startswith('my_') is False:
mycommon.myprint(str(
inspect.stack()[0][3]) + " Le champ '" + val + "' n'existe pas")
return False, " Les informations fournies sont incorrectes",
return False, " Les informations fournies sont incorrectes", False
"""
Verification des champs obligatoires
@ -217,7 +219,7 @@ def Get_Action_Historique_List(diction):
if val not in diction:
mycommon.myprint(
str(inspect.stack()[0][3]) + " - La valeur '" + val + "' n'est pas presente dans la liste des arguments ")
return False, " Les informations fournies sont incorrectes",
return False, " Les informations fournies sont incorrectes",False
"""
Verification de l'identité et autorisation de l'entité qui
@ -230,7 +232,7 @@ def Get_Action_Historique_List(diction):
local_status, my_partner = mycommon.Check_Connexion_And_Return_Partner_Data(diction)
if (local_status is not True):
return local_status, my_partner
return local_status, my_partner, False
RetObject = []
val_tmp = 1
@ -250,9 +252,9 @@ def Get_Action_Historique_List(diction):
val_tmp = val_tmp + 1
RetObject.append(mycommon.JSONEncoder().encode(user))
return True, RetObject
return True, RetObject, str(MYSY_GV.HISTORIQUE_MAX_EVENT)
except Exception as e:
exc_type, exc_obj, exc_tb = sys.exc_info()
mycommon.myprint(str(inspect.stack()[0][3]) + " -" + str(e) + " - Line : " + str(exc_tb.tb_lineno))
return False, " Impossible de récupérer la liste des évènements "
return False, " Impossible de récupérer la liste des évènements ", False

View File

@ -676,11 +676,12 @@ PARTNER_QUOTATION_STATUS = ['-1', '0', '1', '2', '3', '4']
"""
Pour mettre en place un système de configuration global, on va definir les valeur acceptée
"""
PARTNER_BASE_CONFIG_NAME = ['tva', 'smtp_server', 'smtp_user', 'smtp_user_pwd', 'smtp_count_from_name',
PARTNER_BASE_CONFIG_NAME = ['tva', 'smtp_server', 'smtp_user', 'smtp_user_pwd', 'smtp_count_from_name',
'smtp_count_port', 'partner_smtp', 'partner_jour_heure', 'nb_relance_auto',
'relance_auto', 'frequence_relance_auto', 'session_warning', 'session_warning_lead_time',
'recyclage_warning', 'recyclage_warning_lead_time',
'preinscription_notification_email', 'inscription_notification_email']
'preinscription_notification_email', 'inscription_notification_email','nb_heure_par_jour',
'nb_heure_par_mois', 'nb_heure_par_annee', 'nb_heure_par_semaine']
"""
@ -724,7 +725,7 @@ AGENDA_EVENT_TYPE = ['absence', 'planning', 'autre', '']
Limite pour l'affichage des historique d'action coté front.
Par exemple on va afficher les 100 dernières action, mais pas tout.
"""
HISTORIQUE_MAX_EVENT = 100
HISTORIQUE_MAX_EVENT = 20
"""
Type d'apprenant à l'inscription d'une session de formation
@ -871,7 +872,7 @@ EMAIL_MAX_PJ = 5
"""
La clé API de OpenAI
"""
OPENAI_KEY = "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"
OPENAI_KEY = "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"
"""
Variable interne pour le traitement
@ -970,4 +971,5 @@ Les type de ressources humaines sont :
'vide' ou rien ==> Ressource internes (enseignant, vacataire, etc)
"""
TYPE_RH = ['', '1']
TYPE_RH = ['', '1']

File diff suppressed because it is too large Load Diff

View File

@ -974,7 +974,7 @@ def Invoice_Data_From_Tab(diction):
# Récuperation de la sequence de l'objet "partner_invoice_header" dans la collection : "mysy_sequence"
retval_sequence_invoice = MYSY_GV.dbname['mysy_sequence'].find_one(
{'partner_invoice_header': 'partner_order_header',
{'related_mysy_object': 'partner_invoice_header',
'valide': '1', 'partner_owner_recid': str(
my_partner['recid'])})

View File

@ -649,6 +649,9 @@ def Sent_Convocation_Stagiaire_By_Email(tab_files, Folder, diction):
if (local_status is False):
return local_status, local_retval
if ("company_data" in local_retval.keys() and "societe_nom" in local_retval['company_data'].keys()):
company_name = local_retval['company_data']['societe_nom']
convention_dictionnary_data = local_retval
body = {
@ -790,7 +793,13 @@ def Sent_Convocation_Stagiaire_By_Email(tab_files, Folder, diction):
else:
msg.attach(html_mime)
msg['From'] = MYSY_GV.O365_SMTP_COUNT_From_User
#msg['From'] = MYSY_GV.O365_SMTP_COUNT_From_User
if (company_name):
msg['From'] = str(company_name) + " <" + str(MYSY_GV.O365_SMTP_COUNT_From_User) + ">"
else:
msg['From'] = str(MYSY_GV.O365_SMTP_COUNT_From_User)
msg['Cc'] = tab_apprenant_client_rattachement_contact
msg['Bcc'] = 'contact@mysy-training.com'
msg['Subject'] = courrier_template_data['sujet']
@ -1709,7 +1718,20 @@ def Cron_Send_Survey_TabIds(diction):
else:
msg.attach(html_mime)
msg['From'] = MYSY_GV.O365_SMTP_COUNT_From_User
my_company_data = MYSY_GV.dbname['partnair_account'].find_one(
{'recid': str(my_partner['recid']), 'is_partner_admin_account': '1', 'active': '1',
'locked': '0'},
{'_id': 1, 'nom': 1})
if (my_company_data and "nom" in my_company_data.keys() and my_company_data['nom']):
company_name = my_company_data['nom']
#msg['From'] = MYSY_GV.O365_SMTP_COUNT_From_User
if (company_name):
msg['From'] = str(company_name) + " <" + str(MYSY_GV.O365_SMTP_COUNT_From_User) + ">"
else:
msg['From'] = str(MYSY_GV.O365_SMTP_COUNT_From_User)
msg['Bcc'] = 'contact@mysy-training.com'
msg['Subject'] = str(subject)
# msg['to'] = "billardman01@hotmail.com"
@ -2465,7 +2487,20 @@ def Cron_Sent_Attestation_Stagiaire_By_Email(tab_files, Folder, diction):
else:
msg.attach(html_mime)
msg['From'] = MYSY_GV.O365_SMTP_COUNT_From_User
my_company_data = MYSY_GV.dbname['partnair_account'].find_one(
{'recid': str(my_partner['recid']), 'is_partner_admin_account': '1', 'active': '1',
'locked': '0'},
{'_id': 1, 'nom': 1})
if (my_company_data and "nom" in my_company_data.keys() and my_company_data['nom']):
company_name = my_company_data['nom']
#msg['From'] = MYSY_GV.O365_SMTP_COUNT_From_User
if (company_name):
msg['From'] = str(company_name) + " <" + str(MYSY_GV.O365_SMTP_COUNT_From_User) + ">"
else:
msg['From'] = str(MYSY_GV.O365_SMTP_COUNT_From_User)
msg['Cc'] = tab_apprenant_client_rattachement_contact
msg['Bcc'] = 'contact@mysy-training.com'
msg['Subject'] = courrier_template_data['sujet']
@ -2586,6 +2621,9 @@ def Cron_Qualiopi_Automatic_Traitement_Notification(diction):
if (local_status is False):
return local_status, local_retval
if ("company_data" in local_retval.keys() and "societe_nom" in local_retval['company_data'].keys()):
company_name = local_retval['company_data']['societe_nom']
dictionnary_data = local_retval
dictionnary_data['tab_message'] = diction['tab_message']
@ -2698,7 +2736,12 @@ def Cron_Qualiopi_Automatic_Traitement_Notification(diction):
else:
msg.attach(html_mime)
msg['From'] = MYSY_GV.O365_SMTP_COUNT_From_User
#msg['From'] = MYSY_GV.O365_SMTP_COUNT_From_User
if (company_name):
msg['From'] = str(company_name) + " <" + str(MYSY_GV.O365_SMTP_COUNT_From_User) + ">"
else:
msg['From'] = str(MYSY_GV.O365_SMTP_COUNT_From_User)
msg['Bcc'] = 'contact@mysy-training.com'
msg['Subject'] = sujetHtml

File diff suppressed because one or more lines are too long

View File

@ -1337,8 +1337,15 @@ def GetActiveSessionFormation_List(diction):
tmp_debut_inscritp = str(local_tmp['date_debut_inscription']).strip().split(" ")
tmp_fin_inscritp = str(local_tmp['date_fin_inscription']).strip().split(" ")
debut_inscr = datetime.strptime(str(tmp_debut_inscritp[0]).strip(), '%d/%m/%Y')
fin_inscr = datetime.strptime(str(tmp_fin_inscritp[0]).strip(), '%d/%m/%Y')
debut_inscr = datetime.strptime("01/01/1999", '%d/%m/%Y')
fin_inscr = datetime.strptime("01/01/1999", '%d/%m/%Y')
debut_inscr_work = str(tmp_debut_inscritp[0]).strip()
fin_inscr_work = str(tmp_fin_inscritp[0]).strip()
if( mycommon.CheckisDate(debut_inscr_work) and mycommon.CheckisDate(fin_inscr_work) ):
debut_inscr = datetime.strptime(str(tmp_debut_inscritp[0]).strip(), '%d/%m/%Y')
fin_inscr = datetime.strptime(str(tmp_fin_inscritp[0]).strip(), '%d/%m/%Y')
#print(" #### date_debut_inscription = ", debut_inscr, " date_fin_inscription = ", fin_inscr, " NOW = ",datetime.now())
if(debut_inscr <= datetime.now() and fin_inscr >= datetime.now()):
@ -1519,11 +1526,22 @@ def GetActiveSession_Cities_And_Distance_Formation_List(diction):
local_tmp = retval
## Verification des conditions supplementaires :
# en realité c'est parce que c'est chaud de le faire avec pymongo
tmp_debut_inscritp = str(local_tmp['date_debut_inscription']).strip().split(" ")
tmp_fin_inscritp = str(local_tmp['date_fin_inscription']).strip().split(" ")
tmp_debut_inscritp = ""
tmp_fin_inscritp = ""
if( "date_debut_inscription" in local_tmp.keys() and local_tmp['date_debut_inscription']
and "date_fin_inscription" in local_tmp.keys() and local_tmp['date_fin_inscription']):
tmp_debut_inscritp = str(local_tmp['date_debut_inscription']).strip().split(" ")
tmp_fin_inscritp = str(local_tmp['date_fin_inscription']).strip().split(" ")
local_status_tmp_debut_inscritp = mycommon.CheckisDate(str(tmp_debut_inscritp[0]))
local_status_tmp_fin_inscritp = mycommon.CheckisDate(str(tmp_fin_inscritp[0]))
if( tmp_debut_inscritp and tmp_fin_inscritp ):
local_status_tmp_debut_inscritp = mycommon.CheckisDate(str(tmp_debut_inscritp[0]))
local_status_tmp_fin_inscritp = mycommon.CheckisDate(str(tmp_fin_inscritp[0]))
else:
local_status_tmp_debut_inscritp = False
local_status_tmp_fin_inscritp = False
debut_inscr = datetime.strptime("01/01/1999", '%d/%m/%Y')
fin_inscr = datetime.strptime("01/01/1999", '%d/%m/%Y')
if( local_status_tmp_debut_inscritp and local_status_tmp_fin_inscritp ):
debut_inscr = datetime.strptime(str(tmp_debut_inscritp[0]).strip(), '%d/%m/%Y')
@ -8783,6 +8801,9 @@ def Sent_Convocation_Stagiaire_By_Email(tab_files, Folder, diction):
if (local_status is False):
return local_status, local_retval
if ("company_data" in local_retval.keys() and "societe_nom" in local_retval['company_data'].keys()):
company_name = local_retval['company_data']['societe_nom']
convention_dictionnary_data = local_retval
body = {
@ -8924,7 +8945,11 @@ def Sent_Convocation_Stagiaire_By_Email(tab_files, Folder, diction):
else:
msg.attach(html_mime)
msg['From'] = MYSY_GV.O365_SMTP_COUNT_From_User
#msg['From'] = MYSY_GV.O365_SMTP_COUNT_From_User
if (company_name):
msg['From'] = str(company_name) + " <" + str(MYSY_GV.O365_SMTP_COUNT_From_User) + ">"
else:
msg['From'] = str(MYSY_GV.O365_SMTP_COUNT_From_User)
msg['Cc'] = tab_apprenant_client_rattachement_contact
msg['Bcc'] = 'contact@mysy-training.com'
msg['Subject'] = courrier_template_data['sujet']
@ -9388,6 +9413,9 @@ def Sent_Attestation_Stagiaire_By_Email(tab_files, Folder, diction):
if (local_status is False):
return local_status, local_retval
if ("company_data" in local_retval.keys() and "societe_nom" in local_retval['company_data'].keys()):
company_name = local_retval['company_data']['societe_nom']
convention_dictionnary_data = local_retval
convention_dictionnary_data['contenu_attestation'] = contenu_attestation
@ -9531,7 +9559,12 @@ def Sent_Attestation_Stagiaire_By_Email(tab_files, Folder, diction):
else:
msg.attach(html_mime)
msg['From'] = MYSY_GV.O365_SMTP_COUNT_From_User
#msg['From'] = MYSY_GV.O365_SMTP_COUNT_From_User
if (company_name):
msg['From'] = str(company_name) + " <" + str(MYSY_GV.O365_SMTP_COUNT_From_User) + ">"
else:
msg['From'] = str(MYSY_GV.O365_SMTP_COUNT_From_User)
msg['Cc'] = tab_apprenant_client_rattachement_contact
msg['Bcc'] = 'contact@mysy-training.com'
msg['Subject'] = courrier_template_data['sujet']
@ -10666,7 +10699,7 @@ def Invoice_Partner_From_Session( diction):
# Récuperation de la sequence de l'objet "partner_invoice_header" dans la collection : "mysy_sequence"
retval_sequence_invoice = MYSY_GV.dbname['mysy_sequence'].find_one(
{'partner_invoice_header': 'partner_order_header',
{'related_mysy_object': 'partner_invoice_header',
'valide': '1', 'partner_owner_recid': str(
my_partner['recid'])})
@ -11043,6 +11076,9 @@ def Sent_Facture_Stagiaire_By_Email_By_Partner_client(tab_files_name_full_path,
if (local_status is False):
return local_status, local_retval
if ("company_data" in local_retval.keys() and "societe_nom" in local_retval['company_data'].keys()):
company_name = local_retval['company_data']['societe_nom']
convention_dictionnary_data = local_retval
@ -11198,7 +11234,12 @@ def Sent_Facture_Stagiaire_By_Email_By_Partner_client(tab_files_name_full_path,
else:
msg.attach(html_mime)
msg['From'] = MYSY_GV.O365_SMTP_COUNT_From_User
#msg['From'] = MYSY_GV.O365_SMTP_COUNT_From_User
if (company_name):
msg['From'] = str(company_name) + " <" + str(MYSY_GV.O365_SMTP_COUNT_From_User) + ">"
else:
msg['From'] = str(MYSY_GV.O365_SMTP_COUNT_From_User)
msg['Bcc'] = 'contact@mysy-training.com'
msg['Subject'] = courrier_template_data['sujet']
# msg['to'] = "billardman01@hotmail.com"
@ -13081,13 +13122,17 @@ def Invoice_Partner_From_Session_By_Inscription_Id( diction):
partner_invoice_header_data['invoice_header_type'] = "facture"
# Récuperation de la sequence de l'objet "partner_invoice_header" dans la collection : "mysy_sequence"
retval_sequence_invoice = MYSY_GV.dbname['mysy_sequence'].find_one(
{'partner_invoice_header': 'partner_order_header',
{'related_mysy_object': 'partner_invoice_header',
'valide': '1', 'partner_owner_recid': str(
my_partner['recid'])})
if (retval_sequence_invoice is None):
# Il n'y pas de sequence pour le partenaire, on va aller chercher la sequence par defaut
retval_sequence_invoice = MYSY_GV.dbname['mysy_sequence'].find_one(
{'related_mysy_object': 'partner_invoice_header',
'valide': '1', 'partner_owner_recid': 'default'})
@ -13669,7 +13714,7 @@ def Invoice_Splited_Partner_From_Session_By_Inscription_Id( diction):
# Récuperation de la sequence de l'objet "partner_invoice_header" dans la collection : "mysy_sequence"
retval_sequence_invoice = MYSY_GV.dbname['mysy_sequence'].find_one(
{'partner_invoice_header': 'partner_order_header',
{'related_mysy_object': 'partner_invoice_header',
'valide': '1', 'partner_owner_recid': str(
my_partner['recid'])})
@ -14922,6 +14967,9 @@ def Send_Email_request_presinscription_data_validation(diction):
local_status, local_retval = mycommon.Get_Dictionnary_data_For_Template(new_diction)
convention_dictionnary_data = local_retval
if ("company_data" in local_retval.keys() and "societe_nom" in local_retval['company_data'].keys()):
company_name = local_retval['company_data']['societe_nom']
convention_dictionnary_data['attendeelist_url'] = MYSY_GV.CLIENT_URL_BASE+"UpadateAttendeeList/"+str(diction['client_id'])+"/"+str(diction['session_id'])+"/"+str(diction['partner_recid'])+"/"
body = {
@ -14967,7 +15015,15 @@ def Send_Email_request_presinscription_data_validation(diction):
return local_stpm_status, partner_own_smtp_value
msg.attach(html_mime)
msg['From'] = partner_SMTP_COUNT_From_User
if (str(partner_own_smtp_value) == "1"):
msg['From'] = partner_SMTP_COUNT_From_User
else:
if (company_name):
msg['From'] = str(company_name) + " <" + str(partner_SMTP_COUNT_From_User) + ">"
else:
msg['From'] = str(partner_SMTP_COUNT_From_User)
msg['Bcc'] = 'contact@mysy-training.com'
msg['Subject'] = sujetHtml
# msg['to'] = "billardman01@hotmail.com"

View File

@ -1662,9 +1662,9 @@ def Update_Session_Sequence(diction):
return False, " Impossible de mettre à jour la séquence "
"""
Recuperer la liste des sequence d'une formation
Cette fonction permet de recuperer le nombre de sequence de formation
d'une session
"""
def Get_Session_Sequence_List(diction):
try:
@ -1767,6 +1767,66 @@ def Get_Session_Sequence_List(diction):
return False, " Impossible de récupérer la liste des séquences de la session "
"""
Recuperer la liste des sequence d'une formation
"""
def Get_Session_Nb_Sequence(diction):
try:
diction = mycommon.strip_dictionary(diction)
"""
Verification des input acceptés
"""
field_list = ['token', 'session_id']
incom_keys = diction.keys()
for val in incom_keys:
if val not in field_list and val.startswith('my_') is False:
mycommon.myprint(str(
inspect.stack()[0][3]) + " Le champ '" + val + "' n'existe pas")
return False, " Les informations fournies sont incorrectes",
"""
Verification des champs obligatoires
"""
field_list_obligatoire = ['token', 'session_id']
for val in field_list_obligatoire:
if val not in diction:
mycommon.myprint(
str(inspect.stack()[0][3]) + " - La valeur '" + val + "' n'est pas presente dans la liste des arguments ")
return False, " Les informations fournies sont incorrectes",
"""
Verification de l'identité et autorisation de l'entité qui
appelle cette API
"""
token = ""
if ("token" in diction.keys()):
if diction['token']:
token = diction['token']
local_status, my_partner = mycommon.Check_Connexion_And_Return_Partner_Data(diction)
if (local_status is not True):
return local_status, my_partner
RetObject = []
val_tmp = 0
nb_sequence = MYSY_GV.dbname['session_formation_sequence'].count_documents({'session_id':str(diction['session_id']),
'partner_owner_recid':str(my_partner['recid']), 'valide':'1', 'locked':'0'})
RetObject.append(mycommon.JSONEncoder().encode(str(nb_sequence)))
return True, nb_sequence
except Exception as e:
exc_type, exc_obj, exc_tb = sys.exc_info()
mycommon.myprint(str(inspect.stack()[0][3]) + " -" + str(e) + " - Line : " + str(exc_tb.tb_lineno))
return False, " Impossible de récupérer le nombre de séquence de la session "
"""
Recuperer les données d'une sequence donnée
"""
@ -3860,7 +3920,8 @@ def Decale_Session_Sequence_X_days(diction):
"""
Verification des input acceptés
"""
field_list = ['token', 'tab_session_ids', 'nb_jour_decalage']
field_list = ['token', 'tab_session_ids', 'nb_jour_decalage',
'decalage_raison', 'decalage_comment']
incom_keys = diction.keys()
for val in incom_keys:
@ -3958,164 +4019,376 @@ def Decale_Session_Sequence_X_days(diction):
nb_sequence = 0
for local_session_id in tab_session_ids :
# Aller chercher les sequences de la session à decaller
for local_sequence in MYSY_GV.dbname['session_formation_sequence'].find({'session_id':str(local_session_id),
'valide': '1',
'locked':'0',
'partner_owner_recid': str(my_partner['recid'])
}).sort([("_id", pymongo.ASCENDING), ]):
# On commence par mettre à jour les dates de la session
local_session_data = MYSY_GV.dbname['session_formation'].find_one({'_id':ObjectId(str(local_session_id)),
'valide': '1',
'partner_owner_recid': str(
my_partner['recid'])
})
current_start = datetime.strptime(str(local_sequence['sequence_start'])[0:16], '%d/%m/%Y %H:%M')
current_end = datetime.strptime(str(local_sequence['sequence_end'])[0:16], '%d/%m/%Y %H:%M')
nb_jour_decalage_done = 0
nb_jour_decalage_integer = local_val
if( local_session_data ):
session_old_start_date = datetime.strptime(str(local_session_data['date_debut'])[0:10], '%d/%m/%Y')
session_old_start_date_for_comment = str(local_session_data['date_debut'])[0:10]
session_old_start_date_work = session_old_start_date
session_new_start_date = session_old_start_date + timedelta(days=nb_jour_decalage_integer)
session_new_start_date_for_comment = str(session_new_start_date.strftime("%d/%m/%Y"))
# Calcule de la nouvelle date de fin de session
if( nb_jour_decalage_integer > 0 ):
while( nb_jour_decalage_done <= nb_jour_decalage_integer):
new_current_start = current_start + timedelta(days=nb_jour_decalage_done)
new_current_end = current_end + timedelta(days=nb_jour_decalage_done)
nb_jour_ouvre_from_debut_session = 0
while( session_old_start_date_work < session_new_start_date ):
date_jour = str(new_current_start.strftime("%Y-%m-%d"))
jour_name = new_current_start.strftime("%A")
# Recuperation des sequences associées à jour_name
is_jour_name_off = jounree_modele_data[jour_name]["is_off_day"]
if (date_jour not in jounree_modele_data['date_off'] and is_jour_name_off != "1"):
nb_jour_decalage_done = nb_jour_decalage_done + 1
else:
#print(" ### "+str(date_jour)+ " -- "+str(jour_name)+" EST UN JOUR OFF, NO INCREMENT ")
nb_jour_decalage_integer = nb_jour_decalage_integer + 1
nb_jour_decalage_done = nb_jour_decalage_done + 1
#print(" ### nb_jour_decalage_integer passe de "+str(nb_jour_decalage_integer-1)+" à "+str(nb_jour_decalage_integer))
print(" ### "+str(current_start)+ " ==( "+str(nb_jour_decalage_integer)+"J )=== >> "+str(new_current_start))
new_data = {}
new_data['sequence_start'] = str(new_current_start.strftime("%d/%m/%Y %H:%M"))
new_data['sequence_end'] = str(new_current_end.strftime("%d/%m/%Y %H:%M"))
new_data['date_update'] = datetime.now().strftime("%d/%m/%Y %H:%M:%S")
new_data['update_by'] = str(my_partner['recid'])
#print(" ### new_data = ", new_data)
MYSY_GV.dbname['session_formation_sequence'].find_one_and_update(
{'_id': ObjectId(str(local_sequence['_id'])),
'partner_owner_recid': str(my_partner['recid'])},
{'$set': new_data})
"""
Après la mise à jour de la sequence,
il faut mettre à jour le planning des ressources associée
"""
for local_sequence_ressource_affectation in MYSY_GV.dbname[
'session_formation_sequence_affectation'].find({
'sequence_session_id': str(local_sequence['_id']),
'valide': '1',
'locked': '0',
'partner_owner_recid': str(my_partner['recid'])
}):
# Aller cherche l'agenda de la ressource
for local_ressource_agenda in MYSY_GV.dbname['agenda'].find({
'session_formation_sequence_affectation_id': str(
local_sequence_ressource_affectation[
'_id']),
'valide': '1',
'locked': '0',
'partner_owner_recid': str(
my_partner['recid'])
}):
new_data_agenda = {}
new_data_agenda['event_start'] = str(new_current_start.strftime("%Y-%m-%dT%H:%M"))
new_data_agenda['event_end'] = str(new_current_end.strftime("%Y-%m-%dT%H:%M"))
new_data_agenda['date_update'] = datetime.now().strftime("%d/%m/%Y %H:%M:%S")
new_data_agenda['update_by'] = str(my_partner['recid'])
print(" ### new_data_agenda = ", new_data_agenda)
print(" ### QRY = ", {'_id': ObjectId(str(local_ressource_agenda['_id'])),
'partner_owner_recid': str(my_partner['recid'])})
MYSY_GV.dbname['agenda'].find_one_and_update(
{'_id': ObjectId(str(local_ressource_agenda['_id'])),
'partner_owner_recid': str(my_partner['recid'])},
{'$set': new_data_agenda})
elif (nb_jour_decalage_integer < 0):
while (nb_jour_decalage_done >= nb_jour_decalage_integer):
new_current_start = current_start + timedelta(days=nb_jour_decalage_done)
new_current_end = current_end + timedelta(days=nb_jour_decalage_done)
#print(" ### new_current_start = ", new_current_start)
date_jour = str(new_current_start.strftime("%Y-%m-%d"))
jour_name = new_current_start.strftime("%A")
date_jour = str(session_old_start_date_work.strftime("%Y-%m-%d"))
jour_name = session_old_start_date_work.strftime("%A")
# Recuperation des sequences associées à jour_name
is_jour_name_off = jounree_modele_data[jour_name]["is_off_day"]
if (date_jour not in jounree_modele_data['date_off'] and is_jour_name_off != "1"):
nb_jour_decalage_done = nb_jour_decalage_done - 1
else:
print(" ### "+str(date_jour)+ " -- "+str(jour_name)+" EST UN JOUR OFF, NO INCREMENT ")
nb_jour_decalage_integer = nb_jour_decalage_integer - 1
nb_jour_decalage_done = nb_jour_decalage_done - 1
nb_jour_ouvre_from_debut_session = nb_jour_ouvre_from_debut_session + 1
#print(" ### nb_jour_decalage_integer passe de "+str(nb_jour_decalage_integer+1)+" à "+str(nb_jour_decalage_integer))
session_old_start_date_work = session_old_start_date_work + timedelta(days=1)
print(" ### " + str(current_start) + " ==( " + str(nb_jour_decalage_integer) + "J )=== >> " + str(new_current_start))
session_old_end_date = datetime.strptime(str(local_session_data['date_fin'])[0:10], '%d/%m/%Y')
"""
Calculer le nombre de jour ouvré entre l'ancienne date debut session et la nouvelle date de début de session.
Car lors qu'on va caculer la nouvelle date de fin de session, on devra appliquer le decallage par rapport au nombre de
jour ouvrée
"""
declage_fin = 0
local_session_date_fin = session_old_end_date
while (declage_fin < nb_jour_ouvre_from_debut_session):
date_jour = str(local_session_date_fin.strftime("%Y-%m-%d"))
jour_name = local_session_date_fin.strftime("%A")
# Recuperation des sequences associées à jour_name
is_jour_name_off = jounree_modele_data[jour_name]["is_off_day"]
if (date_jour not in jounree_modele_data['date_off'] and is_jour_name_off != "1"):
declage_fin = declage_fin + 1
local_session_date_fin = local_session_date_fin + timedelta(days=1)
#print(" ### date fin session apres calcul = ", local_session_date_fin)
elif (nb_jour_decalage_integer < 0):
nb_jour_ouvre_from_debut_session = 0
while (session_old_start_date_work > session_new_start_date):
date_jour = str(session_old_start_date_work.strftime("%Y-%m-%d"))
jour_name = session_old_start_date_work.strftime("%A")
# Recuperation des sequences associées à jour_name
is_jour_name_off = jounree_modele_data[jour_name]["is_off_day"]
if (date_jour not in jounree_modele_data['date_off'] and is_jour_name_off != "1"):
nb_jour_ouvre_from_debut_session = nb_jour_ouvre_from_debut_session - 1
session_old_start_date_work = session_old_start_date_work + timedelta(days=-1)
print(" ### NB jours ouvrée from debut session = ", nb_jour_ouvre_from_debut_session)
session_old_end_date = datetime.strptime(str(local_session_data['date_fin'])[0:10], '%d/%m/%Y')
"""
Calculer le nombre de jour ouvré entre l'ancienne date debut session et la nouvelle date de début de session.
Car lors qu'on va caculer la nouvelle date de fin de session, on devra appliquer le decallage par rapport au nombre de
jour ouvrée
"""
declage_fin = 0
local_session_date_fin = session_old_end_date
while (declage_fin > nb_jour_ouvre_from_debut_session):
local_session_date_fin = local_session_date_fin + timedelta(days=-1)
date_jour = str(local_session_date_fin.strftime("%Y-%m-%d"))
jour_name = local_session_date_fin.strftime("%A")
# Recuperation des sequences associées à jour_name
is_jour_name_off = jounree_modele_data[jour_name]["is_off_day"]
if (date_jour not in jounree_modele_data['date_off'] and is_jour_name_off != "1"):
declage_fin = declage_fin - 1
print(" ### date fin session apres calcul = ", local_session_date_fin)
#"""""""""""""""""""""""
session_new_end_date = local_session_date_fin
"""print(" ## session_old_end_date = ", session_old_end_date)
print(" ## nb_jour_decalage_integer = ", nb_jour_decalage_integer)
print(" ## session_new_end_date = ", session_new_end_date)"""
# Aller chercher les sequences de la session à decaller
for local_sequence in MYSY_GV.dbname['session_formation_sequence'].find({'session_id':str(local_session_id),
'valide': '1',
'locked':'0',
'partner_owner_recid': str(my_partner['recid'])
}).sort([("_id", pymongo.ASCENDING), ]):
current_start = datetime.strptime(str(local_sequence['sequence_start'])[0:16], '%d/%m/%Y %H:%M')
current_end = datetime.strptime(str(local_sequence['sequence_end'])[0:16], '%d/%m/%Y %H:%M')
nb_jour_decalage_done = 0
nb_jour_decalage_integer = local_val
if( nb_jour_decalage_integer > 0 ):
declage_fin = 0
sequence_old_start_date_work = current_start
sequence_old_end_date_work = current_end
#print(" avvvv nb_jour_ouvre_from_debut_session = ", nb_jour_ouvre_from_debut_session)
while (declage_fin < nb_jour_ouvre_from_debut_session):
#print(" ## analyse du jour ", sequence_old_start_date_work)
date_jour = str(sequence_old_start_date_work.strftime("%Y-%m-%d"))
jour_name = sequence_old_start_date_work.strftime("%A")
# Recuperation des sequences associées à jour_name
is_jour_name_off = jounree_modele_data[jour_name]["is_off_day"]
if (date_jour not in jounree_modele_data['date_off'] and is_jour_name_off != "1"):
declage_fin = declage_fin + 1
sequence_old_start_date_work = sequence_old_start_date_work + timedelta(days=1)
sequence_old_end_date_work = sequence_old_end_date_work + timedelta(days=1)
"""
A la sortie du decalage gérer le cas ou ce jour est off ou ferier
"""
cpt = 0
date_jour = str(sequence_old_start_date_work.strftime("%Y-%m-%d"))
jour_name = sequence_old_start_date_work.strftime("%A")
is_jour_name_off = jounree_modele_data[jour_name]["is_off_day"]
while( date_jour in jounree_modele_data['date_off'] or is_jour_name_off == "1"):
#print(" ### A la sortie on est tombé sur un jour off : ", sequence_old_start_date_work)
sequence_old_start_date_work = sequence_old_start_date_work + timedelta(days=1)
sequence_old_end_date_work = sequence_old_end_date_work + timedelta(days=1)
date_jour = str(sequence_old_start_date_work.strftime("%Y-%m-%d"))
jour_name = sequence_old_start_date_work.strftime("%A")
# Recuperation des sequences associées à jour_name
is_jour_name_off = jounree_modele_data[jour_name]["is_off_day"]
new_current_start = sequence_old_start_date_work
new_current_end = sequence_old_end_date_work
#print(" ### new_current_start = ", new_current_start)
#print(" ### new_current_end = ", new_current_end)
#print(" ### current_start = "+str(current_start)+ " ==( "+str(nb_jour_decalage_integer)+"J )=== >> "+str(new_current_start))
new_data = {}
new_data['sequence_start'] = str(new_current_start.strftime("%d/%m/%Y %H:%M"))
new_data['sequence_end'] = str(new_current_end.strftime("%d/%m/%Y %H:%M"))
new_data['date_update'] = datetime.now().strftime("%d/%m/%Y %H:%M:%S")
new_data['update_by'] = str(my_partner['recid'])
#print(" ### new_data = ", new_data)
MYSY_GV.dbname['session_formation_sequence'].find_one_and_update(
{'_id': ObjectId(str(local_sequence['_id'])),
'partner_owner_recid': str(my_partner['recid'])},
{'$set': new_data})
"""
Après la mise à jour de la sequence,
il faut mettre à jour le planning des ressources associée
"""
for local_sequence_ressource_affectation in MYSY_GV.dbname[
'session_formation_sequence_affectation'].find({
'sequence_session_id': str(local_sequence['_id']),
'valide': '1',
'locked': '0',
'partner_owner_recid': str(my_partner['recid'])
}):
# Aller cherche l'agenda de la ressource
for local_ressource_agenda in MYSY_GV.dbname['agenda'].find({
'session_formation_sequence_affectation_id': str(
local_sequence_ressource_affectation[
'_id']),
'valide': '1',
'locked': '0',
'partner_owner_recid': str(
my_partner['recid'])
}):
new_data_agenda = {}
new_data_agenda['event_start'] = str(new_current_start.strftime("%Y-%m-%dT%H:%M"))
new_data_agenda['event_end'] = str(new_current_end.strftime("%Y-%m-%dT%H:%M"))
new_data_agenda['date_update'] = datetime.now().strftime("%d/%m/%Y %H:%M:%S")
new_data_agenda['update_by'] = str(my_partner['recid'])
MYSY_GV.dbname['agenda'].find_one_and_update(
{'_id': ObjectId(str(local_ressource_agenda['_id'])),
'partner_owner_recid': str(my_partner['recid'])},
{'$set': new_data_agenda})
elif (nb_jour_decalage_integer < 0):
declage_fin = 0
sequence_old_start_date_work = current_start
sequence_old_end_date_work = current_end
#print(" avvvv MINUS 0 nb_jour_ouvre_from_debut_session = ", nb_jour_ouvre_from_debut_session)
while (declage_fin > nb_jour_ouvre_from_debut_session):
#print(" ## analyse du jour ", sequence_old_start_date_work)
date_jour = str(sequence_old_start_date_work.strftime("%Y-%m-%d"))
jour_name = sequence_old_start_date_work.strftime("%A")
# Recuperation des sequences associées à jour_name
is_jour_name_off = jounree_modele_data[jour_name]["is_off_day"]
if (date_jour not in jounree_modele_data['date_off'] and is_jour_name_off != "1"):
declage_fin = declage_fin - 1
sequence_old_start_date_work = sequence_old_start_date_work + timedelta(days=-1)
sequence_old_end_date_work = sequence_old_end_date_work + timedelta(days=-1)
"""
A la sortie du decalage gérer le cas ou ce jour est off ou ferier
"""
cpt = 0
date_jour = str(sequence_old_start_date_work.strftime("%Y-%m-%d"))
jour_name = sequence_old_start_date_work.strftime("%A")
is_jour_name_off = jounree_modele_data[jour_name]["is_off_day"]
while (date_jour in jounree_modele_data['date_off'] or is_jour_name_off == "1"):
#print(" ### MINUS A la sortie on est tombé sur un jour off : ", sequence_old_start_date_work)
sequence_old_start_date_work = sequence_old_start_date_work + timedelta(days=-1)
sequence_old_end_date_work = sequence_old_end_date_work + timedelta(days=-1)
date_jour = str(sequence_old_start_date_work.strftime("%Y-%m-%d"))
jour_name = sequence_old_start_date_work.strftime("%A")
# Recuperation des sequences associées à jour_name
is_jour_name_off = jounree_modele_data[jour_name]["is_off_day"]
new_current_start = sequence_old_start_date_work
new_current_end = sequence_old_end_date_work
#print(" ### new_current_start = ", new_current_start)
#print(" ### new_current_end = ", new_current_end)
#print(" ### " + str(current_start) + " ==( " + str(nb_jour_decalage_integer) + "J )=== >> " + str(new_current_start))
new_data = {}
new_data['sequence_start'] = str(new_current_start.strftime("%d/%m/%Y %H:%M"))
new_data['sequence_end'] = str(new_current_end.strftime("%d/%m/%Y %H:%M"))
new_data['date_update'] = datetime.now().strftime("%d/%m/%Y %H:%M:%S")
new_data['update_by'] = str(my_partner['recid'])
#print(" ### new_data MINUS = ", new_data)
MYSY_GV.dbname['session_formation_sequence'].find_one_and_update(
{'_id': ObjectId(str(local_sequence['_id'])),
'partner_owner_recid': str(my_partner['recid'])},
{'$set': new_data})
"""
Après la mise à jour de la sequence,
il faut mettre à jour le planning des ressources associée
"""
for local_sequence_ressource_affectation in MYSY_GV.dbname['session_formation_sequence_affectation'].find({
'sequence_session_id': str(local_sequence['_id']),
'valide': '1',
'locked': '0',
'partner_owner_recid': str(my_partner['recid'])
}):
# Aller cherche l'agenda de la ressource
for local_ressource_agenda in MYSY_GV.dbname['agenda'].find({'session_formation_sequence_affectation_id':str(local_sequence_ressource_affectation['_id']),
'valide': '1',
'locked': '0',
'partner_owner_recid': str(
my_partner['recid'])
}):
new_data_agenda = {}
new_data_agenda['event_start'] = str(new_current_start.strftime("%Y-%m-%dT%H:%M"))
new_data_agenda['event_end'] = str(new_current_end.strftime("%Y-%m-%dT%H:%M"))
new_data_agenda['date_update'] = datetime.now().strftime("%d/%m/%Y %H:%M:%S")
new_data_agenda['update_by'] = str(my_partner['recid'])
MYSY_GV.dbname['agenda'].find_one_and_update(
{'_id': ObjectId(str(local_ressource_agenda['_id'])),
'partner_owner_recid': str(my_partner['recid'])},
{'$set': new_data_agenda})
if( nb_jour_decalage != 0 ):
# Mettre à jour les date de debut et de fin de la session
new_data = {}
new_data['sequence_start'] = str(new_current_start.strftime("%d/%m/%Y %H:%M"))
new_data['sequence_end'] = str(new_current_end.strftime("%d/%m/%Y %H:%M"))
new_data['date_update'] = datetime.now().strftime("%d/%m/%Y %H:%M:%S")
new_data['date_debut'] = str(session_new_start_date.strftime("%d/%m/%Y"))
new_data['date_fin'] = str(session_new_end_date.strftime("%d/%m/%Y"))
new_data['date_update'] = datetime.now()
new_data['update_by'] = str(my_partner['recid'])
print(" ### new_data = ", new_data)
MYSY_GV.dbname['session_formation_sequence'].find_one_and_update(
{'_id': ObjectId(str(local_sequence['_id'])),
ret_val = MYSY_GV.dbname['session_formation'].find_one_and_update(
{'_id': ObjectId(str(local_session_id)), 'valide': '1',
'partner_owner_recid': str(my_partner['recid'])},
{'$set': new_data})
"""
Après la mise à jour de la sequence,
il faut mettre à jour le planning des ressources associée
"""
for local_sequence_ressource_affectation in MYSY_GV.dbname['session_formation_sequence_affectation'].find({
'sequence_session_id': str(local_sequence['_id']),
'valide': '1',
'locked': '0',
'partner_owner_recid': str(my_partner['recid'])
}):
# Aller cherche l'agenda de la ressource
for local_ressource_agenda in MYSY_GV.dbname['agenda'].find({'session_formation_sequence_affectation_id':str(local_sequence_ressource_affectation['_id']),
'valide': '1',
'locked': '0',
'partner_owner_recid': str(
my_partner['recid'])
}):
new_data_agenda = {}
new_data_agenda['event_start'] = str(new_current_start.strftime("%Y-%m-%dT%H:%M"))
new_data_agenda['event_end'] = str(new_current_end.strftime("%Y-%m-%dT%H:%M"))
new_data_agenda['date_update'] = datetime.now().strftime("%d/%m/%Y %H:%M:%S")
new_data_agenda['update_by'] = str(my_partner['recid'])
print(" ### new_data_agenda = ", new_data_agenda)
print(" ### QRY = ", {'_id': ObjectId(str(local_ressource_agenda['_id'])),
'partner_owner_recid': str(my_partner['recid'])})
MYSY_GV.dbname['agenda'].find_one_and_update(
{'_id': ObjectId(str(local_ressource_agenda['_id'])),
'partner_owner_recid': str(my_partner['recid'])},
{'$set': new_data_agenda})
{"$set": new_data},
upsert=False,
return_document=ReturnDocument.AFTER
)
return True, str(nb_sequence)+" mise(s) à jour"
# Logguer l'action de decalage dans l'historique de la session
# pour la collection 'myclass'
now = str(datetime.now().strftime("%d/%m/%Y %H:%M:%S"))
# print(" ####### laaaa diction = ", diction)
description_text = "Decalage de la session du "+str(session_old_start_date_for_comment)+" au "+str(session_new_start_date_for_comment)
if( "decalage_raison" in diction.keys() and diction['decalage_raison']):
description_text = description_text + " Raison : "+str(diction['decalage_raison'])
if ("decalage_comment" in diction.keys() and diction['decalage_comment']):
description_text = description_text + ". " + str(diction['decalage_comment'])[0:255]
print(" ### description_text = ", description_text)
history_event_dict = {}
history_event_dict['token'] = str(diction['token'])
history_event_dict['related_collection'] = "session_formation"
history_event_dict['related_collection_recid'] = str(local_session_id)
history_event_dict['action_date'] = str(now)
history_event_dict['action_description'] = description_text
local_status, local_retval = mycommon.Collection_Historique.Add_Historique_Event(history_event_dict)
if (local_status is False):
mycommon.myprint(
" WARNING : Impossible de logguer l'historique pour l'évènement : " + str(history_event_dict))
return True, " Décalage effectué "
except Exception as e:
exc_type, exc_obj, exc_tb = sys.exc_info()
mycommon.myprint(str(inspect.stack()[0][3]) + " -" + str(e) + " - Line : " + str(exc_tb.tb_lineno))
return False, " Impossible dedécaler les séquences "
return False, " Impossible de décaler les dates. "

View File

@ -42,17 +42,19 @@
<div
style="padding:12px 0px;text-align:left;font-family:Georgia, 'Times New Roman', Times, serif;color:#454349;font-size:0.9rem;width:100%;float:right;text-align:left;">
Origine : {{json_data.orign_order}}
Origine : {{json_data.orign_order}} <br/>
<b>Période : {{json_data.periode}} </b>
</div>
<div
style="padding:12px 0px;text-align:left;font-family:Georgia, 'Times New Roman', Times, serif;color:#454349;font-size:0.9rem;width:100%;float:right;text-align:left;">
<table style="width:100%;border: none;padding: 0px;">
<tr style="border: 1px solid black;padding: 0px; padding-top:5px;">
<th style="text-align:center;border: 1px solid black;">Description</th>
<th style="text-align:center;border: 1px solid black;">Quantité</th>
<th style="text-align:center;border: 1px solid black;">Prix unitaire</th>
<th style="text-align:center;border: 1px solid black;">Montant</th>
<th style="text-align:center;border: 1px solid black;">Prix unitaire (HT)</th>
<th style="text-align:center;border: 1px solid black;">Montant (HT)</th>
</tr>
<tr style="border: 1px solid black;padding: 0px;padding: 0px; padding-top:5px;">
<td style="text-align:center;border: 1px solid black;"> {{json_data.packs}} <br>
@ -87,7 +89,7 @@
<tr style="padding:0px; padding-top:5px;font-size:0.9rem;">
<td style="text-align:left;">&nbsp; </td>
<td style="text-align:left;">&nbsp; </td>
<td style="text-align:center;">TVA 20% : </td>
<td style="text-align:center;">TVA : </td>
<td style="text-align:center;">{{json_data.tva}} &nbsp;</td>
</tr>
@ -127,10 +129,10 @@
<tbody>
<tr>
<td scope="col" style="text-align: left;">30004</td>
<td scope="col" style="text-align: left;">00120</td>
<td scope="col" style="text-align: left;">00002090815</td>
<td scope="col" style="text-align: left;">60</td>
<td scope="col" style="text-align: left;">30087</td>
<td scope="col" style="text-align: left;">33856</td>
<td scope="col" style="text-align: left;">00021285503</td>
<td scope="col" style="text-align: left;">40</td>
</tr>
@ -156,8 +158,8 @@
<tbody>
<tr>
<td scope="col" style="text-align: left;">FR76 3000 4001 2000 0020 9081 560 </td>
<td scope="col" style="text-align: left;">BNPAFRPPXXX</td>
<td scope="col" style="text-align: left;">FR76 3008 7338 5600 0212 8550 340</td>
<td scope="col" style="text-align: left;">CMCIFRPP</td>
</tr>
@ -180,9 +182,7 @@
<p>MySy Training<br />
Cour du Havre 1, 75008, Paris<br />
MySy Training Technology (MTT), société par actions simplifiée au capital de 1000 euros, dont le siège
MySy Training Technology (MTT), société par actions simplifiée au capital de 10 000 euros, dont le siège
social est
situé 2, place des magnolias, 77680, Roissy en Brie, immatriculée au Registre du Commerce et des
Sociétés sous le numéro 917 500 860 R.C.S. Melun

View File

@ -194,6 +194,8 @@ Recuperation des la configuration du catalogue public
"""
def Get_Partner_Catalog_Pub_Config(diction):
try:
print("### INSIDE NOO PROXYYY")
diction = mycommon.strip_dictionary(diction)
"""

View File

@ -2825,6 +2825,465 @@ def get_class(diction):
return False, " Impossible de récupérer la formation"
"""
Cette fonction recuperer les données d'une formation indépendamment de sont affichage sur la marketplace
"""
def get_class_without_marketplace_check(diction):
try:
'''
# Verification que les champs reçus dans l'API sont bien dans la liste des champs autorisés
# Cela evite le cas ou une entité tierce ajouter les valeurs inconnu dans l'API
# Ici on doit mettre tous les champs possible (obligatoire ou non) de la BDD dans la liste
# field_list.
'''
field_list = ['internal_url', 'token', 'title', 'valide', 'locked', 'user_ip', 'user_country_code', 'user_country_name', 'user_city',
'user_postal', 'user_latitude', 'user_longitude', 'user_state', 'connection_type']
incom_keys = diction.keys()
for val in incom_keys:
if val not in field_list and val.startswith('my_') is False:
mycommon.myprint( str(inspect.stack()[0][3])+ " - Le champ '" + val + "' n'existe pas, Creation formation annulée")
return False, " Impossible de récupérer la formation"
'''
Une fois qu'on a controlé que toutes les clés mise dans l'API sont correcte. etape precedente,
On controle que les champs obligatoires sont presents dans la liste
'''
field_list_obligatoire = ['token']
for val in field_list_obligatoire:
if val not in diction:
mycommon.myprint(str(inspect.stack()[0][3])+" - La valeur '" + val + "' n'est pas presente dans la liste des arguments ")
return False, " Impossible de récupérer la formation"
# recuperation des paramettre
mydata = {}
my_internal_url = ""
my_token = ""
if ("internal_url" in diction.keys()):
if diction['internal_url']:
my_internal_url = diction['internal_url']
if ("token" in diction.keys()):
if diction['token']:
my_token = diction['token']
client_connected_recid = ""
connection_type = ""
if ("connection_type" in diction.keys()):
if diction['connection_type']:
connection_type = diction['connection_type']
'''
Gestion des filters.
'''
internal_url_crit = {}
if ("internal_url" in diction.keys()):
if diction['internal_url']:
internal_url_crit['internal_url'] = diction['internal_url']
title_crit = {}
if ("title" in diction.keys()):
if diction['title']:
title_crit['title'] = diction['title']
coll_name = MYSY_GV.dbname['myclass']
# verifier que le token et l'email sont ok
coll_token = MYSY_GV.dbname['user_token']
# Verification de la validité du token dans le cas des user en mode connecté
'''
Important : Important : si le token est vide, alors c'est une recherche faite en mode non-connecté.
on doit l'accepter.
le controle de la validé du token est faite que ce dernier n'est pas vide.
'''
user_recid = "None"
coll_search_result = MYSY_GV.dbname['user_recherche_result']
# Verification de la validité du token/mail dans le cas des user en mode connecté
if (len(str(my_token)) > 0 and str(connection_type).strip() == "user"):
retval = mycommon.check_token_validity("", my_token)
if retval is False:
mycommon.myprint( str(inspect.stack()[0][3])+" - La session de connexion n'est pas valide")
return False, " Impossible de récupérer la formation"
# Recuperation du recid de l'utilisateur
user_recid = mycommon.get_user_recid_from_token(my_token)
if user_recid is False:
mycommon.myprint(str(inspect.stack()[0][3])+" - Impossible de récupérer le token de l'utilisateur")
return False, " Impossible de récupérer la formation"
# Verification de la validité du token/mail dans le cas des partner en mode connecté
if (len(str(my_token)) > 0 and str(connection_type).strip() == "partner"):
retval = mycommon.check_partner_token_validity("", my_token)
if retval is False:
mycommon.myprint(str(inspect.stack()[0][3]) + " - La session de connexion n'est pas valide")
return "Err_Connexion", "La session de connexion n'est pas valide"
# Recuperation du recid de l'utilisateur
user_recid = mycommon.get_parnter_recid_from_token(my_token)
if user_recid is False:
mycommon.myprint(
str(inspect.stack()[0][3]) + " - Impossible de récupérer le token du partenaire")
return False, " Impossible de récupérer le token du partenaire"
RetObject = []
filt_external_code = {}
internal_url = ""
if ("internal_url" in diction.keys()):
filt_external_code = {'internal_url':str(diction['internal_url'])}
internal_url = str(diction['internal_url'])
#print(' ICICICIC '+str(filt_external_code))
#print(" #### internal_url = ", internal_url)
qry_02 = {'valide':'1','locked':'0','internal_url':internal_url, }
#print(" #### qty_02 = ", qry_02)
# Recuperation des info du partenaire propriaitaire comme : ces certification (qualiopi, datadock, etc) et son nom
tmp_class_data = MYSY_GV.dbname['myclass'].find_one({'valide':'1','locked':'0','internal_url':internal_url, },
{"_id": 1, "partner_owner_recid": 1, } )
if( tmp_class_data is None or tmp_class_data["partner_owner_recid"] is None):
#print(' ### tmp_class_data =', str(tmp_class_data ))
mycommon.myprint(str(inspect.stack()[0][3]) + " - impossible de récupérer les données du partenaire - laa ")
return False, " Cette formation est indisponible "
#print(" ### la formation concernee est : ", tmp_class_data)
qry = {'active':'1','locked':'0','recid':str(tmp_class_data["partner_owner_recid"]) }
tmp_partenaire_data = MYSY_GV.dbname['partnair_account'].find_one(qry)
#print(" ### qry = ", qry)
if (tmp_partenaire_data is None or tmp_partenaire_data["_id"] is None):
mycommon.myprint(str(inspect.stack()[0][3]) + " - impossible de récupérer les données du partenaire (2) ")
return False, " Cette formation est indisponible (2) "
filt_title = {}
if ("title" in diction.keys()):
filt_title = {'title': {'$regex': str(diction['title']), "$options": "i"}}
print(" #### avant requete get partner_owner_recid laa yy= "+str(user_recid)+
" internal_url = "+str(my_internal_url)+
" filt_title = "+str(filt_title))
text_size = 0
"""
# Pour facilité l'affichage du front, on va créer une variable qui liste le nombre de pavé existant.
A date la liste des champs est : description, plus_produit, objectif, programme, prerequis, session, pourqui
"""
nb_pave_a_afficher = 0
connected_client_recid = ""
if (str(connection_type).strip() == "partner"):
connected_client_recid = user_recid
pipe = [
{'$match': {'internal_url': internal_url}},
{'$project': { 'indexed': 0, 'indexed_desc': 0, 'indexed_obj': 0, "indexed_title": 0, "valide": 0,
"locked": 0}},
{'$lookup':
{
'from': 'business_prices',
'let': {'partner_owner_recid': "$partner_owner_recid", 'programme': '$programme'},
'pipeline': [
{'$match':
{'$expr':
{'$and':
[
{'$eq': ["$partner_recid", "$$partner_owner_recid"]},
{'$eq': ["$client_recid", connected_client_recid]},
{'$eq': ["$valide", "1"]}
]
}
}
},
],
'as': 'business_prices'
}
}
]
mytoday = datetime.today()
print(" ### pipe myclass = ", pipe)
for retVal in coll_name.aggregate(pipe):
"""
for retVal in coll_name.find({'valide':'1','locked':'0','internal_url':internal_url,},
{"_id": 0, "indexed": 0, "indexed_desc": 0, "indexed_obj": 0, "indexed_title": 0,
"valide": 0, "locked": 0, "partner_owner_recid": 0, }
).limit(1):
"""
#print('#### ICI retVal = '+str(retVal))
tab_selected_business_prices = []
if ("business_prices" in retVal.keys()):
for local_business_prices in retVal['business_prices']:
if ("date_du" in local_business_prices.keys() and "date_au" in local_business_prices.keys()
and mycommon.CheckisDate(local_business_prices['date_du']) and mycommon.CheckisDate(
local_business_prices['date_au'])):
local_date_du = datetime.strptime(str(local_business_prices['date_du']).strip(), '%d/%m/%Y')
local_date_au = datetime.strptime(str(local_business_prices['date_au']).strip(), '%d/%m/%Y')
if (local_date_du <= mytoday and mytoday <= local_date_au):
local_discount = mycommon.tryFloat(str(local_business_prices['discount']))
local_initial_price = mycommon.tryFloat(str(retVal['price']))
local_discounted_price = round(local_initial_price - (local_initial_price * (local_discount / 100)), 2)
local_business_prices['discounted_price'] = str(local_discounted_price)
retVal['business_prices'][0]['discounted_price'] = str(local_discounted_price)
tab_selected_business_prices.append(local_business_prices)
my_recid = {}
my_recid['user_rec_id'] = str(user_recid)
mydict_combined = {**diction, **retVal, **my_recid}
mydict_combined['date_update'] = str(datetime.now())
mydict_combined['type_view'] = "detail"
if ("_id" in mydict_combined.keys()):
mydict_combined['class_id'] = mydict_combined.pop('_id')
#mycommon.myprint("COMBINED = " + str(mydict_combined))
'''
Statistique : Insertion du recherche - resultat '''
ret_val_tmp = coll_search_result.insert_one(mydict_combined)
if (ret_val_tmp is False):
mycommon.myprint(str(inspect.stack()[0][3]) + " - Impossible de mettre à jour la table des resultat"
" d'une recherche de formation. Voir _id = ")
return False, "Impossible de faire un affichage detaillé "
# Cette varible compte le nombre de certificat dont dispose le partenaire.
# Cette information est utilisée pour savoir les taille à afficher sur le front
nb_partner_certificat = 0
if( "isdatadock" in tmp_partenaire_data.keys() and tmp_partenaire_data['isdatadock']):
retVal['isdatadock'] = tmp_partenaire_data['isdatadock']
if (tmp_partenaire_data['isdatadock'] == "1"):
nb_partner_certificat = nb_partner_certificat + 1
if ("isqualiopi" in tmp_partenaire_data.keys() and tmp_partenaire_data['isqualiopi']):
retVal['isqualiopi'] = tmp_partenaire_data['isqualiopi']
if (tmp_partenaire_data['isqualiopi'] == "1"):
nb_partner_certificat = nb_partner_certificat + 1
if ("iscertitrace" in tmp_partenaire_data.keys() and tmp_partenaire_data['iscertitrace']):
retVal['iscertitrace'] = tmp_partenaire_data['iscertitrace']
if( tmp_partenaire_data['iscertitrace'] == "1"):
nb_partner_certificat = nb_partner_certificat + 1
if ("isbureaucertitrace" in tmp_partenaire_data.keys() and tmp_partenaire_data['isbureaucertitrace']):
retVal['isbureaucertitrace'] = tmp_partenaire_data['isbureaucertitrace']
if (tmp_partenaire_data['isbureaucertitrace'] == "1"):
nb_partner_certificat = nb_partner_certificat + 1
if ("iscertifvoltaire" in tmp_partenaire_data.keys() and tmp_partenaire_data['iscertifvoltaire']):
retVal['iscertifvoltaire'] = tmp_partenaire_data['iscertifvoltaire']
if (tmp_partenaire_data['iscertifvoltaire'] == "1"):
nb_partner_certificat = nb_partner_certificat + 1
retVal['nb_partner_certificat'] = str(nb_partner_certificat)
if ("nom" in tmp_partenaire_data.keys() and tmp_partenaire_data['nom']):
retVal['nom_partenaire'] = tmp_partenaire_data['nom']
if ("website" in tmp_partenaire_data.keys() and tmp_partenaire_data['website']):
retVal['website_partenaire'] = tmp_partenaire_data['website']
if ("description" in retVal.keys()):
tmp_str = retVal['description']
no_html = mycommon.cleanhtml(retVal['description'])
nb_pave_a_afficher = nb_pave_a_afficher + 1
text_size = text_size + len(str(no_html))
if (len(no_html) > MYSY_GV.MAX_CARACT_DETAIL):
retVal['description'] = no_html[:MYSY_GV.MAX_CARACT_DETAIL] + " ..."
if ("objectif" in retVal.keys()):
tmp_str = retVal['objectif']
no_html = mycommon.cleanhtml(retVal['objectif'])
text_size = text_size + len(str(no_html))
nb_pave_a_afficher = nb_pave_a_afficher + 1
if (len(no_html) > MYSY_GV.MAX_CARACT_DETAIL):
retVal['objectif'] = no_html[:MYSY_GV.MAX_CARACT_DETAIL] + " ..."
if ("pourqui" in retVal.keys() and retVal['pourqui']):
nb_pave_a_afficher = nb_pave_a_afficher + 1
if ("programme" in retVal.keys()):
tmp_str = retVal['programme']
no_html = mycommon.cleanhtml( retVal['programme'])
text_size = text_size + len(str(no_html))
nb_pave_a_afficher = nb_pave_a_afficher + 1
if (len(no_html) > MYSY_GV.MAX_CARACT_DETAIL):
retVal['programme'] = no_html[:MYSY_GV.MAX_CARACT_DETAIL] + " ..."
if ("methode_pedagogique" in retVal.keys()):
tmp_str = retVal['methode_pedagogique']
no_html = mycommon.cleanhtml( retVal['methode_pedagogique'])
text_size = text_size + len(str(no_html))
nb_pave_a_afficher = nb_pave_a_afficher + 1
if (len(no_html) > MYSY_GV.MAX_CARACT_DETAIL):
retVal['methode_pedagogique'] = no_html[:MYSY_GV.MAX_CARACT_DETAIL] + " ..."
if ("condition_handicape" in retVal.keys()):
tmp_str = retVal['condition_handicape']
no_html = mycommon.cleanhtml( retVal['condition_handicape'])
text_size = text_size + len(str(no_html))
nb_pave_a_afficher = nb_pave_a_afficher + 1
if (len(no_html) > MYSY_GV.MAX_CARACT_DETAIL):
retVal['condition_handicape'] = no_html[:MYSY_GV.MAX_CARACT_DETAIL] + " ..."
if ("suivi_eval" in retVal.keys()):
tmp_str = retVal['suivi_eval']
no_html = mycommon.cleanhtml( retVal['suivi_eval'])
text_size = text_size + len(str(no_html))
nb_pave_a_afficher = nb_pave_a_afficher + 1
if (len(no_html) > MYSY_GV.MAX_CARACT_DETAIL):
retVal['suivi_eval'] = no_html[:MYSY_GV.MAX_CARACT_DETAIL] + " ..."
if ("pedagogie" in retVal.keys()):
tmp_str = retVal['pedagogie']
no_html = mycommon.cleanhtml(retVal['pedagogie'])
if (len(no_html) > MYSY_GV.MAX_CARACT_DETAIL):
retVal['pedagogie'] = no_html[:MYSY_GV.MAX_CARACT_DETAIL] + " ..."
#retVal["text_size"] = str(text_size)
retVal["text_size"] = "1600"
"""
Verifier s'il y a des session des formations actives
"""
localmyquery = {}
localmyquery['class_internal_url'] = internal_url
localmyquery['valide'] = "1"
localmyquery['session_status'] = "true"
count_localmyquery = MYSY_GV.dbname['session_formation'].count_documents(localmyquery)
if( count_localmyquery > 0 ):
nb_pave_a_afficher = nb_pave_a_afficher + 1
print(" ### nb_pave_a_afficher , SESSION ")
retVal["nb_pave_a_afficher"] = str(nb_pave_a_afficher)
#print(" #### Pour la formation :",internal_url, " text_size = ", str(text_size))
#mycommon.myprint(" #### "+str(retVal))
user = retVal
if( "recyclage_delai" not in user.keys()):
user['recyclage_delai'] = ""
if ("recyclage_alert" not in user.keys()):
user['recyclage_alert'] = ""
if ("recyclage_periodicite" not in user.keys()):
user['recyclage_periodicite'] = ""
if ("note_finale_calculation_rule_id" not in user.keys()):
user['note_finale_calculation_rule_id'] = ""
"""
15/09/2024 :
Si la formation a des unité d'enseignements rattaché,
ramener dans un tableau :
- _id
- code
- titre
- description
"""
tab_ue_detail_data = []
if( "list_unite_enseignement" in user.keys() ):
for tmp_ue in user["list_unite_enseignement"] :
if( "_id" in tmp_ue.keys() ):
local_ue_data = MYSY_GV.dbname['unite_enseignement'].find_one({'_id':ObjectId(str(tmp_ue['_id'])),
'partner_owner_recid':tmp_partenaire_data['recid'],
'valide':'1',
'locked':'0'})
local_code = ""
if( local_ue_data and "code" in local_ue_data.keys() ):
local_code = local_ue_data['code']
local_titre = ""
if (local_ue_data and "titre" in local_ue_data.keys()):
local_titre = local_ue_data['titre']
local_description = ""
if (local_ue_data and "description" in local_ue_data.keys()):
local_description = local_ue_data['description']
local_node = {}
local_node['_id'] = str(tmp_ue['_id'])
local_node['code'] = str(local_code)
local_node['titre'] = str(local_titre)
local_node['description'] = str(local_description)
tab_ue_detail_data.append(local_node)
user['tab_ue_detail_data'] = tab_ue_detail_data
user['business_prices'] = tab_selected_business_prices
RetObject.append(JSONEncoder().encode(user))
return True, RetObject
except Exception as e:
exc_type, exc_obj, exc_tb = sys.exc_info()
mycommon.myprint(str(inspect.stack()[0][3]) + " -" + str(e)+" - Line : "+ str(exc_tb.tb_lineno) )
return False, " Impossible de récupérer la formation"
def get_class_for_partner_catalog(diction):
try:

View File

@ -306,7 +306,7 @@ def Get_Competence_no_filter(diction):
RetObject.append(mycommon.JSONEncoder().encode(user))
#print(" #### RetObject = ", RetObject)
print(" #### RetObject = ", RetObject)
return True, RetObject
except Exception as e:

View File

@ -492,7 +492,7 @@ def incription_training_refused_mail(diction):
"params": dictionnary_data,
}
print(" ### refus_data (dictionnary_data) = ", dictionnary_data)
#print(" ### refus_data (dictionnary_data) = ", dictionnary_data)
# Traitement du sujet du mail
sujet_mail_Template = jinja2.Template(str(courrier_data_retval['sujet']))
@ -960,7 +960,7 @@ def Pre_incription_training_confirmation_mail(diction):
Verification de la liste des champs obligatoires
"""
field_list_obligatoire = ['nom', 'prenom', 'email', 'date_du', 'code_session', 'date_au', 'title',
'distantiel', 'presentiel', 'partner_owner_recid', 'token']
'distantiel', 'presentiel', 'partner_owner_recid', 'token', 'session_id', 'formateur_email']
for val in field_list_obligatoire:
if val not in diction:
mycommon.myprint(
@ -968,6 +968,42 @@ def Pre_incription_training_confirmation_mail(diction):
return False, "Impossible d'envoyer l'email de confirmation de l'inscritpion"
"""
Recuperer les informations de la session
"""
session_count = MYSY_GV.dbname['session_formation'].count_documents({'code_session':str(diction['code_session']),
'partner_owner_recid':str(diction['partner_owner_recid']),
'valide':'1'})
if( session_count !=1 ):
mycommon.myprint(
str(inspect.stack()[0][
3]) + " L'identifiant de la session est invalide ")
return False, "L'identifiant de la session est invalide "
session_data = MYSY_GV.dbname['session_formation'].find_one(
{'code_session': str(diction['code_session']),
'partner_owner_recid': str(diction['partner_owner_recid']),
'valide': '1'})
session_presentiel = ""
session_distantiel = ""
session_hybrid = ""
if( "mode_animation" in session_data.keys() and session_data['mode_animation']):
if( str(session_data['mode_animation']) == "1"):
session_presentiel = ""
session_distantiel = "1"
session_hybrid = ""
elif( str(session_data['mode_animation']) == "2"):
session_presentiel = ""
session_distantiel = ""
session_hybrid = "1"
elif (str(session_data['mode_animation']) == "0"):
session_presentiel = "1"
session_distantiel = ""
session_hybrid = ""
tomorrow = datetime.date.today() + datetime.timedelta(days=1)
tomorrow_day = tomorrow.strftime("%A")
@ -1007,8 +1043,9 @@ def Pre_incription_training_confirmation_mail(diction):
"prenom": str(diction['prenom']),
"date_du": str(diction['date_du']),
"date_fin": str(diction['date_au']),
"distantiel": str(diction['distantiel']),
"presentiel": str(diction['presentiel']),
"distantiel": str(session_distantiel),
"presentiel": str(session_presentiel),
"hybrid": str(session_hybrid),
"title": str(diction['title']),
"code_postal": str(diction['code_postal']),
"ville": str(diction['ville']),
@ -1016,7 +1053,6 @@ def Pre_incription_training_confirmation_mail(diction):
"email": str(diction['email']),
"session_ondemande": str(session_ondemande),
"code_session": str(diction['code_session']),
},
}
@ -1173,7 +1209,8 @@ def Notification_partner_Pre_incription_mail(diction):
Verification de la liste des champs obligatoires
"""
field_list_obligatoire = ['nom', 'prenom', 'email', 'date_du', 'date_au', 'title',
'partner_mail', 'telephone', 'token', 'partner_owner_recid']
'partner_mail', 'telephone', 'token', 'partner_owner_recid',
'session_id', 'formateur_email']
for val in field_list_obligatoire:
if val not in diction:
mycommon.myprint(
@ -1236,12 +1273,33 @@ def Notification_partner_Pre_incription_mail(diction):
# msg = MIMEMultipart("alternative")
"""
Recuperation du modele de courrier zzzzz
"""
local_diction = {}
local_diction['ref_interne'] = "PARTNER_PRE_INSCRIPTION_NOTIF"
local_diction['type_doc'] = "email"
local_diction['partner_owner_recid'] = str(diction['partner_owner_recid'])
courrier_data_status, courrier_data_retval = mycommon.Get_Courrier_Template_Include_Default_Data(local_diction)
if (courrier_data_status is False):
mycommon.myprint(
str(inspect.stack()[0][
3]) + " Impossible de récupérer le modèle de courrier 'PARTNER_PRE_INSCRIPTION_NOTIF' ")
return False, " Impossible de récupérer le modèle de courrier 'PARTNER_PRE_INSCRIPTION_NOTIF' "
if ("contenu_doc" not in courrier_data_retval.keys() or str(courrier_data_retval['contenu_doc']) == ""):
mycommon.myprint(
str(inspect.stack()[0][
3]) + " Le modèle de courrier 'PARTNER_PRE_INSCRIPTION_NOTIF' n'est pas correctement configuré ")
return False, " Le modèle de courrier 'PARTNER_PRE_INSCRIPTION_NOTIF' n'est pas correctement configuré"
# JINJA2
templateLoader = jinja2.FileSystemLoader(searchpath="./")
templateEnv = jinja2.Environment(loader=templateLoader)
TEMPLATE_FILE = "Template/MySy_Notif_Partner_Pre_inscription_formation_tpl.html"
template = templateEnv.get_template(TEMPLATE_FILE)
#templateLoader = jinja2.FileSystemLoader(searchpath="./")
#templateEnv = jinja2.Environment(loader=templateLoader)
#TEMPLATE_FILE = "Template/MySy_Notif_Partner_Pre_inscription_formation_tpl.html"
#template = templateEnv.get_template(TEMPLATE_FILE)
# This data can come from database query
body = {
"params":{"nom": str(diction['nom']),
@ -1260,8 +1318,13 @@ def Notification_partner_Pre_incription_mail(diction):
"session_ondemande": str(session_ondemande),
},
}
contenu_doc_Template = jinja2.Template(str(courrier_data_retval['contenu_doc']))
sourceHtml = contenu_doc_Template.render(params=body["params"])
#sourceHtml = template.render(params=body["params"])
sourceHtml = template.render(params=body["params"])
# Traitement du sujet du mail
sujet_mail_Template = jinja2.Template(str(courrier_data_retval['sujet']))
sujetHtml = sujet_mail_Template.render(params=body["params"])
"""
Recuperation des parametre SMTP du partner si le client a decidé d'utiliser son propre smpt
@ -1312,9 +1375,11 @@ def Notification_partner_Pre_incription_mail(diction):
smtpserver = smtplib.SMTP(partner_SMTP_COUNT_smtpsrv, partner_SMTP_COUNT_port)
msg.set_content(sourceHtml, subtype='html')
msg['From'] = partner_SMTP_COUNT_From_User
msg['Cc'] = 'contact@mysy-training.com, billardman01@hotmail.com'
msg['Subject'] = '[MySy Training] : pre-inscription à la formation ' + str(diction['title'])
msg['Bbc'] = 'contact@mysy-training.com'
msg['Subject'] = sujetHtml
msg['To'] = str(diction['partner_mail'])
if( "formateur_email" in diction.keys() ):
msg['Cc'] = str(diction['formateur_email'])
smtpserver.ehlo()
smtpserver.starttls()
@ -1332,9 +1397,11 @@ def Notification_partner_Pre_incription_mail(diction):
else:
msg['From'] = str(MYSY_GV.O365_SMTP_COUNT_From_User)
#msg['From'] = MYSY_GV.O365_SMTP_COUNT_From_User
msg['Cc'] = 'contact@mysy-training.com, billardman01@hotmail.com'
msg['Subject'] = '[MySy Training] : pre-inscription à la formation '+str(diction['title'])
msg['Bcc'] = 'contact@mysy-training.com'
msg['Subject'] = sujetHtml
msg['To'] = str(diction['partner_mail'])
if ("formateur_email" in diction.keys()):
msg['Cc'] = str(diction['formateur_email'])
smtpserver.ehlo()
smtpserver.starttls()

View File

@ -2488,7 +2488,7 @@ def ManualSendInvoiceEmailRIB_CIC_JMJFormation(diction):
body = {
"params": {"order_id": "MTT/2025_N°0012/JMJ FORMATION",
"date_order": ": 14/07/2025",
"periode":"14/07/2025 au 13/08/2025",
"periode":"14/08/2025 au 13/09/2025",
"total_ht": "130",
"tva": "11.05",
"total_ttc": "141,05 ",
@ -2504,9 +2504,9 @@ def ManualSendInvoiceEmailRIB_CIC_JMJFormation(diction):
"montant": "130 €",
"invoice_id": "FACT_20250715",
"invoice_date": "14/07/2025",
"due_date": "14/07/2025",
"invoice_id": "FACT_20250816",
"invoice_date": "14/08/2025",
"due_date": "14/08/2025",
"orign_order": "Contrat MTT/2025_N°0012/JMJ FORMATION",
}
}
@ -2540,7 +2540,221 @@ def ManualSendInvoiceEmailRIB_CIC_JMJFormation(diction):
#print(" ### body 22 = ", body)
sourceHtml = template.render(json_data=body["params"])
orig_file_name = "invoice_FACT_20250715.pdf"
orig_file_name = "invoice_FACT_20250816.pdf"
outputFilename = str(MYSY_GV.INVOICE_DIRECTORY) + str(orig_file_name)
# open output file for writing (truncated binary)
resultFile = open(outputFilename, "w+b")
# convert HTML to PDF
pisaStatus = pisa.CreatePDF(
src=sourceHtml, # the HTML to convert
dest=resultFile) # file handle to receive result
# close output file
resultFile.close()
return True, " facture envoyée"
except Exception as e:
exc_type, exc_obj, exc_tb = sys.exc_info()
print(str(inspect.stack()[0][3]) + " -" + str(e) + " - ERRORRRR AT Line : " + str(exc_tb.tb_lineno))
return False, " impossible d'envoyer la facure"
"""
Creation manuelle d'une facture avec RIB CIC pour France Active - perso
"""
def ManualSendInvoiceEmailRIB_CIC_France_Active(diction):
try:
'''
Verification des données obligatoires
'''
'''
Une fois qu'on a controlé que toutes les clés mise dans l'API sont correcte. etape precedente,
On controle que les champs obligatoires sont presents dans la liste
'''
tomorrow = datetime.date.today() + datetime.timedelta(days=1)
tomorrow_day = tomorrow.strftime("%A")
print("debut envoi mail de test ")
# on rentre les renseignements pris sur le site du fournisseur
#smtpserver = smtplib.SMTP(MYSY_GV.O365_SMTP_COUNT_smtpsrv, MYSY_GV.O365_SMTP_COUNT_port)
# msg = MIMEMultipart("alternative")
#msg = EmailMessage()
# JINJA2
templateLoader = jinja2.FileSystemLoader(searchpath="./")
templateEnv = jinja2.Environment(loader=templateLoader)
TEMPLATE_FILE = "Template/MySy_Invoice_RIB_PortCities_Perso_tpl.html"
template = templateEnv.get_template(TEMPLATE_FILE)
body = {
"params": {"order_id": "MTT/2025_N°0013/FRANCEACTIVE",
"date_order": ": 09/07/2025",
"periode":"09/07/2025 au 08/07/2026",
"total_ht": "850",
"tva": "0",
"total_ttc": "850",
"client_name": "FRANCE ACTIVE SEINE-ET-MARNE ESSONNE",
"client_address": "29 ALLEE JEAN ROSTAND",
"client_zip_ville": "91000 EVRY-COURCOURONNES",
"client_pays": "France",
"packs": "ELYOS - Pack STANDARD ",
"detail_packs": "Mise en place dun site web (marketplace) - "
"Mise en place dun outil de gestion administrative et de gestion de la relation client pour Organisme de formation ",
"qty": "1",
"unit_price": "850 €",
"montant": "850 €",
"invoice_id": "FACT_20250920_U",
"invoice_date": "09/09/2025",
"due_date": "09/09/2025",
"orign_order": "Contrat MTT/2025_N°0013/FRANCEACTIVE",
}
}
#print(" ### body 1 = ", body)
sourceHtml = template.render(params=body["params"])
"""msg.set_content(sourceHtml, subtype='html')
msg['From'] = MYSY_GV.O365_SMTP_COUNT_From_User
msg['Bcc'] = 'contact@mysy-training.com'
msg['Subject'] = "[MySy Training Technology] : Votre facture N° FACT_230500030"
msg['To'] = 'billardman1@gmail.com'
smtpserver.ehlo()
smtpserver.starttls()
smtpserver.login(MYSY_GV.O365_SMTP_COUNT_user, MYSY_GV.O365_SMTP_COUNT_password)
val = smtpserver.send_message(msg)
smtpserver.close()
"""
#print(" Email envoyé " + str(val))
### CREATION DE LA FACTION PDF
templateLoader = jinja2.FileSystemLoader(searchpath="./")
templateEnv = jinja2.Environment(loader=templateLoader)
#TEMPLATE_FILE = "Template/MySy_Invoice_RIB_tpl.html"
TEMPLATE_FILE = "Template/invoice_RIB_PortCities_perso_tpl.html"
template = templateEnv.get_template(TEMPLATE_FILE)
# This data can come from database query
#print(" ### body 22 = ", body)
sourceHtml = template.render(json_data=body["params"])
orig_file_name = "invoice_FACT_20250816.pdf"
outputFilename = str(MYSY_GV.INVOICE_DIRECTORY) + str(orig_file_name)
# open output file for writing (truncated binary)
resultFile = open(outputFilename, "w+b")
# convert HTML to PDF
pisaStatus = pisa.CreatePDF(
src=sourceHtml, # the HTML to convert
dest=resultFile) # file handle to receive result
# close output file
resultFile.close()
return True, " facture envoyée"
except Exception as e:
exc_type, exc_obj, exc_tb = sys.exc_info()
print(str(inspect.stack()[0][3]) + " -" + str(e) + " - ERRORRRR AT Line : " + str(exc_tb.tb_lineno))
return False, " impossible d'envoyer la facure"
"""
Creation manuelle d'une facture avec RIB CIC pour Bureau Vallé - perso
"""
def ManualSendInvoiceEmailRIB_CIC_BureauVallee(diction):
try:
'''
Verification des données obligatoires
'''
'''
Une fois qu'on a controlé que toutes les clés mise dans l'API sont correcte. etape precedente,
On controle que les champs obligatoires sont presents dans la liste
'''
tomorrow = datetime.date.today() + datetime.timedelta(days=1)
tomorrow_day = tomorrow.strftime("%A")
print("debut envoi mail de test ")
# on rentre les renseignements pris sur le site du fournisseur
#smtpserver = smtplib.SMTP(MYSY_GV.O365_SMTP_COUNT_smtpsrv, MYSY_GV.O365_SMTP_COUNT_port)
# msg = MIMEMultipart("alternative")
#msg = EmailMessage()
# JINJA2
templateLoader = jinja2.FileSystemLoader(searchpath="./")
templateEnv = jinja2.Environment(loader=templateLoader)
TEMPLATE_FILE = "Template/MySy_Invoice_RIB_BureauValee_Perso_tpl.html"
template = templateEnv.get_template(TEMPLATE_FILE)
body = {
"params": {"order_id": "N/A",
"date_order": ": 12/08/2025",
"periode":"12/08/2025 au 29/08/2025",
"total_ht": "6360,81",
"tva": "1100",
"total_ttc": "7460,81",
"client_name": "BVD Fr (Bureau Vallée)",
"client_address": "25 rue du Gros Caillou",
"client_zip_ville": "78340 Les Clayes-sous-Bois",
"client_pays": "France",
"packs": "Prestation de service ",
"detail_packs": "Accompagnement au deploiement de l'ERP CoQliQo",
"qty": "10 jours",
"unit_price": "550 HT €",
"montant": "5 500 €",
"invoice_id": "FACT_20250817",
"invoice_date": "29/08/2025",
"due_date": "15/09/2025",
"orign_order": "N/A",
}
}
#print(" ### body 1 = ", body)
sourceHtml = template.render(params=body["params"])
"""msg.set_content(sourceHtml, subtype='html')
msg['From'] = MYSY_GV.O365_SMTP_COUNT_From_User
msg['Bcc'] = 'contact@mysy-training.com'
msg['Subject'] = "[MySy Training Technology] : Votre facture N° FACT_230500030"
msg['To'] = 'billardman1@gmail.com'
smtpserver.ehlo()
smtpserver.starttls()
smtpserver.login(MYSY_GV.O365_SMTP_COUNT_user, MYSY_GV.O365_SMTP_COUNT_password)
val = smtpserver.send_message(msg)
smtpserver.close()
"""
#print(" Email envoyé " + str(val))
### CREATION DE LA FACTION PDF
templateLoader = jinja2.FileSystemLoader(searchpath="./")
templateEnv = jinja2.Environment(loader=templateLoader)
#TEMPLATE_FILE = "Template/MySy_Invoice_RIB_tpl.html"
TEMPLATE_FILE = "Template/invoice_RIB_BureauVallee_perso_tpl.html"
template = templateEnv.get_template(TEMPLATE_FILE)
# This data can come from database query
#print(" ### body 22 = ", body)
sourceHtml = template.render(json_data=body["params"])
orig_file_name = "invoice_FACT_20250817.pdf"
outputFilename = str(MYSY_GV.INVOICE_DIRECTORY) + str(orig_file_name)
# open output file for writing (truncated binary)
@ -3297,7 +3511,7 @@ def Prepare_and_Send_Email_From_Front(tab_files, Folder, diction):
'$in': list_inscription_id_Objectid},
})
if( is_valide_email_in_related_collection != 1 ):
if( is_valide_email_in_related_collection <= 0 ):
mycommon.myprint(
str(inspect.stack()[0][
3]) + " L'adresse email '" + str(email_dest) + "' existe pas dans le système ")
@ -3846,7 +4060,7 @@ def send_invidual_email(diction):
tab_email_bcc.append(str(my_partner['email']))
""" IMPORTANT : Cette section sera utilisée une fois que le module de Queu de message est ok
queue_mail_diction = {}
queue_mail_diction['token'] = diction['token']
queue_mail_diction['from'] = MYSY_GV.O365_SMTP_COUNT_From_User
@ -3867,6 +4081,7 @@ def send_invidual_email(diction):
queue_mail_diction['smtp_account_From_User'] = MYSY_GV.O365_SMTP_COUNT_user
queue_mail_diction['smtp_account_port'] = MYSY_GV.O365_SMTP_COUNT_port
"""
tab_files = []
queue_mail_status, queue_mail_retval = email_queu_mgt.Add_Message_To_Mail_Queue(tab_files, queue_mail_diction)
@ -3893,7 +4108,22 @@ def send_invidual_email(diction):
else:
msg.attach(html_mime)
msg['From'] = MYSY_GV.O365_SMTP_COUNT_From_User
#msg['From'] = MYSY_GV.O365_SMTP_COUNT_From_User
company_name = ""
my_company_data = MYSY_GV.dbname['partnair_account'].find_one(
{'recid': str(partner_owner_recid), 'is_partner_admin_account': '1', 'active': '1',
'locked': '0'},
{'_id': 1, 'nom': 1})
if (my_company_data and "nom" in my_company_data.keys() and my_company_data['nom']):
company_name = my_company_data['nom']
if (company_name):
msg['From'] = str(company_name) + " <" + str(MYSY_GV.O365_SMTP_COUNT_From_User) + ">"
else:
msg['From'] = str(MYSY_GV.O365_SMTP_COUNT_From_User)
msg['Cc'] = ",".join(tab_email_cc)
msg['Bcc'] = ",".join(tab_email_bcc)
msg['Subject'] = email_sujet

View File

@ -439,6 +439,7 @@ def CreateTableauEmargement_From_Sequence(diction):
query_key['email'] = tmp_val['email']
query_key['session_id'] = tmp_val['session_id']
query_key['class_internal_url'] = tmp_val['class_internal_url']
query_key['session_formation_sequence_id'] = str(session_sequence['_id'])
query_key['date'] = str(session_sequence['sequence_start'])[0:10]
query_key['sequence_start'] = str(session_sequence['sequence_start'])
@ -458,13 +459,17 @@ def CreateTableauEmargement_From_Sequence(diction):
new_my_local_data['matin'] = False
new_my_local_data['apresmidi'] = False
if( "time_in_hour" in session_sequence.keys() ):
new_my_local_data['time_in_hour'] = session_sequence['time_in_hour']
else:
delta_time = datetime.strptime(str(session_sequence['sequence_end']), '%d/%m/%Y %H:%M') - datetime.strptime(str(session_sequence['sequence_start']),'%d/%m/%Y %H:%M')
delta_time_converted_in_hour = round(float(delta_time.total_seconds() / 3600), 2)
new_my_local_data['time_in_hour'] = str(delta_time_converted_in_hour)
if( "volume_theorique" in session_sequence.keys() and session_sequence['volume_theorique']):
new_my_local_data['time_in_hour'] = str(session_sequence['volume_theorique'])
else:
if( "time_in_hour" in session_sequence.keys() ):
new_my_local_data['time_in_hour'] = session_sequence['time_in_hour']
else:
delta_time = datetime.strptime(str(session_sequence['sequence_end']), '%d/%m/%Y %H:%M') - datetime.strptime(str(session_sequence['sequence_start']),'%d/%m/%Y %H:%M')
delta_time_converted_in_hour = round(float(delta_time.total_seconds() / 3600), 2)
new_my_local_data['time_in_hour'] = str(delta_time_converted_in_hour)
new_my_local_data['statut'] = "0"
new_my_local_data['date_envoi'] = ""
@ -557,29 +562,38 @@ def GetTableauEmargement(diction):
RetObject = []
for retval in MYSY_GV.dbname['emargement'].find({'session_id':str(session_id),
'class_internal_url':str(class_internal_url)}).sort([("date",pymongo.ASCENDING), ("sequence_start",pymongo.ASCENDING), ("sequence_end",pymongo.ASCENDING),]):
user = retval
if( "statut" not in retval.keys() ):
user['statut'] = ""
if ("date_envoi" not in retval.keys()):
user['date_envoi'] = ""
# Verifier que la sequence associée est bien valide
is_sequence_valide = 0
if( "session_formation_sequence_id" in retval.keys() and retval['session_formation_sequence_id']):
is_sequence_valide = MYSY_GV.dbname['session_formation_sequence'].count_documents({'_id':ObjectId(str(retval['session_formation_sequence_id'])),
'valide':'1', 'locked':'0',
'partner_owner_recid':str(partner_recid)})
if ("date_emargement" not in retval.keys()):
user['date_emargement'] = ""
if( is_sequence_valide > 0 ):
user = retval
if( "statut" not in retval.keys() ):
user['statut'] = ""
if ("time_in_hour" not in retval.keys()):
delta_time = datetime.strptime(str(user['sequence_end']), '%d/%m/%Y %H:%M') - datetime.strptime(
str(user['sequence_start']),'%d/%m/%Y %H:%M')
if ("date_envoi" not in retval.keys()):
user['date_envoi'] = ""
delta_time_converted_in_hour = round(float(delta_time.total_seconds() / 3600), 2)
user['time_in_hour'] = str(delta_time_converted_in_hour)
if ("date_emargement" not in retval.keys()):
user['date_emargement'] = ""
if ("mysy_manual_signature_img" not in retval.keys()):
user['mysy_manual_signature_img'] = ""
if ("time_in_hour" not in retval.keys()):
delta_time = datetime.strptime(str(user['sequence_end']), '%d/%m/%Y %H:%M') - datetime.strptime(
str(user['sequence_start']),'%d/%m/%Y %H:%M')
user['id'] = str(val_tmp)
RetObject.append(mycommon.JSONEncoder().encode(user))
val_tmp = val_tmp + 1
delta_time_converted_in_hour = round(float(delta_time.total_seconds() / 3600), 2)
user['time_in_hour'] = str(delta_time_converted_in_hour)
if ("mysy_manual_signature_img" not in retval.keys()):
user['mysy_manual_signature_img'] = ""
user['id'] = str(val_tmp)
RetObject.append(mycommon.JSONEncoder().encode(user))
val_tmp = val_tmp + 1
return True, RetObject
except Exception as e:
@ -1014,6 +1028,20 @@ def GerneratePDFEmargementList(diction):
local_tmp['sequence_end'] = val_tmp['sequence_end']
local_tmp['is_present'] = val_tmp['is_present']
local_tmp['time_in_hour'] = val_tmp['time_in_hour']
sequence_title = ""
if ("session_formation_sequence_id" in val_tmp.keys()):
session_formation_sequence_data = MYSY_GV.dbname['session_formation_sequence'].find_one(
{'_id': ObjectId(str(val_tmp['session_formation_sequence_id'])),
'partner_owner_recid': str(my_partner['recid']), }, {'sequence_title': 1})
if (session_formation_sequence_data and "sequence_title" in session_formation_sequence_data.keys()):
sequence_title = session_formation_sequence_data['sequence_title']
local_tmp['sequence_title'] = str(sequence_title)
# Comptabiliser les heures de présence
if( str(val_tmp['is_present']) == "True"):
if ("time_in_hour" not in val_tmp.keys()):
@ -1039,7 +1067,7 @@ def GerneratePDFEmargementList(diction):
tab_users.append(local_tmp)
total_heure = round(total_heure, 2)
#print(' ### tab_users = ' + str(tab_users))
print(' ### tab_users = ' + str(tab_users))
date_for_tmplate = {}
# Recuperation des données du partenaire

View File

@ -16,6 +16,7 @@ Formaulaire :
=> Max_note (si type = note)
"""
import ast
from operator import itemgetter
import bson
import pymongo
@ -152,7 +153,7 @@ def Add_Update_Question_Formulaire(diction):
Verification des input acceptés
"""
field_list = ['token', 'form_id', 'question_id', 'question', 'type', 'commentaire', 'list_choix', 'max_note',
'list_qcm', 'list_case_cocher', 'is_statistic', 'is_alert', 'alert_seuil' ]
'list_qcm', 'list_case_cocher', 'is_statistic', 'is_alert', 'alert_seuil', 'rang' ]
incom_keys = diction.keys()
for val in incom_keys:
@ -206,16 +207,7 @@ def Add_Update_Question_Formulaire(diction):
mycommon.myprint(" Le type des question est invalide. Les valeurs autorisées "+ MYSY_GV.FORM_QUESTION_TYPE)
return False, " Le type des question est invalide. Les valeurs autorisées "+ MYSY_GV.FORM_QUESTION_TYPE
"""
Si la question est utilisée dans le collection 'survey', on revuse
"""
if( "question_id" in diction.keys() ):
is_question_used_in_survey = MYSY_GV.dbname['survey'].count_documents(
{'user_response.question_id': str(diction['question_id']),
'valide': '1'})
if (is_question_used_in_survey > 0):
mycommon.myprint(" Il a déjà des réponses d'enquete avec cette question. Impossible de faire la mise à jour ")
return False, " Il a déjà des réponses d'enquete avec cette question. Impossible de faire la mise à jour "
"""
Verifier que la note maximale est un entier
@ -235,7 +227,7 @@ def Add_Update_Question_Formulaire(diction):
return False, " Pour ce type de question, la note maximale doit être supérieure a '1' "
print(" €€€€€€€€€ ")
# si 'question_id', verifier qu'il est valide
if( "question_id" in diction.keys() ):
@ -250,7 +242,11 @@ def Add_Update_Question_Formulaire(diction):
return False, " L'identifiant de la question est invalide "
# On doit faire un update
"""
Si la question a deja réussu des réponses, seule le rang est modifiable
"""
new_data = {}
new_data['_id'] = str(diction['question_id'])
new_data['date_update'] = str(datetime.now())
new_data['valide'] = "1"
new_data['update_by'] = str(my_partner['_id'])
@ -259,6 +255,17 @@ def Add_Update_Question_Formulaire(diction):
new_data['type'] = str(diction['type'])
new_data['_id'] = str(diction['question_id'])
if ("rang" in diction.keys()):
local_status, local_note_max = mycommon.IsInt(str(diction['rang']).strip())
if (local_status is False):
mycommon.myprint(
" Le rang doit être un nombre entier ")
return False, " Le rang doit être un nombre entier"
new_data['rang'] = mycommon.tryInt(str(diction['rang']))
else:
new_data['rang'] = 99
if ("commentaire" in diction.keys()):
new_data['commentaire'] = str(diction['commentaire'])
else:
@ -288,11 +295,9 @@ def Add_Update_Question_Formulaire(diction):
tab_list_choix = []
if ("list_choix" in diction.keys() and str(diction['type']) == "qcm"):
print(" diction[list_choix] = ", diction['list_choix'])
local_JSON = ast.literal_eval(diction['list_choix'])
for local_val in local_JSON :
print(" local_val ", local_val)
reponse_qcm = {}
if( "reponse" in local_val):
reponse_qcm['reponse_qcm'] = local_val['reponse']
@ -309,11 +314,9 @@ def Add_Update_Question_Formulaire(diction):
tab_list_case_cocher = []
if ("list_case_cocher" in diction.keys() and str(diction['type']) == "checkbox"):
print(" diction[list_case_cocher] = ", diction['list_case_cocher'])
local_JSON = ast.literal_eval(diction['list_case_cocher'])
for local_val in local_JSON :
print(" local_val ", local_val)
reponse_checkbox = {}
if( "reponse" in local_val):
reponse_checkbox['reponse_checkbox'] = local_val['reponse']
@ -690,6 +693,7 @@ def Get_List_Formulaire(diction):
if( "default" not in user.keys()):
user['default'] = "0"
RetObject.append(mycommon.JSONEncoder().encode(user))
return True, RetObject
@ -775,6 +779,10 @@ def Get_List_Formulaire_with_filter(diction):
if ("default" not in user.keys()):
user['default'] = "0"
if ("rang" not in user.keys()):
user['rang'] = "99"
RetObject.append(mycommon.JSONEncoder().encode(user))
return True, RetObject
@ -835,14 +843,44 @@ def Get_Given_Formulaire(diction):
RetObject = []
val_tmp = 0
qry = {"partner_owner_recid": str(my_partner['recid']), 'valide': '1', 'locked': '0', '_id':ObjectId(str(diction['form_id']))}
for New_retVal in MYSY_GV.dbname['formulaire'].find(qry).sort([("_id", pymongo.DESCENDING), ]):
for New_retVal in MYSY_GV.dbname['formulaire'].find(qry):
user = New_retVal
user['id'] = str(val_tmp)
val_tmp = val_tmp + 1
if ("default" not in user.keys()):
user['default'] = "0"
if( "list_questions" in user.keys()):
for tmp in user['list_questions']:
if( "rang" not in tmp.keys()):
tmp['rang'] = 99
sorted_data_rang = json.dumps(sorted(user['list_questions'], key=itemgetter('rang')))
data_list = json.loads(sorted_data_rang)
for question in data_list:
if ("_id" in question.keys()):
is_question_used_in_survey = MYSY_GV.dbname['survey'].count_documents(
{'user_response.question_id': str(question['_id']),
'valide': '1'})
if (is_question_used_in_survey > 0):
# On a déjà des réponses pour cette question
question['updatable'] = "0"
else:
question['updatable'] = "1"
if( "rang" not in question.keys() ):
question['rang'] = "99"
user['list_questions'] = data_list
RetObject.append(mycommon.JSONEncoder().encode(user))
return True, RetObject

View File

@ -159,6 +159,8 @@ def Add_Invoice_Paiement(diction):
if( "total_header_toutes_taxes" in is_existe_invoice_data.keys() ):
total_invoice_amount = is_existe_invoice_data['total_header_toutes_taxes']
print(" ### 00 total_invoice_amount = ", total_invoice_amount)
local_status, local_retval = mycommon.IsFloat(total_invoice_amount)
if (local_status is False):
mycommon.myprint(
@ -167,6 +169,7 @@ def Add_Invoice_Paiement(diction):
total_invoice_amount_float = local_retval
print(" ### 00 local_retval (is float) = ", local_retval)
"""
Récuprer les paiement déjà effectué
@ -180,8 +183,6 @@ def Add_Invoice_Paiement(diction):
list_payment = ast.literal_eval(local_list_paiement_retval[0])
#print(" Les payement JSON = ", list_payment)
total_payed_amount = "0"
if( "total_payed" in list_payment.keys() ):
@ -197,6 +198,7 @@ def Add_Invoice_Paiement(diction):
total_relicat = total_invoice_amount_float - total_payed_amount_float
if( total_relicat < 0 ):
mycommon.myprint(
str(inspect.stack()[0][3]) + " Le montant du "+str(total_relicat)+" est supérieur au montant payé "+str(total_payed_amount_float))
@ -235,6 +237,24 @@ def Add_Invoice_Paiement(diction):
"""
Mettre à jour la facture pour dire si elle est completement payée ou pas
"""
payed_amount = 0
for retval in MYSY_GV.dbname['invoice_paiement'].find({'invoice_id': str(diction['invoice_id']),
'partner_owner_recid': str(my_partner['recid']),
'valide': '1',
'locked': '0'}):
local_status, local_retval = mycommon.IsFloat(str(retval['paiement_amount']))
if (local_status is False):
mycommon.myprint(
str(inspect.stack()[0][3]) + " Impossible d'évaluer les paiements effectués ")
return False, " Impossible d'évaluer les paiements effectués "
payed_amount = payed_amount + local_retval
remain_to_paye = round(total_invoice_amount_float - payed_amount,2)
update_data = {}
update_data['date_update'] = str(datetime.now())
update_data['update_by'] = str(my_partner['_id'])
@ -243,8 +263,10 @@ def Add_Invoice_Paiement(diction):
if( total_relicat == 0):
update_data['invoice_paiement_status'] = "2"
update_data['reste_to_paye'] = str(remain_to_paye)
else:
update_data['invoice_paiement_status'] = "1"
update_data['reste_to_paye'] = str(remain_to_paye)
result = MYSY_GV.dbname['partner_invoice_header'].find_one_and_update(
{'_id':ObjectId(str(diction['invoice_id'])),
@ -360,6 +382,7 @@ def Update_Invoice_Paiement(diction):
'partner_owner_recid': str(my_partner['recid'])})
existing_old_paiement = is_existe_invoice_paiement_data
"""
Verifier que l'_id de la facture fourni dans diction est bien l'_id de la facture contenu dans le paiement
"""
@ -462,8 +485,9 @@ def Update_Invoice_Paiement(diction):
"""
Tout est ok, alors on enregistre le paiement
"""
mytoken = diction['token']
local_paiement_id = diction['_id']
new_data = diction
del diction['token']
del diction['_id']
@ -491,6 +515,24 @@ def Update_Invoice_Paiement(diction):
"""
Mettre à jour la facture pour dire si elle est completement payée ou pas
"""
payed_amount = 0
for retval in MYSY_GV.dbname['invoice_paiement'].find({'invoice_id': str(diction['invoice_id']),
'partner_owner_recid': str(my_partner['recid']),
'valide': '1',
'locked': '0'}):
local_status, local_retval = mycommon.IsFloat(str(retval['paiement_amount']))
if (local_status is False):
mycommon.myprint(
str(inspect.stack()[0][3]) + " Impossible d'évaluer les paiements effectués ")
return False, " Impossible d'évaluer les paiements effectués "
payed_amount = payed_amount + local_retval
remain_to_paye = round(total_invoice_amount_float - payed_amount, 2)
update_data = {}
update_data['date_update'] = str(datetime.now())
update_data['update_by'] = str(my_partner['_id'])
@ -499,8 +541,10 @@ def Update_Invoice_Paiement(diction):
if( total_relicat == 0):
update_data['invoice_paiement_status'] = "2"
update_data['reste_to_paye'] = str(remain_to_paye)
else:
update_data['invoice_paiement_status'] = "1"
update_data['reste_to_paye'] = str(remain_to_paye)
result = MYSY_GV.dbname['partner_invoice_header'].find_one_and_update(
{'_id':ObjectId(str(diction['invoice_id'])),
@ -512,6 +556,23 @@ def Update_Invoice_Paiement(diction):
return_document=ReturnDocument.AFTER
)
"""
Ajout l'action dans l'historique
"""
## Add to log history
now = str(datetime.now().strftime("%d/%m/%Y %H:%M:%S"))
history_event_dict = {}
history_event_dict['token'] = str(mytoken)
history_event_dict['related_collection'] = "partner_invoice_header"
history_event_dict['related_collection_recid'] = str(diction['invoice_id'])
history_event_dict['action_date'] = str(now)
history_event_dict['action_description'] = "Mise à jour paiement. Montant : " +str(existing_old_paiement['paiement_amount'])+" ==>" + str(diction['paiement_amount']) + ", Mode : " +str(existing_old_paiement['paiement_mode'])+" ==>"+ str(
diction['paiement_mode'])
local_status, local_retval = mycommon.Collection_Historique.Add_Historique_Event(history_event_dict)
if (local_status is False):
mycommon.myprint(
" WARNING : Impossible de logguer l'historique pour l'évènement : " + str(history_event_dict))
return True, " Le paiement a été correctement mise à jour "
except Exception as e:
@ -711,7 +772,7 @@ def Get_Invoice_Liste_Payement_And_Total_Amount(diction):
"""
Cette fonction retounne le montant total payé dans une facture ainsi que
Cette fonction retourne le montant total payé dans une facture ainsi que
le reste à payer
"""
def Get_Invoice_Total_Amount_Payed_And_Remaining_Amount(diction):

200
main.py
View File

@ -417,6 +417,20 @@ def get_class():
return jsonify(status=status, message=retval)
"""
Cette API fonction recuperer les données d'une formation indépendamment de sont affichage sur la marketplace
"""
@app.route('/myclass/api/get_class_without_marketplace_check/', methods=['POST','GET'])
@crossdomain(origin='*')
def get_class_without_marketplace_check():
# On recupere le corps (payload) de la requete
payload = mycommon.strip_dictionary (request.form.to_dict())
print(" ### get_class_without_marketplace_check : payload = ",str(payload)+" IP requester = "+str(request.remote_addr))
status, retval = cm.get_class_without_marketplace_check(payload)
return jsonify(status=status, message=retval)
@app.route('/myclass/api/get_class_for_partner_catalog/', methods=['POST','GET'])
@crossdomain(origin='*')
@ -531,7 +545,7 @@ def get_partner_class_Without_Scope_Action():
def update_class():
# On recupere le corps (payload) de la requete
payload = mycommon.strip_dictionary (request.form.to_dict())
print(" ### update_class payload = (trop long cherif) " )
print(" ### update_class payload = (trop long cherif) ", payload )
status, retval, class_id = cm.update_class(payload)
@ -3076,6 +3090,40 @@ def ManualSendInvoiceEmailRIB_CIC_JMJFormation():
"""
API Creation manuelle d'une facture avec RIB CIC pour France Active - perso
"""
@app.route('/myclass/api/ManualSendInvoiceEmailRIB_CIC_France_Active/', methods=['POST','GET'])
@crossdomain(origin='*')
def ManualSendInvoiceEmailRIB_CIC_France_Active():
# On recupere le corps (payload) de la requete
payload = mycommon.strip_dictionary (request.form.to_dict())
print(" ### ManualSendInvoiceEmailRIB_CIC_France_Active : payload = ",str(payload))
localStatus, message= emails.ManualSendInvoiceEmailRIB_CIC_France_Active(payload)
return jsonify(status=localStatus, message=message )
"""
API Creation manuelle d'une facture avec RIB CIC pour Bureau Vallée - perso
"""
@app.route('/myclass/api/ManualSendInvoiceEmailRIB_CIC_BureauVallee/', methods=['POST','GET'])
@crossdomain(origin='*')
def ManualSendInvoiceEmailRIB_CIC_BureauVallee():
# On recupere le corps (payload) de la requete
payload = mycommon.strip_dictionary (request.form.to_dict())
print(" ### ManualSendInvoiceEmailRIB_CIC_BureauVallee : payload = ",str(payload))
localStatus, message= emails.ManualSendInvoiceEmailRIB_CIC_BureauVallee(payload)
return jsonify(status=localStatus, message=message )
"""
API de recuperation au formation CSV de la liste des inscrits à une formation
avec les statuts (validé ou pas)
@ -7812,6 +7860,21 @@ def Get_Session_Sequence_List():
return jsonify(status=status, message=retval, nb_sequence=nb_sequence)
"""
API qui recupere le nombre de séquences d'une session de formation
"""
@app.route('/myclass/api/Get_Session_Nb_Sequence/', methods=['POST','GET'])
@crossdomain(origin='*')
def Get_Session_Nb_Sequence():
# On recupere le corps (payload) de la requete
payload = mycommon.strip_dictionary (request.form.to_dict())
print(" ### Get_Session_Nb_Sequence payload = ",payload)
status, retval = Session_Formation_Sequence.Get_Session_Nb_Sequence(payload)
return jsonify(status=status, message=retval)
"""
API qui recupere les données d'une séquence d'une session de formation
"""
@ -8300,8 +8363,8 @@ def Get_Action_Historique_List():
# On recupere le corps (payload) de la requete
payload = mycommon.strip_dictionary (request.form.to_dict())
print(" ### Get_Action_Historique_List payload = ",payload)
status, retval = Collection_Historique.Get_Action_Historique_List(payload)
return jsonify(status=status, message=retval)
status, retval, max_line = Collection_Historique.Get_Action_Historique_List(payload)
return jsonify(status=status, message=retval, max_line=max_line)
"""
@ -9871,6 +9934,21 @@ def Get_Given_Survey_Data_No_Token():
return jsonify(status=status, message=retval)
"""
API pour recuperer les données d'une enquete en passant par un QR Code
"""
@app.route('/myclass/api/Get_Given_Survey_Data_From_QR_Code_No_Token/', methods=['POST','GET'])
@crossdomain(origin='*')
def Get_Given_Survey_Data_From_QR_Code_No_Token():
# On recupere le corps (payload) de la requete
payload = mycommon.strip_dictionary (request.form.to_dict())
print(" ### Get_Given_Survey_Data_From_QR_Code_No_Token payload = ",payload)
status, retval = survey_mgt.Get_Given_Survey_Data_From_QR_Code_No_Token(payload)
return jsonify(status=status, message=retval)
"""
API pour enregistrer les resultat d'une enquete
"""
@ -9914,6 +9992,62 @@ def Init_Survey_Tab_For_All_Session_Inscrit():
"""
API pour initialiset (suppression et creation ) d'une enquete pour tous
les inscrits d'un session.
algorithm :
On supprime tous enregistrements avec le clé :
- session_id,
La difference avec les autre qu'il nous ajouter 2 informations à la volée :
- survey_internal_code : pour identifier toutes les lignes relative à la meme évaluation
- survey_type = 'specific'
"""
@app.route('/myclass/api/Init_Specific_Survey_Tab_For_All_Session_Inscrit/', methods=['POST','GET'])
@crossdomain(origin='*')
def Init_Specific_Survey_Tab_For_All_Session_Inscrit():
# On recupere le corps (payload) de la requete
payload = mycommon.strip_dictionary (request.form.to_dict())
print(" ### Init_Specific_Survey_Tab_For_All_Session_Inscrit payload = ",payload)
status, retval, survey_internal_code = survey_mgt.Init_Specific_Survey_Tab_For_All_Session_Inscrit(payload)
return jsonify(status=status, message=retval, survey_internal_code=survey_internal_code)
"""
API pour ajouter une évaluation spécifique
"""
@app.route('/myclass/api/Add_Specific_Survey_Tab_For_All_Session_Inscrit/', methods=['POST','GET'])
@crossdomain(origin='*')
def Add_Specific_Survey_Tab_For_All_Session_Inscrit():
# On recupere le corps (payload) de la requete
payload = mycommon.strip_dictionary (request.form.to_dict())
print(" ### Add_Specific_Survey_Tab_For_All_Session_Inscrit payload = ",payload)
status, retval, survey_internal_code = survey_mgt.Add_Specific_Survey_Tab_For_All_Session_Inscrit(payload)
return jsonify(status=status, message=retval, survey_internal_code=survey_internal_code)
"""
Cette API recupere l'internal_code des evaluations spécifiques
d'une session de formation
"""
@app.route('/myclass/api/Get_List_Specific_Survey_Internal_Code/', methods=['POST','GET'])
@crossdomain(origin='*')
def Get_List_Specific_Survey_Internal_Code():
# On recupere le corps (payload) de la requete
payload = mycommon.strip_dictionary (request.form.to_dict())
print(" ### Get_List_Specific_Survey_Internal_Code payload = ",payload)
status, retval = survey_mgt.Get_List_Specific_Survey_Internal_Code(payload)
return jsonify(status=status, message=retval)
"""
API pour initialiset (suppression et creation ) d'une enquete pour tous
@ -10363,7 +10497,6 @@ def Decale_Session_Sequence_X_days():
"""
API Pour ajouter une categorie de formation
"""
@ -11481,6 +11614,35 @@ def Create_Emargement_QR_Code_From_Inscription(token, session_id, tab_emargement
return False
"""
API pour créer un fichier QR code pour les demandes d'évaluation
"""
@app.route('/myclass/api/Create_Evaluation_QR_Code_From_Survey/<token>/<session_id>/<tab_survey_ids>/<type_eval>', methods=['POST','GET'])
@crossdomain(origin='*')
def Create_Evaluation_QR_Code_From_Survey(token, session_id, tab_survey_ids, type_eval):
# On recupere le corps (payload) de la requete
payload = mycommon.strip_dictionary (request.form.to_dict())
payload = {}
payload['token'] = str(token)
payload['session_id'] = str(session_id)
payload['tab_survey_ids'] = str(tab_survey_ids)
payload['type_eval'] = str(type_eval)
print(" ### Create_Evaluation_QR_Code_From_Survey : payload = ",str(payload))
localStatus, response= survey_mgt.Create_Evaluation_QR_Code_From_Survey(payload)
if(localStatus ):
return response
else:
return False
"""
API :
22/06/2024 - Nouvelle version d'envoi des demandes d'emargement par email
@ -11674,6 +11836,20 @@ def Delete_List_Survey():
"""
API pour recuperer la l'url d'un survey en fournissant le session_id et l'email de l'inscrit
"""
@app.route('/myclass/api/Get_Survey_Url_From_SessionId_Email_No_Token/', methods=['POST','GET'])
@crossdomain(origin='*')
def Get_Survey_Url_From_SessionId_Email_No_Token():
# On recupere le corps (payload) de la requete
payload = mycommon.strip_dictionary (request.form.to_dict())
print(" ### Get_Survey_Url_From_SessionId_Email_No_Token payload = ",payload)
status, retval = survey_mgt.Get_Survey_Url_From_SessionId_Email_No_Token(payload)
return jsonify(status=status, message=retval)
"""
@ -12123,7 +12299,7 @@ API permet de recuperer les data du partenaire proprietaire d'un sous domaine
def Get_Partner_Data_From_Subdomain():
# On recupere le corps (payload) de la requete
payload = mycommon.strip_dictionary (request.form.to_dict())
print(" ### Get_Partner_Data_From_Subdomain payload = ",payload)
print(" ### Get_Partner_Data_From_Subdomain payload iiiiiiii = ",payload)
status, retval = mycommon.Get_Partner_Data_From_Subdomain(payload)
return jsonify(status=status, message=retval)
@ -13833,6 +14009,20 @@ def JMJ_Repise_Factures():
return jsonify(status=localStatus, message=message )
"""
Test reprise facture JMJ update inscription invoice status
"""
@app.route('/myclass/api/JMJ_Repise_Factures_Update_Inscription_Status/', methods=['POST','GET'])
@crossdomain(origin='*')
def JMJ_Repise_Factures_Update_Inscription_Status():
# On recupere le corps (payload) de la requete
payload = mycommon.strip_dictionary (request.form.to_dict())
print(" ### JMJ_Repise_Factures_Update_Inscription_Status : payload = ",payload)
localStatus, message= tools_cherif.JMJ_Repise_Factures_Update_Inscription_Status(payload)
return jsonify(status=localStatus, message=message )
if __name__ == '__main__':
print(" debut api")

View File

@ -104,6 +104,10 @@ def Add_Update_Partner_Basic_Setup(diction):
if (local_status is not True):
return local_status, my_partner
print(" ### str(diction['config_name']) = ", str(diction['config_name']))
print(" ### MYSY_GV.PARTNER_BASE_CONFIG_NAME = ", str(MYSY_GV.PARTNER_BASE_CONFIG_NAME))
if(str(diction['config_name']) not in MYSY_GV.PARTNER_BASE_CONFIG_NAME):
mycommon.myprint(
@ -290,7 +294,7 @@ def Get_List_Partner_Basic_Setup(diction):
if(len(tab_related_collection) > 0 ):
qry = {'$and': [{'partner_owner_recid':str(my_partner['recid']), 'valide':'1', 'locked':'0',}, filt_related_collection]}
print(" ### Get_List_Partner_Basic_Setup QRY = ", qry)
for New_retVal in MYSY_GV.dbname['base_partner_setup'].find(qry ):
if( str(New_retVal['config_name']) == "smtp_user_pwd"):
New_retVal['config_value'] = New_retVal['config_value'][:2]+"...."+str(New_retVal['config_value'])[-2:]

View File

@ -202,7 +202,7 @@ def Invoice_Partner_Order(diction):
# Récuperation de la sequence de l'objet "partner_invoice_header" dans la collection : "mysy_sequence"
retval_sequence_invoice = MYSY_GV.dbname['mysy_sequence'].find_one({'partner_invoice_header': 'partner_order_header',
retval_sequence_invoice = MYSY_GV.dbname['mysy_sequence'].find_one({'related_mysy_object': 'partner_invoice_header',
'valide': '1', 'partner_owner_recid': str(
my_partner['recid'])})

View File

@ -4588,8 +4588,8 @@ def Get_Dictionnary_data_For_Template(diction):
'distantiel', 'presentiel', 'session_ondemande', 'nb_participant',
'prix_session', 'titre', 'location_type', 'is_bpf', 'formateur_id', 'adresse',
'code_postal', 'ville', 'pays', 'date_debut_inscription', 'date_fin_inscription',
'formateur_nom_prenom', 'session_formation_titre', 'session_formation_objectif',
'session_formation_description']
'formateur_nom_prenom', 'formateur_email', 'session_formation_titre', 'session_formation_objectif',
'session_formation_description', 'nb_participant']
list_session_data = []
tab_session_id = diction['list_session_id']
@ -4628,6 +4628,8 @@ def Get_Dictionnary_data_For_Template(diction):
# Recuperation des données du formation
formateur_nom_prenom = ""
formateur_email = ""
# Si il y a un code formateur_id, alors on va recuperer les nom et prenom du formation
if ("formateur_id" in session_data.keys() and session_data['formateur_id']):
@ -4641,7 +4643,11 @@ def Get_Dictionnary_data_For_Template(diction):
if (formateur_data and "nom" in formateur_data.keys() and "prenom" in formateur_data.keys()):
formateur_nom_prenom = str(formateur_data['nom']) + " " + str(formateur_data['prenom'])
if (formateur_data and "email" in formateur_data.keys()):
formateur_email = str(formateur_data['email'])
session_data['formateur_nom_prenom'] = formateur_nom_prenom
session_data['formateur_email'] = formateur_email
new_session_data = {}
for champ in session_liste_champ:
@ -4806,7 +4812,8 @@ def Get_Dictionnary_data_For_Template(diction):
list_myclass_data = []
tab_myclass_id = diction['list_class_id']
myclass_liste_champ = ['certif', 'cpf', 'metier', 'objectif', 'title', 'duration', 'duration_unit', ]
myclass_liste_champ = ['certif', 'cpf', 'metier', 'objectif', 'title', 'duration', 'duration_unit',
'methode_pedagogique' , 'suivi_eval']
for myclass_data in MYSY_GV.dbname['myclass'].find({'_id': {'$in': tab_myclass_id, },
'valide': '1',
@ -6968,25 +6975,38 @@ def Get_Partner_Data_From_Subdomain(diction):
print(" ## QRY = ", {'subdomaine_catalog_pub':diction['subdomain'],
'active':'1',
'locked':'0',
'firstconnexion':'0',
'is_partner_admin_account': '1'
})
partnair_data_count = MYSY_GV.dbname['partnair_account'].count_documents({'subdomaine_catalog_pub':diction['subdomain'],
'active':'1',
'locked':'0',
'firstconnexion':'0'
'firstconnexion':'0',
'is_partner_admin_account':'1'
})
if( partnair_data_count != 1 ):
myprint(
str(inspect.stack()[0][3]) + " Sous Domaine invalide ")
str(inspect.stack()[0][3]) + " Sous Domaine invalide 11 ")
return False, " Sous Domaine invalide"
RetObject = []
val_tmp = 0
# print(" ### data_cle = ", data_cle)
print(" ## QTY2 = ", {'subdomaine_catalog_pub': diction['subdomain'],
'active': '1',
'locked': '0',
'firstconnexion': '0',
'is_partner_admin_account': '1'
})
for retval in MYSY_GV.dbname['partnair_account'].find({'subdomaine_catalog_pub': diction['subdomain'],
'active': '1',
'locked': '0',
'firstconnexion': '0'
'firstconnexion': '0','is_partner_admin_account':'1'
}, {'_id':1, 'recid':1, 'nom':1}):
user = retval
user['id'] = str(val_tmp)
@ -7880,6 +7900,7 @@ def Push_Document_To_ENT_For_Inscrit(tab_files, Folder, diction):
if (str(partner_own_smtp_value) == "1"):
msg.attach(html_mime)
msg['From'] = partner_SMTP_COUNT_From_User
msg['Bcc'] = "contact@mysy-training.com"
msg['Subject'] = sujetHtml
msg['to'] = str(email)
@ -7894,7 +7915,22 @@ def Push_Document_To_ENT_For_Inscrit(tab_files, Folder, diction):
else:
msg.attach(html_mime)
msg['From'] = partner_SMTP_COUNT_From_User
#msg['From'] = partner_SMTP_COUNT_From_User
company_name = ""
my_company_data = MYSY_GV.dbname['partnair_account'].find_one(
{'recid': str(my_partner['recid']), 'is_partner_admin_account': '1', 'active': '1',
'locked': '0'},
{'_id': 1, 'nom': 1})
if (my_company_data and "nom" in my_company_data.keys() and my_company_data['nom']):
company_name = my_company_data['nom']
if (company_name):
msg['From'] = str(company_name) + " <" + str(partner_SMTP_COUNT_From_User) + ">"
else:
msg['From'] = str(partner_SMTP_COUNT_From_User)
msg['Bcc'] = "contact@mysy-training.com"
msg['Subject'] = sujetHtml
msg['to'] = str(email)

View File

@ -939,6 +939,7 @@ def Update_Ressource_Humaine(diction):
if diction['profil']:
profil = diction['profil']
#print(" ## QRY addupdate = ", {'profil_nom': str(profil), 'valide': '1', 'locked': '0'})
Rh_profil_count = MYSY_GV.dbname['ressource_humaine_profil'].count_documents(
{'profil_nom': str(profil), 'valide': '1', 'locked': '0'})
@ -1478,7 +1479,7 @@ def Get_List_Ressource_Humaine_with_filter(diction):
Verification des input acceptés
"""
field_list = ['token', 'nom', 'email', 'formation',
'session', 'type_rh']
'session', 'type_rh', 'competence']
incom_keys = diction.keys()
for val in incom_keys:
@ -1519,28 +1520,43 @@ def Get_List_Ressource_Humaine_with_filter(diction):
return False, str(inspect.stack()[0][3]) + " - impossible de récupérer les données de l'utilisateur. "
filt_nom = {}
if ("nom" in diction.keys()):
if ("nom" in diction.keys() and diction['nom']):
filt_nom = {'nom': {'$regex': str(diction['nom']), "$options": "i"}}
filt_type_rh = {}
if ("type_rh" in diction.keys()):
if ("type_rh" in diction.keys() and diction['type_rh']):
filt_type_rh = {'type_rh': str(diction['type_rh'])}
filt_email = {}
if ("email" in diction.keys()):
if ("email" in diction.keys() and diction['email']):
filt_email = {
'email': {'$regex': str(diction['email']), "$options": "i"}}
sub_filt_formation = {}
if ("formation" in diction.keys()):
if ("formation" in diction.keys() and diction['formation']):
sub_filt_formation = {
'external_code': {'$regex': str(diction['formation']), "$options": "i"}, 'partner_owner_recid':str(my_partner['recid'])}
sub_filt_session = {}
if ("session" in diction.keys()):
if ("session" in diction.keys() and diction['session']):
sub_filt_session = { 'code_session': {'$regex': str(diction['session']), "$options": "i"}, 'partner_owner_recid':str(my_partner['recid'])}
filt_competence = {}
if( "competence" in diction.keys() and diction['competence']):
# Aller chercher la liste des employés (ressources humaines) ayant ces compétence
tab_competence_ids_split = str(diction['competence']).split(",")
tab_competence_ids = []
tab_list_competence = []
for tmp in tab_competence_ids_split:
if( tmp ):
tab_competence_ids.append(str(tmp).strip())
local_node = {}
local_node['list_competence._id'] = str(tmp).strip()
tab_list_competence.append(local_node)
filt_competence = {"$and":tab_list_competence}
"""
@ -1549,7 +1565,7 @@ def Get_List_Ressource_Humaine_with_filter(diction):
"""
filt_session = {}
Lists_session_id = []
if ("session" in diction.keys()):
if ("session" in diction.keys() and diction['session']):
for Lists_session in MYSY_GV.dbname['session_formation'].find(sub_filt_session, {'_id':1}):
Lists_session_id.append(str(Lists_session['_id']))
@ -1566,7 +1582,7 @@ def Get_List_Ressource_Humaine_with_filter(diction):
"""
filt_formation = {}
Lists_formation_id = []
if ("formation" in diction.keys()):
if ("formation" in diction.keys() and diction['formation']):
for Lists_formation in MYSY_GV.dbname['myclass'].find(sub_filt_formation, {'_id': 1}):
Lists_formation_id.append(str(Lists_formation['_id']))
@ -1589,7 +1605,7 @@ def Get_List_Ressource_Humaine_with_filter(diction):
data_cle['valide'] = "1"
find_qry = {'$and':[{'partner_recid': str(my_partner['recid']), 'valide':'1', 'locked':'0', 'is_partner_admin_account':'0' }, filt_nom, filt_email,
filt_type_rh] }
filt_type_rh, filt_competence] }
new_myquery = [{'$match': find_qry},
@ -1610,8 +1626,8 @@ def Get_List_Ressource_Humaine_with_filter(diction):
}
]
#print(" ##### new_myquery aa = ", new_myquery)
#print(" ##### find_qry aa = ", find_qry)
print(" ##### new_myquery aa = ", new_myquery)
print(" ##### find_qry aa = ", find_qry)
New_RetObject = []
New_val_tmp = 1
@ -5359,7 +5375,7 @@ def Add_Update_RH_Competence(diction):
"""
Verification des input acceptés
"""
field_list = ['token', 'competence_id', 'competence', 'niveau', 'rh_id']
field_list = ['token', 'competence_id', 'competence', 'niveau', 'rh_id', 'new_competence_id']
incom_keys = diction.keys()
for val in incom_keys:
@ -5448,7 +5464,6 @@ def Add_Update_RH_Competence(diction):
return True, " La compétence a été mise à jour"
else:
# Il s'agit de la creation d'une competence
new_data = {}
@ -5459,8 +5474,11 @@ def Add_Update_RH_Competence(diction):
new_data['competence'] = str(diction['competence'])
new_data['niveau'] = str(diction['niveau'])
new_competence_id = secrets.token_hex(5)
new_data['_id'] = new_competence_id
if( "new_competence_id" in diction.keys() and diction['new_competence_id']):
new_data['_id'] = diction['new_competence_id']
else:
new_competence_id = secrets.token_hex(5)
new_data['_id'] = new_competence_id
update = MYSY_GV.dbname['ressource_humaine'].update_one({'_id': ObjectId(str(diction['rh_id'])),

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1,99 +0,0 @@
%PDF-1.4
%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com
1 0 obj
<<
/F1 2 0 R /F2 3 0 R /F3 4 0 R
>>
endobj
2 0 obj
<<
/BaseFont /Helvetica /Encoding /WinAnsiEncoding /Name /F1 /Subtype /Type1 /Type /Font
>>
endobj
3 0 obj
<<
/BaseFont /Helvetica-Bold /Encoding /WinAnsiEncoding /Name /F2 /Subtype /Type1 /Type /Font
>>
endobj
4 0 obj
<<
/BaseFont /Helvetica-Oblique /Encoding /WinAnsiEncoding /Name /F3 /Subtype /Type1 /Type /Font
>>
endobj
5 0 obj
<<
/Contents 10 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 9 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
6 0 obj
<<
/Contents 11 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 9 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
7 0 obj
<<
/PageMode /UseNone /Pages 9 0 R /Type /Catalog
>>
endobj
8 0 obj
<<
/Author () /CreationDate (D:20250713203048+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20250713203048+02'00') /Producer (xhtml2pdf <https://github.com/xhtml2pdf/xhtml2pdf/>)
/Subject () /Title () /Trapped /False
>>
endobj
9 0 obj
<<
/Count 2 /Kids [ 5 0 R 6 0 R ] /Type /Pages
>>
endobj
10 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 2219
>>
stream
Gb"/(>?BQ=&:WeDbT#e!(gg`6iFuLM4mbfIKQLQZHT8lCJpMf9/NK[-^*D<+m)2JcKjFD'E_:.>1E+Mc1\rF8T];*,Ies_mLG><)).8gcSq>A?\hG1U2a7(eFGp0Y@^Xn<XKL#pTVq+Efs`MsX\9[QC?-V.X':<m_iH$ACb5=$[@UmG3!."EE#,pES%>%?GLb5>3eIpTKCLl;s!A2b<<h5:S)Lr,c0kRP1JHQRbc^9ifJofJASrDD(k*GS].,.#)c,clp6ogPRbl3J/]J`XbqO/c>-=`lAh31#L=^p$fAfZECVZ!nG;K);kJ<u"=2WFPpM0V<1q`DImdTc#)[nhg"YV&NCc\o)CIZW)]D9aC8`tLOQlf39"3n)e$P,TnnZ8,iADeg9Q(K6H$WK04=,-M"kb7nG?E^4&nG!I.dk'*?<R/moS)t*rcbW"P),i"E.W\0_\R[<KWKakK1tL+@7o4i9lM"=!m!bt*eOCM4SCNNd8mu[$9P5V_4Mi4<QmQN8"A<4F>u>k-m)gdmFMMOeA=hr4'?etu-Ot,/7E\O1_C_4G:t<*d,-/eV!u(s<fuqoFroAjFOhidB"^<[c-9Iq:!t,uAj6Ep18TF!%2jYWd?>Xf)AhamNTjr[pX_[#o&^&!9H!k&t4-DbCPf4WgaJ!l\S2`/sD6DYr3-_#mF<!=pNp@ai46RlF"eN+u<(baVm_Ne$4jEBfnR#K'f'ACI%U".baL/5`)V1s"6:6J!"G@I1ejC6lTT1I3SARe:,T'4*NF6lulV_S]\3s^^d3bEBHDZte)js13<u)OY[7t[Ae#R>oeF?[qntm@>%,Wj=:R-I5Mf+;1@%N&t%3cGN`ZL7uO;F)B-W/EM2@t40^mjg2\,9:^&#53\o&D.<a1bLbJSk':]4\_NHO+h1;TBZg3j`.hn!'e&.u4/bI8!.;dHL8Zq^e)u4(Tnbf&UuoCTm0>LTG2l46u8l5%+,eB@5*i=#CdbULHI3."juP/hfHM"irL.+F(e;/^n0CY@FrHG<Zo"=^)8[#dWe*+21Tl!dMUp.6WeU0uu6[O!4sVaPD5PE'V+&2fKbP<4uZ_6\F$]VNAd9X4i`32fTNr@N*,%l=.[H]9"kE8rQB/6^#ofblc$r)'10[fhW2-XEGcG0Ij&Fqs\a5]X;OlT(>p:WnjZjWp!\>S[G7DfS*RZrA=*'X(jRWHfOCRV,Yb4RK.=[gJT&1R7E.MJOtV5(L9J@1LN&?#O;3h9sNr=B67YR-'>")^)B]D9R"fV*=l5ia0a!O%1Uq1flCN.$&.nA^@u)3-%V#o]`g?PfA0Yd7^d(P*8+sNVMW=MUrb/6;:IAqLuc-rb2u-5+CPbtL-3bC&!r/$SS3G*GYAfa?69^!/=Ed3)<E6M)I8FY;`7A,!QB@E9sQTf8A>Q#e(2?9^NXW5^;\WghMts/Y-u^-?9BGgWd9M0<K2#)k!eGZ9-6BqC;4"2i>hG:Q!6'X5$u:q9Q`*qOI=O:``7p1W/SQUNR#Pq:&.5tAS6h)4QBU&0=d`uQ+Tj<gB>ddCMs%+IrFDZm>>%:`^co7I@l-#CQKIO$3AOMrmT5:I2T0EOf6Q?1fZQ/eD[LnE11p:%6E4QaQttnhrm^>.Og_Ci^D+X`6*$MXg]41bia[XTW>(%HYP)gc)koldhl%P<#+&9iN/^a@4rf;Z.=l49:An>7r@:\)d31R5jTn#9'$]Ho%(*h?.0=;]%Js5;4k;Uh9_ZZ/d32rs,mM-Q^-ASL9AA[WhqWhX<aVSYW:#R#a-l-+#*dAP#N!\/>p4T8-jbLCsKQ:iYbSJpB3Gb:]MoeGa&=RBJ`4f(AfXj6&(5\@5T5>M55A?=%sh^GQ@mbNnpT;?NgY+7Aq.L-6J=.1D66dDouT0bse')ARmjoM5EHM3P$t^59iD7GE@_#B6$M=Ra$CI!L6VH6JI\$+Ln8pi)6R%)&>B$9"L1XRDk7sRnXueMUE1ZJ-1]TbiZDU7C2L%#\]6K`4NDK'HSfXBnh/T$6fp_RYjpOP"'6F4o'3&8-iklPJm2%ol7[;bo%:6.4L[%R]lboKO0q8_p/-2S.k,l8>]=uK@H_m;`PdCTeqNqLTs,+RIWZ[Bl-]u^Y1iX)SJ+f*JNLF]/bVaNhHA]SA.LObHVlsROqG6#3\!2kCC"Bf.Y<C#j;:&Ce"4>0].DK"4Jt(%tBZ-kMIX)YPi*B?1eO(Or62Hiq!;26.>Q0lfQ%20,M\L^]~>endstream
endobj
11 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 644
>>
stream
Gb!#Y995Pr&AI`dk1$8n0HT!$OCP>/V5gOR)ihVYK[$g^OV1^jq]3mjJLX=B_fg`!Af`&O2]`J8S1_1p>n6?Q!q-<o"[r*8MCF@q_jAI?m;2"+/m8BO.]kNE)),Dh8\*pEem0;d*lW^>#^s-l`WmZShe#U,Y'jJ81L-[DiB19U0Fj%q@N'ZNE^40rVXJag!Xo+YGC)*L\h0O(aPN96+YM2AT"mO@qm+B)3\?7#&3U(_+(9;nP+n`b=Nd]mMq1BN@_]2E2q'5naga\5qH=NaASG&lYdP78>'H)<h,31s#:Xs([oFsDVt@6\Qc&e/[csKAlSu#0$X*^],>jNXf%thOQa9W;P*G(d2qoD[e%B7r[15rTrbNE<p^?VeT\fSrpd0a0KX?AunV7\T6Mr6FQ?>L5!pYB98bPj4B&9?$;+8ArfH8Z#NSrg/744(/=J4i*M1>7G/=i&tL(4Y5Rf?1$BI_uUdh(4eTn7f2dJd<ImPJ^AUQeiGC2pmWc=BH#k7"c2MYQ?iMbe:.Vcc)<?l534@`SYJZ%Znt"$:Fqq4PjlL>tX(,i.DD&81UXQ&9R!69PS2VKDt'j;4oVTrsHS[HHoqMA7jV]/'-#TXN]*W.IKF=`91HlTO3^3;VUJ!KQ+9!=MfANr~>endstream
endobj
xref
0 12
0000000000 65535 f
0000000073 00000 n
0000000124 00000 n
0000000231 00000 n
0000000343 00000 n
0000000458 00000 n
0000000662 00000 n
0000000866 00000 n
0000000934 00000 n
0000001186 00000 n
0000001251 00000 n
0000003562 00000 n
trailer
<<
/ID
[<9b6ff018ce684a0bb6c1fc659a2e27ec><9b6ff018ce684a0bb6c1fc659a2e27ec>]
% ReportLab generated PDF document -- digest (http://www.reportlab.com)
/Info 8 0 R
/Root 7 0 R
/Size 12
>>
startxref
4297
%%EOF

View File

@ -1,99 +0,0 @@
%PDF-1.4
%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com
1 0 obj
<<
/F1 2 0 R /F2 3 0 R /F3 4 0 R
>>
endobj
2 0 obj
<<
/BaseFont /Helvetica /Encoding /WinAnsiEncoding /Name /F1 /Subtype /Type1 /Type /Font
>>
endobj
3 0 obj
<<
/BaseFont /Helvetica-Bold /Encoding /WinAnsiEncoding /Name /F2 /Subtype /Type1 /Type /Font
>>
endobj
4 0 obj
<<
/BaseFont /Helvetica-Oblique /Encoding /WinAnsiEncoding /Name /F3 /Subtype /Type1 /Type /Font
>>
endobj
5 0 obj
<<
/Contents 10 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 9 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
6 0 obj
<<
/Contents 11 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 9 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
7 0 obj
<<
/PageMode /UseNone /Pages 9 0 R /Type /Catalog
>>
endobj
8 0 obj
<<
/Author () /CreationDate (D:20250713202427+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20250713202427+02'00') /Producer (xhtml2pdf <https://github.com/xhtml2pdf/xhtml2pdf/>)
/Subject () /Title () /Trapped /False
>>
endobj
9 0 obj
<<
/Count 2 /Kids [ 5 0 R 6 0 R ] /Type /Pages
>>
endobj
10 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 2180
>>
stream
Gb"/(>>s99'Ro4HS2\l%0YYJK_UGr$3pi^G6Fnh>*Ce[R:reo1=Xj=D4d,3N:7T7*f^1k!VSndBm^H!.!$-Otp"PN-5)eIeaoK>4nJ$qbeqNVo]^aCud4P>VMUQ05Zaro`JY'#[B&BnU[^'bcWKFAtY&5,S%H!5.Z*BPTC-BUlE<M#ii@^"L6=%j%;K_YrcCb:.@/LJR^I\THPleG>C:J.gZb-6B%F]JXZg0Z^2@c`ZR@?eXL*)1CYDUJ#a4!)5]dhdFVRKHKMt0>E1Q:+GQE08Ifh2."iUri"p%[#*)Xq7th2FPRH#W#aeSt0B]ir/g%BmFV4++^7"p5B2_2AR,Rr#NUc0.0"2j`<fFP`o5o0^Z/TK/<TTeSASSi%/_!IbYXq3e'iJP7H[aq10`4`m=Qla:gVRbs3ORcW8Eb1RYUdsU9LF0JJAb*3<pb$*4n/XadS.d8MoQ*p7q$#9!0rSEtJ]:WiHg8JL#>J3!h.1D5ll&<Q>7i3KYdj0oD`f_0Z<tl]9]<Y$5*Uq`2RA]lS`3T(6M*me$d;mcfE!tj+XQnTG9N5]O!=B"[mcA16J+CK^al&Q])-a=]NHR]?$5PIg`mnR?P2am(DD"0Q]b5G-AhhC56cT>k=kCfg,,Buao"`,23$Or&b$pAhEbLbr)s;q*k/r[;KBF[Pa.`+a\F/muK.`<H6X'pf-$>4+T%qS3:NO-rr7<h/li"k=QW\[9aL/5a)A[E0Rhlc+9g-[;..W+Ik[b<'GZ^#+]TH_u-,MZIKM9DB"PAN)B=(Fa-LmB.=08MpkFu9b-2C#=;=Ki?74W4R9@,^H7dGT;C2TF.)+B!)>3Y5q^3i/&nZa`M6ss4^c0h!;rZ8qIg=1+4Y:_DfkrWT/a3*ND=H;XeBnlWD/SB?&hapa,[RRaDXM):@)Hl+)B'\imd:r?W(Ep7N;iPFG3+>)d'LEuc(K`,,<cGkj"IlYsD6kf`^$QXgp"^/5G4qa68V&GGiPRUCSH'-EOjXmLW<0?P):Vn[,Bo4"_#_5E%]_R>WHuBMKaP(F9gQ_:WtNP%S%+=t0b%Q#FYVlj&Bfo8`=Slh+j#k^V?(]ELW@M[TMWQ5k?gb>N(R('5($XPD!gX@06sRqWnjZkWp!\>S[G!S#hUfFIN!M$<?^t[hRI=+Urku#;aR"t)k;rUrfL[L^nel++]4s$$lB`P5b3Ct.H9rD7Q1fa&rBu\Vnpm/FSF#/dC:AaVH'd8E4AA^P7s]d8;uTqhMXCZ==_\b/\"Xhkh\?WZ4]>@(tf]?VMWIQUrb/6;:MoFLkLJ2b2u-4+LV]rL,p(U*D=D9::,HoHV>-d>[J#_/=Eaj62:hg<Ym"q8uKcmT\'dQM+D-28@?5BD&mHcHO!n[[p_)+Td4fkg-SkfnVk\jK&+8C)s&N92kAQ:IJfH^Gr]ZW3S$tU75P',?cDA*JUX2QRGr5+eSQF*'n\(WSW0hBoF&Ls,mn@si**N@Gt.*Nq6DTZ%[tr"h"K@\]ohWhCM"S)+'I=kI@b!%K@CNW#`*s!+,6rab@pjW)h6)m<t(Oi6n8M,4Ie8M:,<EeJO^XqR=48VM8$p)&onjBDY.0?X:3.tHE.4+HsWcT\uOMhkJg!?HqUPI#6ttVeHIkZE7WBlBFJ%,Onoeo%;B!_*]:dQrH/"PSF'ukMWHV8jj^SY?.0<XFgGktTKd;:G=-E])%&9:s!8!:/h:jX(qKp\X.InpY`b5?^ueli&0t\95%5Ck84#U1ZCLb/76h,(?us>9(=.N*g_8U&5Q[TPn0eScUX:'<=mWJF"Tf''?oK8?M1g+VcC.'fDu]tirZm:(?S`*SMi]kc9KjS:AgBEg-c+jYP\6s$b/e\g1JN:`jk1rsO@4P\99=oHB2YI5c/q9`JP%=3Tl*G>#`?h_\<O(O^o#.M$!2/:=UZaMVt:Rp-r&(i\?JLj0h63teO#0KTfFGFcI1->BUF=L^kBQ7+r+:]MQ+T@N7Pdkp?>h5&C/WMM=2,Cj*>"U))c>'.?SJ9YQ+cY?Bq*LiP#T\7/?qIknIcl)X9/E]2925Fbk,V$WNZG08N/7S&Or&cpPFmX(S]4ZM;IXN$36iU]+bn^I=+)[29N+(+FZ)kdQ5j'ABa@I9V0?KH@@Vbp\'7bdYO7'@SZ8%tD1WkMIX)^\TU^]"09e95<5nR@bkZ%%=mH=B?#nIKDR2k)B~>endstream
endobj
11 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 644
>>
stream
Gb!#Y995Pr&AI`dk1$8n0HT!$OCP>/V5gOR)ihVYK[$g^OV1^jq]3mjJLX=B_fg`!Af`&O2]`J8S1_1p>n6?Q!q-<o"[r*8MCF@q_jAI?m;2"+/m8BO.]kNE)),Dh8\*pEem0;d*lW^>#^s-l`WmZShe#U,Y'jJ81L-[DiB19U0Fj%q@N'ZNE^40rVXJag!Xo+YGC)*L\h0O(aPN96+YM2AT"mO@qm+B)3\?7#&3U(_+(9;nP+n`b=Nd]mMq1BN@_]2E2q'5naga\5qH=NaASG&lYdP78>'H)<h,31s#:Xs([oFsDVt@6\Qc&e/[csKAlSu#0$X*^],>jNXf%thOQa9W;P*G(d2qoD[e%B7r[15rTrbNE<p^?VeT\fSrpd0a0KX?AunV7\T6Mr6FQ?>L5!pYB98bPj4B&9?$;+8ArfH8Z#NSrg/744(/=J4i*M1>7G/=i&tL(4Y5Rf?1$BI_uUdh(4eTn7f2dJd<ImPJ^AUQeiGC2pmWc=BH#k7"c2MYQ?iMbe:.Vcc)<?l534@`SYJZ%Znt"$:Fqq4PjlL>tX(,i.DD&81UXQ&9R!69PS2VKDt'j;4oVTrsHS[HHoqMA7jV]/'-#TXN]*W.IKF=`91HlTO3^3;VUJ!KQ+9!=MfANr~>endstream
endobj
xref
0 12
0000000000 65535 f
0000000073 00000 n
0000000124 00000 n
0000000231 00000 n
0000000343 00000 n
0000000458 00000 n
0000000662 00000 n
0000000866 00000 n
0000000934 00000 n
0000001186 00000 n
0000001251 00000 n
0000003523 00000 n
trailer
<<
/ID
[<8dd6199f74f1def4cd92576a0eb9339f><8dd6199f74f1def4cd92576a0eb9339f>]
% ReportLab generated PDF document -- digest (http://www.reportlab.com)
/Info 8 0 R
/Root 7 0 R
/Size 12
>>
startxref
4258
%%EOF

View File

@ -1,99 +0,0 @@
%PDF-1.4
%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com
1 0 obj
<<
/F1 2 0 R /F2 3 0 R /F3 4 0 R
>>
endobj
2 0 obj
<<
/BaseFont /Helvetica /Encoding /WinAnsiEncoding /Name /F1 /Subtype /Type1 /Type /Font
>>
endobj
3 0 obj
<<
/BaseFont /Helvetica-Bold /Encoding /WinAnsiEncoding /Name /F2 /Subtype /Type1 /Type /Font
>>
endobj
4 0 obj
<<
/BaseFont /Helvetica-Oblique /Encoding /WinAnsiEncoding /Name /F3 /Subtype /Type1 /Type /Font
>>
endobj
5 0 obj
<<
/Contents 10 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 9 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
6 0 obj
<<
/Contents 11 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 9 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
7 0 obj
<<
/PageMode /UseNone /Pages 9 0 R /Type /Catalog
>>
endobj
8 0 obj
<<
/Author () /CreationDate (D:20250713202912+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20250713202912+02'00') /Producer (xhtml2pdf <https://github.com/xhtml2pdf/xhtml2pdf/>)
/Subject () /Title () /Trapped /False
>>
endobj
9 0 obj
<<
/Count 2 /Kids [ 5 0 R 6 0 R ] /Type /Pages
>>
endobj
10 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 2180
>>
stream
Gb"/(>>s99'Ro4HS2\l%0YYJK_UGr$3pi^G6Fnh>*Ce[R:reo1=Xj=D4d,3N:7T7*f^1k!VSndBm^H!.!$-Otp"PN-5)eIeaoK>4nJ$qbeqNVo]^aCud4P>VMUQ05Zaro`JY'#[B&BnU[^'bcWKFAtY&5,S%H!5.Z*BPTC-BUlE<M#ii@^"L6=%j%;K_YrcCb:.@/LJR^I\THPleG>C:J.gZb-6B%F]JXZg0Z^2@c`ZR@?eXL*)1CYDUJ#a4!)5]dhdFVRKHKMt0>E1Q:+GQE08Ifh2."iUri"p%[#*)Xq7th2FPRH#W#aeSt0B]ir/g%BmFV4++^7"p5B2_2AR,Rr#NUc0.0"2j`<fFP`o5o0^Z/TK/<TTeSASSi%/_!IbYXq3e'iJP7H[aq10`4`m=Qla:gVRbs3ORcW8Eb1RYUdsU9LF0JJAb*3<pb$*4n/XadS.d8MoQ*p7q$#9!0rSEtJ]:WiHg8JL#>J3!h.1D5ll&<Q>7i3KYdj0oD`f_0Z<tl]9]<Y$5*Uq`2RA]lS`3T(6M*me$d;mcfE!tj+XQnTG9N5]O!=B"[mcA16J+CK^al&Q])-a=]NHR]?$5PIg`mnR?P2am(DD"0Q]b5G-AhhC56cT>k=kCfg,,Buao"`,23$Or&b$pAhEbLbr)s;q*k/r[;KBF[Pa.`+a\F/muK.`<H6X'pf-$>4+T%qS3:NO-rr7<h/li"k=QW\[9aL/5a)A[E0Rhlc+9g-[;..W+Ik[b<'GZ^#+]TH_u-,MZIKM9DB"PAN)B=(Fa-LmB.=08MpkFu9b-2C#=;=Ki?74W4R9@,^H7dGT;C2TF.)+B!)>3Y5q^3i/&nZa`M6ss4^c0h!;rZ8qIg=1+4Y:_DfkrWT/a3*ND=H;XeBnlWD/SB?&hapa,[RRaDXM):@)Hl+)B'\imd:r?W(Ep7N;iPFG3+>)d'LEuc(K`,,<cGkj"IlYsD6kf`^$QXgp"^/5G4qa68V&GGiPRUCSH'-EOjXmLW<0?P):Vn[,Bo4"_#_5E%]_R>WHuBMKaP(F9gQ_:WtNP%S%+=t0b%Q#FYVlj&Bfo8`=Slh+j#k^V?(]ELW@M[TMWQ5k?gb>N(R('5($XPD!gX@06sRqWnjZkWp!\>S[G!S#hUfFIN!M$<?^t[hRI=+Urku#;aR"t)k;rUrfL[L^nel++]4s$$lB`P5b3Ct.H9rD7Q1fa&rBu\Vnpm/FSF#/dC:AaVH'd8E4AA^P7s]d8;uTqhMXCZ==_\b/\"Xhkh\?WZ4]>@(tf]?VMWIQUrb/6;:MoFLkLJ2b2u-4+LV]rL,p(U*D=D9::,HoHV>-d>[J#_/=Eaj62:hg<Ym"q8uKcmT\'dQM+D-28@?5BD&mHcHO!n[[p_)+Td4fkg-SkfnVk\jK&+8C)s&N92kAQ:IJfH^Gr]ZW3S$tU75P',?cDA*JUX2QRGr5+eSQF*'n\(WSW0hBoF&Ls,mn@si**N@Gt.*Nq6DTZ%[tr"h"K@\]ohWhCM"S)+'I=kI@b!%K@CNW#`*s!+,6rab@pjW)h6)m<t(Oi6n8M,4Ie8M:,<EeJO^XqR=48VM8$p)&onjBDY.0?X:3.tHE.4+HsWcT\uOMhkJg!?HqUPI#6ttVeHIkZE7WBlBFJ%,Onoeo%;B!_*]:dQrH/"PSF'ukMWHV8jj^SY?.0<XFgGktTKd;:G=-E])%&9:s!8!:/h:jX(qKp\X.InpY`b5?^ueli&0t\95%5Ck84#U1ZCLb/76h,(?us>9(=.N*g_8U&5Q[TPn0eScUX:'<=mWJF"Tf''?oK8?M1g+VcC.'fDu]tirZm:(?S`*SMi]kc9KjS:AgBEg-c+jYP\6s$b/e\g1JN:`jk1rsO@4P\99=oHB2YI5c/q9`JP%=3Tl*G>#`?h_\<O(O^o#.M$!2/:=UZaMVt:Rp-r&(i\?JLj0h63teO#0KTfFGFcI1->BUF=L^kBQ7+r+:]MQ+T@N7Pdkp?>h5&C/WMM=2,Cj*>"U))c>'.?SJ9YQ+cY?Bq*LiP#T\7/?qIknIcl)X9/E]2925Fbk,V$WNZG08N/7S&Or&cpPFmX(S]4ZM;IXN$36iU]+bn^I=+)[29N+(+FZ)kdQ5j'ABa@I9V0?KH@@Vbp\'7bdYO7'@SZ8%tD1WkMIX)^\TU^]"09e95<5nR@bkZ%%=mH=B?#nIKDR2k)B~>endstream
endobj
11 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 644
>>
stream
Gb!#Y995Pr&AI`dk1$8n0HT!$OCP>/V5gOR)ihVYK[$g^OV1^jq]3mjJLX=B_fg`!Af`&O2]`J8S1_1p>n6?Q!q-<o"[r*8MCF@q_jAI?m;2"+/m8BO.]kNE)),Dh8\*pEem0;d*lW^>#^s-l`WmZShe#U,Y'jJ81L-[DiB19U0Fj%q@N'ZNE^40rVXJag!Xo+YGC)*L\h0O(aPN96+YM2AT"mO@qm+B)3\?7#&3U(_+(9;nP+n`b=Nd]mMq1BN@_]2E2q'5naga\5qH=NaASG&lYdP78>'H)<h,31s#:Xs([oFsDVt@6\Qc&e/[csKAlSu#0$X*^],>jNXf%thOQa9W;P*G(d2qoD[e%B7r[15rTrbNE<p^?VeT\fSrpd0a0KX?AunV7\T6Mr6FQ?>L5!pYB98bPj4B&9?$;+8ArfH8Z#NSrg/744(/=J4i*M1>7G/=i&tL(4Y5Rf?1$BI_uUdh(4eTn7f2dJd<ImPJ^AUQeiGC2pmWc=BH#k7"c2MYQ?iMbe:.Vcc)<?l534@`SYJZ%Znt"$:Fqq4PjlL>tX(,i.DD&81UXQ&9R!69PS2VKDt'j;4oVTrsHS[HHoqMA7jV]/'-#TXN]*W.IKF=`91HlTO3^3;VUJ!KQ+9!=MfANr~>endstream
endobj
xref
0 12
0000000000 65535 f
0000000073 00000 n
0000000124 00000 n
0000000231 00000 n
0000000343 00000 n
0000000458 00000 n
0000000662 00000 n
0000000866 00000 n
0000000934 00000 n
0000001186 00000 n
0000001251 00000 n
0000003523 00000 n
trailer
<<
/ID
[<f58327f55503402f13c5673b07f3697d><f58327f55503402f13c5673b07f3697d>]
% ReportLab generated PDF document -- digest (http://www.reportlab.com)
/Info 8 0 R
/Root 7 0 R
/Size 12
>>
startxref
4258
%%EOF

File diff suppressed because one or more lines are too long

View File

@ -1,91 +0,0 @@
%PDF-1.4
%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com
1 0 obj
<<
/F1 2 0 R /F2 4 0 R /F3 5 0 R
>>
endobj
2 0 obj
<<
/BaseFont /Helvetica /Encoding /WinAnsiEncoding /Name /F1 /Subtype /Type1 /Type /Font
>>
endobj
3 0 obj
<<
/BitsPerComponent 8 /ColorSpace /DeviceRGB /Filter [ /ASCII85Decode /FlateDecode ] /Height 125 /Length 2752 /Subtype /Image
/Type /XObject /Width 396
>>
stream
Gb"/lCNe_d(^8U1UaN3;I$4-'fC#_Jgn@5*J.LrP(K#>I_i\eB&_CS>gWfg"!!$Q>If/m)j%"gjoDS./I0G0#q"7r<T^LS%rMapH!MD6K8X/-#e[=g"!;&Z:M>FQls(L4u!9f0[&qrpY^`m6E3bH&RW<JOgJB+GuFjPECZm&HV!$5$.U5ZZ[.0(bn9qn`S:alAm:fF*I)Gqp`aAZ69X@c>=!6A&FU5XCq.0,0<,#MCkW"]5"[#ui4G#SeKrhlGX=UdWm!+;P'6lBi,V#]F4bpCMI"tBcV:.(b7QCq+UUE^s[<b"rTJAKWq.&/r('Yq4L8X.aN<!m#8e0N1h8caI+PUI%l"TV:tU-,@g^u3:+PR!HT(`[+DnjG(j2u!BmiHfd0/EQRP,Z10*a0Vp5H,g.D$Mk,oqPFJta!&1T@kF%tq;FQ;V)a'7;-#,=U?_Z&12C4s$HT5H>D\L]$@ot?<2m;=,rHA:K-R<m$5+X?'EI(`<,/R(*O'(M2A?/L`)LKc6lg:49kl'V?p_mU)G65k&Lmt2*YEm8.oB=d:at%f9e3't?T0nr\qWZ0hOf837Sd6klMGc%\iAmEXnKrIJj2)Y.&/h&$?elpUR"+<*`b.^Wjt>B8<hX;<!r?\*#\DsW@D6Dgt!Q8,g*&"Q%D.Z;b#;rWJ:DF,>hKg:at%ZP@`7W8_9$d8jh4O+/C1)W#CqQh'coi:/Tu/];O$SceH+B4,tZeTI*N:X&(7tM]OZ(,b%c6lWr;klM_nS;+:Xa.G0F41MYfnQVuKY1aU:Z)_)$'E/'<D0;(Aj;N.\F)9kFC?jFu=;+htC44X6p=e_u5U/J4d1LsJE;3e=IYN$/Q&nNm(Q%H.1Sl&kXp_qJ:qHqf!-rJPlTMi"V`O!HWJ/&`75uFu7leO%nR86f\d`W.uM)(NQ9#2i8c)AMP;>!._m&I+NVF4QSJP*`o]#gnqAKFQ/PnKB2%k7`EEiP(53Z"fqPd3]&:at%ZdpuFAAZ1@)8sC]<*l#MrX-oS!D2Tm?e%=BD4dt]u3?Ei4'oDLWmsM<'a*J>K]f8MOXfeU0`7KCT2%MaBRu@[anlp!SH?ELD>?L]1K4GOXf6ih7b+LhBbc(C>htAjP9eP/l>Ia#HX&;J&lq!0Tjg&78ddZ#YC2Q<KBrVj["oH_^7_/HK*RkXWL(]aUOe>;i;6V_PAlRoVH<&71\!3g:Lt#B2M1XRJ2l#0[-XtO"Hg#*NR`rTg&4ri8&d>nrF[iq.B8To@bM:JZJk/D.O=3)?@tS@/qj42c72<P+-!0$i?5.'4#J3e],RTR)pPa.GGC7H,8)$$PY#7e)*5i.=b,TdF9+dW=6#i/VU>R0>O\m`TnbKnk100cpZ7=Be^u<5%-DM'apfq>>b,U[mJ-1ahc5[Nt.?OT8(`')2.&^$)!=ge1C3*3DV5+/4?pFkXTTi'J"ZX;2B[/mUPnFLEJ>&'qK-DeA);kMTTKEIKX-@FN!t9eV*,McUaoMu+!r?tWO\-Y-8Hh)hkn071cSCbHFOLV:J9.J=;'$=7&e&`0'@VY'GpH?]28B7<8hUh=Bs(@>!T"!`?W=3#jlPUp7HJhCRe6G5F<j^)KeKqLi=aM\'\GTRV_2Tice_[)Zr#[e/FE*ViOH=-nKV1]5g@sM9;4Pn^Yhk<kU:b%:l2Dd7Rd9`pA<O-4u.QGQ<'8RQVkf2k92l(eX]*R:oWTtn7q[>W3dPZB?nTJ+2.(t8r"H6atpP"Q&k`TWb-)k,qR2bQf2l??Tl:kZVN$WkOh%T2)Qj8]PD8CIp#QSgs`!l4YL/)lqY(2[srP(ZRsDp0eG2_G:IQHJ$tD8^!Y-hh\#Oa:hf]lLXfOUGt=hGjV_="$NKkIdaP2Sn+)O]cC4*nmUg!/\Z,RbKaBLL18W75^.3$2-WbUUCrTF^Qr2h[df%i:]!U):'=6e&KnoQ'dBf"Hd+[i*3I>Scs7^PViD;)%?]"?4XA\-dP'r^?gDO-+h%^rE;/'U@Mo7'7=citqE\:mFW\@ecIE=[mI@oQa.UR?OYO6P,<G<O&b'@H-<-HX:5N`G\\Kd$4RnqWKjV_3tAtGs,Nk4GAfpGWFNE0Pj!`N>Xl*>_24&YKY>(4tse<`M'N*=hKCZro:06_&=7SRa+)OVTW2^>*GVCnTeM=M(U;MBUHH?>Ej]6P8/Bhu/<YITi_QC0j_:Zi-f8`s/W7A64(&mWhZXJZanR,&X?E-,0ijS:mn_&a=+^<WKSE4s1SG'nZ&9VOZ6L#ns,N1s3aQkYRf_JNp=>D9PWIGBQO.S#B2*S+5p6"`mk[(qS3T&maZhe&`1PHAq:Y@#$t(g8/Pm^.^s:.CM$d5N`UJFFEF(!XiKCZH:O%Ke_H%BehN3%:/J9R(ZijV\drh7>+"WDmQolh@g`[*340_tSI0M28NS@=_?0:&?$(f=U+@iP*!#9<a;5l4&aF;Tu(].+7C^&u$<-A5lagMDau=/EWI18PP;`U][Phmj^3)6lcCJ"Zgb-;Fo;'OAR,h^FFq*!K9:A.YU7kN'iXUKgYs#6[(#66ii69?Rgat!K9K<.YU7kN(GZPKgYs#8J`k16ii7*^.KPG!$`_k;FhK%.'"$p"TYhXKgYrl7oQ7G-ii`BWY?'L!$Q),KgYr,Lm1LT;#l]PUJaVs!2PFL'G:QL(()OF6ihg,F-T(d!2*"iPsV2FTM._<6D=Hf%]r\;M#r2f1f5\I$393%.o#sOM#m[He7pIO8/)&gBrP!$'EC7iTh6J*!&00d.YU7k!$'"nH!#JJ~>endstream
endobj
4 0 obj
<<
/BaseFont /Times-Bold /Encoding /WinAnsiEncoding /Name /F2 /Subtype /Type1 /Type /Font
>>
endobj
5 0 obj
<<
/BaseFont /Times-Roman /Encoding /WinAnsiEncoding /Name /F3 /Subtype /Type1 /Type /Font
>>
endobj
6 0 obj
<<
/Contents 10 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 9 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] /XObject <<
/FormXob.bc9efef1b007b4280b2f3106d3fe571f 3 0 R
>>
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
7 0 obj
<<
/PageMode /UseNone /Pages 9 0 R /Type /Catalog
>>
endobj
8 0 obj
<<
/Author () /CreationDate (D:20250705185411+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20250705185411+02'00') /Producer (xhtml2pdf <https://github.com/xhtml2pdf/xhtml2pdf/>)
/Subject () /Title () /Trapped /False
>>
endobj
9 0 obj
<<
/Count 1 /Kids [ 6 0 R ] /Type /Pages
>>
endobj
10 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 1380
>>
stream
Gb!#[gMZ%0&:Ml+bYs^B@tn&^b"L,?amK@eF0QN0ckHlAVHb](aUt@#d')n7EdWd]a%fGfL)l/9B',UD6]N![r36$AQid3>LU/K8N'ff6-AdETmr6rEH9AdV0:UeB6R$%`"4.W-3YDLd?!:h@F<o86R3e:/`YEkc6K;nMO!u7S"oT,P,Ii\]]Oss'G>7C!0npA:!<$i_s3X>V=%@8>+VqG`,n7?&K(Gus*T3Y%$'1I(La^7.43k#",5i`.OMNWVZ&RFe;E^+(U]VYG7Y?hZXjSbTM]AME"H=#Y%=2j:4t-%nk`c?Y6Z']UW?ocN?gpTJJhK?r$[<4t,,=P@s/RCJ!@*Q&oiRm)Ai%Me%)T6&1)@-L1JTe61t<%](6DA=,3.!X`^%&2$LJBGE%Mh(%rn9-BQ&d5aV'qD(g6>G2._q`22&:dZ*7)H^$9G^4rKM;=Q'(:hs7%lW;DWG=Zo;AM3+ZtH_V8<D).tBEVuYBOXrQ:=sP?<,4r/XXjABuOX^]+SO#]s1/jFAh,JgJ>a^gVl'[F$R=b#6=*#l>n68(2%dm%HWL#bpX,]rd<GIF3\ei+t0S(_p9(>fn<`"Z09M`14_eeLL"'[6#J^j%*[]Xd.FORquo(i7t^3&?-roX'_^PSq]F`+OV?MF//n$:RBH<kA7qneR5gf?M$SPagT.:/JNW-l=*2>NK#OM9B(pT%mD&1ua8c+VPa'9a,R;ZX']fEDR?9&/eMOPWsPGVG58mjZQV/`:N<_@LTieE!,^#fW60L@aTTVMa#c`ZsOS7e(`([MHlSbbWsiH`sCYeK(Z?L$)(@<aQK!;"[k;EInf4&(]@o*8O)8/UQ-(8ORm$B&4f;8.b,1"?USsqgXW,;Mg7//)]=e\>u^3V:g:T^8YlarUmEeTWeqnl3^c2a,)TdC,8!INg":.ni9r*?t,GI6M"aWXpOe7^)dL';)u"IM<t]bGW;*,q7,q&:*C^,ZbnPT*?jM&_ku/!?SBqYqR,qa>71k#kul4Io%\2BnMN6"(,i$i?/`]99fBH!.OjN%%O(LWIUWa4eh,f;%$]jObA\"ph@B5p]8TSjAR=a+<O>-4]-]^dQQrT0gk!;OZP$oJVLZNWVg2,`&X'j9,gd+D4cUTX^`qO<gmTE]>b)6aYs)#kYDF'o40>D&&Zp[oSn06gcMiHP.gJ9\"@]adq=FCA/65^NMZ9.tO&'20E`aU4*riVQ?Ib(FLVg)I4-QYiUGpMfCb^6>_o53SKg<hu6C'`:lu_a"e0LlO"37@qW_AM@H(j8>mN>8(4""JJX?er!:F7#,6SgkRXIq_X]Ll3+gN@UlZ>R)'qn1_B^<U(,?2M=#9$W:5^Y.S[oc81WB,N!i_ZEf>\%S>4ZR`DudD(eAp[A~>endstream
endobj
xref
0 11
0000000000 65535 f
0000000073 00000 n
0000000124 00000 n
0000000231 00000 n
0000003174 00000 n
0000003282 00000 n
0000003391 00000 n
0000003658 00000 n
0000003726 00000 n
0000003978 00000 n
0000004037 00000 n
trailer
<<
/ID
[<d40a07d62104eb3d04d7cf889535d183><d40a07d62104eb3d04d7cf889535d183>]
% ReportLab generated PDF document -- digest (http://www.reportlab.com)
/Info 8 0 R
/Root 7 0 R
/Size 11
>>
startxref
5509
%%EOF

View File

@ -1,91 +0,0 @@
%PDF-1.4
%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com
1 0 obj
<<
/F1 2 0 R /F2 4 0 R /F3 5 0 R
>>
endobj
2 0 obj
<<
/BaseFont /Helvetica /Encoding /WinAnsiEncoding /Name /F1 /Subtype /Type1 /Type /Font
>>
endobj
3 0 obj
<<
/BitsPerComponent 8 /ColorSpace /DeviceRGB /Filter [ /ASCII85Decode /FlateDecode ] /Height 125 /Length 2752 /Subtype /Image
/Type /XObject /Width 396
>>
stream
Gb"/lCNe_d(^8U1UaN3;I$4-'fC#_Jgn@5*J.LrP(K#>I_i\eB&_CS>gWfg"!!$Q>If/m)j%"gjoDS./I0G0#q"7r<T^LS%rMapH!MD6K8X/-#e[=g"!;&Z:M>FQls(L4u!9f0[&qrpY^`m6E3bH&RW<JOgJB+GuFjPECZm&HV!$5$.U5ZZ[.0(bn9qn`S:alAm:fF*I)Gqp`aAZ69X@c>=!6A&FU5XCq.0,0<,#MCkW"]5"[#ui4G#SeKrhlGX=UdWm!+;P'6lBi,V#]F4bpCMI"tBcV:.(b7QCq+UUE^s[<b"rTJAKWq.&/r('Yq4L8X.aN<!m#8e0N1h8caI+PUI%l"TV:tU-,@g^u3:+PR!HT(`[+DnjG(j2u!BmiHfd0/EQRP,Z10*a0Vp5H,g.D$Mk,oqPFJta!&1T@kF%tq;FQ;V)a'7;-#,=U?_Z&12C4s$HT5H>D\L]$@ot?<2m;=,rHA:K-R<m$5+X?'EI(`<,/R(*O'(M2A?/L`)LKc6lg:49kl'V?p_mU)G65k&Lmt2*YEm8.oB=d:at%f9e3't?T0nr\qWZ0hOf837Sd6klMGc%\iAmEXnKrIJj2)Y.&/h&$?elpUR"+<*`b.^Wjt>B8<hX;<!r?\*#\DsW@D6Dgt!Q8,g*&"Q%D.Z;b#;rWJ:DF,>hKg:at%ZP@`7W8_9$d8jh4O+/C1)W#CqQh'coi:/Tu/];O$SceH+B4,tZeTI*N:X&(7tM]OZ(,b%c6lWr;klM_nS;+:Xa.G0F41MYfnQVuKY1aU:Z)_)$'E/'<D0;(Aj;N.\F)9kFC?jFu=;+htC44X6p=e_u5U/J4d1LsJE;3e=IYN$/Q&nNm(Q%H.1Sl&kXp_qJ:qHqf!-rJPlTMi"V`O!HWJ/&`75uFu7leO%nR86f\d`W.uM)(NQ9#2i8c)AMP;>!._m&I+NVF4QSJP*`o]#gnqAKFQ/PnKB2%k7`EEiP(53Z"fqPd3]&:at%ZdpuFAAZ1@)8sC]<*l#MrX-oS!D2Tm?e%=BD4dt]u3?Ei4'oDLWmsM<'a*J>K]f8MOXfeU0`7KCT2%MaBRu@[anlp!SH?ELD>?L]1K4GOXf6ih7b+LhBbc(C>htAjP9eP/l>Ia#HX&;J&lq!0Tjg&78ddZ#YC2Q<KBrVj["oH_^7_/HK*RkXWL(]aUOe>;i;6V_PAlRoVH<&71\!3g:Lt#B2M1XRJ2l#0[-XtO"Hg#*NR`rTg&4ri8&d>nrF[iq.B8To@bM:JZJk/D.O=3)?@tS@/qj42c72<P+-!0$i?5.'4#J3e],RTR)pPa.GGC7H,8)$$PY#7e)*5i.=b,TdF9+dW=6#i/VU>R0>O\m`TnbKnk100cpZ7=Be^u<5%-DM'apfq>>b,U[mJ-1ahc5[Nt.?OT8(`')2.&^$)!=ge1C3*3DV5+/4?pFkXTTi'J"ZX;2B[/mUPnFLEJ>&'qK-DeA);kMTTKEIKX-@FN!t9eV*,McUaoMu+!r?tWO\-Y-8Hh)hkn071cSCbHFOLV:J9.J=;'$=7&e&`0'@VY'GpH?]28B7<8hUh=Bs(@>!T"!`?W=3#jlPUp7HJhCRe6G5F<j^)KeKqLi=aM\'\GTRV_2Tice_[)Zr#[e/FE*ViOH=-nKV1]5g@sM9;4Pn^Yhk<kU:b%:l2Dd7Rd9`pA<O-4u.QGQ<'8RQVkf2k92l(eX]*R:oWTtn7q[>W3dPZB?nTJ+2.(t8r"H6atpP"Q&k`TWb-)k,qR2bQf2l??Tl:kZVN$WkOh%T2)Qj8]PD8CIp#QSgs`!l4YL/)lqY(2[srP(ZRsDp0eG2_G:IQHJ$tD8^!Y-hh\#Oa:hf]lLXfOUGt=hGjV_="$NKkIdaP2Sn+)O]cC4*nmUg!/\Z,RbKaBLL18W75^.3$2-WbUUCrTF^Qr2h[df%i:]!U):'=6e&KnoQ'dBf"Hd+[i*3I>Scs7^PViD;)%?]"?4XA\-dP'r^?gDO-+h%^rE;/'U@Mo7'7=citqE\:mFW\@ecIE=[mI@oQa.UR?OYO6P,<G<O&b'@H-<-HX:5N`G\\Kd$4RnqWKjV_3tAtGs,Nk4GAfpGWFNE0Pj!`N>Xl*>_24&YKY>(4tse<`M'N*=hKCZro:06_&=7SRa+)OVTW2^>*GVCnTeM=M(U;MBUHH?>Ej]6P8/Bhu/<YITi_QC0j_:Zi-f8`s/W7A64(&mWhZXJZanR,&X?E-,0ijS:mn_&a=+^<WKSE4s1SG'nZ&9VOZ6L#ns,N1s3aQkYRf_JNp=>D9PWIGBQO.S#B2*S+5p6"`mk[(qS3T&maZhe&`1PHAq:Y@#$t(g8/Pm^.^s:.CM$d5N`UJFFEF(!XiKCZH:O%Ke_H%BehN3%:/J9R(ZijV\drh7>+"WDmQolh@g`[*340_tSI0M28NS@=_?0:&?$(f=U+@iP*!#9<a;5l4&aF;Tu(].+7C^&u$<-A5lagMDau=/EWI18PP;`U][Phmj^3)6lcCJ"Zgb-;Fo;'OAR,h^FFq*!K9:A.YU7kN'iXUKgYs#6[(#66ii69?Rgat!K9K<.YU7kN(GZPKgYs#8J`k16ii7*^.KPG!$`_k;FhK%.'"$p"TYhXKgYrl7oQ7G-ii`BWY?'L!$Q),KgYr,Lm1LT;#l]PUJaVs!2PFL'G:QL(()OF6ihg,F-T(d!2*"iPsV2FTM._<6D=Hf%]r\;M#r2f1f5\I$393%.o#sOM#m[He7pIO8/)&gBrP!$'EC7iTh6J*!&00d.YU7k!$'"nH!#JJ~>endstream
endobj
4 0 obj
<<
/BaseFont /Times-Bold /Encoding /WinAnsiEncoding /Name /F2 /Subtype /Type1 /Type /Font
>>
endobj
5 0 obj
<<
/BaseFont /Times-Roman /Encoding /WinAnsiEncoding /Name /F3 /Subtype /Type1 /Type /Font
>>
endobj
6 0 obj
<<
/Contents 10 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 9 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] /XObject <<
/FormXob.f616519b2a4fb7b31b424f053fbb7643 3 0 R
>>
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
7 0 obj
<<
/PageMode /UseNone /Pages 9 0 R /Type /Catalog
>>
endobj
8 0 obj
<<
/Author () /CreationDate (D:20250705192159+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20250705192159+02'00') /Producer (xhtml2pdf <https://github.com/xhtml2pdf/xhtml2pdf/>)
/Subject () /Title () /Trapped /False
>>
endobj
9 0 obj
<<
/Count 1 /Kids [ 6 0 R ] /Type /Pages
>>
endobj
10 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 1381
>>
stream
Gb!#[gMZ%0&:O:SbYs^B@tn&^b"L,?amK@eF0QN0ckHlAVGf&taUt@#d')n7EdWdUa%fI\Jo-C@B',UD6W+=@?EEuD,lk[ii:N05j"Qi#P=3:GGISK3*]pk+Ab4S;,XM\j!$-'R,9cR0Q!kFn<t_Y#?D=E,>f$.E)J9G-9G%jb(aQm6_-uur4_pe)CKb$>"!#2`(jptPO$8HU.Z2uH=O<e.1u&iSp8cnhJ:fm.4CS@9U(jeCS6ffQnjbS`PCNgo771tRA>k98%4.>SWl/F-e:A<QSm`=MckrJ5TZ?cmK>M#T:5R=4e2e$)>/;3S!KXT<q!(eiJ-Vbp1>369^Igg(0Z'42N!6e/hLj%n+:K2;@hGb%j&D4-;dH/2!=AE]1B&9U":3UYTcLuPY,0#8&0%X,p,[[WC$ZH?@gbJqVMMRcJoH#bQ8U4qf=gRi-USLN975XeHe#*P])1,OX%!._KLCOL)kB=1c'ZAdnX#,%ZKODdOc28Xd*&`&7[k)[W[JEY"r1RI9MrZM;tW.n79l(2B57"]'V$bc>$*e>hm05$E+e0E2=0"#GBDUj':WX]49).r"HIRQ`EW.A5q1)54lPN1Z^mj,[T#d!WS-6H?1)1c\p+/8oA'Rtl+tX#p!q$SNN'X7Y2)jfGOr4ldI2Ru.bi'/2h_FEeIE7j<1e2gpSPm:kkXYsjASf?qI4a-YF9#f[!4qqpC$R(RlIlo"h`u*(F366EOB.?H;ai;Cdi_IEP?>lpTapNJ=F1qkP/@3<jtun5D(:_'\4"`!Pg7q3,>S-QM-oo[+m!V0<6_U?)iEDB:QY9@M4Ysoi?ohJgq3?QIs.X?)ttG4m^$2,/%#8Dph`5#Tb/m4)b5uJ%!p+M2A0gi8>N`/Q'r&R_=(9cZRLD^H+,)jRunN?%ORSPLu9KYpo*h7rc,mr#CaY0JtB8Tm8CQCPp.=?Ot&#[iF)ce94>:g`Ol5lll,3:*:L)Z_J_93't^bLUPpJgT8sDqR)7N)[d'ul?USjo"o?unI7DO(,fc9<T0^f:&88hF]-GI*C8]0r5<>BXBWQB)(:B-;o:n/Gr+(l4D9[H.'dk8W1k.ZcC4Uf?&#ST1'\$D:2q/)RE6U2ZWWS18;*f-!_G49H?A11TZC^n2^V=0=/Ec/Xj<2tC[C`Y:9*_P"RBH[V5]<BZi;0+d_X67+d(#?r]L$:Ntk*6gAbcCUD$bs*9FH37t9oW=#K%*U[H:Sc;j/YkfpFp=cAqOE3U'n+j_FBON('3cT4$90lc14^buP//7R[O;<R_E4,=R#bXo#Det<oH-^0SNOdR4(<mVge<lSp+mFo*;=WOs(qn1eDZHchF>l24$9$W:5c[9ZgqNe^4A/WG\Gm1/#4SX*Oc*#FqSUUYS!Vcs~>endstream
endobj
xref
0 11
0000000000 65535 f
0000000073 00000 n
0000000124 00000 n
0000000231 00000 n
0000003174 00000 n
0000003282 00000 n
0000003391 00000 n
0000003658 00000 n
0000003726 00000 n
0000003978 00000 n
0000004037 00000 n
trailer
<<
/ID
[<eff54f37b742ea7922ca372e5bf11db6><eff54f37b742ea7922ca372e5bf11db6>]
% ReportLab generated PDF document -- digest (http://www.reportlab.com)
/Info 8 0 R
/Root 7 0 R
/Size 11
>>
startxref
5510
%%EOF

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -1,85 +0,0 @@
%PDF-1.4
%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com
1 0 obj
<<
/F1 2 0 R /F2 4 0 R
>>
endobj
2 0 obj
<<
/BaseFont /Helvetica /Encoding /WinAnsiEncoding /Name /F1 /Subtype /Type1 /Type /Font
>>
endobj
3 0 obj
<<
/BitsPerComponent 8 /ColorSpace /DeviceRGB /Filter [ /ASCII85Decode /FlateDecode ] /Height 125 /Length 2752 /Subtype /Image
/Type /XObject /Width 396
>>
stream
Gb"/lCNe_d(^8U1UaN3;I$4-'fC#_Jgn@5*J.LrP(K#>I_i\eB&_CS>gWfg"!!$Q>If/m)j%"gjoDS./I0G0#q"7r<T^LS%rMapH!MD6K8X/-#e[=g"!;&Z:M>FQls(L4u!9f0[&qrpY^`m6E3bH&RW<JOgJB+GuFjPECZm&HV!$5$.U5ZZ[.0(bn9qn`S:alAm:fF*I)Gqp`aAZ69X@c>=!6A&FU5XCq.0,0<,#MCkW"]5"[#ui4G#SeKrhlGX=UdWm!+;P'6lBi,V#]F4bpCMI"tBcV:.(b7QCq+UUE^s[<b"rTJAKWq.&/r('Yq4L8X.aN<!m#8e0N1h8caI+PUI%l"TV:tU-,@g^u3:+PR!HT(`[+DnjG(j2u!BmiHfd0/EQRP,Z10*a0Vp5H,g.D$Mk,oqPFJta!&1T@kF%tq;FQ;V)a'7;-#,=U?_Z&12C4s$HT5H>D\L]$@ot?<2m;=,rHA:K-R<m$5+X?'EI(`<,/R(*O'(M2A?/L`)LKc6lg:49kl'V?p_mU)G65k&Lmt2*YEm8.oB=d:at%f9e3't?T0nr\qWZ0hOf837Sd6klMGc%\iAmEXnKrIJj2)Y.&/h&$?elpUR"+<*`b.^Wjt>B8<hX;<!r?\*#\DsW@D6Dgt!Q8,g*&"Q%D.Z;b#;rWJ:DF,>hKg:at%ZP@`7W8_9$d8jh4O+/C1)W#CqQh'coi:/Tu/];O$SceH+B4,tZeTI*N:X&(7tM]OZ(,b%c6lWr;klM_nS;+:Xa.G0F41MYfnQVuKY1aU:Z)_)$'E/'<D0;(Aj;N.\F)9kFC?jFu=;+htC44X6p=e_u5U/J4d1LsJE;3e=IYN$/Q&nNm(Q%H.1Sl&kXp_qJ:qHqf!-rJPlTMi"V`O!HWJ/&`75uFu7leO%nR86f\d`W.uM)(NQ9#2i8c)AMP;>!._m&I+NVF4QSJP*`o]#gnqAKFQ/PnKB2%k7`EEiP(53Z"fqPd3]&:at%ZdpuFAAZ1@)8sC]<*l#MrX-oS!D2Tm?e%=BD4dt]u3?Ei4'oDLWmsM<'a*J>K]f8MOXfeU0`7KCT2%MaBRu@[anlp!SH?ELD>?L]1K4GOXf6ih7b+LhBbc(C>htAjP9eP/l>Ia#HX&;J&lq!0Tjg&78ddZ#YC2Q<KBrVj["oH_^7_/HK*RkXWL(]aUOe>;i;6V_PAlRoVH<&71\!3g:Lt#B2M1XRJ2l#0[-XtO"Hg#*NR`rTg&4ri8&d>nrF[iq.B8To@bM:JZJk/D.O=3)?@tS@/qj42c72<P+-!0$i?5.'4#J3e],RTR)pPa.GGC7H,8)$$PY#7e)*5i.=b,TdF9+dW=6#i/VU>R0>O\m`TnbKnk100cpZ7=Be^u<5%-DM'apfq>>b,U[mJ-1ahc5[Nt.?OT8(`')2.&^$)!=ge1C3*3DV5+/4?pFkXTTi'J"ZX;2B[/mUPnFLEJ>&'qK-DeA);kMTTKEIKX-@FN!t9eV*,McUaoMu+!r?tWO\-Y-8Hh)hkn071cSCbHFOLV:J9.J=;'$=7&e&`0'@VY'GpH?]28B7<8hUh=Bs(@>!T"!`?W=3#jlPUp7HJhCRe6G5F<j^)KeKqLi=aM\'\GTRV_2Tice_[)Zr#[e/FE*ViOH=-nKV1]5g@sM9;4Pn^Yhk<kU:b%:l2Dd7Rd9`pA<O-4u.QGQ<'8RQVkf2k92l(eX]*R:oWTtn7q[>W3dPZB?nTJ+2.(t8r"H6atpP"Q&k`TWb-)k,qR2bQf2l??Tl:kZVN$WkOh%T2)Qj8]PD8CIp#QSgs`!l4YL/)lqY(2[srP(ZRsDp0eG2_G:IQHJ$tD8^!Y-hh\#Oa:hf]lLXfOUGt=hGjV_="$NKkIdaP2Sn+)O]cC4*nmUg!/\Z,RbKaBLL18W75^.3$2-WbUUCrTF^Qr2h[df%i:]!U):'=6e&KnoQ'dBf"Hd+[i*3I>Scs7^PViD;)%?]"?4XA\-dP'r^?gDO-+h%^rE;/'U@Mo7'7=citqE\:mFW\@ecIE=[mI@oQa.UR?OYO6P,<G<O&b'@H-<-HX:5N`G\\Kd$4RnqWKjV_3tAtGs,Nk4GAfpGWFNE0Pj!`N>Xl*>_24&YKY>(4tse<`M'N*=hKCZro:06_&=7SRa+)OVTW2^>*GVCnTeM=M(U;MBUHH?>Ej]6P8/Bhu/<YITi_QC0j_:Zi-f8`s/W7A64(&mWhZXJZanR,&X?E-,0ijS:mn_&a=+^<WKSE4s1SG'nZ&9VOZ6L#ns,N1s3aQkYRf_JNp=>D9PWIGBQO.S#B2*S+5p6"`mk[(qS3T&maZhe&`1PHAq:Y@#$t(g8/Pm^.^s:.CM$d5N`UJFFEF(!XiKCZH:O%Ke_H%BehN3%:/J9R(ZijV\drh7>+"WDmQolh@g`[*340_tSI0M28NS@=_?0:&?$(f=U+@iP*!#9<a;5l4&aF;Tu(].+7C^&u$<-A5lagMDau=/EWI18PP;`U][Phmj^3)6lcCJ"Zgb-;Fo;'OAR,h^FFq*!K9:A.YU7kN'iXUKgYs#6[(#66ii69?Rgat!K9K<.YU7kN(GZPKgYs#8J`k16ii7*^.KPG!$`_k;FhK%.'"$p"TYhXKgYrl7oQ7G-ii`BWY?'L!$Q),KgYr,Lm1LT;#l]PUJaVs!2PFL'G:QL(()OF6ihg,F-T(d!2*"iPsV2FTM._<6D=Hf%]r\;M#r2f1f5\I$393%.o#sOM#m[He7pIO8/)&gBrP!$'EC7iTh6J*!&00d.YU7k!$'"nH!#JJ~>endstream
endobj
4 0 obj
<<
/BaseFont /Helvetica-Bold /Encoding /WinAnsiEncoding /Name /F2 /Subtype /Type1 /Type /Font
>>
endobj
5 0 obj
<<
/Contents 9 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 8 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] /XObject <<
/FormXob.2334743c725931a9ea3fbca05f2e932d 3 0 R
>>
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
6 0 obj
<<
/PageMode /UseNone /Pages 8 0 R /Type /Catalog
>>
endobj
7 0 obj
<<
/Author () /CreationDate (D:20250711114758+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20250711114758+02'00') /Producer (xhtml2pdf <https://github.com/xhtml2pdf/xhtml2pdf/>)
/Subject () /Title () /Trapped /False
>>
endobj
8 0 obj
<<
/Count 1 /Kids [ 5 0 R ] /Type /Pages
>>
endobj
9 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 2000
>>
stream
Gb!Sn=`<%a&:W67fU&=)!3PuZr)b=\'/YIbV<EO4K9>@sJL)cYSYNs6ZTOOHM'=BQOc;]39p%4nhopJ<S_Z.l"?n[>4ddPegDHKoTSP?[^.)(0J]<26kMsCF_)_G?6CJe9Kb=_1685a9K5U1GU(PZ=?qiUl&q(_7^sq,efI2TrF$qI3VdR@ZeQ=l5,l=Z,Tcn`6`h1ZRW<7+2!B>"PTfKqm&@2`KglqQ<$6E:ZQmkN6'+*5UioEP6RfAq+`/Jc2"eTHT/Z4_j,C]T2&eTE6@a!F=4\Gdk%^.jXDER)_BnE#J'Pq6]1G<e`E%>nZ\d-O&&Jq-AVpE:jCNoZ'UsLW%0l%)D(C[/tkSo^Ih%S;:Y18AkkuN`W$_fD8eQ"c=$CHqZbm8-1BpUPZJ7XgGLD<a""hZr7"?@2&e0Nhkd(bA`l0TriMp.+<,m,d6>^T7XPP@aiS_q[tF?UV"-.#-BVK/lJA!6+K&?03dbd:a-+sA@81eX@C&p()Gm_lL:@i;CHZq0?'q`AgC^o-[>(en*%H6!Z&8Os\cK1I.?8Z)%.10LO&9d)A^BS<f/'netX>@\1Zs&^(5ZVcRpQ8%,NWWJ(;_nU@+Vq-`L//X%'L*@lO]2oS*'F[E[+ufKnDV&RlC\0L`(G2C>R`9#@PS,SVr_IG[kq#u1p$E)\i\ZYBF^B30D]_CE<-kWBd[rP3>sukII"T_-q)hhSj0Ei=IpFc^'S^%q5',9:4]E2Qmo::0e#PU<;49&Rg>0Y,/jng+<^[lTO%-`BM6N8f5`oE%)D"-L\k,A3K;F,;2<*NpAG,0e>:,%-BgJ_!m]Rm4iX.8<f?1hiH=[cpAZM/?HG7WS_*WF0%Pc3iUl>VSluuY\.#48'R0pBnMJ)I*ZC3?cCHKC'_&I9g4q&nIh3t3]]C0FKGb4o5ArE,7Y"WVkM/Y'/+eT0d76'`<p"aBV*IV&6;ZFUplKUGB$_jm]#E#X&N<_8Q!5D8EBs^D]Zo-YXg6/Zc@k9,Y)dj51A';[pJMS8LR<fEMiiMP%G+4^KCZs'gVTT;SR<M#_Ps)i;AMT<62p^?pH1p4Y`H1\1%=36gp=8bS?aei2)GEas>>Lk$TN,>ufBZoB]jXM7L!TN1Z4!O_PpZla\59_gj,XsjIt@plr\@mF(&7=0W9b>8_j>;le1n/(JaE7CHCm>Gn:ZJ(]GPA5$,kV9RSCt5[*p/@+#_ka4Z)KAq84s3/XCh3Efle[IhWis1gt)%=pCL>"aisU,N++naotg4G1lCpUfAcRgX%Ip0kH9&P<HqZ8u0c=Jb4]n7eZP\;!O,`qNYmc[!)r9RH77p,M2*?4%Oh8?'bY9l("3_YS^t'K[JLLqd^Y4!<4WeOJ.lHKR't;FWi9pdQX+2QM4GP-98W3ah8G&8U=GkpJq]/_Riredb@sje0ih)8MI\J][[[WWZc&OZ+LU,gRD(_NY#:46BMCrb5gWi3,eMhALIm=".,Nh9p'P[>siHSoJSlX>nJN@kck1+-Y[]"h=jE^eK(hW5sbVG@j\9#3?a,8Nfk;B4*/k3P0\srR-MA*dd"3__@=)4kHf<diP.$W7sA;PXJCLqM3!6mFRjjSi.pN9hJbK.Mp!KuMQ!DaPFA"*4>fJ78#I\-a)H0/CAuVg@eS:,d9VN=JnE^>Zt'qN]12l!#X):XY:%^D,Jg+[VSA=_oFVd3qN+.0&M+b\+>oq_n[^)$O7,%Z'"DKr0;\8U&+BH&4a>)-/80l0k]-t,s!94foq?P-oFWeL!=;@U[We=oG;NA[I0oa7WgaHkT\:'d?em:-ebg1a^9:RE63_4Ke$,aCC7>j5@9Z!Z?=SZZX]kmdkf7Xm7u]RZ!FA,Gc]Z7hQCW-K:-nKi%R8dfo6?Cl;oIn#no4%3H)9loF;`=Q.J,X2?*3i``hQ-HC(mK/?n=o[<1WANrn0F"N>@]p^_;#\bR#LfmL*CCa09hV@<$Q7^'_h6/7r,c%j`V)&1a<j$3X.Y5*Z=Ps&;r>WJ2?$rWB2h+jB~>endstream
endobj
xref
0 10
0000000000 65535 f
0000000073 00000 n
0000000114 00000 n
0000000221 00000 n
0000003164 00000 n
0000003276 00000 n
0000003542 00000 n
0000003610 00000 n
0000003862 00000 n
0000003921 00000 n
trailer
<<
/ID
[<b6139719c7306ca5b33b8f0a66121db8><b6139719c7306ca5b33b8f0a66121db8>]
% ReportLab generated PDF document -- digest (http://www.reportlab.com)
/Info 7 0 R
/Root 6 0 R
/Size 10
>>
startxref
6012
%%EOF

View File

@ -1,85 +0,0 @@
%PDF-1.4
%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com
1 0 obj
<<
/F1 2 0 R /F2 4 0 R
>>
endobj
2 0 obj
<<
/BaseFont /Helvetica /Encoding /WinAnsiEncoding /Name /F1 /Subtype /Type1 /Type /Font
>>
endobj
3 0 obj
<<
/BitsPerComponent 8 /ColorSpace /DeviceRGB /Filter [ /ASCII85Decode /FlateDecode ] /Height 125 /Length 2752 /Subtype /Image
/Type /XObject /Width 396
>>
stream
Gb"/lCNe_d(^8U1UaN3;I$4-'fC#_Jgn@5*J.LrP(K#>I_i\eB&_CS>gWfg"!!$Q>If/m)j%"gjoDS./I0G0#q"7r<T^LS%rMapH!MD6K8X/-#e[=g"!;&Z:M>FQls(L4u!9f0[&qrpY^`m6E3bH&RW<JOgJB+GuFjPECZm&HV!$5$.U5ZZ[.0(bn9qn`S:alAm:fF*I)Gqp`aAZ69X@c>=!6A&FU5XCq.0,0<,#MCkW"]5"[#ui4G#SeKrhlGX=UdWm!+;P'6lBi,V#]F4bpCMI"tBcV:.(b7QCq+UUE^s[<b"rTJAKWq.&/r('Yq4L8X.aN<!m#8e0N1h8caI+PUI%l"TV:tU-,@g^u3:+PR!HT(`[+DnjG(j2u!BmiHfd0/EQRP,Z10*a0Vp5H,g.D$Mk,oqPFJta!&1T@kF%tq;FQ;V)a'7;-#,=U?_Z&12C4s$HT5H>D\L]$@ot?<2m;=,rHA:K-R<m$5+X?'EI(`<,/R(*O'(M2A?/L`)LKc6lg:49kl'V?p_mU)G65k&Lmt2*YEm8.oB=d:at%f9e3't?T0nr\qWZ0hOf837Sd6klMGc%\iAmEXnKrIJj2)Y.&/h&$?elpUR"+<*`b.^Wjt>B8<hX;<!r?\*#\DsW@D6Dgt!Q8,g*&"Q%D.Z;b#;rWJ:DF,>hKg:at%ZP@`7W8_9$d8jh4O+/C1)W#CqQh'coi:/Tu/];O$SceH+B4,tZeTI*N:X&(7tM]OZ(,b%c6lWr;klM_nS;+:Xa.G0F41MYfnQVuKY1aU:Z)_)$'E/'<D0;(Aj;N.\F)9kFC?jFu=;+htC44X6p=e_u5U/J4d1LsJE;3e=IYN$/Q&nNm(Q%H.1Sl&kXp_qJ:qHqf!-rJPlTMi"V`O!HWJ/&`75uFu7leO%nR86f\d`W.uM)(NQ9#2i8c)AMP;>!._m&I+NVF4QSJP*`o]#gnqAKFQ/PnKB2%k7`EEiP(53Z"fqPd3]&:at%ZdpuFAAZ1@)8sC]<*l#MrX-oS!D2Tm?e%=BD4dt]u3?Ei4'oDLWmsM<'a*J>K]f8MOXfeU0`7KCT2%MaBRu@[anlp!SH?ELD>?L]1K4GOXf6ih7b+LhBbc(C>htAjP9eP/l>Ia#HX&;J&lq!0Tjg&78ddZ#YC2Q<KBrVj["oH_^7_/HK*RkXWL(]aUOe>;i;6V_PAlRoVH<&71\!3g:Lt#B2M1XRJ2l#0[-XtO"Hg#*NR`rTg&4ri8&d>nrF[iq.B8To@bM:JZJk/D.O=3)?@tS@/qj42c72<P+-!0$i?5.'4#J3e],RTR)pPa.GGC7H,8)$$PY#7e)*5i.=b,TdF9+dW=6#i/VU>R0>O\m`TnbKnk100cpZ7=Be^u<5%-DM'apfq>>b,U[mJ-1ahc5[Nt.?OT8(`')2.&^$)!=ge1C3*3DV5+/4?pFkXTTi'J"ZX;2B[/mUPnFLEJ>&'qK-DeA);kMTTKEIKX-@FN!t9eV*,McUaoMu+!r?tWO\-Y-8Hh)hkn071cSCbHFOLV:J9.J=;'$=7&e&`0'@VY'GpH?]28B7<8hUh=Bs(@>!T"!`?W=3#jlPUp7HJhCRe6G5F<j^)KeKqLi=aM\'\GTRV_2Tice_[)Zr#[e/FE*ViOH=-nKV1]5g@sM9;4Pn^Yhk<kU:b%:l2Dd7Rd9`pA<O-4u.QGQ<'8RQVkf2k92l(eX]*R:oWTtn7q[>W3dPZB?nTJ+2.(t8r"H6atpP"Q&k`TWb-)k,qR2bQf2l??Tl:kZVN$WkOh%T2)Qj8]PD8CIp#QSgs`!l4YL/)lqY(2[srP(ZRsDp0eG2_G:IQHJ$tD8^!Y-hh\#Oa:hf]lLXfOUGt=hGjV_="$NKkIdaP2Sn+)O]cC4*nmUg!/\Z,RbKaBLL18W75^.3$2-WbUUCrTF^Qr2h[df%i:]!U):'=6e&KnoQ'dBf"Hd+[i*3I>Scs7^PViD;)%?]"?4XA\-dP'r^?gDO-+h%^rE;/'U@Mo7'7=citqE\:mFW\@ecIE=[mI@oQa.UR?OYO6P,<G<O&b'@H-<-HX:5N`G\\Kd$4RnqWKjV_3tAtGs,Nk4GAfpGWFNE0Pj!`N>Xl*>_24&YKY>(4tse<`M'N*=hKCZro:06_&=7SRa+)OVTW2^>*GVCnTeM=M(U;MBUHH?>Ej]6P8/Bhu/<YITi_QC0j_:Zi-f8`s/W7A64(&mWhZXJZanR,&X?E-,0ijS:mn_&a=+^<WKSE4s1SG'nZ&9VOZ6L#ns,N1s3aQkYRf_JNp=>D9PWIGBQO.S#B2*S+5p6"`mk[(qS3T&maZhe&`1PHAq:Y@#$t(g8/Pm^.^s:.CM$d5N`UJFFEF(!XiKCZH:O%Ke_H%BehN3%:/J9R(ZijV\drh7>+"WDmQolh@g`[*340_tSI0M28NS@=_?0:&?$(f=U+@iP*!#9<a;5l4&aF;Tu(].+7C^&u$<-A5lagMDau=/EWI18PP;`U][Phmj^3)6lcCJ"Zgb-;Fo;'OAR,h^FFq*!K9:A.YU7kN'iXUKgYs#6[(#66ii69?Rgat!K9K<.YU7kN(GZPKgYs#8J`k16ii7*^.KPG!$`_k;FhK%.'"$p"TYhXKgYrl7oQ7G-ii`BWY?'L!$Q),KgYr,Lm1LT;#l]PUJaVs!2PFL'G:QL(()OF6ihg,F-T(d!2*"iPsV2FTM._<6D=Hf%]r\;M#r2f1f5\I$393%.o#sOM#m[He7pIO8/)&gBrP!$'EC7iTh6J*!&00d.YU7k!$'"nH!#JJ~>endstream
endobj
4 0 obj
<<
/BaseFont /Helvetica-Bold /Encoding /WinAnsiEncoding /Name /F2 /Subtype /Type1 /Type /Font
>>
endobj
5 0 obj
<<
/Contents 9 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 8 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] /XObject <<
/FormXob.2334743c725931a9ea3fbca05f2e932d 3 0 R
>>
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
6 0 obj
<<
/PageMode /UseNone /Pages 8 0 R /Type /Catalog
>>
endobj
7 0 obj
<<
/Author () /CreationDate (D:20250711114813+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20250711114813+02'00') /Producer (xhtml2pdf <https://github.com/xhtml2pdf/xhtml2pdf/>)
/Subject () /Title () /Trapped /False
>>
endobj
8 0 obj
<<
/Count 1 /Kids [ 5 0 R ] /Type /Pages
>>
endobj
9 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 2012
>>
stream
Gb!SnD/\/e&H;*)_(W^]!bV4&.Nb"c>Dr/#WB9H6J3^N-c@p,G[aLN@qAh#AVJKCu'A"sn+L*Kfm[h%;F?G_[LqjODIn);JIN,#f(DK`$L:;sG/C<l^oR,<gd^t0>>)[%tF.n7RL(MQQc9X@59[SCQGH`Ea15Wa<5V_r?1c@t#i=&S@i@1.u7Q$L_.WI\r:T0>GT]'N?Hti[e3WPN>0Jk.Z$Y":qJ9s%QX5H:^!Aihn@3WNKN&Z0H/n][3+#2e\BYd3-ab\D*8n*8HE>0(3bE@[f0m],eJfS0;/?M,%<b[/Yi>?B?Y+:n>$Fgh\)qbJIaT33O<3+=j_GR\pk9G[eR0^-Rd'pi!8qXc2\^MQb%B<=.(n#9[8?j;[@9d/>1TQ$D/nd^^_b7V#i;tQ_e68r@Z:MdSK4,n#!eH_l3tD4IGa.#9'/Xo>oWK-On`B[a3Z05&MOXN]m\9C%81]<M+ubd6XY#`97tO8X4(bAcWY,V(Z(`jj6?B42e%6:F'T>Jnbg8JCM4;n7P0>`N2Bu<X88YN<+-2c1C6]@u#7MlVk=i0j`$cWR2iDdC`RA9q+/&_h(/th^'h+t]7JpXq4EXha^_&$OBoT6FdeNSjT4GU>mMuZ>@AcqZKOGB@7>HJgkYL9Z?g6ARc$t_f-NBf/]L(W]/W54t--`X5GGAu;cI(opM+1(&-0R7j4h.g/U3T'g<[d4YSE$d3`?L_EMf^k8kMrA>*U_CBoKo2m(@2E5D;IWkJb\)4aXXpE6Q9\&,-9]CSDuAH%VnM?JKeg8Xd05_;AgnUb>5f3a@SJD88bXg:nn474FjLsmGWjm&]&-HWE/^k&h%aR'WXj:YIRmUKjNI%\UMj`HR2cB0@D&AH(VJ6@,V#BAV+s$\XTR+gSoF`X@CCT_QpTrHka6POjo.P-)"u#<,Qn%2&J!Q+7%US,.B)O0LHI])pL`8(&!N(h?E2VjlAN"0V;nTKca:5G9@Yh@q?,a>@H7sAi]sAS^+ROkQ2aXMJNH58Qashb6lAr(^/eWio#L*%S&g^%RcZ921O@uPL="O4hB<g=^`KFSqs\Xe$l35o/Lj`ipE4J+'r8:7j$T\G?8]i4WeiYqh(TYUr7B9l-f]uqFjlMg6hkIR$'_n1]E)EK.17-8V/!9'Q2n)a[5Ain:9>%H47Ig5<]mKrT\V%nngO4bgt6nq`[I;h*V6>89i;g,E4Ip0RK;#Bc2l<)J&Z]HCM!gA9DkjY`),*AKS:,84B77M@D.[=;laV!G?6MhicXuG[Q;I!=LX8B#bE,NAA>S%Cs=q;c0fJZA3<N7(R%;7W4*$A8`OtV$uT2^E2,im4IU-ZQ.,+jSEn0#K\'rpMuoZSPsS:MdaUl(leL$:U[M7nDD(e)*7#<0J?H[0'&J2[#8I_jh1i28P\\fEc46^P2=g6]`j%Tn9u/=jL1@8eVSFn,ad@5hWbEg\fn#KZ$Zh:S"!:tNY#:86BMCrF+Eg(>h48OTSgV0^a3Wr.?`8pD5`GIhSs3(/L%$K%P*'<R`0L.I=G32h=9bD,SXWNB#8;G'4PY7.&jGW2)gM`Hqo@1<:?*97]1)=VW]Lt9iaiDs1X^<h0h_rOqO'+4plJ\anLXD=4-!ViOTO9f2'sJU5J;4C3'1Ge-n&OSXM5Q_ps=;q+'1sfhZf^G9)tURV<G^P!ta-HN_-"keP>g4c-<Z#o8d@q45a*-VuYa@i!>eN9PlBN5$a@Nk@Kgj02)4&IWk5X^?F"mko4F,r;j",oWHB54JT=Y]s2KmAB(R0_>q`8i;Xs4g"0dY,5J2qEM!L25-\s'=;!"/GI]m(0A5R<aA#rCN`X_Vk>N/&uK8F5`nf&_XWUi",uGB35D:Y*U3X.-C5P5HouBrSX!.#4L+i\dq"cg1N\WoI8q?VSKffKc;#2GA3C9J:@FLL4cf-3;MWtZWB1rTZNRC+G";RKT(U+p;$,Y^4X9*J&LR7+0B=QuhG@<Z5(p++E=@cYLAs^L8cZe%]3)nbF(*AQm99O*;,pNu2sU>HnYRR^~>endstream
endobj
xref
0 10
0000000000 65535 f
0000000073 00000 n
0000000114 00000 n
0000000221 00000 n
0000003164 00000 n
0000003276 00000 n
0000003542 00000 n
0000003610 00000 n
0000003862 00000 n
0000003921 00000 n
trailer
<<
/ID
[<5db93bcefa4c2784599505f5e3350aff><5db93bcefa4c2784599505f5e3350aff>]
% ReportLab generated PDF document -- digest (http://www.reportlab.com)
/Info 7 0 R
/Root 6 0 R
/Size 10
>>
startxref
6024
%%EOF

View File

@ -1,85 +0,0 @@
%PDF-1.4
%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com
1 0 obj
<<
/F1 2 0 R /F2 4 0 R
>>
endobj
2 0 obj
<<
/BaseFont /Helvetica /Encoding /WinAnsiEncoding /Name /F1 /Subtype /Type1 /Type /Font
>>
endobj
3 0 obj
<<
/BitsPerComponent 8 /ColorSpace /DeviceRGB /Filter [ /ASCII85Decode /FlateDecode ] /Height 125 /Length 2752 /Subtype /Image
/Type /XObject /Width 396
>>
stream
Gb"/lCNe_d(^8U1UaN3;I$4-'fC#_Jgn@5*J.LrP(K#>I_i\eB&_CS>gWfg"!!$Q>If/m)j%"gjoDS./I0G0#q"7r<T^LS%rMapH!MD6K8X/-#e[=g"!;&Z:M>FQls(L4u!9f0[&qrpY^`m6E3bH&RW<JOgJB+GuFjPECZm&HV!$5$.U5ZZ[.0(bn9qn`S:alAm:fF*I)Gqp`aAZ69X@c>=!6A&FU5XCq.0,0<,#MCkW"]5"[#ui4G#SeKrhlGX=UdWm!+;P'6lBi,V#]F4bpCMI"tBcV:.(b7QCq+UUE^s[<b"rTJAKWq.&/r('Yq4L8X.aN<!m#8e0N1h8caI+PUI%l"TV:tU-,@g^u3:+PR!HT(`[+DnjG(j2u!BmiHfd0/EQRP,Z10*a0Vp5H,g.D$Mk,oqPFJta!&1T@kF%tq;FQ;V)a'7;-#,=U?_Z&12C4s$HT5H>D\L]$@ot?<2m;=,rHA:K-R<m$5+X?'EI(`<,/R(*O'(M2A?/L`)LKc6lg:49kl'V?p_mU)G65k&Lmt2*YEm8.oB=d:at%f9e3't?T0nr\qWZ0hOf837Sd6klMGc%\iAmEXnKrIJj2)Y.&/h&$?elpUR"+<*`b.^Wjt>B8<hX;<!r?\*#\DsW@D6Dgt!Q8,g*&"Q%D.Z;b#;rWJ:DF,>hKg:at%ZP@`7W8_9$d8jh4O+/C1)W#CqQh'coi:/Tu/];O$SceH+B4,tZeTI*N:X&(7tM]OZ(,b%c6lWr;klM_nS;+:Xa.G0F41MYfnQVuKY1aU:Z)_)$'E/'<D0;(Aj;N.\F)9kFC?jFu=;+htC44X6p=e_u5U/J4d1LsJE;3e=IYN$/Q&nNm(Q%H.1Sl&kXp_qJ:qHqf!-rJPlTMi"V`O!HWJ/&`75uFu7leO%nR86f\d`W.uM)(NQ9#2i8c)AMP;>!._m&I+NVF4QSJP*`o]#gnqAKFQ/PnKB2%k7`EEiP(53Z"fqPd3]&:at%ZdpuFAAZ1@)8sC]<*l#MrX-oS!D2Tm?e%=BD4dt]u3?Ei4'oDLWmsM<'a*J>K]f8MOXfeU0`7KCT2%MaBRu@[anlp!SH?ELD>?L]1K4GOXf6ih7b+LhBbc(C>htAjP9eP/l>Ia#HX&;J&lq!0Tjg&78ddZ#YC2Q<KBrVj["oH_^7_/HK*RkXWL(]aUOe>;i;6V_PAlRoVH<&71\!3g:Lt#B2M1XRJ2l#0[-XtO"Hg#*NR`rTg&4ri8&d>nrF[iq.B8To@bM:JZJk/D.O=3)?@tS@/qj42c72<P+-!0$i?5.'4#J3e],RTR)pPa.GGC7H,8)$$PY#7e)*5i.=b,TdF9+dW=6#i/VU>R0>O\m`TnbKnk100cpZ7=Be^u<5%-DM'apfq>>b,U[mJ-1ahc5[Nt.?OT8(`')2.&^$)!=ge1C3*3DV5+/4?pFkXTTi'J"ZX;2B[/mUPnFLEJ>&'qK-DeA);kMTTKEIKX-@FN!t9eV*,McUaoMu+!r?tWO\-Y-8Hh)hkn071cSCbHFOLV:J9.J=;'$=7&e&`0'@VY'GpH?]28B7<8hUh=Bs(@>!T"!`?W=3#jlPUp7HJhCRe6G5F<j^)KeKqLi=aM\'\GTRV_2Tice_[)Zr#[e/FE*ViOH=-nKV1]5g@sM9;4Pn^Yhk<kU:b%:l2Dd7Rd9`pA<O-4u.QGQ<'8RQVkf2k92l(eX]*R:oWTtn7q[>W3dPZB?nTJ+2.(t8r"H6atpP"Q&k`TWb-)k,qR2bQf2l??Tl:kZVN$WkOh%T2)Qj8]PD8CIp#QSgs`!l4YL/)lqY(2[srP(ZRsDp0eG2_G:IQHJ$tD8^!Y-hh\#Oa:hf]lLXfOUGt=hGjV_="$NKkIdaP2Sn+)O]cC4*nmUg!/\Z,RbKaBLL18W75^.3$2-WbUUCrTF^Qr2h[df%i:]!U):'=6e&KnoQ'dBf"Hd+[i*3I>Scs7^PViD;)%?]"?4XA\-dP'r^?gDO-+h%^rE;/'U@Mo7'7=citqE\:mFW\@ecIE=[mI@oQa.UR?OYO6P,<G<O&b'@H-<-HX:5N`G\\Kd$4RnqWKjV_3tAtGs,Nk4GAfpGWFNE0Pj!`N>Xl*>_24&YKY>(4tse<`M'N*=hKCZro:06_&=7SRa+)OVTW2^>*GVCnTeM=M(U;MBUHH?>Ej]6P8/Bhu/<YITi_QC0j_:Zi-f8`s/W7A64(&mWhZXJZanR,&X?E-,0ijS:mn_&a=+^<WKSE4s1SG'nZ&9VOZ6L#ns,N1s3aQkYRf_JNp=>D9PWIGBQO.S#B2*S+5p6"`mk[(qS3T&maZhe&`1PHAq:Y@#$t(g8/Pm^.^s:.CM$d5N`UJFFEF(!XiKCZH:O%Ke_H%BehN3%:/J9R(ZijV\drh7>+"WDmQolh@g`[*340_tSI0M28NS@=_?0:&?$(f=U+@iP*!#9<a;5l4&aF;Tu(].+7C^&u$<-A5lagMDau=/EWI18PP;`U][Phmj^3)6lcCJ"Zgb-;Fo;'OAR,h^FFq*!K9:A.YU7kN'iXUKgYs#6[(#66ii69?Rgat!K9K<.YU7kN(GZPKgYs#8J`k16ii7*^.KPG!$`_k;FhK%.'"$p"TYhXKgYrl7oQ7G-ii`BWY?'L!$Q),KgYr,Lm1LT;#l]PUJaVs!2PFL'G:QL(()OF6ihg,F-T(d!2*"iPsV2FTM._<6D=Hf%]r\;M#r2f1f5\I$393%.o#sOM#m[He7pIO8/)&gBrP!$'EC7iTh6J*!&00d.YU7k!$'"nH!#JJ~>endstream
endobj
4 0 obj
<<
/BaseFont /Helvetica-Bold /Encoding /WinAnsiEncoding /Name /F2 /Subtype /Type1 /Type /Font
>>
endobj
5 0 obj
<<
/Contents 9 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 8 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] /XObject <<
/FormXob.2334743c725931a9ea3fbca05f2e932d 3 0 R
>>
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
6 0 obj
<<
/PageMode /UseNone /Pages 8 0 R /Type /Catalog
>>
endobj
7 0 obj
<<
/Author () /CreationDate (D:20250711115343+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20250711115343+02'00') /Producer (xhtml2pdf <https://github.com/xhtml2pdf/xhtml2pdf/>)
/Subject () /Title () /Trapped /False
>>
endobj
8 0 obj
<<
/Count 1 /Kids [ 5 0 R ] /Type /Pages
>>
endobj
9 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 1984
>>
stream
Gb!SngMYb8&:N/3lq:2%JC](^jKVJ.->5#TPbJZm$q?si"d5fTFQ2rY43Pf^.8_@%/$_tg[OCRhbaFm:g"E2N,4It+^S;Z5^CATD98Y,b_](uI(23IjH84c7m9RL\/S6ek\PPU96O7:iF-$ic.2pS2%b?;3-IMQ/.&Pje`^WNVS0:KZN.M@K<+G0oP3ciW)>2Aj2#Mr[:E=tD%)>:p%*]+0Js]gti1A0C.N#B00N3uK-5*DtN3ekmEqX_J#rBk\(4;pG[%'TDNqgks;+0ISM_/ROoK3-W41sQT3do;UdKDkR1"aELB3s^Ki)\d=FT]q2!>hG/X3\^nCNoZ'UsLW%0l%&C)[rT#a;^=)h%A/0.b0E=ksgUG$_fD8l`4c4'egj?RM"3AdOo%>!6ZLm%P+F#$@$eL9]T.q&<h&\6iSn[V74Vbbqh$L<t)V6CAofQN8eWlD14EfdJ7H$Q9ZCOS'&FqN_-5q6)9Ya1Xg_OM1hO(d4B9(F0#Mn]+`d1N((*Id6*ield9eecVs9j,?QWjD6C;hNL00M'bf^W$m_e79X8-I-lL(WMe&)Bdpc?"T`Nj_<"KmXD5hdmrE'f0R8tN9-)E]*Yn^(R+91;`N&T>$A&0;S'M=KAlp7K3:bWU^M;7kV\Qtp)YL0iS?aPViBH3dY;,Fcuq:57`PYRB%>2:gY-r/5.h;ksKGP4<Z0;unu-2j6Igh!ip`)CcLb\#7M*1+&XqfF-t&EnlQqqP2@%o?CO^=R)39!@j57VT.6.sM<^\."qG=qPVE8/glq-,N\4"/UJB\MjaRl'<70%@.35e:</VOO^6lCmbtQAd_5=EhAL[M(>B(<@[m7bEYrgPmq*On+gS!":O<[3lElDP;WULg#&Z#:_#@,1DO^f(!kpjBK93Tf!^6mJiDIWI2GorH8\LZG5"jdnKRq:?7dXI].sgG,S@3,49SXBXpF2rTY=c.ma0#M,kV]GTIRYXYojr8F.h.mf7#F&$1OEpSjl-bOJ/et<m[.c,oL2q6.l6j+<4Sq:'dBK.*0nhkRqOQhmV:8FBLtlDDkd$=NJ-&U9*_RSLKbJ*4gFpmd9V,Y:a1TO)NGCbBL-s%(ihD_9cRe@bQ/)ZiHpd'32S$VEYop,Z+8pIj!KR9%\WVTSEo/><%);:qIB'@/&7o6a+=e01BHer#NM!?S<G+oeMVWT:ukL+Ft+;hX],dUJ*Adh58l2$q=G1Z@&n5-L2dWSX^4V&S\K9K9f<489@A,Tqr5l,LA4(X=`@71)g6)lqf<B,:;13ph?O$-CD4b=.!L?(<7eLkk7?=MhYX5LA473p9@H:O:LjI\Xh4+U:rM.U&7B_06VN#r*a4k#O9_t25dYrAh8V_fMDBT)j^R)/SpNBPI?-iZ$LC5f>OLk,g.b-/a,oLE_hmG$[S$/^0^4Z(d*KGZWJTa[FM6/XD90!i\'b%:I*J?5qS)X6YP91Pko?P\6:eJ,fj0o-kF0`]giO3-p.oCEgAROd[>:g[?8hjpl)RKUf>`M#;Aj"kk<<r7odqWO$5ir!VU"MX<oqNL*hqD$9MI5e#:CO6jQKZ?9)_Ag1=]M0&tVq't<u,9A._K<s1$&@8#UTi&7-RT."q!*Srh^p#4oqaa-HVOkiT':*6*s+blaj':*.<3\WGkB\P9=jmM?8__se:D$!lrMlGMW!+&"t<p'9NFN$eTWN=20A0sHjU.HH5B]ecN%S4k./m`\]jma@H9`hdTjJ?sImGYb1d".P-aF]^kJ?Jaas'NY&=]Ml!U*mb'7jKM5f\UsXhpG\']+Xac<&\SZ6+&(R\%5_6X8+!Cr*6A8Kad\AVWLQ<<=U<Kc*;dCSTKPV)ik1?dAQI8NuE/>(O.gJ4AY,"8bT$fneO&XD#a)`T#L:84[[<hG)!*JTak)f??AVMN7Mo^8,mD>]8bsJ(uS;<7e@QC9^_^WOU?@@LG9K$M\"d=:`RC8[,JbmJk+P8$77s#r0cL/F:YC?._&@E5:Y\.M?~>endstream
endobj
xref
0 10
0000000000 65535 f
0000000073 00000 n
0000000114 00000 n
0000000221 00000 n
0000003164 00000 n
0000003276 00000 n
0000003542 00000 n
0000003610 00000 n
0000003862 00000 n
0000003921 00000 n
trailer
<<
/ID
[<2ca8974d7243840a38e62207b951542e><2ca8974d7243840a38e62207b951542e>]
% ReportLab generated PDF document -- digest (http://www.reportlab.com)
/Info 7 0 R
/Root 6 0 R
/Size 10
>>
startxref
5996
%%EOF

View File

@ -1,85 +0,0 @@
%PDF-1.4
%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com
1 0 obj
<<
/F1 2 0 R /F2 4 0 R
>>
endobj
2 0 obj
<<
/BaseFont /Helvetica /Encoding /WinAnsiEncoding /Name /F1 /Subtype /Type1 /Type /Font
>>
endobj
3 0 obj
<<
/BitsPerComponent 8 /ColorSpace /DeviceRGB /Filter [ /ASCII85Decode /FlateDecode ] /Height 125 /Length 2752 /Subtype /Image
/Type /XObject /Width 396
>>
stream
Gb"/lCNe_d(^8U1UaN3;I$4-'fC#_Jgn@5*J.LrP(K#>I_i\eB&_CS>gWfg"!!$Q>If/m)j%"gjoDS./I0G0#q"7r<T^LS%rMapH!MD6K8X/-#e[=g"!;&Z:M>FQls(L4u!9f0[&qrpY^`m6E3bH&RW<JOgJB+GuFjPECZm&HV!$5$.U5ZZ[.0(bn9qn`S:alAm:fF*I)Gqp`aAZ69X@c>=!6A&FU5XCq.0,0<,#MCkW"]5"[#ui4G#SeKrhlGX=UdWm!+;P'6lBi,V#]F4bpCMI"tBcV:.(b7QCq+UUE^s[<b"rTJAKWq.&/r('Yq4L8X.aN<!m#8e0N1h8caI+PUI%l"TV:tU-,@g^u3:+PR!HT(`[+DnjG(j2u!BmiHfd0/EQRP,Z10*a0Vp5H,g.D$Mk,oqPFJta!&1T@kF%tq;FQ;V)a'7;-#,=U?_Z&12C4s$HT5H>D\L]$@ot?<2m;=,rHA:K-R<m$5+X?'EI(`<,/R(*O'(M2A?/L`)LKc6lg:49kl'V?p_mU)G65k&Lmt2*YEm8.oB=d:at%f9e3't?T0nr\qWZ0hOf837Sd6klMGc%\iAmEXnKrIJj2)Y.&/h&$?elpUR"+<*`b.^Wjt>B8<hX;<!r?\*#\DsW@D6Dgt!Q8,g*&"Q%D.Z;b#;rWJ:DF,>hKg:at%ZP@`7W8_9$d8jh4O+/C1)W#CqQh'coi:/Tu/];O$SceH+B4,tZeTI*N:X&(7tM]OZ(,b%c6lWr;klM_nS;+:Xa.G0F41MYfnQVuKY1aU:Z)_)$'E/'<D0;(Aj;N.\F)9kFC?jFu=;+htC44X6p=e_u5U/J4d1LsJE;3e=IYN$/Q&nNm(Q%H.1Sl&kXp_qJ:qHqf!-rJPlTMi"V`O!HWJ/&`75uFu7leO%nR86f\d`W.uM)(NQ9#2i8c)AMP;>!._m&I+NVF4QSJP*`o]#gnqAKFQ/PnKB2%k7`EEiP(53Z"fqPd3]&:at%ZdpuFAAZ1@)8sC]<*l#MrX-oS!D2Tm?e%=BD4dt]u3?Ei4'oDLWmsM<'a*J>K]f8MOXfeU0`7KCT2%MaBRu@[anlp!SH?ELD>?L]1K4GOXf6ih7b+LhBbc(C>htAjP9eP/l>Ia#HX&;J&lq!0Tjg&78ddZ#YC2Q<KBrVj["oH_^7_/HK*RkXWL(]aUOe>;i;6V_PAlRoVH<&71\!3g:Lt#B2M1XRJ2l#0[-XtO"Hg#*NR`rTg&4ri8&d>nrF[iq.B8To@bM:JZJk/D.O=3)?@tS@/qj42c72<P+-!0$i?5.'4#J3e],RTR)pPa.GGC7H,8)$$PY#7e)*5i.=b,TdF9+dW=6#i/VU>R0>O\m`TnbKnk100cpZ7=Be^u<5%-DM'apfq>>b,U[mJ-1ahc5[Nt.?OT8(`')2.&^$)!=ge1C3*3DV5+/4?pFkXTTi'J"ZX;2B[/mUPnFLEJ>&'qK-DeA);kMTTKEIKX-@FN!t9eV*,McUaoMu+!r?tWO\-Y-8Hh)hkn071cSCbHFOLV:J9.J=;'$=7&e&`0'@VY'GpH?]28B7<8hUh=Bs(@>!T"!`?W=3#jlPUp7HJhCRe6G5F<j^)KeKqLi=aM\'\GTRV_2Tice_[)Zr#[e/FE*ViOH=-nKV1]5g@sM9;4Pn^Yhk<kU:b%:l2Dd7Rd9`pA<O-4u.QGQ<'8RQVkf2k92l(eX]*R:oWTtn7q[>W3dPZB?nTJ+2.(t8r"H6atpP"Q&k`TWb-)k,qR2bQf2l??Tl:kZVN$WkOh%T2)Qj8]PD8CIp#QSgs`!l4YL/)lqY(2[srP(ZRsDp0eG2_G:IQHJ$tD8^!Y-hh\#Oa:hf]lLXfOUGt=hGjV_="$NKkIdaP2Sn+)O]cC4*nmUg!/\Z,RbKaBLL18W75^.3$2-WbUUCrTF^Qr2h[df%i:]!U):'=6e&KnoQ'dBf"Hd+[i*3I>Scs7^PViD;)%?]"?4XA\-dP'r^?gDO-+h%^rE;/'U@Mo7'7=citqE\:mFW\@ecIE=[mI@oQa.UR?OYO6P,<G<O&b'@H-<-HX:5N`G\\Kd$4RnqWKjV_3tAtGs,Nk4GAfpGWFNE0Pj!`N>Xl*>_24&YKY>(4tse<`M'N*=hKCZro:06_&=7SRa+)OVTW2^>*GVCnTeM=M(U;MBUHH?>Ej]6P8/Bhu/<YITi_QC0j_:Zi-f8`s/W7A64(&mWhZXJZanR,&X?E-,0ijS:mn_&a=+^<WKSE4s1SG'nZ&9VOZ6L#ns,N1s3aQkYRf_JNp=>D9PWIGBQO.S#B2*S+5p6"`mk[(qS3T&maZhe&`1PHAq:Y@#$t(g8/Pm^.^s:.CM$d5N`UJFFEF(!XiKCZH:O%Ke_H%BehN3%:/J9R(ZijV\drh7>+"WDmQolh@g`[*340_tSI0M28NS@=_?0:&?$(f=U+@iP*!#9<a;5l4&aF;Tu(].+7C^&u$<-A5lagMDau=/EWI18PP;`U][Phmj^3)6lcCJ"Zgb-;Fo;'OAR,h^FFq*!K9:A.YU7kN'iXUKgYs#6[(#66ii69?Rgat!K9K<.YU7kN(GZPKgYs#8J`k16ii7*^.KPG!$`_k;FhK%.'"$p"TYhXKgYrl7oQ7G-ii`BWY?'L!$Q),KgYr,Lm1LT;#l]PUJaVs!2PFL'G:QL(()OF6ihg,F-T(d!2*"iPsV2FTM._<6D=Hf%]r\;M#r2f1f5\I$393%.o#sOM#m[He7pIO8/)&gBrP!$'EC7iTh6J*!&00d.YU7k!$'"nH!#JJ~>endstream
endobj
4 0 obj
<<
/BaseFont /Helvetica-Bold /Encoding /WinAnsiEncoding /Name /F2 /Subtype /Type1 /Type /Font
>>
endobj
5 0 obj
<<
/Contents 9 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 8 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] /XObject <<
/FormXob.e0a4eca9b7e93789d055f156cba63530 3 0 R
>>
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
6 0 obj
<<
/PageMode /UseNone /Pages 8 0 R /Type /Catalog
>>
endobj
7 0 obj
<<
/Author () /CreationDate (D:20250715083514+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20250715083514+02'00') /Producer (xhtml2pdf <https://github.com/xhtml2pdf/xhtml2pdf/>)
/Subject () /Title () /Trapped /False
>>
endobj
8 0 obj
<<
/Count 1 /Kids [ 5 0 R ] /Type /Pages
>>
endobj
9 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 1995
>>
stream
Gb!Sn=`<%a&:W67fU&=)!3PuZo%*YN;m^Q2a?^mV#`M0L$EPHbSYNs6ZTM8]M'=BQObLZV7<*N`^7"dV41d=<"Fb%\G;qnPf027+TSPAQ^I(t.Jbjkjo7#kDk6cZP5+<G6Kb=_1685a9K5<58;3,=5YU5kqM8"-u1%ht32G0_C"At%b'MLK])G=_.Ud'cuW/FuTr[63Fkl=tb!3W>1BMPcI`,(&,pLL.%_1:WtR<$5"O^K2AS6X8RPJ:`PE(hGf%jUs;a-LLN7mtK].b4#UUq#IgS]q/N(9]]`:7lU.0L8Nb"?&!dWL"J0\.uMhh10RPa$hE,kVKKrg?h'G..kYab\BK%"G8-4o#>38[fk539/U0h\eZO0JuBCDlDg@WKc*[=Act$)Yfdm/_(nQ`_honL!ZiBk'0-d5`$F,0d9f;ZjC&XqC$J.]Q2qe/:VY,n_g%gWamNan3Zj@"&niLF;jl7k0hJbuLfCZkB'QQlOUr3WRO1e>:fsU(-a#'=o4X8Zl"n3J-f/EmWFeK[._F)A&MKJ*Tmf=(JniRVb@_5rUNeJb/X,B^T@HB/LGf;N"@ZI_k7+MB?fn,_<[+aoKe&.&'i5[<s1snXf@IT%_'&(]b)e=D8S)RB0GOJ:giu&1=JG'+d?jW81lmr9'Ve*'9Xr=B5C+.nj4P+u*u8N,-V99bZFYZmq]P/?dmJhPrlFd"3h"CTHZV<<9VUc"/o!oQl,n9(cjbp+WN.rGTX$h1#Hod5cN]?)hZpo$hXh%ckO/YNLO!"B>I_ddkU+l<BEP*ZBNHu%[Sdtkpkt3(.EG)ii(.ai1f1<#d#YtgEqckl/X+&gCdG%$mSa`HG.A;;9;PuO\KW)cU?tUc52YoG@%kq<LR;]0db6r>rEGU%b+\[7-\ZCajXa^J(ZW'dDaX:JGf-Z5q`uO%F44*+p)k(eYEJ@TFe^4k/^p.u,$_aj&#d?N&^K,rICg>G6T<J6iZJ,*=aUTd5r;VS:U(Y;$"9\Gi4imQ,ap&1ZmFB<g4HOSALu"R)dj51@qag5'0*snPGn`5,u.[[9t*^QZA)-1XLkR<OBH3a=jc\";^V/sFS#.qc.UA-lZ71>#/.^ar8YHIQL.J&#0R\/f$gMtkc.!"b;D$QaY5#l_IrcKf`Y6j/sHLp>U\CCnY:flT&9X]5Bdt@"8qqY=8(t;i60a&dP4lV"6oQ,oI_.00LEW\IN#2N$)Y8f1gQcjBVRkZ%9D4o/L8N'Zb[h023r[;Z7.)Vp*eM!<+2a0=p1?Q"ai[L/`;1#aotg42VIWL8?GQ>D+uWAa-=gZ;0L=RKh*-l_<a&L[I!9iTo^ELjB$D,VnGBEA!TLX[9R'Um3)5R:13eFYB+H=@9^rX#c"i#p;o3F!WH<U+@@Mn$1hWVi^0f(9A;uQ=l*<.S)iXm-?g6t-L#$RgfZ=U#Tm]a8oA.>;dNR-9S15hif0O[X;Z[_)U#&*\@sEbi<XE\C_TI&[hMXSKWAjKC/e&T(qAWXD2P,Fmi#pcTssP0Bo5HTU;[V85>.`+Dn\FcMf*h4#ndTL+#77>aU']OEKl^?fpJ749g0pk@&eFn8ZgGo$hrjGSrB"UKE&ZM*Sc'3Y`]X-,X)QQe&cfjJlg@Zh8=(G/oG$tG!mY0XjlG(q5G6@3&id(3JORt;tKa\*OB,@%dlAo'/\/bTI$q3g)U7Q27-b&[\#ssN!,WmP5J?mdN^0/oJqgV,?QY.7qtNNiakbh*o:nh,]Lpn?:sD4%c2OA/U5Brb\;o[kdClss!]LjAQ@J6H3=Y)7Y4NtmA$$@/^;go>Cuj8l=NI5W:g@2=#Z%Y21NQ0SZA$bOMROE<1GD9d\2>n3#5>dQ&]g4mEknYqA<Q#;5<jX.^(%_VmGW$SA+SG]arBfU#P*\4GfsBHA.IXD%0XII3#=e^$(?:(p2ZJ%f][]M]5BG0u0XVK]j(=R,%56+r0Yc%V$o'(8&H.Tf@eOC!H[FKWS&_.n%T3/mhJ\8p@J?WIu45rW@<('o2~>endstream
endobj
xref
0 10
0000000000 65535 f
0000000073 00000 n
0000000114 00000 n
0000000221 00000 n
0000003164 00000 n
0000003276 00000 n
0000003542 00000 n
0000003610 00000 n
0000003862 00000 n
0000003921 00000 n
trailer
<<
/ID
[<e1f8ef2bb7af8bebf51350dffa9ee682><e1f8ef2bb7af8bebf51350dffa9ee682>]
% ReportLab generated PDF document -- digest (http://www.reportlab.com)
/Info 7 0 R
/Root 6 0 R
/Size 10
>>
startxref
6007
%%EOF

View File

@ -1,85 +0,0 @@
%PDF-1.4
%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com
1 0 obj
<<
/F1 2 0 R /F2 4 0 R
>>
endobj
2 0 obj
<<
/BaseFont /Helvetica /Encoding /WinAnsiEncoding /Name /F1 /Subtype /Type1 /Type /Font
>>
endobj
3 0 obj
<<
/BitsPerComponent 8 /ColorSpace /DeviceRGB /Filter [ /ASCII85Decode /FlateDecode ] /Height 125 /Length 2752 /Subtype /Image
/Type /XObject /Width 396
>>
stream
Gb"/lCNe_d(^8U1UaN3;I$4-'fC#_Jgn@5*J.LrP(K#>I_i\eB&_CS>gWfg"!!$Q>If/m)j%"gjoDS./I0G0#q"7r<T^LS%rMapH!MD6K8X/-#e[=g"!;&Z:M>FQls(L4u!9f0[&qrpY^`m6E3bH&RW<JOgJB+GuFjPECZm&HV!$5$.U5ZZ[.0(bn9qn`S:alAm:fF*I)Gqp`aAZ69X@c>=!6A&FU5XCq.0,0<,#MCkW"]5"[#ui4G#SeKrhlGX=UdWm!+;P'6lBi,V#]F4bpCMI"tBcV:.(b7QCq+UUE^s[<b"rTJAKWq.&/r('Yq4L8X.aN<!m#8e0N1h8caI+PUI%l"TV:tU-,@g^u3:+PR!HT(`[+DnjG(j2u!BmiHfd0/EQRP,Z10*a0Vp5H,g.D$Mk,oqPFJta!&1T@kF%tq;FQ;V)a'7;-#,=U?_Z&12C4s$HT5H>D\L]$@ot?<2m;=,rHA:K-R<m$5+X?'EI(`<,/R(*O'(M2A?/L`)LKc6lg:49kl'V?p_mU)G65k&Lmt2*YEm8.oB=d:at%f9e3't?T0nr\qWZ0hOf837Sd6klMGc%\iAmEXnKrIJj2)Y.&/h&$?elpUR"+<*`b.^Wjt>B8<hX;<!r?\*#\DsW@D6Dgt!Q8,g*&"Q%D.Z;b#;rWJ:DF,>hKg:at%ZP@`7W8_9$d8jh4O+/C1)W#CqQh'coi:/Tu/];O$SceH+B4,tZeTI*N:X&(7tM]OZ(,b%c6lWr;klM_nS;+:Xa.G0F41MYfnQVuKY1aU:Z)_)$'E/'<D0;(Aj;N.\F)9kFC?jFu=;+htC44X6p=e_u5U/J4d1LsJE;3e=IYN$/Q&nNm(Q%H.1Sl&kXp_qJ:qHqf!-rJPlTMi"V`O!HWJ/&`75uFu7leO%nR86f\d`W.uM)(NQ9#2i8c)AMP;>!._m&I+NVF4QSJP*`o]#gnqAKFQ/PnKB2%k7`EEiP(53Z"fqPd3]&:at%ZdpuFAAZ1@)8sC]<*l#MrX-oS!D2Tm?e%=BD4dt]u3?Ei4'oDLWmsM<'a*J>K]f8MOXfeU0`7KCT2%MaBRu@[anlp!SH?ELD>?L]1K4GOXf6ih7b+LhBbc(C>htAjP9eP/l>Ia#HX&;J&lq!0Tjg&78ddZ#YC2Q<KBrVj["oH_^7_/HK*RkXWL(]aUOe>;i;6V_PAlRoVH<&71\!3g:Lt#B2M1XRJ2l#0[-XtO"Hg#*NR`rTg&4ri8&d>nrF[iq.B8To@bM:JZJk/D.O=3)?@tS@/qj42c72<P+-!0$i?5.'4#J3e],RTR)pPa.GGC7H,8)$$PY#7e)*5i.=b,TdF9+dW=6#i/VU>R0>O\m`TnbKnk100cpZ7=Be^u<5%-DM'apfq>>b,U[mJ-1ahc5[Nt.?OT8(`')2.&^$)!=ge1C3*3DV5+/4?pFkXTTi'J"ZX;2B[/mUPnFLEJ>&'qK-DeA);kMTTKEIKX-@FN!t9eV*,McUaoMu+!r?tWO\-Y-8Hh)hkn071cSCbHFOLV:J9.J=;'$=7&e&`0'@VY'GpH?]28B7<8hUh=Bs(@>!T"!`?W=3#jlPUp7HJhCRe6G5F<j^)KeKqLi=aM\'\GTRV_2Tice_[)Zr#[e/FE*ViOH=-nKV1]5g@sM9;4Pn^Yhk<kU:b%:l2Dd7Rd9`pA<O-4u.QGQ<'8RQVkf2k92l(eX]*R:oWTtn7q[>W3dPZB?nTJ+2.(t8r"H6atpP"Q&k`TWb-)k,qR2bQf2l??Tl:kZVN$WkOh%T2)Qj8]PD8CIp#QSgs`!l4YL/)lqY(2[srP(ZRsDp0eG2_G:IQHJ$tD8^!Y-hh\#Oa:hf]lLXfOUGt=hGjV_="$NKkIdaP2Sn+)O]cC4*nmUg!/\Z,RbKaBLL18W75^.3$2-WbUUCrTF^Qr2h[df%i:]!U):'=6e&KnoQ'dBf"Hd+[i*3I>Scs7^PViD;)%?]"?4XA\-dP'r^?gDO-+h%^rE;/'U@Mo7'7=citqE\:mFW\@ecIE=[mI@oQa.UR?OYO6P,<G<O&b'@H-<-HX:5N`G\\Kd$4RnqWKjV_3tAtGs,Nk4GAfpGWFNE0Pj!`N>Xl*>_24&YKY>(4tse<`M'N*=hKCZro:06_&=7SRa+)OVTW2^>*GVCnTeM=M(U;MBUHH?>Ej]6P8/Bhu/<YITi_QC0j_:Zi-f8`s/W7A64(&mWhZXJZanR,&X?E-,0ijS:mn_&a=+^<WKSE4s1SG'nZ&9VOZ6L#ns,N1s3aQkYRf_JNp=>D9PWIGBQO.S#B2*S+5p6"`mk[(qS3T&maZhe&`1PHAq:Y@#$t(g8/Pm^.^s:.CM$d5N`UJFFEF(!XiKCZH:O%Ke_H%BehN3%:/J9R(ZijV\drh7>+"WDmQolh@g`[*340_tSI0M28NS@=_?0:&?$(f=U+@iP*!#9<a;5l4&aF;Tu(].+7C^&u$<-A5lagMDau=/EWI18PP;`U][Phmj^3)6lcCJ"Zgb-;Fo;'OAR,h^FFq*!K9:A.YU7kN'iXUKgYs#6[(#66ii69?Rgat!K9K<.YU7kN(GZPKgYs#8J`k16ii7*^.KPG!$`_k;FhK%.'"$p"TYhXKgYrl7oQ7G-ii`BWY?'L!$Q),KgYr,Lm1LT;#l]PUJaVs!2PFL'G:QL(()OF6ihg,F-T(d!2*"iPsV2FTM._<6D=Hf%]r\;M#r2f1f5\I$393%.o#sOM#m[He7pIO8/)&gBrP!$'EC7iTh6J*!&00d.YU7k!$'"nH!#JJ~>endstream
endobj
4 0 obj
<<
/BaseFont /Helvetica-Bold /Encoding /WinAnsiEncoding /Name /F2 /Subtype /Type1 /Type /Font
>>
endobj
5 0 obj
<<
/Contents 9 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 8 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] /XObject <<
/FormXob.cce78b71853849c73b887b8941906fa4 3 0 R
>>
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
6 0 obj
<<
/PageMode /UseNone /Pages 8 0 R /Type /Catalog
>>
endobj
7 0 obj
<<
/Author () /CreationDate (D:20250717161429+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20250717161429+02'00') /Producer (xhtml2pdf <https://github.com/xhtml2pdf/xhtml2pdf/>)
/Subject () /Title () /Trapped /False
>>
endobj
8 0 obj
<<
/Count 1 /Kids [ 5 0 R ] /Type /Pages
>>
endobj
9 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 1945
>>
stream
Gb!SngN)%,&:N/3i2'?u1P2mA1QQ\F2OW.d7HsH\1EK\.>\,J.eg5>5oj.%gJJ(CL[N]KJ*_@W.`LbmK>V#jW@JC)LGCN$%03rU?$3W?QIN]i5,i.A"8[nBF]"ehe]t't+C8m&$N:KLFPRX(4F<Guu%26Mlq;/u>_<Wl+C.5]Y!^O"*<B-h0.]8OXJ($L-->uHL/*Xcj!%nla(Zd?0@+7_Z2o3:B.NMQ"6R34!#f8#hW#^4)SPH&W^F$FshiEc12.2]R1?ofuCTY.TObAPT00Mn`:Ct>HWruF?4D.]tJs#I$F])W\.oR/W-nmT#%F3%TOJ,XUbq,Sd[+XS)\R+$Hnd="#_;O%?]X=`d%7,,o;RI@PWPf'A17_fX?54]c.2RiiXJAnXH9%l@=H9(t==J4M$HHL("\=5S$D/U-:OE'9@N(GM@R^0_,8WS'^J0I]pdRoJ5#"an2HiNadRL+6;QGdeP&<f%V,bFS<*pA&+b=B!!iME]&`[JEi2W=;3.$%C%D8qc*NWg_"(NWWQ7JOE9A1ED3GFVq"J(eX$9EZ9lPYP9mIag,1p/TLm0a-YLQG'&jY'4O]7Qa8#BJkNa^R`Z5PMn2s,r/oN!s/Nc-h/>OBrA3rV:Cf-F:[Uo],a0-=>3F5o\Q$X/Ej`\IsAP%!C6MG_kh1nROKAN<aHh5#ZDQ+_LlD0\mdG#4]r<4I`$oDm%C2Dluj<Y&6EULA*WZ`C$#D)ji!PBHB%")2h)3)OKgsNKgl=Wi('C1!1q(<FA\_;O>5!*c8^&^2;8R.iDc6$"1.;<=I>a-H1m@a_`Moqk98kCe;>&MmXNU-5bhU6X&ZS1j"oLW`XeE@P&FE4W*YJ=arJ[E4i;m+.tJ8;J%kd'\6Lne9^daK(3=LO09X_Egn7i"D-!rMS"Bgh%^Tt$.SS2n;2N6&*NqWmhE`"+I:5JD0P&Fl,j6K)ZfqJ17n6[o-N+BC]SBJ=I(Y,B9WiZ81&!qcj32V*#Y._&7*\ZG[!+rjX(qJZ0eR5RS&jr1r/]Th5R]:`M&^?T?c;Crc!-L5+du/b>03U\kUlW@V@_QE>*Woe,TXoM5"5qdpEM^0hcuG^Q<Rl's8Y3nuXGKf5UXqTf+9C_!]5Y-Qg`rY?>JPr"X.a0;jiXEZ.L:n&\SXaKUAPO*ile.2-fEO!0pY;/*.!Si2o#j:*AmS^YU6,8HZ\e']iPM<63e7Oc5Q#rHicYB0K-b_j:?4Wl$#;Ut%%h,pLIctu3(;oa$FD1?@V[MNCI7L4=DLp'3b)\'=dCEUCYgGnOW_q.@<P[B:?`Pr6_]PR%I7s2BCHO.f'c9iG6os>7<FTLuU@=aB&FMt[*.i4Oe8R,pQR7DO<6*F1jB<'`jd&Vi_>.M%Kn.Io\A!u-+;PuLZ/t%BV]:s'u!F$<BV)24+TlG3PlJ3'3W`^aU+DqLYe-QrQ(0(bHpbE+$GZ#5)Vqr0<<afk*,?!]eI#%tWJF6t)><M`XW$o79eRq9b`4jQJPlrJQ:rQ:4?tX=m.S'%aOck=L.OLEM]-uHubBPk6`ARAd<47#B25=>(>`s=b\4*=J`X@6O#,_[WD7mB-ZWn(WA2dCb_!=oT`3=H#icL,\4/V.YFXq&gh<j$?>UC;*Cd:W7;2DZ"J01Hc/(=/:\`PGF<#4OR1(t-?Bu4X4:!T]uI#$5<4iOa^]\L9\\4@/C%sb.E?!CG"7qf\2DH0/!dNR4ZjSr"angk9YRA'r%crVJ@(`GPa>2N.]h)?YDs!VfO\,qU:BX>@>n#Q79Y&n$Q\:b:Am'^G#5o2F*Crs,9ArXe9qc@YEE+TU=#S4#neIc+Z/<;1=_([n8/=_?iJSj<#a.mlA-gq=\T>lu#hUSJqfg/\X*g>\gD?'(Te(``h+!Y#E8'Drm`mpBQMBLFmCrQH-(14pCW<L8[BuPRWKWfLc.h(8rORIG$%!SU/;?8^jr<KtYs4d~>endstream
endobj
xref
0 10
0000000000 65535 f
0000000073 00000 n
0000000114 00000 n
0000000221 00000 n
0000003164 00000 n
0000003276 00000 n
0000003542 00000 n
0000003610 00000 n
0000003862 00000 n
0000003921 00000 n
trailer
<<
/ID
[<171936cfd3c633e9e383a92e7b9a50db><171936cfd3c633e9e383a92e7b9a50db>]
% ReportLab generated PDF document -- digest (http://www.reportlab.com)
/Info 7 0 R
/Root 6 0 R
/Size 10
>>
startxref
5957
%%EOF

View File

@ -1,85 +0,0 @@
%PDF-1.4
%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com
1 0 obj
<<
/F1 2 0 R /F2 4 0 R
>>
endobj
2 0 obj
<<
/BaseFont /Helvetica /Encoding /WinAnsiEncoding /Name /F1 /Subtype /Type1 /Type /Font
>>
endobj
3 0 obj
<<
/BitsPerComponent 8 /ColorSpace /DeviceRGB /Filter [ /ASCII85Decode /FlateDecode ] /Height 125 /Length 2752 /Subtype /Image
/Type /XObject /Width 396
>>
stream
Gb"/lCNe_d(^8U1UaN3;I$4-'fC#_Jgn@5*J.LrP(K#>I_i\eB&_CS>gWfg"!!$Q>If/m)j%"gjoDS./I0G0#q"7r<T^LS%rMapH!MD6K8X/-#e[=g"!;&Z:M>FQls(L4u!9f0[&qrpY^`m6E3bH&RW<JOgJB+GuFjPECZm&HV!$5$.U5ZZ[.0(bn9qn`S:alAm:fF*I)Gqp`aAZ69X@c>=!6A&FU5XCq.0,0<,#MCkW"]5"[#ui4G#SeKrhlGX=UdWm!+;P'6lBi,V#]F4bpCMI"tBcV:.(b7QCq+UUE^s[<b"rTJAKWq.&/r('Yq4L8X.aN<!m#8e0N1h8caI+PUI%l"TV:tU-,@g^u3:+PR!HT(`[+DnjG(j2u!BmiHfd0/EQRP,Z10*a0Vp5H,g.D$Mk,oqPFJta!&1T@kF%tq;FQ;V)a'7;-#,=U?_Z&12C4s$HT5H>D\L]$@ot?<2m;=,rHA:K-R<m$5+X?'EI(`<,/R(*O'(M2A?/L`)LKc6lg:49kl'V?p_mU)G65k&Lmt2*YEm8.oB=d:at%f9e3't?T0nr\qWZ0hOf837Sd6klMGc%\iAmEXnKrIJj2)Y.&/h&$?elpUR"+<*`b.^Wjt>B8<hX;<!r?\*#\DsW@D6Dgt!Q8,g*&"Q%D.Z;b#;rWJ:DF,>hKg:at%ZP@`7W8_9$d8jh4O+/C1)W#CqQh'coi:/Tu/];O$SceH+B4,tZeTI*N:X&(7tM]OZ(,b%c6lWr;klM_nS;+:Xa.G0F41MYfnQVuKY1aU:Z)_)$'E/'<D0;(Aj;N.\F)9kFC?jFu=;+htC44X6p=e_u5U/J4d1LsJE;3e=IYN$/Q&nNm(Q%H.1Sl&kXp_qJ:qHqf!-rJPlTMi"V`O!HWJ/&`75uFu7leO%nR86f\d`W.uM)(NQ9#2i8c)AMP;>!._m&I+NVF4QSJP*`o]#gnqAKFQ/PnKB2%k7`EEiP(53Z"fqPd3]&:at%ZdpuFAAZ1@)8sC]<*l#MrX-oS!D2Tm?e%=BD4dt]u3?Ei4'oDLWmsM<'a*J>K]f8MOXfeU0`7KCT2%MaBRu@[anlp!SH?ELD>?L]1K4GOXf6ih7b+LhBbc(C>htAjP9eP/l>Ia#HX&;J&lq!0Tjg&78ddZ#YC2Q<KBrVj["oH_^7_/HK*RkXWL(]aUOe>;i;6V_PAlRoVH<&71\!3g:Lt#B2M1XRJ2l#0[-XtO"Hg#*NR`rTg&4ri8&d>nrF[iq.B8To@bM:JZJk/D.O=3)?@tS@/qj42c72<P+-!0$i?5.'4#J3e],RTR)pPa.GGC7H,8)$$PY#7e)*5i.=b,TdF9+dW=6#i/VU>R0>O\m`TnbKnk100cpZ7=Be^u<5%-DM'apfq>>b,U[mJ-1ahc5[Nt.?OT8(`')2.&^$)!=ge1C3*3DV5+/4?pFkXTTi'J"ZX;2B[/mUPnFLEJ>&'qK-DeA);kMTTKEIKX-@FN!t9eV*,McUaoMu+!r?tWO\-Y-8Hh)hkn071cSCbHFOLV:J9.J=;'$=7&e&`0'@VY'GpH?]28B7<8hUh=Bs(@>!T"!`?W=3#jlPUp7HJhCRe6G5F<j^)KeKqLi=aM\'\GTRV_2Tice_[)Zr#[e/FE*ViOH=-nKV1]5g@sM9;4Pn^Yhk<kU:b%:l2Dd7Rd9`pA<O-4u.QGQ<'8RQVkf2k92l(eX]*R:oWTtn7q[>W3dPZB?nTJ+2.(t8r"H6atpP"Q&k`TWb-)k,qR2bQf2l??Tl:kZVN$WkOh%T2)Qj8]PD8CIp#QSgs`!l4YL/)lqY(2[srP(ZRsDp0eG2_G:IQHJ$tD8^!Y-hh\#Oa:hf]lLXfOUGt=hGjV_="$NKkIdaP2Sn+)O]cC4*nmUg!/\Z,RbKaBLL18W75^.3$2-WbUUCrTF^Qr2h[df%i:]!U):'=6e&KnoQ'dBf"Hd+[i*3I>Scs7^PViD;)%?]"?4XA\-dP'r^?gDO-+h%^rE;/'U@Mo7'7=citqE\:mFW\@ecIE=[mI@oQa.UR?OYO6P,<G<O&b'@H-<-HX:5N`G\\Kd$4RnqWKjV_3tAtGs,Nk4GAfpGWFNE0Pj!`N>Xl*>_24&YKY>(4tse<`M'N*=hKCZro:06_&=7SRa+)OVTW2^>*GVCnTeM=M(U;MBUHH?>Ej]6P8/Bhu/<YITi_QC0j_:Zi-f8`s/W7A64(&mWhZXJZanR,&X?E-,0ijS:mn_&a=+^<WKSE4s1SG'nZ&9VOZ6L#ns,N1s3aQkYRf_JNp=>D9PWIGBQO.S#B2*S+5p6"`mk[(qS3T&maZhe&`1PHAq:Y@#$t(g8/Pm^.^s:.CM$d5N`UJFFEF(!XiKCZH:O%Ke_H%BehN3%:/J9R(ZijV\drh7>+"WDmQolh@g`[*340_tSI0M28NS@=_?0:&?$(f=U+@iP*!#9<a;5l4&aF;Tu(].+7C^&u$<-A5lagMDau=/EWI18PP;`U][Phmj^3)6lcCJ"Zgb-;Fo;'OAR,h^FFq*!K9:A.YU7kN'iXUKgYs#6[(#66ii69?Rgat!K9K<.YU7kN(GZPKgYs#8J`k16ii7*^.KPG!$`_k;FhK%.'"$p"TYhXKgYrl7oQ7G-ii`BWY?'L!$Q),KgYr,Lm1LT;#l]PUJaVs!2PFL'G:QL(()OF6ihg,F-T(d!2*"iPsV2FTM._<6D=Hf%]r\;M#r2f1f5\I$393%.o#sOM#m[He7pIO8/)&gBrP!$'EC7iTh6J*!&00d.YU7k!$'"nH!#JJ~>endstream
endobj
4 0 obj
<<
/BaseFont /Helvetica-Bold /Encoding /WinAnsiEncoding /Name /F2 /Subtype /Type1 /Type /Font
>>
endobj
5 0 obj
<<
/Contents 9 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 8 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] /XObject <<
/FormXob.cce78b71853849c73b887b8941906fa4 3 0 R
>>
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
6 0 obj
<<
/PageMode /UseNone /Pages 8 0 R /Type /Catalog
>>
endobj
7 0 obj
<<
/Author () /CreationDate (D:20250717161510+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20250717161510+02'00') /Producer (xhtml2pdf <https://github.com/xhtml2pdf/xhtml2pdf/>)
/Subject () /Title () /Trapped /False
>>
endobj
8 0 obj
<<
/Count 1 /Kids [ 5 0 R ] /Type /Pages
>>
endobj
9 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 1944
>>
stream
Gb!Sn=`YcG&:WeDkTpseX,tlCa,fbQlrLFX"/k_J.Mmim%9j$QNnmEYI9L[t%1G%Fc!i.k!Q.I1rjqur<_EK"_\XSjr=L3fFNMoj&E'A]M1DCbFFPZNh:>Nj'&SfDk*?@RV'_K_as/'+2J<<CJb0F09E8/T>71Z?YKKbC($U_a!6%u<iKP7\S5trgVOpGL]HQ)aV#/^D\4cm-QGYD.;'VLb"9\+lFBFM3O[.,5#cC@iG3j3j5+.H1RbZA@5;r5lJ5sJ/W,KVf[H?=8&gF2;ocuPg+G(&'$*)d*cE(7S,M`CcUr"BXVC:q7?uG$DS<4g86`F7Y=[]#uZd!i;]s\O7's=`m_6lRSCK$uIK'F&HC,'a-M%Q[s3l/>=.RmH;/eY'b8Zg),E_\Ep*(0%r;W,V2No*kEO9EN:hFZ(dp\OL#1a_8$MY8Vl0"r9SSIGDcSX(J5S!rPW[#-?/ND*?K<ZB()h2iaOX+lb9^++@o!nEA8:'%Y#EjIcF<R-s@Al%8_0JqcEZ@T!<.a&RQ9I9(dn!paU@tMuu!!SqNWqD:g[.a>,%N8E:Zh=QTnO#hldde3NO^5fMn,p5kk@?:lj.C[*j+#0\DajpcR:aQ+-qLNGMuJ)`)3``_9)A(**g9B6hOojFOO]QR^0Ct/EdkUb4[-jrjCC"aou;VD9:dRlQ]<kQG*m)A-A2*]3hFUC^N\9O0(,mgY-7<N08:!]K>h>fIiFb&<+m=1RMh#4c5N&8#`Y(WR&HpT>@WmrDPFq0_PJl;'0Y'"EIHTY[&7Gf]d83VmTVD>K:*E,8gQ]#\_I^t]Ne+02.*BF?noJGLD\GhB;M;cHre2f1V?ft#%%n\Bft]WLQ@J)2=:RR7RYDc#*m&_bCEd"*D/"lcN!Fb6W%`"UlD$@\h\7A:o1d568X7>0cb]j2rilP5OtA>p]e[")63(aHn/Lm^hk=3In[lRhKZb&>ECG0bmDQ+`q#(o!=$XKN<C.CBn@QS;ZiaERZq^UB!^9'K,(h#2-EkWdY\6R?Dfkb2R,4uoAnqee!kP_BB81W\[_M2riFk=m4X3Kdh4U%Vb[aun<#-AeM7$A0GVLDBDhp8#?0UHOY*3JJoD1>%i/o$Jd:XkC2recmJ)iUp8_Qja1(0[0j7<SamTITSMW*<@GrfqNE++(h:uj<->$4\X,s6=jZ7Yha^XG?1&"4mB(*+690o:4MNq&]YZ(\K*R<sj^*^2Gn3@Ki8[VN?H@.YP.2-f-Oiu6o*G(]^>E%s'=Ha>KhCIS9dG%,X0#JUK0DdX;Hd2&f;%D\h@XYelJeTlm3S@9#0#/OFEgZG07V+aMK5Flor3*=i`_&:$gl%GU9=6#t1m-"W]X=D6.G-FVDCt'P_K2j7=tk1,T;SqfDJc@OS62+O_T?*2[@2Ut$\D7pX-_2C\g[7>#]\BG'Nl!V"AnB:bArLjL&u`>KG$BrMNh'.$>QWG[das/o12&5K,$Xq1@Hg/qtd6>]&D%L6u'ZSc[_8`-cAj#;-%(;D/:[lnhH8iK%VV#Pt&A64HQUg1n;NBpA7gtGOm\e=t*^>GV?QqVqAusIY\2@#.JH^\:(\g&J\h8;H(Bs;_u@rGA?,ZN)r*<k&5AmAj>,=h/lmK(iF.T9--rd[W$a=T`H[mod%*0/6Gjej>Sh-%NoK&CF2d$W8r>]eEhUEB+9-sJ&?8g+<hlt;E;@tYhkGfJ=#&kN0^8,DVN84T>KYl*,78u%tL@W85ON#q<VgD6ZMeGPbA&O]NO5$0V4r^nn,V>k-qkKIC8&I10Cm;P!&tSfT`TdgB*g$)C+TU\M_0j3J8V>Y^0A@GU9UWR>_BgjK,\,%[mU1rV7TX`T&s=-H*S:6e6QbRjqtS?+kMWQ=mW(^K43LHfKR6E5<MKF2Sqt>Fm<r</7[q"1VH\$3-e:'GmY^rs]8Vl.f>W]OOdY\ADVPdAJs%!B4`k#Jkohnc~>endstream
endobj
xref
0 10
0000000000 65535 f
0000000073 00000 n
0000000114 00000 n
0000000221 00000 n
0000003164 00000 n
0000003276 00000 n
0000003542 00000 n
0000003610 00000 n
0000003862 00000 n
0000003921 00000 n
trailer
<<
/ID
[<8ab819ec586be2263d69f050dece040e><8ab819ec586be2263d69f050dece040e>]
% ReportLab generated PDF document -- digest (http://www.reportlab.com)
/Info 7 0 R
/Root 6 0 R
/Size 10
>>
startxref
5956
%%EOF

View File

@ -1,85 +0,0 @@
%PDF-1.4
%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com
1 0 obj
<<
/F1 2 0 R /F2 4 0 R
>>
endobj
2 0 obj
<<
/BaseFont /Helvetica /Encoding /WinAnsiEncoding /Name /F1 /Subtype /Type1 /Type /Font
>>
endobj
3 0 obj
<<
/BitsPerComponent 8 /ColorSpace /DeviceRGB /Filter [ /ASCII85Decode /FlateDecode ] /Height 125 /Length 2752 /Subtype /Image
/Type /XObject /Width 396
>>
stream
Gb"/lCNe_d(^8U1UaN3;I$4-'fC#_Jgn@5*J.LrP(K#>I_i\eB&_CS>gWfg"!!$Q>If/m)j%"gjoDS./I0G0#q"7r<T^LS%rMapH!MD6K8X/-#e[=g"!;&Z:M>FQls(L4u!9f0[&qrpY^`m6E3bH&RW<JOgJB+GuFjPECZm&HV!$5$.U5ZZ[.0(bn9qn`S:alAm:fF*I)Gqp`aAZ69X@c>=!6A&FU5XCq.0,0<,#MCkW"]5"[#ui4G#SeKrhlGX=UdWm!+;P'6lBi,V#]F4bpCMI"tBcV:.(b7QCq+UUE^s[<b"rTJAKWq.&/r('Yq4L8X.aN<!m#8e0N1h8caI+PUI%l"TV:tU-,@g^u3:+PR!HT(`[+DnjG(j2u!BmiHfd0/EQRP,Z10*a0Vp5H,g.D$Mk,oqPFJta!&1T@kF%tq;FQ;V)a'7;-#,=U?_Z&12C4s$HT5H>D\L]$@ot?<2m;=,rHA:K-R<m$5+X?'EI(`<,/R(*O'(M2A?/L`)LKc6lg:49kl'V?p_mU)G65k&Lmt2*YEm8.oB=d:at%f9e3't?T0nr\qWZ0hOf837Sd6klMGc%\iAmEXnKrIJj2)Y.&/h&$?elpUR"+<*`b.^Wjt>B8<hX;<!r?\*#\DsW@D6Dgt!Q8,g*&"Q%D.Z;b#;rWJ:DF,>hKg:at%ZP@`7W8_9$d8jh4O+/C1)W#CqQh'coi:/Tu/];O$SceH+B4,tZeTI*N:X&(7tM]OZ(,b%c6lWr;klM_nS;+:Xa.G0F41MYfnQVuKY1aU:Z)_)$'E/'<D0;(Aj;N.\F)9kFC?jFu=;+htC44X6p=e_u5U/J4d1LsJE;3e=IYN$/Q&nNm(Q%H.1Sl&kXp_qJ:qHqf!-rJPlTMi"V`O!HWJ/&`75uFu7leO%nR86f\d`W.uM)(NQ9#2i8c)AMP;>!._m&I+NVF4QSJP*`o]#gnqAKFQ/PnKB2%k7`EEiP(53Z"fqPd3]&:at%ZdpuFAAZ1@)8sC]<*l#MrX-oS!D2Tm?e%=BD4dt]u3?Ei4'oDLWmsM<'a*J>K]f8MOXfeU0`7KCT2%MaBRu@[anlp!SH?ELD>?L]1K4GOXf6ih7b+LhBbc(C>htAjP9eP/l>Ia#HX&;J&lq!0Tjg&78ddZ#YC2Q<KBrVj["oH_^7_/HK*RkXWL(]aUOe>;i;6V_PAlRoVH<&71\!3g:Lt#B2M1XRJ2l#0[-XtO"Hg#*NR`rTg&4ri8&d>nrF[iq.B8To@bM:JZJk/D.O=3)?@tS@/qj42c72<P+-!0$i?5.'4#J3e],RTR)pPa.GGC7H,8)$$PY#7e)*5i.=b,TdF9+dW=6#i/VU>R0>O\m`TnbKnk100cpZ7=Be^u<5%-DM'apfq>>b,U[mJ-1ahc5[Nt.?OT8(`')2.&^$)!=ge1C3*3DV5+/4?pFkXTTi'J"ZX;2B[/mUPnFLEJ>&'qK-DeA);kMTTKEIKX-@FN!t9eV*,McUaoMu+!r?tWO\-Y-8Hh)hkn071cSCbHFOLV:J9.J=;'$=7&e&`0'@VY'GpH?]28B7<8hUh=Bs(@>!T"!`?W=3#jlPUp7HJhCRe6G5F<j^)KeKqLi=aM\'\GTRV_2Tice_[)Zr#[e/FE*ViOH=-nKV1]5g@sM9;4Pn^Yhk<kU:b%:l2Dd7Rd9`pA<O-4u.QGQ<'8RQVkf2k92l(eX]*R:oWTtn7q[>W3dPZB?nTJ+2.(t8r"H6atpP"Q&k`TWb-)k,qR2bQf2l??Tl:kZVN$WkOh%T2)Qj8]PD8CIp#QSgs`!l4YL/)lqY(2[srP(ZRsDp0eG2_G:IQHJ$tD8^!Y-hh\#Oa:hf]lLXfOUGt=hGjV_="$NKkIdaP2Sn+)O]cC4*nmUg!/\Z,RbKaBLL18W75^.3$2-WbUUCrTF^Qr2h[df%i:]!U):'=6e&KnoQ'dBf"Hd+[i*3I>Scs7^PViD;)%?]"?4XA\-dP'r^?gDO-+h%^rE;/'U@Mo7'7=citqE\:mFW\@ecIE=[mI@oQa.UR?OYO6P,<G<O&b'@H-<-HX:5N`G\\Kd$4RnqWKjV_3tAtGs,Nk4GAfpGWFNE0Pj!`N>Xl*>_24&YKY>(4tse<`M'N*=hKCZro:06_&=7SRa+)OVTW2^>*GVCnTeM=M(U;MBUHH?>Ej]6P8/Bhu/<YITi_QC0j_:Zi-f8`s/W7A64(&mWhZXJZanR,&X?E-,0ijS:mn_&a=+^<WKSE4s1SG'nZ&9VOZ6L#ns,N1s3aQkYRf_JNp=>D9PWIGBQO.S#B2*S+5p6"`mk[(qS3T&maZhe&`1PHAq:Y@#$t(g8/Pm^.^s:.CM$d5N`UJFFEF(!XiKCZH:O%Ke_H%BehN3%:/J9R(ZijV\drh7>+"WDmQolh@g`[*340_tSI0M28NS@=_?0:&?$(f=U+@iP*!#9<a;5l4&aF;Tu(].+7C^&u$<-A5lagMDau=/EWI18PP;`U][Phmj^3)6lcCJ"Zgb-;Fo;'OAR,h^FFq*!K9:A.YU7kN'iXUKgYs#6[(#66ii69?Rgat!K9K<.YU7kN(GZPKgYs#8J`k16ii7*^.KPG!$`_k;FhK%.'"$p"TYhXKgYrl7oQ7G-ii`BWY?'L!$Q),KgYr,Lm1LT;#l]PUJaVs!2PFL'G:QL(()OF6ihg,F-T(d!2*"iPsV2FTM._<6D=Hf%]r\;M#r2f1f5\I$393%.o#sOM#m[He7pIO8/)&gBrP!$'EC7iTh6J*!&00d.YU7k!$'"nH!#JJ~>endstream
endobj
4 0 obj
<<
/BaseFont /Helvetica-Bold /Encoding /WinAnsiEncoding /Name /F2 /Subtype /Type1 /Type /Font
>>
endobj
5 0 obj
<<
/Contents 9 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 8 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] /XObject <<
/FormXob.cce78b71853849c73b887b8941906fa4 3 0 R
>>
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
6 0 obj
<<
/PageMode /UseNone /Pages 8 0 R /Type /Catalog
>>
endobj
7 0 obj
<<
/Author () /CreationDate (D:20250717162337+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20250717162337+02'00') /Producer (xhtml2pdf <https://github.com/xhtml2pdf/xhtml2pdf/>)
/Subject () /Title () /Trapped /False
>>
endobj
8 0 obj
<<
/Count 1 /Kids [ 5 0 R ] /Type /Pages
>>
endobj
9 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 1946
>>
stream
Gb!SnD0$US&H9tYd$IL!ArsEH^O3+m\&l";?V%(:4QF7sEQK'%GtHfjqQB6Tkhrs4CkA&b!ur\jp=\9b<\"J!$t#*Dp.'f6dNqD]5_,'d(BTaldf#`,FBag.$[b=mRp.A<QC:pq.$'$Hfq93R#LY]`0EGF@mk#Lr]IlRR<hqf$!#/X7Ki;`bE`uW:Rbj/bGsf/M8b]=hE01.1.#246UII#N#mT6bl*)'F,(Z+I&5JW[mF^I_F>=m827]R^IVeAQ!NUm=;;[16CX&u@,Xb=Ukt1GpJd=8:-)bkE3O<`@N-#<'P7!LURA.K$J[pnYE(5#(%&I]UAeC#sbr5%4p"Dm"=1GsS#1j(@X\Fdm#c^gfWl<%R,t=Pjklg&;WYel5\O`6&-++rKb;mh_EX](f8qA3g3.>'\5S=c0GUGe,g?['$e!Q(-/)&Sp\bKV2D)1Iu2d4ArDJGoPd42/X2DS9t>&>7CF@1X.XVs[+qPrH[#uj8)3!IB(aj&t`<B9)Zp,MZ@JtWdCOUY!L<*?AKAh%M=I-7:o)A@3n!\!:1<io^SVR>$*E6u,;S@(!eN#tA)Od<a1NU.",L*+Kr5:;@,)?8Lh(B7#KH8@=4aYZWp6:#oT=S1doadC9f;pp`io9anso*0&JK<1XQpZ5$BOn7%5n)5G(-c_FuW&Gd9=n58&\TF>J[)6F$4;l'r=7L*]rk5j'428<e\[oBJ\/=)[$l0BA*Tl8a-41KV8<%6$@[aXCjZ>dRV(F%[l!8(`Elq)l=B;s(AT4qF4#"*]>F>8ON3Kbo0\Uq*L8ckji^Kj-B.B8FU6V']8]Bi8[2^_E)<DDs>3W+FFHXtMG[QgRCB<D[!I5d5qU=DUj)0kR!3Hiq1:oiKYj+!:f'A)(N#2)8Hj*B3gD"?H.$Lf5g]^[AY*]bpTUnr7:ZV+l3;8J^V^T7[Z"/T(]-H3*=$U`Z#k/q"n[pfP0@:PG$YXUuZ@oJFUMPHH1-m.97S'!+aN2k]k_^_KgUc&h2q_T(D-'H_<3!=*!M7p.:6eO)%a@-8FS>_*LW^A%q2ChNIen<;D9DPg6c5m[S&j'V"t97;']nVIraM7P@H+WmJZOL'E!=@L:Lui%L>rLH[5l&*G!EDpq1s3Abqf1XYP@/TEp=JnVh*q'4h40')7Hd=QLDgCAV+gf2C+JB.]l^le&HF!]RaUuF5!".UdDD3>2#eqd2^-J-tQL1J`[I*FUhcB=`J\Z#DAmVW]E;W)lo20\uj%blF;k[%?N0]p-Pk&#XRnonWi<TUEPt4%HNk()i)+=pt@-OngguZfN:FsQgLC2W)a^B%q/&RGmL1NT(^"//cblP=<M*"*AR!$b/L2\&f7!-k#'u=d&RlIR4>Z]oIAh1<c0K+4G;&0==1Mce1".o9.&WYY39%`^m5-i.?2kNBO"i-H?Y%PC)2[XLg'p/Fi$SX728/j4q'aaSeOW9WHSNR<ES#NLt$\q+/6RYTKAS9(/MY..Z/+goGNc0Z0sJV-,BmB<,n-;fNB/_b)q'FUnhD,MFjYl/dh@61*-m;EK0o\Q0mCTc)=YMQR(DqDUBoAnU_jW_7@C))_\AO/6>4Cfo=JqnG:WC1$kI"3$%&0NiDhYh29l]GC)7hQO/Bc)pja<'V[0!i(%Irb&fd<XuQk*Pm-uCb_-'hRdcb;P;=[Kh]Xk(:[tM00DBBE/eURj6XD6Tf+us7&K:/%>F!U!FNASDq>XB\4GuRDVW\%7oG%\tN\m@kX`#Vjm[Fj]J!;lb>QMhXZru80pXT0W=1YS9>XAX1G$D8MTF75%[U`T-ZUSGXr@>>]3&?>/N!EDPl56]MQH,3Z@$mI.(=#7q^p`_"j&%q1PBV\iG@S]tmqPdtm%CC<O3-t*[f?*e$#X\:NtF"3,A)rqj(cb97?HdG2Ic_'M_F%]e:Q]>[,V*/i?Ooj$A8)5Mg(Q-Q@JTWN`<eg>5nVJD?.E~>endstream
endobj
xref
0 10
0000000000 65535 f
0000000073 00000 n
0000000114 00000 n
0000000221 00000 n
0000003164 00000 n
0000003276 00000 n
0000003542 00000 n
0000003610 00000 n
0000003862 00000 n
0000003921 00000 n
trailer
<<
/ID
[<cc420a16091a37dc959374438c7d30f4><cc420a16091a37dc959374438c7d30f4>]
% ReportLab generated PDF document -- digest (http://www.reportlab.com)
/Info 7 0 R
/Root 6 0 R
/Size 10
>>
startxref
5958
%%EOF

View File

@ -1,85 +0,0 @@
%PDF-1.4
%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com
1 0 obj
<<
/F1 2 0 R /F2 4 0 R
>>
endobj
2 0 obj
<<
/BaseFont /Helvetica /Encoding /WinAnsiEncoding /Name /F1 /Subtype /Type1 /Type /Font
>>
endobj
3 0 obj
<<
/BitsPerComponent 8 /ColorSpace /DeviceRGB /Filter [ /ASCII85Decode /FlateDecode ] /Height 125 /Length 2752 /Subtype /Image
/Type /XObject /Width 396
>>
stream
Gb"/lCNe_d(^8U1UaN3;I$4-'fC#_Jgn@5*J.LrP(K#>I_i\eB&_CS>gWfg"!!$Q>If/m)j%"gjoDS./I0G0#q"7r<T^LS%rMapH!MD6K8X/-#e[=g"!;&Z:M>FQls(L4u!9f0[&qrpY^`m6E3bH&RW<JOgJB+GuFjPECZm&HV!$5$.U5ZZ[.0(bn9qn`S:alAm:fF*I)Gqp`aAZ69X@c>=!6A&FU5XCq.0,0<,#MCkW"]5"[#ui4G#SeKrhlGX=UdWm!+;P'6lBi,V#]F4bpCMI"tBcV:.(b7QCq+UUE^s[<b"rTJAKWq.&/r('Yq4L8X.aN<!m#8e0N1h8caI+PUI%l"TV:tU-,@g^u3:+PR!HT(`[+DnjG(j2u!BmiHfd0/EQRP,Z10*a0Vp5H,g.D$Mk,oqPFJta!&1T@kF%tq;FQ;V)a'7;-#,=U?_Z&12C4s$HT5H>D\L]$@ot?<2m;=,rHA:K-R<m$5+X?'EI(`<,/R(*O'(M2A?/L`)LKc6lg:49kl'V?p_mU)G65k&Lmt2*YEm8.oB=d:at%f9e3't?T0nr\qWZ0hOf837Sd6klMGc%\iAmEXnKrIJj2)Y.&/h&$?elpUR"+<*`b.^Wjt>B8<hX;<!r?\*#\DsW@D6Dgt!Q8,g*&"Q%D.Z;b#;rWJ:DF,>hKg:at%ZP@`7W8_9$d8jh4O+/C1)W#CqQh'coi:/Tu/];O$SceH+B4,tZeTI*N:X&(7tM]OZ(,b%c6lWr;klM_nS;+:Xa.G0F41MYfnQVuKY1aU:Z)_)$'E/'<D0;(Aj;N.\F)9kFC?jFu=;+htC44X6p=e_u5U/J4d1LsJE;3e=IYN$/Q&nNm(Q%H.1Sl&kXp_qJ:qHqf!-rJPlTMi"V`O!HWJ/&`75uFu7leO%nR86f\d`W.uM)(NQ9#2i8c)AMP;>!._m&I+NVF4QSJP*`o]#gnqAKFQ/PnKB2%k7`EEiP(53Z"fqPd3]&:at%ZdpuFAAZ1@)8sC]<*l#MrX-oS!D2Tm?e%=BD4dt]u3?Ei4'oDLWmsM<'a*J>K]f8MOXfeU0`7KCT2%MaBRu@[anlp!SH?ELD>?L]1K4GOXf6ih7b+LhBbc(C>htAjP9eP/l>Ia#HX&;J&lq!0Tjg&78ddZ#YC2Q<KBrVj["oH_^7_/HK*RkXWL(]aUOe>;i;6V_PAlRoVH<&71\!3g:Lt#B2M1XRJ2l#0[-XtO"Hg#*NR`rTg&4ri8&d>nrF[iq.B8To@bM:JZJk/D.O=3)?@tS@/qj42c72<P+-!0$i?5.'4#J3e],RTR)pPa.GGC7H,8)$$PY#7e)*5i.=b,TdF9+dW=6#i/VU>R0>O\m`TnbKnk100cpZ7=Be^u<5%-DM'apfq>>b,U[mJ-1ahc5[Nt.?OT8(`')2.&^$)!=ge1C3*3DV5+/4?pFkXTTi'J"ZX;2B[/mUPnFLEJ>&'qK-DeA);kMTTKEIKX-@FN!t9eV*,McUaoMu+!r?tWO\-Y-8Hh)hkn071cSCbHFOLV:J9.J=;'$=7&e&`0'@VY'GpH?]28B7<8hUh=Bs(@>!T"!`?W=3#jlPUp7HJhCRe6G5F<j^)KeKqLi=aM\'\GTRV_2Tice_[)Zr#[e/FE*ViOH=-nKV1]5g@sM9;4Pn^Yhk<kU:b%:l2Dd7Rd9`pA<O-4u.QGQ<'8RQVkf2k92l(eX]*R:oWTtn7q[>W3dPZB?nTJ+2.(t8r"H6atpP"Q&k`TWb-)k,qR2bQf2l??Tl:kZVN$WkOh%T2)Qj8]PD8CIp#QSgs`!l4YL/)lqY(2[srP(ZRsDp0eG2_G:IQHJ$tD8^!Y-hh\#Oa:hf]lLXfOUGt=hGjV_="$NKkIdaP2Sn+)O]cC4*nmUg!/\Z,RbKaBLL18W75^.3$2-WbUUCrTF^Qr2h[df%i:]!U):'=6e&KnoQ'dBf"Hd+[i*3I>Scs7^PViD;)%?]"?4XA\-dP'r^?gDO-+h%^rE;/'U@Mo7'7=citqE\:mFW\@ecIE=[mI@oQa.UR?OYO6P,<G<O&b'@H-<-HX:5N`G\\Kd$4RnqWKjV_3tAtGs,Nk4GAfpGWFNE0Pj!`N>Xl*>_24&YKY>(4tse<`M'N*=hKCZro:06_&=7SRa+)OVTW2^>*GVCnTeM=M(U;MBUHH?>Ej]6P8/Bhu/<YITi_QC0j_:Zi-f8`s/W7A64(&mWhZXJZanR,&X?E-,0ijS:mn_&a=+^<WKSE4s1SG'nZ&9VOZ6L#ns,N1s3aQkYRf_JNp=>D9PWIGBQO.S#B2*S+5p6"`mk[(qS3T&maZhe&`1PHAq:Y@#$t(g8/Pm^.^s:.CM$d5N`UJFFEF(!XiKCZH:O%Ke_H%BehN3%:/J9R(ZijV\drh7>+"WDmQolh@g`[*340_tSI0M28NS@=_?0:&?$(f=U+@iP*!#9<a;5l4&aF;Tu(].+7C^&u$<-A5lagMDau=/EWI18PP;`U][Phmj^3)6lcCJ"Zgb-;Fo;'OAR,h^FFq*!K9:A.YU7kN'iXUKgYs#6[(#66ii69?Rgat!K9K<.YU7kN(GZPKgYs#8J`k16ii7*^.KPG!$`_k;FhK%.'"$p"TYhXKgYrl7oQ7G-ii`BWY?'L!$Q),KgYr,Lm1LT;#l]PUJaVs!2PFL'G:QL(()OF6ihg,F-T(d!2*"iPsV2FTM._<6D=Hf%]r\;M#r2f1f5\I$393%.o#sOM#m[He7pIO8/)&gBrP!$'EC7iTh6J*!&00d.YU7k!$'"nH!#JJ~>endstream
endobj
4 0 obj
<<
/BaseFont /Helvetica-Bold /Encoding /WinAnsiEncoding /Name /F2 /Subtype /Type1 /Type /Font
>>
endobj
5 0 obj
<<
/Contents 9 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 8 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] /XObject <<
/FormXob.2ccb9e91594014dfb4f4bd9a52694668 3 0 R
>>
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
6 0 obj
<<
/PageMode /UseNone /Pages 8 0 R /Type /Catalog
>>
endobj
7 0 obj
<<
/Author () /CreationDate (D:20250725105234+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20250725105234+02'00') /Producer (xhtml2pdf <https://github.com/xhtml2pdf/xhtml2pdf/>)
/Subject () /Title () /Trapped /False
>>
endobj
8 0 obj
<<
/Count 1 /Kids [ 5 0 R ] /Type /Pages
>>
endobj
9 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 1946
>>
stream
Gb!SngMRrh&:N/3n>3&r5W%qr4P$dl"K`?l9$mkGL+KH4"dW]bP.:Je%ei;0V:@20/$_tgZ<'[/kKM0'i=+<P&br'an,<Td?b5IbPTn7HpD-VW"mZ)I::dRJeiA+k5+<G6Kb=_1685a9K5<58;28b-YU5kqM8$H,@HquLCm7?D&Y]uW.&_)W23puf8UmU]W/]Z,mT7ndlN!HQ!7%WRBMPcI`,(#+pLL_6JcX$q1ZaF$,!e<73'*U(7t46N0^JIOCgsBNJl"23]b.a5AmftK.4^W<kktVqCp8e,l.0of'e0LS%R;E(3jg_1!Oi,OXW)4KG.7gS)Jpf:>J&SN4h4l:Mcl&*Rp[qH6/J!QkX\O@Z;`&<VJ@na/;QnQ0!EE[<LE=+BguLJ$b_MX*%Z`h3in](/)]C&0Tf:b5YT%c'`DaL5@7(t1et/d?SUKuL[hjqYb,/N+g\eKM9\R8Ylrd:9N>]4G"ber"Hc;G7]-0bj9\,WU1rO2"h"c82[?M2)3;,ER5^CGCmhLS0NDLpQt3b,W87!-dh/9r0NiFRW@DdCqF*YQHi40SN2t3+qgq,d+f#]YfSe2!Y$`[S"1dsbA2-I3T6oIYJ'gW%L'@sQk/i-HRU$@<rV:Cf7^L&Jooo266+:"R^sP&rqTWtdY,":&J%Fi,4='[bGVU31`e,O4Sf'MSNcTbpQu%g2KB2kaRE`O^f9^-BY:i[(0<[SmLA0;P`C$#B,L#1'1_4@j["/p([**Rt>H&#VlKMSi%!'d5'TsE%\hn6q?j"@?D%"d`'Gb9g9!r\h-%Rn?9<kd%qDFHer6Qq9[Bs-/V-3m8&r^pgBia>s%!9qTFg6H*ce!cbeq<KVRJ!Jq#KPR'pJJ/L>H)h!8j^LnWEcVI.PRI?s7+W,=`.0629/+p13"+,KtAP!a$BSc*Bp/Mj5JcXnt!)]#/l+,XNZ]P.pVV[9GHDL-KBAi4C=g7ad19hKI&'W=\dWMK-2.<%Rp_oilK4U6$.t4dV[fV;OFPZ_D\GA.kG43d83lnkt[L8/Ip#frcIl5bD1uho]6L0^A.?jU`7MN(INglM.u;?df>X/8<i5)R/UQ^P!J"_rdem;.A;)6bGVWkgq`H4Kc3bVJDH8<L-C20?h;KjnLK"_^>(b=bAAC#IZH,15lr8V]]H&R>+&ce]1pb6)3d$/AD(@u:)5!USt$6**i[QRSX)u!8]7B+=euHu/^VAnXNBF:1+NhFoM@.oFFR#2r%q;%'22VmbLJ=Yo>?V@f(MEUAqaXdMYKg9[a@pmO9k[Dgutt$/Dh<+:js_Ak8PpBrj%`O*S'DERR:bD)%0m&f$ch8`Wa/-$O^LDUb-"]XBJlM-#mXXA.dq*"hdN'SuHaG6*HG8f?13!K88rA)QVrM>+P6(\muFimLl_R"CtXH<74m_KZ<[RWHUjgX.`B96/5@'R1mlH/ZMs2_Sa/8B5(3gSU+@6)[Wp3O%>I)MBsH-JF6t)><M`XW%>O=d3hI5^qS-F<<O\f:rcF2@V91eC00s\&HYnE<D7.eG#>b>(Wg>M9,d0kWGM%c.tX%Nd#rW,\>GI.is!1c`&iUP2I'M#=a!1Zfo=MBo_#1$@b<b"@694E*E2R=VN0>JGC)7hg'#[-$#%F3VKN=Pp_=uTRIud-MNOR2/BMg@-9ZmT8RF8f14f[>4/?KW.@EWqErUk]PJAaXGq#:i>?L>qLu9R818cG`TW:!?s/.PrQC$<!d0!e?.h^@Fc@#>o^7i'JO!X#i-uW.rJne*.\@bt7X8+!Cls-[J63]TbWAmgQV*bPfE@dbRe/I<Dg7n[<oHClaUIOY9'ja<[O!iu(0R_PUH4QGJ[XE@lN0<]N]gKkhU*2%pX$`/P(L=_"JsPk?qgYf`^$UgV$,C-CM!-'Q=R!R]@c.W>#_t,KR`1W_:FM6s3N`,7OC69%^4P5@SRh3!=GFFd?E&Ss[Jg8`O8i#~>endstream
endobj
xref
0 10
0000000000 65535 f
0000000073 00000 n
0000000114 00000 n
0000000221 00000 n
0000003164 00000 n
0000003276 00000 n
0000003542 00000 n
0000003610 00000 n
0000003862 00000 n
0000003921 00000 n
trailer
<<
/ID
[<ffe6dd6dfa5508a2e7641c6565bd9352><ffe6dd6dfa5508a2e7641c6565bd9352>]
% ReportLab generated PDF document -- digest (http://www.reportlab.com)
/Info 7 0 R
/Root 6 0 R
/Size 10
>>
startxref
5958
%%EOF

View File

@ -1,85 +0,0 @@
%PDF-1.4
%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com
1 0 obj
<<
/F1 2 0 R /F2 4 0 R
>>
endobj
2 0 obj
<<
/BaseFont /Helvetica /Encoding /WinAnsiEncoding /Name /F1 /Subtype /Type1 /Type /Font
>>
endobj
3 0 obj
<<
/BitsPerComponent 8 /ColorSpace /DeviceRGB /Filter [ /ASCII85Decode /FlateDecode ] /Height 125 /Length 2752 /Subtype /Image
/Type /XObject /Width 396
>>
stream
Gb"/lCNe_d(^8U1UaN3;I$4-'fC#_Jgn@5*J.LrP(K#>I_i\eB&_CS>gWfg"!!$Q>If/m)j%"gjoDS./I0G0#q"7r<T^LS%rMapH!MD6K8X/-#e[=g"!;&Z:M>FQls(L4u!9f0[&qrpY^`m6E3bH&RW<JOgJB+GuFjPECZm&HV!$5$.U5ZZ[.0(bn9qn`S:alAm:fF*I)Gqp`aAZ69X@c>=!6A&FU5XCq.0,0<,#MCkW"]5"[#ui4G#SeKrhlGX=UdWm!+;P'6lBi,V#]F4bpCMI"tBcV:.(b7QCq+UUE^s[<b"rTJAKWq.&/r('Yq4L8X.aN<!m#8e0N1h8caI+PUI%l"TV:tU-,@g^u3:+PR!HT(`[+DnjG(j2u!BmiHfd0/EQRP,Z10*a0Vp5H,g.D$Mk,oqPFJta!&1T@kF%tq;FQ;V)a'7;-#,=U?_Z&12C4s$HT5H>D\L]$@ot?<2m;=,rHA:K-R<m$5+X?'EI(`<,/R(*O'(M2A?/L`)LKc6lg:49kl'V?p_mU)G65k&Lmt2*YEm8.oB=d:at%f9e3't?T0nr\qWZ0hOf837Sd6klMGc%\iAmEXnKrIJj2)Y.&/h&$?elpUR"+<*`b.^Wjt>B8<hX;<!r?\*#\DsW@D6Dgt!Q8,g*&"Q%D.Z;b#;rWJ:DF,>hKg:at%ZP@`7W8_9$d8jh4O+/C1)W#CqQh'coi:/Tu/];O$SceH+B4,tZeTI*N:X&(7tM]OZ(,b%c6lWr;klM_nS;+:Xa.G0F41MYfnQVuKY1aU:Z)_)$'E/'<D0;(Aj;N.\F)9kFC?jFu=;+htC44X6p=e_u5U/J4d1LsJE;3e=IYN$/Q&nNm(Q%H.1Sl&kXp_qJ:qHqf!-rJPlTMi"V`O!HWJ/&`75uFu7leO%nR86f\d`W.uM)(NQ9#2i8c)AMP;>!._m&I+NVF4QSJP*`o]#gnqAKFQ/PnKB2%k7`EEiP(53Z"fqPd3]&:at%ZdpuFAAZ1@)8sC]<*l#MrX-oS!D2Tm?e%=BD4dt]u3?Ei4'oDLWmsM<'a*J>K]f8MOXfeU0`7KCT2%MaBRu@[anlp!SH?ELD>?L]1K4GOXf6ih7b+LhBbc(C>htAjP9eP/l>Ia#HX&;J&lq!0Tjg&78ddZ#YC2Q<KBrVj["oH_^7_/HK*RkXWL(]aUOe>;i;6V_PAlRoVH<&71\!3g:Lt#B2M1XRJ2l#0[-XtO"Hg#*NR`rTg&4ri8&d>nrF[iq.B8To@bM:JZJk/D.O=3)?@tS@/qj42c72<P+-!0$i?5.'4#J3e],RTR)pPa.GGC7H,8)$$PY#7e)*5i.=b,TdF9+dW=6#i/VU>R0>O\m`TnbKnk100cpZ7=Be^u<5%-DM'apfq>>b,U[mJ-1ahc5[Nt.?OT8(`')2.&^$)!=ge1C3*3DV5+/4?pFkXTTi'J"ZX;2B[/mUPnFLEJ>&'qK-DeA);kMTTKEIKX-@FN!t9eV*,McUaoMu+!r?tWO\-Y-8Hh)hkn071cSCbHFOLV:J9.J=;'$=7&e&`0'@VY'GpH?]28B7<8hUh=Bs(@>!T"!`?W=3#jlPUp7HJhCRe6G5F<j^)KeKqLi=aM\'\GTRV_2Tice_[)Zr#[e/FE*ViOH=-nKV1]5g@sM9;4Pn^Yhk<kU:b%:l2Dd7Rd9`pA<O-4u.QGQ<'8RQVkf2k92l(eX]*R:oWTtn7q[>W3dPZB?nTJ+2.(t8r"H6atpP"Q&k`TWb-)k,qR2bQf2l??Tl:kZVN$WkOh%T2)Qj8]PD8CIp#QSgs`!l4YL/)lqY(2[srP(ZRsDp0eG2_G:IQHJ$tD8^!Y-hh\#Oa:hf]lLXfOUGt=hGjV_="$NKkIdaP2Sn+)O]cC4*nmUg!/\Z,RbKaBLL18W75^.3$2-WbUUCrTF^Qr2h[df%i:]!U):'=6e&KnoQ'dBf"Hd+[i*3I>Scs7^PViD;)%?]"?4XA\-dP'r^?gDO-+h%^rE;/'U@Mo7'7=citqE\:mFW\@ecIE=[mI@oQa.UR?OYO6P,<G<O&b'@H-<-HX:5N`G\\Kd$4RnqWKjV_3tAtGs,Nk4GAfpGWFNE0Pj!`N>Xl*>_24&YKY>(4tse<`M'N*=hKCZro:06_&=7SRa+)OVTW2^>*GVCnTeM=M(U;MBUHH?>Ej]6P8/Bhu/<YITi_QC0j_:Zi-f8`s/W7A64(&mWhZXJZanR,&X?E-,0ijS:mn_&a=+^<WKSE4s1SG'nZ&9VOZ6L#ns,N1s3aQkYRf_JNp=>D9PWIGBQO.S#B2*S+5p6"`mk[(qS3T&maZhe&`1PHAq:Y@#$t(g8/Pm^.^s:.CM$d5N`UJFFEF(!XiKCZH:O%Ke_H%BehN3%:/J9R(ZijV\drh7>+"WDmQolh@g`[*340_tSI0M28NS@=_?0:&?$(f=U+@iP*!#9<a;5l4&aF;Tu(].+7C^&u$<-A5lagMDau=/EWI18PP;`U][Phmj^3)6lcCJ"Zgb-;Fo;'OAR,h^FFq*!K9:A.YU7kN'iXUKgYs#6[(#66ii69?Rgat!K9K<.YU7kN(GZPKgYs#8J`k16ii7*^.KPG!$`_k;FhK%.'"$p"TYhXKgYrl7oQ7G-ii`BWY?'L!$Q),KgYr,Lm1LT;#l]PUJaVs!2PFL'G:QL(()OF6ihg,F-T(d!2*"iPsV2FTM._<6D=Hf%]r\;M#r2f1f5\I$393%.o#sOM#m[He7pIO8/)&gBrP!$'EC7iTh6J*!&00d.YU7k!$'"nH!#JJ~>endstream
endobj
4 0 obj
<<
/BaseFont /Helvetica-Bold /Encoding /WinAnsiEncoding /Name /F2 /Subtype /Type1 /Type /Font
>>
endobj
5 0 obj
<<
/Contents 9 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 8 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] /XObject <<
/FormXob.60c02443bbdd629cd79711ed552f7585 3 0 R
>>
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
6 0 obj
<<
/PageMode /UseNone /Pages 8 0 R /Type /Catalog
>>
endobj
7 0 obj
<<
/Author () /CreationDate (D:20250725151520+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20250725151520+02'00') /Producer (xhtml2pdf <https://github.com/xhtml2pdf/xhtml2pdf/>)
/Subject () /Title () /Trapped /False
>>
endobj
8 0 obj
<<
/Count 1 /Kids [ 5 0 R ] /Type /Pages
>>
endobj
9 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 1937
>>
stream
Gb!SngN)%,&:N/3i2'?u1P11sQ$KGaD*2[pMqmQLB0<K<Urlf&X\4iNlan9.&<nT+Z5$NkYpGS:(416!E3TDe$,[jVI.p-ar6cl]B:No`h+r\s.S9AYEnY@n[4_!eQbC45+goh<1.EE"!bI!r:-(Lc64FSJ'`$=sJ[sBDW7?cI7tbr@Xf0)c2,lT</GY]_->i=.FMEq*>6j(A!H;0O_[&_kA9JUpI&>>#2)[i(0loX2154Gea3iRN3r3W4:GqGoOAalk%gErHrkLpVo6?oBHnrhoE\]o`)lsZO\ac1mR0lEp"4Tnr8ZYT_i1n*Ca>Gq%4$n["[5P@I7aYh;pZ-X;,750gYCcl0TY.\3d1&BaMGgi!_,On)<&1"PbccndeJ(F21b5O?R9fm)":H&MLQun9,ecAT3smSHMCEq9TKhc8kDO%J`ebGt><jgT++Kgiqsb]$9V81/3ZG2q$>C_`<N4Ng0hF;LLsi;3A?)g?SrfIWSchf.A?,j>3H/!DGa^e?]W']5#\7HJ;^GEZ'J)s)m>gY*Zq+\Yc:W&uFnVcb0+uaflb>Dm>\247(CUM'O@H%"(T!7"_9i)bEoYKf@Re@%pV+ZIP/lF<$t:tt-3KrdH8SgskJPE/bSF.*O6?,%HqNu7D/=j+SdbAT9)^'uVlS\7A,JTP-_jOW4G]?G1BlsinPZ##-JRS&+MPIJB/B2Kh=ZP]]Bdr3lauc-nDS8hGRX1^"7q0Qc(d`a@kkr*j)Q06OjY!Yp%3<@N,m'8'M;Jo\dV@+BEQ9ID%"gaOqIDRS/^kp.Y_YV.0W/>j>N:Hr6WU/[A7!tV-4'='9$sfH!9=21j"oLW`WY`(Mgj;ojF<.Zi5(Ak]g=l5*"3M8=A;,;HRoVY1@BD&r`1KIsgocPhQmd,:JbY9\]eNl)pBb9qYfdLYp4uGW>H$I&AC,!O60iC:b_J8ln-*D$9Wpa`uY]cZ?Gsf`KldYUj36/1DNGOA+"lTFm>630n)i5]fGYdV[fVQC2Qn_R?KlCFW=fd;[1lFJm8.(5HKCJ,F8+oD\$>gjC4\=!,aa]1puX@V@_QJVcL;C4L=HM5"5qdpEM^0hcuG^Q<Rl's8T\r`0efCH-dI:n&+\@/!S-a>quEAXV5TI`7dpq:%.AVh*q.JQsR^$sQj/aEM-Z1-mknQmWP'.]l\VBk+\KBHUIES2Ot#WR1"&Q?F]J1e4f+8f<peTUE]kcJ`Oo.h3*^E$;3HW_SWD`[YPODC]a#FeGMkk/S6IHQgsNKV8'spe(1ed?)JS#4d&s`aQ%g^,F--r(=%D2cc%"ANM8$Wm_-\LTha&#[p]`dluF8"i0#L"Ys-,&Ha[e/hU.!>i%k(Mt5GN?DV&U<4TE0=37(Mjjo%"9DCW/ATDQZS`7SV1C5FQ7Fu8UQ59\#1fc9'EHP.Dh%AYH=X^QuD@)uc$('`h<=Hk:AIqI!;A:RXhA+O@@;Y$L;Wj0YL^#A[mUY0YI/!;2;09^Vc\U),I@gNj#u6;MMPI8gcJ$oMNoX[o-08a>QrG!kU@:FNimD]\f@]Ojg"t!*N,#2.8`IGA(7enR0DH\/S/L+jn`'7:^*5&JDPX/fY><CS_qqALdkP1rR$te?XdK'/[s-;@R:*h_J<gaD*c9j95=,HQVX$fo$S5CZ(?@D0P93'<jKFt.JPc`X6Yc>/a0UN5gqVgX8.ZAd]N!1Z/Ze[k1uP5"Zm6Z4gBL,r$Bo+BW6H#>!/A336/?PCZ`!I*`RR=SK)Ui%Ar/%Jh(in\qeCS</)=8W/g5j)].M]7d"P1#>I#iR=ed^grfp[i^s!rAiGkoBFbEg/bN$]h0MKbQ$g40s@,%:qi__h0PBV\i:LhILmqPdtm%CC<O%Fe$g])WnoX6^H`s<L2&Mlqm5](eHaJCqNbnuJ!`L$'iC-ciZ>4K?N3N1_7\EJG*I\T$\S`30DgnaTbCTII6~>endstream
endobj
xref
0 10
0000000000 65535 f
0000000073 00000 n
0000000114 00000 n
0000000221 00000 n
0000003164 00000 n
0000003276 00000 n
0000003542 00000 n
0000003610 00000 n
0000003862 00000 n
0000003921 00000 n
trailer
<<
/ID
[<9d4b7ea30b2d30f25403f154b483162e><9d4b7ea30b2d30f25403f154b483162e>]
% ReportLab generated PDF document -- digest (http://www.reportlab.com)
/Info 7 0 R
/Root 6 0 R
/Size 10
>>
startxref
5949
%%EOF

View File

@ -1,85 +0,0 @@
%PDF-1.4
%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com
1 0 obj
<<
/F1 2 0 R /F2 4 0 R
>>
endobj
2 0 obj
<<
/BaseFont /Helvetica /Encoding /WinAnsiEncoding /Name /F1 /Subtype /Type1 /Type /Font
>>
endobj
3 0 obj
<<
/BitsPerComponent 8 /ColorSpace /DeviceRGB /Filter [ /ASCII85Decode /FlateDecode ] /Height 125 /Length 2752 /Subtype /Image
/Type /XObject /Width 396
>>
stream
Gb"/lCNe_d(^8U1UaN3;I$4-'fC#_Jgn@5*J.LrP(K#>I_i\eB&_CS>gWfg"!!$Q>If/m)j%"gjoDS./I0G0#q"7r<T^LS%rMapH!MD6K8X/-#e[=g"!;&Z:M>FQls(L4u!9f0[&qrpY^`m6E3bH&RW<JOgJB+GuFjPECZm&HV!$5$.U5ZZ[.0(bn9qn`S:alAm:fF*I)Gqp`aAZ69X@c>=!6A&FU5XCq.0,0<,#MCkW"]5"[#ui4G#SeKrhlGX=UdWm!+;P'6lBi,V#]F4bpCMI"tBcV:.(b7QCq+UUE^s[<b"rTJAKWq.&/r('Yq4L8X.aN<!m#8e0N1h8caI+PUI%l"TV:tU-,@g^u3:+PR!HT(`[+DnjG(j2u!BmiHfd0/EQRP,Z10*a0Vp5H,g.D$Mk,oqPFJta!&1T@kF%tq;FQ;V)a'7;-#,=U?_Z&12C4s$HT5H>D\L]$@ot?<2m;=,rHA:K-R<m$5+X?'EI(`<,/R(*O'(M2A?/L`)LKc6lg:49kl'V?p_mU)G65k&Lmt2*YEm8.oB=d:at%f9e3't?T0nr\qWZ0hOf837Sd6klMGc%\iAmEXnKrIJj2)Y.&/h&$?elpUR"+<*`b.^Wjt>B8<hX;<!r?\*#\DsW@D6Dgt!Q8,g*&"Q%D.Z;b#;rWJ:DF,>hKg:at%ZP@`7W8_9$d8jh4O+/C1)W#CqQh'coi:/Tu/];O$SceH+B4,tZeTI*N:X&(7tM]OZ(,b%c6lWr;klM_nS;+:Xa.G0F41MYfnQVuKY1aU:Z)_)$'E/'<D0;(Aj;N.\F)9kFC?jFu=;+htC44X6p=e_u5U/J4d1LsJE;3e=IYN$/Q&nNm(Q%H.1Sl&kXp_qJ:qHqf!-rJPlTMi"V`O!HWJ/&`75uFu7leO%nR86f\d`W.uM)(NQ9#2i8c)AMP;>!._m&I+NVF4QSJP*`o]#gnqAKFQ/PnKB2%k7`EEiP(53Z"fqPd3]&:at%ZdpuFAAZ1@)8sC]<*l#MrX-oS!D2Tm?e%=BD4dt]u3?Ei4'oDLWmsM<'a*J>K]f8MOXfeU0`7KCT2%MaBRu@[anlp!SH?ELD>?L]1K4GOXf6ih7b+LhBbc(C>htAjP9eP/l>Ia#HX&;J&lq!0Tjg&78ddZ#YC2Q<KBrVj["oH_^7_/HK*RkXWL(]aUOe>;i;6V_PAlRoVH<&71\!3g:Lt#B2M1XRJ2l#0[-XtO"Hg#*NR`rTg&4ri8&d>nrF[iq.B8To@bM:JZJk/D.O=3)?@tS@/qj42c72<P+-!0$i?5.'4#J3e],RTR)pPa.GGC7H,8)$$PY#7e)*5i.=b,TdF9+dW=6#i/VU>R0>O\m`TnbKnk100cpZ7=Be^u<5%-DM'apfq>>b,U[mJ-1ahc5[Nt.?OT8(`')2.&^$)!=ge1C3*3DV5+/4?pFkXTTi'J"ZX;2B[/mUPnFLEJ>&'qK-DeA);kMTTKEIKX-@FN!t9eV*,McUaoMu+!r?tWO\-Y-8Hh)hkn071cSCbHFOLV:J9.J=;'$=7&e&`0'@VY'GpH?]28B7<8hUh=Bs(@>!T"!`?W=3#jlPUp7HJhCRe6G5F<j^)KeKqLi=aM\'\GTRV_2Tice_[)Zr#[e/FE*ViOH=-nKV1]5g@sM9;4Pn^Yhk<kU:b%:l2Dd7Rd9`pA<O-4u.QGQ<'8RQVkf2k92l(eX]*R:oWTtn7q[>W3dPZB?nTJ+2.(t8r"H6atpP"Q&k`TWb-)k,qR2bQf2l??Tl:kZVN$WkOh%T2)Qj8]PD8CIp#QSgs`!l4YL/)lqY(2[srP(ZRsDp0eG2_G:IQHJ$tD8^!Y-hh\#Oa:hf]lLXfOUGt=hGjV_="$NKkIdaP2Sn+)O]cC4*nmUg!/\Z,RbKaBLL18W75^.3$2-WbUUCrTF^Qr2h[df%i:]!U):'=6e&KnoQ'dBf"Hd+[i*3I>Scs7^PViD;)%?]"?4XA\-dP'r^?gDO-+h%^rE;/'U@Mo7'7=citqE\:mFW\@ecIE=[mI@oQa.UR?OYO6P,<G<O&b'@H-<-HX:5N`G\\Kd$4RnqWKjV_3tAtGs,Nk4GAfpGWFNE0Pj!`N>Xl*>_24&YKY>(4tse<`M'N*=hKCZro:06_&=7SRa+)OVTW2^>*GVCnTeM=M(U;MBUHH?>Ej]6P8/Bhu/<YITi_QC0j_:Zi-f8`s/W7A64(&mWhZXJZanR,&X?E-,0ijS:mn_&a=+^<WKSE4s1SG'nZ&9VOZ6L#ns,N1s3aQkYRf_JNp=>D9PWIGBQO.S#B2*S+5p6"`mk[(qS3T&maZhe&`1PHAq:Y@#$t(g8/Pm^.^s:.CM$d5N`UJFFEF(!XiKCZH:O%Ke_H%BehN3%:/J9R(ZijV\drh7>+"WDmQolh@g`[*340_tSI0M28NS@=_?0:&?$(f=U+@iP*!#9<a;5l4&aF;Tu(].+7C^&u$<-A5lagMDau=/EWI18PP;`U][Phmj^3)6lcCJ"Zgb-;Fo;'OAR,h^FFq*!K9:A.YU7kN'iXUKgYs#6[(#66ii69?Rgat!K9K<.YU7kN(GZPKgYs#8J`k16ii7*^.KPG!$`_k;FhK%.'"$p"TYhXKgYrl7oQ7G-ii`BWY?'L!$Q),KgYr,Lm1LT;#l]PUJaVs!2PFL'G:QL(()OF6ihg,F-T(d!2*"iPsV2FTM._<6D=Hf%]r\;M#r2f1f5\I$393%.o#sOM#m[He7pIO8/)&gBrP!$'EC7iTh6J*!&00d.YU7k!$'"nH!#JJ~>endstream
endobj
4 0 obj
<<
/BaseFont /Helvetica-Bold /Encoding /WinAnsiEncoding /Name /F2 /Subtype /Type1 /Type /Font
>>
endobj
5 0 obj
<<
/Contents 9 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 8 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] /XObject <<
/FormXob.fc9870a6ef35a3885b8158c487e9d5f0 3 0 R
>>
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
6 0 obj
<<
/PageMode /UseNone /Pages 8 0 R /Type /Catalog
>>
endobj
7 0 obj
<<
/Author () /CreationDate (D:20250727171952+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20250727171952+02'00') /Producer (xhtml2pdf <https://github.com/xhtml2pdf/xhtml2pdf/>)
/Subject () /Title () /Trapped /False
>>
endobj
8 0 obj
<<
/Count 1 /Kids [ 5 0 R ] /Type /Pages
>>
endobj
9 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 1989
>>
stream
Gb!Sn=`<%a&:W67fU&=)!3PuZo%*YN;m^Q2a?^mV#`M0L$EPJ8S>3j5ZTOOHM'=BQObLZV7<*N`^7"dV41d=<"Fb%TG;qnPf027+TSPAQ^I(t.Jbjkjo7#kDk6cZP2ObT.Kb=_1685a9K5<58;3.SuYU5kqM8"-u1%ht32G0_C"At%b'MLK])G=_.,X73JW/FuTr[63Fkl=s7!3W>1BMPcI`,(&,pLL:)_1:WtR<$5"O^K2AS6X8RPJ:`PnD2G09d1>0E>`b+j9J&K)%*-K4-FdjS]q/N(9]]`:7lSX2aL8i"?&!dM3fXu\.uMhh10RPa$hE,kVKKrg?h'G..kYab\BK%"G8-4o#@J#[fk539/U0h\eZO0JuAf^EE1;c_Mfj.1BJMegLUe+?l>ck@E"I6!=o]qM4=nU@M8)SkV&[hl<t:"C#VSUQ2qe/:VY,n_g%i-:@G&43Zj@"&niLf;lSC&0hJbuLfCZkB'QQlOUr3WRNtY<:fsU(-a#'=o4YBqe(KBt:;"ac;pC!@<-G%a,$lm36N)S/"P'#6QH^8l7e'kM>HX^tCfV@G*nh<-&/8\mQ8c&II@6'A>)C%\jK:>Z<Bs]7rWc4S?<d"2"bX$h-ptkU-^CBR_,0b/Eo[,b@>UjG7pk8*d6(U,;2c8n1#XnJs6*n$)UG9oq63-%GdWFV?!;GkCEGtC@X=tLdN?$6>t=L3I#h$8P=[SO`HgiA5$^1p"M/$H5'>E<*E3f1n)3lXjk50hjSRl%bFALhm/6fioIpgAGRHI@%,Jj*&T+1?)XV8d_H&,g"b6'I1Bff'(*(F*Q3O?hO+T*Ihj5@"R1pEK$VIgIT9;IEbG86C.f#OUjmhQqD-t`aq3EZ=$\_&2`&-kIecpHBhn#=S%b5bd.;UdhBCU#P(sa4P)o>+])fDM/%k7mVRta+F@k"IoGd[BSX;`IrD4/rp'B.ZiI6\P8MK%DVlJ';Q)nMGt=8pV9Q,U3T(.;YDp(U`iRLj(7!WHjm>t*4BJ[Qh.6CSXS,`H:PAHN?mE,7No+`N#X,?"uE9:WA>Rr4GFAIY3A=a+"W+k+_mZFo(=VG,uhkiV-kS$SU9fB;A[%=3ALq8[cq/_cm+%@/B=Xf"qsd%WlWb;D$QaY5#l_IrcKf`Y6j/sHLp>U\CCnY:flT&9X]5Bdt@"8qqY<VGb9i60_]l'N1.5k=jp]h8P9N0*OpT13R,JnaX29bqCrg1ZSEK@Mk_$d%u#F>/bHNFa3=F@o-!4c2*K<EO!ejoK*h!T/uA$[?'7Ee0L;9m6Fk;C`DS>Ed7S0kI[YPT=jm+jrhI0RHNA/UP*3aCRmMq-n7-Zo=q%b]5,HQKtTR*@--g$-]";F\^19Cl9/=@FY#"52!q%^jc_2AE]g@@:$$=>f_N,[#JUfjdcRg8PU=@Eb@[VP!7I?SHXY$n8T5Ej>OG-jb:*M&hNG`DtF1.BF$)%/>#8hqPMbt,K/-:;'\Ha&jU.BY,XXb;+9GPi0(FB.?_uhCT*5GhSs3(.3c<[(-@'GC_]*\oDMNhFN^FTOALK+O9qsY:5GU(USPiR`n]'Yni79`;nZ+)C7TNN\4>0@AA!j?r:d&Si9i+IQ'AL!nPO7p:;0@8]S[Kn*cAT/EVlK_&X?n9;NoSmVe1bDi7*GA(p<R+c/5"6b^R)a\Eg@ncqKpZQHWfQG6i`Nd"7PIIM1Hl&o9$jnlqMRO.^17k:E'\@):J:W>U,BQS!K.GfO6V^b#q>.@jg-GjdMsi$J-)6p5YHAH_rG(=0:dm1_\bL-?hJWQ+YZbPIOelFni9s$q4<+r&Pn=?#hm21NQ0Su\-cOMROE<1GD9d\2>n3#5>dQ&]g4mEknYqA<Q#;5<jX.^(%_VmGW$S@nGE]amgNg\l@=:ZCUG]gBg=[YCm5^(+/C??AW:(_uLUL]=Hj`Jpb4(uR/t6M(R/9^_[VOU?@BLG9K$Mbi<(:`RC8[,uj3$;a0mTQ%W>p6B/W\pJ!_-/>Hj+*O\"@f~>endstream
endobj
xref
0 10
0000000000 65535 f
0000000073 00000 n
0000000114 00000 n
0000000221 00000 n
0000003164 00000 n
0000003276 00000 n
0000003542 00000 n
0000003610 00000 n
0000003862 00000 n
0000003921 00000 n
trailer
<<
/ID
[<8d7b5cd86f3518bdbadf4f2d263c621b><8d7b5cd86f3518bdbadf4f2d263c621b>]
% ReportLab generated PDF document -- digest (http://www.reportlab.com)
/Info 7 0 R
/Root 6 0 R
/Size 10
>>
startxref
6001
%%EOF

View File

@ -1,85 +0,0 @@
%PDF-1.4
%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com
1 0 obj
<<
/F1 2 0 R /F2 4 0 R
>>
endobj
2 0 obj
<<
/BaseFont /Helvetica /Encoding /WinAnsiEncoding /Name /F1 /Subtype /Type1 /Type /Font
>>
endobj
3 0 obj
<<
/BitsPerComponent 8 /ColorSpace /DeviceRGB /Filter [ /ASCII85Decode /FlateDecode ] /Height 125 /Length 2752 /Subtype /Image
/Type /XObject /Width 396
>>
stream
Gb"/lCNe_d(^8U1UaN3;I$4-'fC#_Jgn@5*J.LrP(K#>I_i\eB&_CS>gWfg"!!$Q>If/m)j%"gjoDS./I0G0#q"7r<T^LS%rMapH!MD6K8X/-#e[=g"!;&Z:M>FQls(L4u!9f0[&qrpY^`m6E3bH&RW<JOgJB+GuFjPECZm&HV!$5$.U5ZZ[.0(bn9qn`S:alAm:fF*I)Gqp`aAZ69X@c>=!6A&FU5XCq.0,0<,#MCkW"]5"[#ui4G#SeKrhlGX=UdWm!+;P'6lBi,V#]F4bpCMI"tBcV:.(b7QCq+UUE^s[<b"rTJAKWq.&/r('Yq4L8X.aN<!m#8e0N1h8caI+PUI%l"TV:tU-,@g^u3:+PR!HT(`[+DnjG(j2u!BmiHfd0/EQRP,Z10*a0Vp5H,g.D$Mk,oqPFJta!&1T@kF%tq;FQ;V)a'7;-#,=U?_Z&12C4s$HT5H>D\L]$@ot?<2m;=,rHA:K-R<m$5+X?'EI(`<,/R(*O'(M2A?/L`)LKc6lg:49kl'V?p_mU)G65k&Lmt2*YEm8.oB=d:at%f9e3't?T0nr\qWZ0hOf837Sd6klMGc%\iAmEXnKrIJj2)Y.&/h&$?elpUR"+<*`b.^Wjt>B8<hX;<!r?\*#\DsW@D6Dgt!Q8,g*&"Q%D.Z;b#;rWJ:DF,>hKg:at%ZP@`7W8_9$d8jh4O+/C1)W#CqQh'coi:/Tu/];O$SceH+B4,tZeTI*N:X&(7tM]OZ(,b%c6lWr;klM_nS;+:Xa.G0F41MYfnQVuKY1aU:Z)_)$'E/'<D0;(Aj;N.\F)9kFC?jFu=;+htC44X6p=e_u5U/J4d1LsJE;3e=IYN$/Q&nNm(Q%H.1Sl&kXp_qJ:qHqf!-rJPlTMi"V`O!HWJ/&`75uFu7leO%nR86f\d`W.uM)(NQ9#2i8c)AMP;>!._m&I+NVF4QSJP*`o]#gnqAKFQ/PnKB2%k7`EEiP(53Z"fqPd3]&:at%ZdpuFAAZ1@)8sC]<*l#MrX-oS!D2Tm?e%=BD4dt]u3?Ei4'oDLWmsM<'a*J>K]f8MOXfeU0`7KCT2%MaBRu@[anlp!SH?ELD>?L]1K4GOXf6ih7b+LhBbc(C>htAjP9eP/l>Ia#HX&;J&lq!0Tjg&78ddZ#YC2Q<KBrVj["oH_^7_/HK*RkXWL(]aUOe>;i;6V_PAlRoVH<&71\!3g:Lt#B2M1XRJ2l#0[-XtO"Hg#*NR`rTg&4ri8&d>nrF[iq.B8To@bM:JZJk/D.O=3)?@tS@/qj42c72<P+-!0$i?5.'4#J3e],RTR)pPa.GGC7H,8)$$PY#7e)*5i.=b,TdF9+dW=6#i/VU>R0>O\m`TnbKnk100cpZ7=Be^u<5%-DM'apfq>>b,U[mJ-1ahc5[Nt.?OT8(`')2.&^$)!=ge1C3*3DV5+/4?pFkXTTi'J"ZX;2B[/mUPnFLEJ>&'qK-DeA);kMTTKEIKX-@FN!t9eV*,McUaoMu+!r?tWO\-Y-8Hh)hkn071cSCbHFOLV:J9.J=;'$=7&e&`0'@VY'GpH?]28B7<8hUh=Bs(@>!T"!`?W=3#jlPUp7HJhCRe6G5F<j^)KeKqLi=aM\'\GTRV_2Tice_[)Zr#[e/FE*ViOH=-nKV1]5g@sM9;4Pn^Yhk<kU:b%:l2Dd7Rd9`pA<O-4u.QGQ<'8RQVkf2k92l(eX]*R:oWTtn7q[>W3dPZB?nTJ+2.(t8r"H6atpP"Q&k`TWb-)k,qR2bQf2l??Tl:kZVN$WkOh%T2)Qj8]PD8CIp#QSgs`!l4YL/)lqY(2[srP(ZRsDp0eG2_G:IQHJ$tD8^!Y-hh\#Oa:hf]lLXfOUGt=hGjV_="$NKkIdaP2Sn+)O]cC4*nmUg!/\Z,RbKaBLL18W75^.3$2-WbUUCrTF^Qr2h[df%i:]!U):'=6e&KnoQ'dBf"Hd+[i*3I>Scs7^PViD;)%?]"?4XA\-dP'r^?gDO-+h%^rE;/'U@Mo7'7=citqE\:mFW\@ecIE=[mI@oQa.UR?OYO6P,<G<O&b'@H-<-HX:5N`G\\Kd$4RnqWKjV_3tAtGs,Nk4GAfpGWFNE0Pj!`N>Xl*>_24&YKY>(4tse<`M'N*=hKCZro:06_&=7SRa+)OVTW2^>*GVCnTeM=M(U;MBUHH?>Ej]6P8/Bhu/<YITi_QC0j_:Zi-f8`s/W7A64(&mWhZXJZanR,&X?E-,0ijS:mn_&a=+^<WKSE4s1SG'nZ&9VOZ6L#ns,N1s3aQkYRf_JNp=>D9PWIGBQO.S#B2*S+5p6"`mk[(qS3T&maZhe&`1PHAq:Y@#$t(g8/Pm^.^s:.CM$d5N`UJFFEF(!XiKCZH:O%Ke_H%BehN3%:/J9R(ZijV\drh7>+"WDmQolh@g`[*340_tSI0M28NS@=_?0:&?$(f=U+@iP*!#9<a;5l4&aF;Tu(].+7C^&u$<-A5lagMDau=/EWI18PP;`U][Phmj^3)6lcCJ"Zgb-;Fo;'OAR,h^FFq*!K9:A.YU7kN'iXUKgYs#6[(#66ii69?Rgat!K9K<.YU7kN(GZPKgYs#8J`k16ii7*^.KPG!$`_k;FhK%.'"$p"TYhXKgYrl7oQ7G-ii`BWY?'L!$Q),KgYr,Lm1LT;#l]PUJaVs!2PFL'G:QL(()OF6ihg,F-T(d!2*"iPsV2FTM._<6D=Hf%]r\;M#r2f1f5\I$393%.o#sOM#m[He7pIO8/)&gBrP!$'EC7iTh6J*!&00d.YU7k!$'"nH!#JJ~>endstream
endobj
4 0 obj
<<
/BaseFont /Helvetica-Bold /Encoding /WinAnsiEncoding /Name /F2 /Subtype /Type1 /Type /Font
>>
endobj
5 0 obj
<<
/Contents 9 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 8 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] /XObject <<
/FormXob.fc9870a6ef35a3885b8158c487e9d5f0 3 0 R
>>
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
6 0 obj
<<
/PageMode /UseNone /Pages 8 0 R /Type /Catalog
>>
endobj
7 0 obj
<<
/Author () /CreationDate (D:20250727172100+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20250727172100+02'00') /Producer (xhtml2pdf <https://github.com/xhtml2pdf/xhtml2pdf/>)
/Subject () /Title () /Trapped /False
>>
endobj
8 0 obj
<<
/Count 1 /Kids [ 5 0 R ] /Type /Pages
>>
endobj
9 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 1971
>>
stream
Gb!SnD/\/e&H;*)_(W^]!G;+%WZRS9>DoV#;KpcK!.el8SVu-@D5Ao_ofMGmU23u,'A"sn+L*Kgm[h%;F?EHpLqjPGs%_\^rAmD\0.<P'NGf@C=J51+kkTJmH#Nf![%,ALk!BB.$mD!,S:dn%9[SY3GH`Ea15W^T5V[Di1c@t#nJkD`@2)C;UDcd@Q/k01O(a?@T^aBdrl"rKa8oPQ_pFo]/Vr'`"7F8tXb)+["(o[f_aK*!QuVgD?-WCE5N&#&A2K-CEl2J4NKG:kQ"D5!:84`#+m<&9#^1I3Z*aA/>EoMH``'*u\^%l>:r"[/h8g(.-V%G:;S>8X#Y39[T8s\4AKo>Z6Ji$#.1Pjf'M\mb)E"@;0f%RAO^^UUNj6<5Al`?[o:QtP%Bo+RL.e`Z;JWOHas$is%u,q2$3XfNmc<S=`09P*Q(US6`UJ`c(LJf/UpEX5Xb8.k(+rc4NPlHC,77A'f@huO"VO3Q)46i[X%"?;`JWf7P8(eda`]&7.i=1d:7\F1$Lq,LPe)V>FHrrZ$/tOc#s)j;_aum`Y*\B6Mf6dA6\IpB>>RUB<"tT()_U1>lZ+i68d(.[dt%N7:_+ZJM3EmB(;"(m+RBg-O"fodp#f.*'`EU<paa$^UW(RLQfMM\N7Va3TN,,`\1F5HiUh#Nc-cc!hlY6Nag)'*'En^Hq]NIOd:7lnrlBf\10uSs>BHI^kOE#M<4*tNZus"q)#@8/gfBng:g"pTf3,E)Y)CZH=h;8;hC\]S*T/',^4TN<U(('lUMZDe30MELNF.)R/3lta2+DV=V1CZbinsuNp6Pf?QkU.V(6iQF5:(k9=%]`p<;s:eX!09s3k`2RF'W)U(.sOmLhY6ZD%)Bo^KoNc*9us(3nSU:SgE^EC::Lnm0Oj<Dg3Q#@8KO/ehjaW>H:g5`f'21]j`hZG%Fiu9SDde%fo\_/&HQ;e@2L32tVPRbM5HLC5VIF/;V<g*%884p)V?[!WFl\AFUkEd5GMSBIgr_S?]/kXG9(QN[#$/#b9p'aV7!^M=[lggMKj!XJ%X5Rk?3BAC1f_<jh_RPfZ)^h)p2YqUtb4Qd=(VfBDV`RodqVTko341g$-4NZ<InJ5V_jVHb4l*t2'\."'#tOF8f/CcmR+a8*S8*'[T)i<8o-rHZ3*/+DRt=kPHXK.gTtV.3gb"8V[qoI_420LG\ADAqc(nYY!o1gc]fBWj^&%(=o$!Kt^L`F'FC%a-J<`KZ*F3/S.sD-/iM<WQi]!T0'n#e4N&Ee0L;I<OC&dOF3NgQ3r10bou:-@=s"66nsO2g[o>,CB;iW+8GLHp'DJm60`]Zg>kRjSE=u#K\'2k]3=kSPsS:)e-g7(nLW49=D)3E8UQt)*7#<0IPF(/n@[])Br<qH#Gu]P*:6]gfr-nV"aP&DaEh8]V!/$\ZMu/F()2="H0n1><N"d)hM*/bD4HS].%m]n8\,;'T&0c*)I6#Mft.B<)IlW\E#2ZMPN+J)epUk[rE;MMb'Zg?jAA\ZhWsXl]7L/4!&g%KECM\9NXr.Hjj:#,n5%kk,)(@bD?dtlFh5dl*S^P/\4X<ZZX^V^FNkcG@(r`UkC=VMh9c,npR7j<!9jO\/N6'eWY;Le<&KX9hle&RQcJ$;\PI,\2l<$J+),H]B/JEY/<.`1Mo6XZ3\omNrV-K!N[jGPN[l9Dc>>NhoSQ<!_&;:B$k,l$cWZIc1kMK%claA*J[>jO-n6dC&Qc'H`&$;Qe]t$NR64;&bM8o4I`?o;tL20qM59N)FsO.eorrP\"Ns'+4\W%:f+K2h5noPg_!V-Y1DApH@'haEi,KJLD$KG=?quk*WGu^UB*jV.D3To7NLb??:uose&?Ep^[5jM#qZcOr-4^TP=:4t,%Q1U+Y.]66^>(r?#c1'qJGW\T?[,>nR@X]>c,i'5%B8f4l7_e+]%&NL;IQm+oE"2A([=:O<pfb'bnrkN';s'Vu@d3VPXQ82#%R`9+n$~>endstream
endobj
xref
0 10
0000000000 65535 f
0000000073 00000 n
0000000114 00000 n
0000000221 00000 n
0000003164 00000 n
0000003276 00000 n
0000003542 00000 n
0000003610 00000 n
0000003862 00000 n
0000003921 00000 n
trailer
<<
/ID
[<6ae516d251a61e33909666dcb951ad78><6ae516d251a61e33909666dcb951ad78>]
% ReportLab generated PDF document -- digest (http://www.reportlab.com)
/Info 7 0 R
/Root 6 0 R
/Size 10
>>
startxref
5983
%%EOF

View File

@ -1,2 +0,0 @@
formation_code_externe;code_session;date_debut;date_fin;nb_participant;adresse;code_postal;ville;pays;date_debut_inscription;date_fin_inscription;distanciel;presentiel;prix_session;session_status;lms_class_code;session_etape;formateur_email;titre;location_type;is_bpf;type_session
IFOD_01;tttttttt;07/07/2025;18/07/2025;10;23 Bd de Reuilly;75012;Paris;France;05/01/2024;05/07/2025;1;1;2450;1;;Planifiée;;Gestion commerciale de juillet 2025;intra;1;0
1 formation_code_externe code_session date_debut date_fin nb_participant adresse code_postal ville pays date_debut_inscription date_fin_inscription distanciel presentiel prix_session session_status lms_class_code session_etape formateur_email titre location_type is_bpf type_session
2 IFOD_01 tttttttt 07/07/2025 18/07/2025 10 23 Bd de Reuilly 75012 Paris France 05/01/2024 05/07/2025 1 1 2450 1 Planifiée Gestion commerciale de juillet 2025 intra 1 0

View File

@ -1,6 +0,0 @@
formation_code_externe;code_session;client_rattachement_email;client_rattachement_nom;facture_client_rattachement_email;facture_client_rattachement_nom;prenom;nom;employeur;telephone;email;adresse;code_postal;ville;pays;modefinancement;opco;status;prix
IFOD_01;IFOD_22_Sess_AOUT_DEV_dup;;;;;part 2;part nom2;employeur 2;10101;mysytraining+apprenant1@gmail.com;adresse01;code_postal01;ville01;pays01;modefinancement;opco;0;1500
IFOD_01;IFOD_22_Sess_AOUT_DEV_dup;mysytraining+client1@gmail.com;Client 1;mysy1000formation@gmail.com;Client FACT;part 3;part nom3_client;employeur 3;10101;mysytraining+apprenant2@gmail.com;adresse02;code_postal02;ville02;pays02;modefinancement;;0;1500
IFOD_01;IFOD_22_Sess_AOUT_DEV_dup;mysytraining+client1@gmail.com;Client 1;mysy1000formation@gmail.com;Client FACT;part 4;part nom4_client;employeur 4;10101;mysytraining+apprenant3@gmail.com;adresse03;code_postal03;ville03;pays03;modefinancement;;0;1500
IFOD_01;IFOD_22_Sess_AOUT_DEV_dup;mysytraining+client2@gmail.com;Client 2;mysy1000formation@gmail.com;Client FACT;part 5;part nom5_client;employeur 5;10101;mysy1000formation+01@gmail.com;adresse04;code_postal04;ville04;pays04;modefinancement;;0;1500
IFOD_01;IFOD_22_Sess_AOUT_DEV_dup;mysytraining+client2@gmail.com;Client 2;;;part 6;part nom6_client;employeur 6;10101;mysy1000formation+02@gmail.com;adresse05;code_postal05;ville05;pays05;modefinancement;;0;1500
1 formation_code_externe code_session client_rattachement_email client_rattachement_nom facture_client_rattachement_email facture_client_rattachement_nom prenom nom employeur telephone email adresse code_postal ville pays modefinancement opco status prix
2 IFOD_01 IFOD_22_Sess_AOUT_DEV_dup part 2 part nom2 employeur 2 10101 mysytraining+apprenant1@gmail.com adresse01 code_postal01 ville01 pays01 modefinancement opco 0 1500
3 IFOD_01 IFOD_22_Sess_AOUT_DEV_dup mysytraining+client1@gmail.com Client 1 mysy1000formation@gmail.com Client FACT part 3 part nom3_client employeur 3 10101 mysytraining+apprenant2@gmail.com adresse02 code_postal02 ville02 pays02 modefinancement 0 1500
4 IFOD_01 IFOD_22_Sess_AOUT_DEV_dup mysytraining+client1@gmail.com Client 1 mysy1000formation@gmail.com Client FACT part 4 part nom4_client employeur 4 10101 mysytraining+apprenant3@gmail.com adresse03 code_postal03 ville03 pays03 modefinancement 0 1500
5 IFOD_01 IFOD_22_Sess_AOUT_DEV_dup mysytraining+client2@gmail.com Client 2 mysy1000formation@gmail.com Client FACT part 5 part nom5_client employeur 5 10101 mysy1000formation+01@gmail.com adresse04 code_postal04 ville04 pays04 modefinancement 0 1500
6 IFOD_01 IFOD_22_Sess_AOUT_DEV_dup mysytraining+client2@gmail.com Client 2 part 6 part nom6_client employeur 6 10101 mysy1000formation+02@gmail.com adresse05 code_postal05 ville05 pays05 modefinancement 0 1500

View File

@ -1,6 +0,0 @@
formation_code_externe;code_session;client_rattachement_email;client_rattachement_nom;facture_client_rattachement_email;facture_client_rattachement_nom;prenom;nom;employeur;telephone;email;adresse;code_postal;ville;pays;modefinancement;opco;status;prix
IFOD_01;IFOD_22_Sess_AOUT_DEV_dup;;;;;part 2;part nom2;employeur 2;10101;mysytraining+apprenant1@gmail.com;adresse01;code_postal01;ville01;pays01;modefinancement;opco;0;1500
IFOD_01;IFOD_22_Sess_AOUT_DEV_dup;mysytraining+client1@gmail.com;Client 1;mysy1000formation@gmail.com;Client FACT;part 3;part nom3_client;employeur 3;10101;mysytraining+apprenant2@gmail.com;adresse02;code_postal02;ville02;pays02;modefinancement;;0;1500
IFOD_01;IFOD_22_Sess_AOUT_DEV_dup;mysytraining+client1@gmail.com;Client 1;mysy1000formation@gmail.com;Client FACT;part 4;part nom4_client;employeur 4;10101;mysytraining+apprenant3@gmail.com;adresse03;code_postal03;ville03;pays03;modefinancement;;0;1500
IFOD_01;IFOD_22_Sess_AOUT_DEV_dup;mysytraining+client2@gmail.com;Client 2;mysy1000formation@gmail.com;Client FACT;part 5;part nom5_client;employeur 5;10101;mysy1000formation+01@gmail.com;adresse04;code_postal04;ville04;pays04;modefinancement;;0;1500
IFOD_01;IFOD_22_Sess_AOUT_DEV_dup;mysytraining+client2@gmail.com;Client 2;;;part 6;part nom6_client;employeur 6;10101;mysy1000formation+02@gmail.com;adresse05;code_postal05;ville05;pays05;modefinancement;;0;1500
1 formation_code_externe code_session client_rattachement_email client_rattachement_nom facture_client_rattachement_email facture_client_rattachement_nom prenom nom employeur telephone email adresse code_postal ville pays modefinancement opco status prix
2 IFOD_01 IFOD_22_Sess_AOUT_DEV_dup part 2 part nom2 employeur 2 10101 mysytraining+apprenant1@gmail.com adresse01 code_postal01 ville01 pays01 modefinancement opco 0 1500
3 IFOD_01 IFOD_22_Sess_AOUT_DEV_dup mysytraining+client1@gmail.com Client 1 mysy1000formation@gmail.com Client FACT part 3 part nom3_client employeur 3 10101 mysytraining+apprenant2@gmail.com adresse02 code_postal02 ville02 pays02 modefinancement 0 1500
4 IFOD_01 IFOD_22_Sess_AOUT_DEV_dup mysytraining+client1@gmail.com Client 1 mysy1000formation@gmail.com Client FACT part 4 part nom4_client employeur 4 10101 mysytraining+apprenant3@gmail.com adresse03 code_postal03 ville03 pays03 modefinancement 0 1500
5 IFOD_01 IFOD_22_Sess_AOUT_DEV_dup mysytraining+client2@gmail.com Client 2 mysy1000formation@gmail.com Client FACT part 5 part nom5_client employeur 5 10101 mysy1000formation+01@gmail.com adresse04 code_postal04 ville04 pays04 modefinancement 0 1500
6 IFOD_01 IFOD_22_Sess_AOUT_DEV_dup mysytraining+client2@gmail.com Client 2 part 6 part nom6_client employeur 6 10101 mysy1000formation+02@gmail.com adresse05 code_postal05 ville05 pays05 modefinancement 0 1500

View File

@ -1,4 +0,0 @@
formation_code_externe;code_session;client_rattachement_email;client_rattachement_nom;facture_client_rattachement_email;facture_client_rattachement_nom;prenom;nom;employeur;telephone;email;adresse;code_postal;ville;pays;modefinancement;opco;status;prix
IFOD_01;test_facturatop;;;;;part 2;part nom2;employeur 2;10101;mysytraining+apprenant1@gmail.com;adresse01;code_postal01;ville01;pays01;modefinancement;opco;0;1500
IFOD_01;test_facturatop;;;;;part 3;part nom3_client;employeur 3;10101;mysytraining+apprenant2@gmail.com;adresse02;code_postal02;ville02;pays02;modefinancement;;0;1500
IFOD_01;test_facturatop;;;;;part 4;part nom4_client;employeur 4;10101;mysytraining+apprenant3@gmail.com;adresse03;code_postal03;ville03;pays03;modefinancement;;0;1500
1 formation_code_externe code_session client_rattachement_email client_rattachement_nom facture_client_rattachement_email facture_client_rattachement_nom prenom nom employeur telephone email adresse code_postal ville pays modefinancement opco status prix
2 IFOD_01 test_facturatop part 2 part nom2 employeur 2 10101 mysytraining+apprenant1@gmail.com adresse01 code_postal01 ville01 pays01 modefinancement opco 0 1500
3 IFOD_01 test_facturatop part 3 part nom3_client employeur 3 10101 mysytraining+apprenant2@gmail.com adresse02 code_postal02 ville02 pays02 modefinancement 0 1500
4 IFOD_01 test_facturatop part 4 part nom4_client employeur 4 10101 mysytraining+apprenant3@gmail.com adresse03 code_postal03 ville03 pays03 modefinancement 0 1500

View File

@ -1,4 +0,0 @@
formation_code_externe;code_session;client_rattachement_email;client_rattachement_nom;facture_client_rattachement_email;facture_client_rattachement_nom;prenom;nom;employeur;telephone;email;adresse;code_postal;ville;pays;modefinancement;opco;status;prix
IFOD_01;test_facturatop;;;;;part 2;part nom2;employeur 2;10101;mysytraining+apprenant1@gmail.com;adresse01;code_postal01;ville01;pays01;modefinancement;opco;0;1500
IFOD_01;test_facturatop;;;;;part 3;part nom3_client;employeur 3;10101;mysytraining+apprenant2@gmail.com;adresse02;code_postal02;ville02;pays02;modefinancement;;0;1500
IFOD_01;test_facturatop;;;;;part 4;part nom4_client;employeur 4;10101;mysytraining+apprenant3@gmail.com;adresse03;code_postal03;ville03;pays03;modefinancement;;0;1500
1 formation_code_externe code_session client_rattachement_email client_rattachement_nom facture_client_rattachement_email facture_client_rattachement_nom prenom nom employeur telephone email adresse code_postal ville pays modefinancement opco status prix
2 IFOD_01 test_facturatop part 2 part nom2 employeur 2 10101 mysytraining+apprenant1@gmail.com adresse01 code_postal01 ville01 pays01 modefinancement opco 0 1500
3 IFOD_01 test_facturatop part 3 part nom3_client employeur 3 10101 mysytraining+apprenant2@gmail.com adresse02 code_postal02 ville02 pays02 modefinancement 0 1500
4 IFOD_01 test_facturatop part 4 part nom4_client employeur 4 10101 mysytraining+apprenant3@gmail.com adresse03 code_postal03 ville03 pays03 modefinancement 0 1500

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.1 KiB

Some files were not shown because too many files have changed in this diff Show More