06/07/2025 - 12h

Signed-off-by: Cherif <cbalde@mysy-training.com>
master_Elyos_FI
Cherif 2025-07-06 12:27:14 +02:00
parent e05e0ae097
commit 814a8403dd
52 changed files with 11326 additions and 337 deletions

View File

@ -4,15 +4,58 @@
<option name="autoReloadType" value="SELECTIVE" />
</component>
<component name="ChangeListManager">
<list default="true" id="c6d0259a-16e1-410d-91a1-830590ee2a08" name="Changes" comment="ssss">
<change afterPath="$PROJECT_DIR$/groupe_client_mgt.py" afterDir="false" />
<list default="true" id="c6d0259a-16e1-410d-91a1-830590ee2a08" name="Changes" comment="03/07/2025 - 19h30">
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
<change beforePath="$PROJECT_DIR$/Activite.py" beforeDir="false" afterPath="$PROJECT_DIR$/Activite.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/Collection_Historique.py" beforeDir="false" afterPath="$PROJECT_DIR$/Collection_Historique.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/Dashbord_queries/factures_tbd_qries.py" beforeDir="false" afterPath="$PROJECT_DIR$/Dashbord_queries/factures_tbd_qries.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/Dashbord_queries/ressources_humaines_tbd_qries.py" beforeDir="false" afterPath="$PROJECT_DIR$/Dashbord_queries/ressources_humaines_tbd_qries.py" 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$/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$/agenda.py" beforeDir="false" afterPath="$PROJECT_DIR$/agenda.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/appel_offre.py" beforeDir="false" afterPath="$PROJECT_DIR$/appel_offre.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/apprenant_mgt.py" beforeDir="false" afterPath="$PROJECT_DIR$/apprenant_mgt.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/articles_avis.py" beforeDir="false" afterPath="$PROJECT_DIR$/articles_avis.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/attached_file_mgt.py" beforeDir="false" afterPath="$PROJECT_DIR$/attached_file_mgt.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/attestation_formation.py" beforeDir="false" afterPath="$PROJECT_DIR$/attestation_formation.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/base_class_calcul_note.py" beforeDir="false" afterPath="$PROJECT_DIR$/base_class_calcul_note.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/base_document_automatic_setup.py" beforeDir="false" afterPath="$PROJECT_DIR$/base_document_automatic_setup.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/base_partner_session_step.py" beforeDir="false" afterPath="$PROJECT_DIR$/base_partner_session_step.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/base_specific_fields.py" beforeDir="false" afterPath="$PROJECT_DIR$/base_specific_fields.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/class_mgt.py" beforeDir="false" afterPath="$PROJECT_DIR$/class_mgt.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/domaine_formation_mgt.py" beforeDir="false" afterPath="$PROJECT_DIR$/domaine_formation_mgt.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/crm_opportunite.py" beforeDir="false" afterPath="$PROJECT_DIR$/crm_opportunite.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/ela_factures_mgt.py" beforeDir="false" afterPath="$PROJECT_DIR$/ela_factures_mgt.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/ela_index_bdd_classes.py" beforeDir="false" afterPath="$PROJECT_DIR$/ela_index_bdd_classes.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/ela_user_account.py" beforeDir="false" afterPath="$PROJECT_DIR$/ela_user_account.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$/groupe_inscrit_mgt.py" beforeDir="false" afterPath="$PROJECT_DIR$/groupe_inscrit_mgt.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/jury_mgt.py" beforeDir="false" afterPath="$PROJECT_DIR$/jury_mgt.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/lms_chamilo/mysy_lms.py" beforeDir="false" afterPath="$PROJECT_DIR$/lms_chamilo/mysy_lms.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/main.py" beforeDir="false" afterPath="$PROJECT_DIR$/main.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/module_editique.py" beforeDir="false" afterPath="$PROJECT_DIR$/module_editique.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/notes_apprenant_mgt.py" beforeDir="false" afterPath="$PROJECT_DIR$/notes_apprenant_mgt.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_client.py" beforeDir="false" afterPath="$PROJECT_DIR$/partner_client.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/partner_document_mgt.py" beforeDir="false" afterPath="$PROJECT_DIR$/partner_document_mgt.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$/partner_produit_service_mgt.py" beforeDir="false" afterPath="$PROJECT_DIR$/partner_produit_service_mgt.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/partners.py" beforeDir="false" afterPath="$PROJECT_DIR$/partners.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/prj_common.py" beforeDir="false" afterPath="$PROJECT_DIR$/prj_common.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/purchase_prices.py" beforeDir="false" afterPath="$PROJECT_DIR$/purchase_prices.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/ressources_humaines.py" beforeDir="false" afterPath="$PROJECT_DIR$/ressources_humaines.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/ressources_materiels.py" beforeDir="false" afterPath="$PROJECT_DIR$/ressources_materiels.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/strype_payement.py" beforeDir="false" afterPath="$PROJECT_DIR$/strype_payement.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/survey_mgt.py" beforeDir="false" afterPath="$PROJECT_DIR$/survey_mgt.py" afterDir="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$/user_access_right.py" beforeDir="false" afterPath="$PROJECT_DIR$/user_access_right.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" />
@ -456,7 +499,7 @@
<option name="project" value="LOCAL" />
<updated>1747251650255</updated>
</task>
<option name="localTasksCounter" value="486" />
<option name="localTasksCounter" value="487" />
<servers />
</component>
<component name="Vcs.Log.Tabs.Properties">
@ -498,7 +541,6 @@
</option>
</component>
<component name="VcsManagerConfiguration">
<MESSAGE value="08/05/2025 - 14h" />
<MESSAGE value="08/05/2025 - 19" />
<MESSAGE value="13/05/2025 - 17h" />
<MESSAGE value="13/05/2025 - 20h" />
@ -523,6 +565,7 @@
<MESSAGE value="qsdssdd" />
<MESSAGE value="ss" />
<MESSAGE value="ssss" />
<option name="LAST_COMMIT_MESSAGE" value="ssss" />
<MESSAGE value="03/07/2025 - 19h30" />
<option name="LAST_COMMIT_MESSAGE" value="03/07/2025 - 19h30" />
</component>
</project>

View File

@ -584,7 +584,7 @@ Recuperation de la liste des activité d'une entité en se basant sur
- token (partner_recid)
- related_collection_recid (s'il est fourni)
/!\ : apres avoir récupérer les info, on va ajouter 1 : 'retard'
Important : : apres avoir récupérer les info, on va ajouter 1 : 'retard'
calcul du retard = deadline - date_day:
>= pas en retard
< 0 : en de tard de X jours

View File

@ -38,7 +38,7 @@ from email import encoders
"""
/!\ : 15/12/2024 : A faire
Important : : 15/12/2024 : A faire
Ajouter le log vers celui qui a éffectué l'action.
Ceci pour tracer les action d'une pesonne comme la suppression d'un objet.
@ -54,10 +54,10 @@ Pour un ajout, sont pris en compte :
- attached_doc_id (si une pièce jointe est enregistrée dans la collection : download_files)
- action_date : Date à la quelle l'action a été faite. La date doit etre au format : d/%m/%Y %H:%M:%S
/!\ : Il n'y pas d'update. Pour corriger un event, il faut logguer un autre event
Important : : Il n'y pas d'update. Pour corriger un event, il faut logguer un autre event
/!\ 20/04/25 : on ajoute un champ 'technical_comment' qui permet de logger des detail d'ordre technique qui permet de
Important : 20/04/25 : on ajoute un champ 'technical_comment' qui permet de logger des detail d'ordre technique qui permet de
mieux logger les evenements critiques comme la modification des droits d'acces, les mots de passe, etc
"""

View File

@ -2344,7 +2344,7 @@ def Get_Qery_List_Facture_Previsionnelle_Data_By_Periode(diction):
for val in MYSY_GV.dbname['session_formation'].aggregate(pipe_qry):
"""
30/05/2024 - update :
/!\ : Ici on parle du prix TOTAL de la session
Important : : Ici on parle du prix TOTAL de la session
Pour recalculer le prix mensuelle, il faut prendre
on fait un ratio :
- calculer le nombre de mois

View File

@ -87,7 +87,7 @@ def Get_Humain_Ressource_With_Planning(diction):
print(" ### event_type_filter = ", event_type_filter)
"""
/!\ : si 'tab_rh_id' == 'all', cela veut dire qu'on prend touts les employés
Important : : si 'tab_rh_id' == 'all', cela veut dire qu'on prend touts les employés
si non, on va aller filtrer selon les contenus de la tab tab_rh_id
"""
tab_rh_id = []
@ -553,7 +553,7 @@ def Get_Humain_Ressource_With_Planning_And_Cost(diction):
"""
/!\ : si 'tab_rh_id' == 'all', cela veut dire qu'on prend touts les employés
Important : : si 'tab_rh_id' == 'all', cela veut dire qu'on prend touts les employés
si non, on va aller filtrer selon les contenus de la tab tab_rh_id
"""
tab_rh_id = []
@ -989,7 +989,7 @@ def Format_employee_contrat_agenda_events(tab_diction):
"""
# Calcul du cout total d'une tache
/!\ Le prix du contrat prend toujours le pas sur le prix rentré à la main.
Important : Le prix du contrat prend toujours le pas sur le prix rentré à la main.
C'est a dire que si un pour quelque raison que ce soit, sur la même période un employé
a un groupe de prix d'achat et une prix saisie à la main, alors les totaux seront calculés en se basant
sur le prix qui est dans le contrat

View File

@ -11,7 +11,7 @@ alors il est stocké dans la collection "e_document_signe" avec les champs :
0 - a signer
1 - signé
/!\ IMPORTANT :
Important : IMPORTANT :
- A la creation d'un document, on lui ajoute une cle secrete avec 5 chiffre
- On ajoute une adresse email qui doit signer le mail
@ -26,7 +26,7 @@ Pour afficher le doc, l'utilisateur doit fournir :
- l'email de la personne
- secret_key : la clé de X caractère
/!\ : Nous effectuons une signature electronique securisée de niveau 2 :
Important : : Nous effectuons une signature electronique securisée de niveau 2 :
https://www.francenum.gouv.fr/guides-et-conseils/pilotage-de-lentreprise/dematerialisation-des-documents/la-signature#:~:text=L'objectif%20majeur%20de%20la,rapporter%20la%20preuve%20du%20consentement.
En pratique, comment fonctionne la signature électronique avancée (niveau 2) ?
Pour signer numériquement un contrat de location ou même un achat immobilier et que cela ait une valeur légale, il faut passer par un tiers de confiance. Ces entreprises habilitées à effectuer des opérations de sécurité juridique d'authentification, de transmission et de stockage sont nombreuses. Si elles proposent chacune leur solution, plus ou moins élaborées ou faciles dutilisation, leur fonctionnement est relativement similaire : la procédure ressemble un peu à un achat en ligne, avec une authentification par code secret via SMS. Le processus est le suivant.
@ -802,7 +802,7 @@ def Create_E_Signature_For_E_Document(file_img=None, Folder=None, diction=None):
Apresent que le message est signé, on va mettre à jour le doc
"""
"""
/!\ : 14/09/2024 :
Important : : 14/09/2024 :
On recupere d'abord l'_id du document car comme on autorise plusieurs email,
une LIKE provoque un trou de securité et n'est pas bien adaptée
"""

View File

@ -46,6 +46,8 @@ import attached_file_mgt as attached_file_mgt
from zipfile import ZipFile
import partner_client as partner_client
import E_Sign_Document as E_Sign_Document
import survey_mgt
"""
Enregistrement d'un stagiaire
@ -55,11 +57,11 @@ Voici les valeurs possibles du statut d'un stagiaire
# 2 ==> Encours d'inscription. Ce statut est surtout utilisé quand on fait de inscription depuis le backoffice par un gestionnaire de formation.
# -1 ==> Inscription annulée
/!\ : Cette foncton est utilisé aussi bien en mode non-connecté qu'en mode connecté
Important : : Cette foncton est utilisé aussi bien en mode non-connecté qu'en mode connecté
il ne faut donc controler le token que s'il est fourni avec une valeur donnée
Si il n'est pas fourni, on prend le 'partner_owner_recid' de la formation
/!\ 2 : le 'partner_owner_recid' doit etre celui de la session de formation, EN AUCUN CAS CELUI DE LA PERSONNE CONNECTEE
Important : 2 : le 'partner_owner_recid' doit etre celui de la session de formation, EN AUCUN CAS CELUI DE LA PERSONNE CONNECTEE
"""
def AddStagiairetoClass(diction):
@ -141,7 +143,7 @@ def AddStagiairetoClass(diction):
"""
/!\ : 01/08/2024
Important : : 01/08/2024
Si 'my_partner' est NONE, on va recuperer les données coorespondant au compte admin du partnenaire .
On ajoute aussi le token au dictionnaire
"""
@ -318,36 +320,34 @@ def AddStagiairetoClass(diction):
telephone = str(diction['telephone']).strip()
mydata['telephone'] = telephone
if ("client_rattachement_id" in diction.keys()):
if diction['client_rattachement_id']:
mydata['client_rattachement_id'] = diction['client_rattachement_id']
if ("client_rattachement_id" in diction.keys() and diction['client_rattachement_id']):
mydata['client_rattachement_id'] = diction['client_rattachement_id']
## Verifier l'existance du client de rattachement
local_client_retval_count = MYSY_GV.dbname['partner_client'].count_documents( {'_id': ObjectId(diction['client_rattachement_id']),
'valide': '1','locked': '0', 'partner_recid': str(my_session_data['partner_owner_recid'])})
## Verifier l'existance du client de rattachement
local_client_retval_count = MYSY_GV.dbname['partner_client'].count_documents( {'_id': ObjectId(diction['client_rattachement_id']),
'valide': '1','locked': '0', 'partner_recid': str(my_session_data['partner_owner_recid'])})
if( local_client_retval_count != 1 ):
mycommon.myprint(
str(inspect.stack()[0][3]) + " - Le client de rattachement est invalide : local_client_retval_count = "+ str(local_client_retval_count))
return False, " Le client de rattachement est invalide "
if( local_client_retval_count != 1 ):
mycommon.myprint(
str(inspect.stack()[0][3]) + " - Le client de rattachement est invalide : local_client_retval_count = "+ str(local_client_retval_count))
return False, " Le client de rattachement est invalide "
else:
mydata['client_rattachement_id'] = ""
if ("facture_client_rattachement_id" in diction.keys()):
if diction['facture_client_rattachement_id']:
mydata['facture_client_rattachement_id'] = diction['facture_client_rattachement_id']
if ("facture_client_rattachement_id" in diction.keys() and diction['facture_client_rattachement_id']):
mydata['facture_client_rattachement_id'] = diction['facture_client_rattachement_id']
## Verifier l'existance du client de rattachement
local_client_retval_count = MYSY_GV.dbname['partner_client'].count_documents( {'_id': ObjectId(diction['facture_client_rattachement_id']),
'valide': '1','locked': '0', 'partner_recid': str(my_session_data['partner_owner_recid'])})
## Verifier l'existance du client de rattachement
local_client_retval_count = MYSY_GV.dbname['partner_client'].count_documents( {'_id': ObjectId(diction['facture_client_rattachement_id']),
'valide': '1','locked': '0', 'partner_recid': str(my_session_data['partner_owner_recid'])})
if( local_client_retval_count != 1 ):
mycommon.myprint(
str(inspect.stack()[0][3]) + " - L'entité à facturer est invalide : local_client_retval_count = "+ str(local_client_retval_count))
return False, " L'entité à facturer est invalide "
if( local_client_retval_count != 1 ):
mycommon.myprint(
str(inspect.stack()[0][3]) + " - L'entité à facturer est invalide : local_client_retval_count = "+ str(local_client_retval_count))
return False, " L'entité à facturer est invalide "
else:
mydata['facture_client_rattachement_id'] = ""
@ -370,21 +370,20 @@ def AddStagiairetoClass(diction):
if ("financeur_rattachement_id" in diction.keys()):
if diction['financeur_rattachement_id']:
mydata['financeur_rattachement_id'] = diction['financeur_rattachement_id']
if ("financeur_rattachement_id" in diction.keys() and diction['financeur_rattachement_id']):
mydata['financeur_rattachement_id'] = diction['financeur_rattachement_id']
## Verifier l'existance du client de rattachement
local_client_retval_count = MYSY_GV.dbname['partner_client'].count_documents(
{'_id': ObjectId(diction['financeur_rattachement_id']),
'valide': '1', 'locked': '0', 'partner_recid': str(my_session_data['partner_owner_recid'])})
## Verifier l'existance du client de rattachement
local_client_retval_count = MYSY_GV.dbname['partner_client'].count_documents(
{'_id': ObjectId(diction['financeur_rattachement_id']),
'valide': '1', 'locked': '0', 'partner_recid': str(my_session_data['partner_owner_recid'])})
if (local_client_retval_count != 1):
mycommon.myprint(
str(inspect.stack()[0][
3]) + " - Le client de rattachement est invalide : local_client_retval_count = " + str(
local_client_retval_count))
return False, " Le client de rattachement est invalide "
if (local_client_retval_count != 1):
mycommon.myprint(
str(inspect.stack()[0][
3]) + " - Le client de rattachement est invalide : local_client_retval_count = " + str(
local_client_retval_count))
return False, " Le financeur est invalide "
else:
mydata['financeur_rattachement_id'] = ""
@ -519,7 +518,7 @@ def AddStagiairetoClass(diction):
mydata[str(val)] = diction[str(val)]
#print(" #### mydata = " + str(mydata))
print(" #### mydata for inscription = " + str(mydata))
coll_inscription = MYSY_GV.dbname['inscription']
@ -581,13 +580,13 @@ def AddStagiairetoClass(diction):
else:
local_diction['tab_ue_ids'] = ""
print(" ### Init_AcceptAttendeeInscription_For_Initial_Formation 11 local_diction = ",local_diction )
#print(" ### Init_AcceptAttendeeInscription_For_Initial_Formation 11 local_diction = ",local_diction )
local_inscription_liste_ue_status, local_inscription_liste_ue_retval = Init_AcceptAttendeeInscription_For_Initial_Formation(
local_diction)
print(" local_inscription_liste_ue_status, local_inscription_liste_ue_retval = ",
local_inscription_liste_ue_status, local_inscription_liste_ue_retval)
"""print(" local_inscription_liste_ue_status, local_inscription_liste_ue_retval = ",
local_inscription_liste_ue_status, local_inscription_liste_ue_retval)"""
elif ("tab_ue_ids" in diction.keys() and "formation_initiale" in my_partner.keys() and my_partner['formation_initiale'] == "1" ):
@ -662,6 +661,66 @@ def AddStagiairetoClass(diction):
Warning_message = " WARNING : Impossible d'envoyer le mail de preinscriton à "+ str(inspect.stack()[0][3]) + " - l'adresse email " + str( mydata['email']) + " pour la session " + str(mydata['session_id']) + " "
"""
05/07/2025 : Aller regarder dans la configuration des traitements automatique de la session si des opérations
doivent etre doclenchés à la preinscription
ex : les client qui souhaite envoyer le questionnaire de positionnement à la préinscription
pour rechercher les actions à declencer à la préinscrition, il faut regarder ici :
session_formation['automatic_traitement'][num_line]['action_target_date'] = 'preinscription'
(my_session_data)
"""
if( "automatic_traitement" in my_session_data and len(my_session_data['automatic_traitement']) > 0 ):
for local_automatic_traitement in my_session_data['automatic_traitement'] :
if( "action_target_date" in local_automatic_traitement.keys() and local_automatic_traitement['action_target_date'] == 'preinscription'
and 'courrier_template_type_document_ref_interne' in local_automatic_traitement.keys()
and local_automatic_traitement['actif'] == '1' and local_automatic_traitement['valide'] == '1'
and local_automatic_traitement['statut'] == '0' and local_automatic_traitement['locked'] == '0'
):
# Il y a une action a declencher
if( local_automatic_traitement["courrier_template_type_document_ref_interne"] == "QUESTION_POSITIONNEMENT" ):
# Recuperer le formulaire de positionnement par defaut
formulaire_q_pos_data = MYSY_GV.dbname['formulaire'].find_one({'partner_owner_recid':str(my_partner['recid']),
'valide':'1',
'locked':'0',
'type':'pos',
'default':'1',
})
if( formulaire_q_pos_data ):
Init_Survey_data = {}
Init_Survey_data['token'] = diction['token']
Init_Survey_data['session_id'] = str(my_session_data['_id'])
Init_Survey_data['formulaire_id'] = str(formulaire_q_pos_data['_id'])
Init_Survey_data['survey_type'] = "pos"
Init_Survey_data['tab_inscrit_ids'] = str(inserted_id)
Init_Survey_data['sending_date'] = ""
qpo_status, qpo_retval = survey_mgt.Init_Survey_Tab_For_All_Session_Inscrit(Init_Survey_data)
if( qpo_status is True):
#il faut envoyer le questionnaire
survey_data = MYSY_GV.dbname['survey'].find_one({'inscription_id':str(inserted_id),
'session_id':str(my_session_data['_id']),
'survey_type':"pos",
'statut':'0'})
if( survey_data):
Init_Survey_send_data = {}
Init_Survey_send_data['token'] = diction['token']
Init_Survey_send_data['tab_ids'] = str(survey_data['_id'])
qpo_send_status, qpo_send_retval = survey_mgt.Send_Survey_TabIds(Init_Survey_send_data)
if (qpo_send_status is False):
mycommon.myprint(
" WARNING : Impossible d'envoyer le questionnaire de positionnement pour l'inscription" +
str(inserted_id) + ", Raison " + qpo_send_retval+ " ")
else:
mycommon.myprint(
str(inspect.stack()[0][3]) + " - ret_val.inserted_id is null ")
@ -834,14 +893,14 @@ def AddStagiairetoClass(diction):
"""
Mettre à jour les infomration d'un stgiaire
/!\ : on NE mets PAS à jour la session, juste les info du stagiaire
Important : : on NE mets PAS à jour la session, juste les info du stagiaire
# status : 0 ==> Preinscription
# status : 1 ==> Inscription validée
# status : -1 ==> Inscription annulée
# status : 2 ==> Inscription encours de creation
/!\ Inscription sur le LMS :
Important : Inscription sur le LMS :
Si la session de formation possede un code de formation lms 'lms_class_code'
Alors cela veut dire que c'est une formation qui est gérée avec le LMS de MYSY.
@ -935,7 +994,7 @@ def UpdateStagiairetoClass(diction):
""""
/!\ : update du 18/08/2023 : On va autoriser le changement le session de formation.
Important : : update du 18/08/2023 : On va autoriser le changement le session de formation.
en effet il peut arriver qu'on souhaite deplacer la formation d'une personne à une autre session.
"""
if ("session_id" in diction.keys()):
@ -2119,7 +2178,7 @@ def DownloadParticipantsList(diction):
"""
/!\ : Quand il n'y a pas encore de stagaire, alors le grid : RetObject : est vide car la boucle precedent est vide
Important : : Quand il n'y a pas encore de stagaire, alors le grid : RetObject : est vide car la boucle precedent est vide
Donc on retourne juste les infos de la session
"""
@ -2380,7 +2439,7 @@ def DownloadEvaluationList(diction):
"""
/!\ : Quand il n'y a pas encore de stagaire, alors le grid : RetObject : est vide car la boucle precedent est vide
Important : : Quand il n'y a pas encore de stagaire, alors le grid : RetObject : est vide car la boucle precedent est vide
Donc on retourne juste les infos de la session
"""
@ -2734,10 +2793,10 @@ def AddStagiairetoClass_mass(file=None, Folder=None, diction=None):
code_postal = str(df['code_postal'].values[n])
if ("." in str(code_postal)):
# /!\ : l'utilisateur envoie un code poster au format entier, plutot que string.
# Important : : l'utilisateur envoie un code poster au format entier, plutot que string.
code_postal = str(code_postal).split(".")[0]
elif ("." in str(code_postal)):
# /!\ : l'utilisateur envoie un code poster au format entier, plutot que string.
# Important : : l'utilisateur envoie un code poster au format entier, plutot que string.
code_postal = str(code_postal).split(",")[0]
else:
code_postal = str(code_postal)
@ -3103,10 +3162,10 @@ def Controle_AddStagiairetoClass_mass(saved_file=None, Folder=None, diction=None
code_postal = str(df['code_postal'].values[n]).strip()
if ("." in str(code_postal)):
# /!\ : l'utilisateur envoie un code poster au format entier, plutot que string.
# Important : : l'utilisateur envoie un code poster au format entier, plutot que string.
code_postal = str(code_postal).split(".")[0]
elif ("." in str(code_postal)):
# /!\ : l'utilisateur envoie un code poster au format entier, plutot que string.
# Important : : l'utilisateur envoie un code poster au format entier, plutot que string.
code_postal = str(code_postal).split(",")[0]
else:
code_postal = str(code_postal)
@ -3223,8 +3282,8 @@ def Controle_AddStagiairetoClass_mass(saved_file=None, Folder=None, diction=None
"""
Cette fonction permet d'importer un fichier excel pour les stagiaire de plusieurs session, plusieurs formations
/!\ : Controle session : on va utiliser les colonne : formation code externe et le code de la session
/!\ : controle du client : on va utiliser le mail et le nom du client pour voir si ca concorde.
Important : : Controle session : on va utiliser les colonne : formation code externe et le code de la session
Important : : controle du client : on va utiliser le mail et le nom du client pour voir si ca concorde.
update du 21/08/23 :
Pour eviter les imports partiels du fichier, on va créer une fonction qui va faire les controles.
@ -3584,7 +3643,7 @@ def AddStagiairetoClass_mass_for_many_session(file=None, Folder=None, diction=No
mydata['client_rattachement_id'] = str(local_client_retval_data['_id'])
has_client_client = str(local_client_retval_data['_id'])
# /!\ : Par defaut, ont que le client de facturation = au client principale. comme ca
# Important : : Par defaut, ont que le client de facturation = au client principale. comme ca
# Si il y un client de facturation plus bas, on l'ecrase
mydata['facture_client_rattachement_id'] = str(local_client_retval_data['_id'])
@ -3637,7 +3696,7 @@ def AddStagiairetoClass_mass_for_many_session(file=None, Folder=None, diction=No
has_client_facture = str(local_client_retval_data['_id'])
"""
11/07/2024 - /!\ Si je n'ai pas de client facturé mais que j'ai un client (classique),
11/07/2024 - Important : Si je n'ai pas de client facturé mais que j'ai un client (classique),
alors on fait : client_facturé = client_normal
"""
if( len(str(has_client_facture).strip()) <= 1 and len(str(has_client_client).strip()) > 3 ):
@ -3645,7 +3704,7 @@ def AddStagiairetoClass_mass_for_many_session(file=None, Folder=None, diction=No
"""
11/07/2024 - /!\ Si j'ai un client facturé, mais pas un client normal, alors on fait :
11/07/2024 - Important : Si j'ai un client facturé, mais pas un client normal, alors on fait :
client_client = client_facture
"""
if (len(str(has_client_client).strip()) <= 1 and len(str(has_client_facture).strip()) > 3):
@ -5902,7 +5961,7 @@ on créer le contenu des collection :
==> Cela permet de gerer par exemple les personne qui s'inscrivent juste pour passer l'exemple final, ou juste les project
etc.
/!\ Pour determiner si une inscription concerne la formation initiale, on regarde si le compte utilisateur qui
Important : Pour determiner si une inscription concerne la formation initiale, on regarde si le compte utilisateur qui
valide l'inscription est un compte de 'formation initiale'
@ -7115,7 +7174,7 @@ def Accept_List_AttendeeInscription(diction):
"""
Cette fonction supprime un stagiaire.
/!\ : seuls les preinscrit, ou les inscription annulés (donc status : 0 ou -1)
Important : : seuls les preinscrit, ou les inscription annulés (donc status : 0 ou -1)
"""
def DeleteAttendeeInscription(diction):
try:
@ -7265,7 +7324,7 @@ def DeleteAttendeeInscription(diction):
"""
Fonction de suppression d'une liste de stagiaires en partant de l'_id, ceci si
les conditions sont reunies.
/!\ : seuls les preinscrit, ou les inscription annulés (donc status : 0 ou -1)
Important : : seuls les preinscrit, ou les inscription annulés (donc status : 0 ou -1)
"""
def Delete_List_AttendeeInscription(diction):
try:
@ -7612,7 +7671,7 @@ def Update_Stagiaire_Image(file_img=None, Folder=None, diction=None):
""" Recuperation de l'image d'un stagiaire
/!\ important : on prend le 'related_collection_recid' comme le '_id' de la collection inscription
Important : important : on prend le 'related_collection_recid' comme le '_id' de la collection inscription
"""
def getRecodedStagiaireImage_from_front(diction=None):
try:
@ -8209,11 +8268,11 @@ def Get_Statgaire_List_Partner_with_filter(diction):
"""
/!\ : 28/12/2023 - update
Important : : 28/12/2023 - update
S'il y a de la data dans la collection 'apprenant_collection' cela veut dire qu'il y a un dossier apprenant,
alors on va plutot retourner les info qui sont dans cette collection
/!\ 31/07/2024 - annulation de la recheche de l'apprenant
Important : 31/07/2024 - annulation de la recheche de l'apprenant
if ('apprenant_collection' in retVal.keys() and len( retVal['apprenant_collection']) > 0):
if ("civilite" in retVal['apprenant_collection'][0].keys()):
val['civilite'] = str(retVal['apprenant_collection'][0]['civilite']).lower()
@ -8817,7 +8876,7 @@ def Get_List_Conventions_Stagiaire(diction):
1 - On regarde le partenaire à des conventions qui sont personnalisées, si non
2 - On va sortir les conventions par defaut de MySy.
/!\ : On ne melange pas les 2. c'est l'un ou l'autre
Important : : On ne melange pas les 2. c'est l'un ou l'autre
"""
for retval in MYSY_GV.dbname['courrier_template'].find({'ref_interne':'CONVENTION_STAGIAIRE',
'valide':'1',
@ -8912,7 +8971,7 @@ def Get_List_Conventions_Stagiaire_With_Filter(diction):
1 - On regarde le partenaire à des conventions qui sont personnalisées, si non
2 - On va sortir les conventions par defaut de MySy.
/!\ : On ne melange pas les 2. c'est l'un ou l'autre
Important : : On ne melange pas les 2. c'est l'un ou l'autre
"""
@ -9010,7 +9069,7 @@ def Get_List_Convocations_Stagiaire_With_Filter(diction):
1 - On regarde le partenaire à des conventions qui sont personnalisées, si non
2 - On va sortir les conventions par defaut de MySy.
/!\ : On ne melange pas les 2. c'est l'un ou l'autre
Important : : On ne melange pas les 2. c'est l'un ou l'autre
"""
qry = {'$and': [{'ref_interne': 'CONVOCATION_STAGIAIRE',
@ -9107,7 +9166,7 @@ def Get_List_Emargement_With_Filter(diction):
1 - On regarde le partenaire à des conventions qui sont personnalisées, si non
2 - On va sortir les conventions par defaut de MySy.
/!\ : On ne melange pas les 2. c'est l'un ou l'autre
Important : : On ne melange pas les 2. c'est l'un ou l'autre
"""
qry = {'$and': [{'ref_interne': 'EMARGEMENT',
@ -9180,7 +9239,7 @@ def Get_List_Conventions_Stagiaire_Individuelles(diction):
1 - On regarde le partenaire à des conventions qui sont personnalisées, si non
2 - On va sortir les conventions par defaut de MySy.
/!\ : On ne melange pas les 2. c'est l'un ou l'autre
Important : : On ne melange pas les 2. c'est l'un ou l'autre
"""
for retval in MYSY_GV.dbname['courrier_template'].find({"$or": [
{
@ -9240,7 +9299,7 @@ adresse email de test, on accepte en non obligatoire
- email_test
- email_production
/!\ : Regle de gestion :
Important : : Regle de gestion :
1) Si le modele de courrier est 'edit_by_client', alors le mail est envoyé au contact de communication
du client rattaché au stagiaire.
@ -9333,7 +9392,7 @@ def Sent_Convention_Stagiaire_By_Email(tab_files, Folder, diction):
# Verification de la validité des adresses email_recu
"""
/!\ : Si l'email de test est repli, alors on considere que c'est un test, on ne prend pas en compte l'email de email_production.
Important : : Si l'email de test est repli, alors on considere que c'est un test, on ne prend pas en compte l'email de email_production.
Ceci pour forcer les utilisateur à ne remplir que l'email de prod s'il veulent l'envoyer en prod.
Si l'adresse email_prodution = "defaul", cela veut dire qu'on envoie la convention à :
@ -9619,7 +9678,7 @@ def Sent_Convention_Stagiaire_By_Email(tab_files, Folder, diction):
"""
Apres la creation du document electronique, on envoie la demande de validation
/!\ on envoie le mail à chaque destinataire
Important : on envoie le mail à chaque destinataire
"""
for email in tab_emails_destinataire:
@ -9908,7 +9967,7 @@ def Sent_Convention_Individuelle_Stagiaire_By_Email(tab_files, Folder, diction):
# Verification de la validité des adresses email_recu
"""
/!\ : Si l'email de test est repli, alors on considere que c'est un test, on ne prend pas en compte l'email de email_production.
Important : : Si l'email de test est repli, alors on considere que c'est un test, on ne prend pas en compte l'email de email_production.
Ceci pour forcer les utilisateur à ne remplir que l'email de prod s'il veulent l'envoyer en prod.
Si l'adresse email_prodution = "defaul", cela veut dire qu'on envoie la convention à :
@ -11275,7 +11334,7 @@ def Sent_Convention_Stagiaire_By_Email_By_Partner_client(tab_files_name_full_pat
# Verification de la validité des adresses email_recu
"""
/!\ : Si l'email de test est repli, alors on considere que c'est un test, on ne prend pas en compte l'email de email_production.
Important : : Si l'email de test est repli, alors on considere que c'est un test, on ne prend pas en compte l'email de email_production.
Ceci pour forcer les utilisateur à ne remplir que l'email de prod s'il veulent l'envoyer en prod.
Si l'adresse email_prodution = "defaul", cela veut dire qu'on envoie la convention à :
@ -11543,7 +11602,7 @@ def Sent_Convention_Stagiaire_By_Email_By_Partner_client(tab_files_name_full_pat
"""
Apres la creation du document electronique, on envoie la demande de validation
/!\ on envoie le mail à chaque destinataire
Important : on envoie le mail à chaque destinataire
"""
for email in tab_emails_destinataire :

View File

@ -214,7 +214,7 @@ def Cron_Send_Survey():
"""
CRON fonction qui fait les relances de devis
/!\ Algorithme :
Important : Algorithme :
1 - Recuperer dans la collection "base_partner_setup" les partenaires
qui ont la relance auto active : "relance_auto"
@ -514,7 +514,7 @@ def Cron_Monthly_Invoice_Inscription():
"""
30/05/2024 - update :
/!\ : Ici on parle du prix TOTAL de la session
Important : : Ici on parle du prix TOTAL de la session
Pour recalculer le prix mensuelle, il faut prendre
on fait un ratio :
- calculer le nombre de mois
@ -754,7 +754,7 @@ def Invoice_Data_From_Tab(diction):
if( price_by_session == "perstagiaire"):
montant_total_ht_session = montant_total_ht_session + (prix_session * nb_participant )
"""
/!\ A faire plus tard : 30/05/5024
Important : A faire plus tard : 30/05/5024
aller chercher le nombre de jour de formation sur le mois.
exemple le cas des formations qui finissent en milieu d'un mois
@ -764,7 +764,7 @@ def Invoice_Data_From_Tab(diction):
elif( price_by_session == "persession"):
montant_total_ht_session = montant_total_ht_session + prix_session
"""
/!\ A faire plus tard : 30/05/5024
Important : A faire plus tard : 30/05/5024
aller chercher le nombre de jour de formation sur le mois.
exemple le cas des formations qui finissent en milieu d'un mois
@ -1115,7 +1115,7 @@ Dans cette collection
Alogorithme :
/!\ Ce cron doit tourner tous les jours à 23h
Important : Ce cron doit tourner tous les jours à 23h
1 - On va aller directement dans le collection 'session_formation' recuperer toutes les session ayant : {'automatic_traitement.actif':'1',
automatic_traitement.statut != '2' (statut 2 = Done) }
@ -1293,7 +1293,7 @@ def Cron_Daily_Automatic_Qualiopi_Documents():
"""
Mettre à jour le document
/!\ 17/04/25 : Lorsqu'il s'agit d'une action d'emargement avec un targuet = 'every_session_sequence_day', alors
Important : 17/04/25 : Lorsqu'il s'agit d'une action d'emargement avec un targuet = 'every_session_sequence_day', alors
on ne desactive l'action que si la date du jous >= a la date de fin de session
"""

View File

@ -53,7 +53,7 @@ import Inscription_mgt as Inscription_mgt
"""
Cette fonction prepare et envoi les conVocation a chaque
participant à la session de formation.
/!\ : 27/02/2025 : Dans le cadre du traitement automatique,
Important : : 27/02/2025 : Dans le cadre du traitement automatique,
il ne faut pas envoyé de convocation au personnes de la meme session qui ont déjà recues
leur convocation.
Comment faire :
@ -238,7 +238,7 @@ telecharge les conventions d'entreprise et les conventions individuelles.
On créé un fichier zip qui sera téléchargé avec toutes les pièces jointes.
/!\ : 27/02/2025 : Dans le cadre du traitement automatique,
Important : : 27/02/2025 : Dans le cadre du traitement automatique,
il ne faut pas envoyé de convocation au personnes de la meme session qui ont déjà recues
leur convocation.
Comment faire :
@ -465,7 +465,7 @@ def Sent_Convocation_Stagiaire_By_Email(tab_files, Folder, diction):
# Verification de la validité des adresses email_recu
"""
/!\ : Si l'email de test est repli, alors on considere que c'est un test, on ne prend pas en compte l'email de email_production.
Important : : Si l'email de test est repli, alors on considere que c'est un test, on ne prend pas en compte l'email de email_production.
Ceci pour forcer les utilisateur à ne remplir que l'email de prod s'il veulent l'envoyer en prod.
Si l'adresse email_prodution = "defaul", cela veut dire qu'on envoie la convention à :
@ -1080,7 +1080,7 @@ pas que les inscrits, (le cas de enseignants), on va rajouter
- related_collection = collection concernée
- related_collection_id = l'_id concernée dans la collection
/!\ 27/02/2025 : On ne fait l'initialisation que ceux pour qui il n'y a aucune initialisation
Important : 27/02/2025 : On ne fait l'initialisation que ceux pour qui il n'y a aucune initialisation
"""
@ -2140,7 +2140,7 @@ def Cron_Sent_Attestation_Stagiaire_By_Email(tab_files, Folder, diction):
# Verification de la validité des adresses email_recu
"""
/!\ : Si l'email de test est repli, alors on considere que c'est un test, on ne prend pas en compte l'email de email_production.
Important : : Si l'email de test est repli, alors on considere que c'est un test, on ne prend pas en compte l'email de email_production.
Ceci pour forcer les utilisateur à ne remplir que l'email de prod s'il veulent l'envoyer en prod.
Si l'adresse email_prodution = "defaul", cela veut dire qu'on envoie la convention à :
@ -2809,7 +2809,7 @@ def Cron_Init_Emargement_By_Date_With_Template(diction):
cpt = 0
"""
/!\ Cas particulier des émargements
Important : Cas particulier des émargements
Ici, on va aller chercher les séquences du jour
"""
todays_date = str(date.today().strftime("%d/%m/%Y"))
@ -2922,7 +2922,7 @@ def Cron_Init_Emargement_By_Date_With_Template(diction):
CRON :
Cette fonction prepare et envoi les demandes d'émargement du JOUR qui n'ont pas déjà été envoyées
/!\ : On envoie uniquement les demandes d'émargement du jours
Important : : On envoie uniquement les demandes d'émargement du jours
"""
def Cron_Send_Emargement_By_Date_By_Email_for_not_sent(Folder, diction):
try:
@ -2958,7 +2958,7 @@ def Cron_Send_Emargement_By_Date_By_Email_for_not_sent(Folder, diction):
return False, " L'identifiant de la session est invalide ", "0"
"""
/!\ Cas particulier des émargements
Important : Cas particulier des émargements
Ici, on envoyer uniquement les emargement du jour
"""
todays_date = str(date.today().strftime("%d/%m/%Y"))

File diff suppressed because one or more lines are too long

View File

@ -45,7 +45,7 @@ import partner_base_setup as partner_base_setup
"""
Fonction de creation et mise à jour d'une session de formation.
/!\ : le champ 'source' definit la source de la creation de la session
Important : : le champ 'source' definit la source de la creation de la session
si le champ 'session_id' est renseigné alors c'est une mise à jour.
@ -346,10 +346,10 @@ def Add_Update_SessionFormation(diction):
if ("code_postal" in diction.keys()):
if diction['code_postal']:
if( "." in str(diction['code_postal']) ):
#/!\ : l'utilisateur envoie un code poster au format entier, plutot que string.
#Important : : l'utilisateur envoie un code poster au format entier, plutot que string.
mydata['code_postal'] = str(diction['code_postal']).split(".")[0]
elif( "." in str(diction['code_postal']) ):
#/!\ : l'utilisateur envoie un code poster au format entier, plutot que string.
#Important : : l'utilisateur envoie un code poster au format entier, plutot que string.
mydata['code_postal'] = str(diction['code_postal']).split(",")[0]
else:
mydata['code_postal'] = str(diction['code_postal'])
@ -529,7 +529,7 @@ def Add_Update_SessionFormation(diction):
1 - si le champ 'session_id' est renseingé alors c'est une mise à jour.
Dans le cas d'une mise à jour,
je verifie s'il y a des inscription avec les code session actuellement en base, si oui, alors on refuse la modication
/!\ : DU CODE SESSION, mais on accepte les autres champs car le session est deja utilisé.
Important : : DU CODE SESSION, mais on accepte les autres champs car le session est deja utilisé.
2 - Si le champ 'session_id' N'EST PAS renseingé alors c'est une creation.
On verifie que ce code session n'est pas deja utilisé pour cette formation.
@ -705,7 +705,7 @@ def Add_Update_SessionFormation(diction):
"""
Gestion de mise à jour JUSTE de l'etape, notamment utilisé dans le mode kanban
/!\ : Une session est modifiable tanque la facturation n'a pas demarré. Apres tous est bloqué
Important : : Une session est modifiable tanque la facturation n'a pas demarré. Apres tous est bloqué
"""
def Update_SessionFormation_Only_Step(diction):
@ -841,7 +841,7 @@ def Update_SessionFormation_Only_Step(diction):
"""
Fonction de recuperation d'une session de formation.
/!\ : il ne doit pas y avoir plus d'une session.
Important : : il ne doit pas y avoir plus d'une session.
si le result > 1 une session, alors erreur d'inchorence d'info.
"""
@ -1253,7 +1253,7 @@ def Get_Given_SessionFormation_From_Id(diction):
Cette fonction recupere la liste de toutes les sessions de formation actives et valides
d'une formation données ET les sessions "on demande"
/!\ : Cette fonction est utilisée en mode non connecté et en mode connecté.
Important : : Cette fonction est utilisée en mode non connecté et en mode connecté.
Donc faire attention au controle de la connexion
"""
def GetActiveSessionFormation_List(diction):
@ -3201,10 +3201,10 @@ def Add_Update_SessionFormation_mass(file=None, Folder=None, diction=None):
if (str(df['code_postal'].values[n])):
local_code_postal = str(df['code_postal'].values[n]).strip()
if ("." in str(local_code_postal)):
# /!\ : l'utilisateur envoie un code poster au format entier, plutot que string.
# Important : : l'utilisateur envoie un code poster au format entier, plutot que string.
local_code_postal = str(local_code_postal).split(".")[0]
elif ("." in str(local_code_postal)):
# /!\ : l'utilisateur envoie un code poster au format entier, plutot que string.
# Important : : l'utilisateur envoie un code poster au format entier, plutot que string.
local_code_postal = str(local_code_postal).split(",")[0]
else:
local_code_postal = str(local_code_postal)
@ -3753,10 +3753,10 @@ def Controle_Add_Update_SessionFormation_mass(saved_file=None, Folder=None, dict
local_code_postal = str(df['code_postal'].values[n]).strip()
if ("." in str(local_code_postal)):
# /!\ : l'utilisateur envoie un code poster au format entier, plutot que string.
# Important : : l'utilisateur envoie un code poster au format entier, plutot que string.
local_code_postal = str(local_code_postal).split(".")[0]
elif ("." in str(local_code_postal)):
# /!\ : l'utilisateur envoie un code poster au format entier, plutot que string.
# Important : : l'utilisateur envoie un code poster au format entier, plutot que string.
local_code_postal = str(local_code_postal).split(",")[0]
else:
local_code_postal = str(local_code_postal)
@ -4310,10 +4310,10 @@ def Add_Update_SessionFormation_mass_for_many_class(file=None, Folder=None, dict
local_code_postal = str(df['code_postal'].values[n]).strip()
if ("." in str(local_code_postal)):
# /!\ : l'utilisateur envoie un code poster au format entier, plutot que string.
# Important : : l'utilisateur envoie un code poster au format entier, plutot que string.
local_code_postal = str(local_code_postal).split(".")[0]
elif ("." in str(local_code_postal)):
# /!\ : l'utilisateur envoie un code poster au format entier, plutot que string.
# Important : : l'utilisateur envoie un code poster au format entier, plutot que string.
local_code_postal = str(local_code_postal).split(",")[0]
else:
local_code_postal = str(local_code_postal)
@ -4847,10 +4847,10 @@ def Controle_Add_Update_SessionFormation_mass_for_many_class(saved_file=None, Fo
local_code_postal = str(df['code_postal'].values[n]).strip()
if ("." in str(local_code_postal)):
# /!\ : l'utilisateur envoie un code poster au format entier, plutot que string.
# Important : : l'utilisateur envoie un code poster au format entier, plutot que string.
local_code_postal = str(local_code_postal).split(".")[0]
elif ("." in str(local_code_postal)):
# /!\ : l'utilisateur envoie un code poster au format entier, plutot que string.
# Important : : l'utilisateur envoie un code poster au format entier, plutot que string.
local_code_postal = str(local_code_postal).split(",")[0]
else:
local_code_postal = str(local_code_postal)
@ -5023,7 +5023,7 @@ def Controle_Add_Update_SessionFormation_mass_for_many_class(saved_file=None, Fo
"""
Cette fonction supprime une session de formation.
/!\ : il faut s'assurer qu'il n'y a aucune inscription avant de supprimer valide.
Important : : il faut s'assurer qu'il n'y a aucune inscription avant de supprimer valide.
Et La promotion est supprimé, alors supprimer toutes inscriptions (annulée) associés
Ensuite supprimer les affectations d'enseignants et de materiels associée
@ -5154,12 +5154,12 @@ def Delete_SessionFormation(diction):
session_id) + " a été correctement supprimée ")
return True, "La promotion a été correctement supprimée"
return True, "Le document a été correctement supprimé"
except Exception as e:
exc_type, exc_obj, exc_tb = sys.exc_info()
mycommon.myprint(str(inspect.stack()[0][3]) + " -" + str(e) + " - ERRORRRR AT Line : " + str(exc_tb.tb_lineno))
return False, "Impossible de supprimer La promotion de formation"
return False, "Impossible de supprimer le document"
"""
@ -5270,7 +5270,7 @@ def Delete_List_SessionFormation(diction):
if( cpt > 1 ):
return True, "("+str(cpt)+") sessions ont été correctement supprimées"
else:
return True, "La promotion a été correctement supprimée"
return True, "Le document a été correctement supprimé"
except Exception as e:
@ -5406,7 +5406,7 @@ par defaut lorqu'on duplique
- code_session = old_code_session+"_dup"
/!\ : Important : on prend une tab de session_id
Important : : Important : on prend une tab de session_id
"""
def Duplicate_List_Session_Formation(diction):
@ -5584,12 +5584,12 @@ def Duplicate_List_Session_Formation(diction):
if(cpt > 1 ):
return True, "("+str(cpt)+" sessions ont été correctement dupliquées "
else:
return True, "La promotion a été correctement dupliquée "
return True, "Le document a été correctement dupliqué "
except Exception as e:
exc_type, exc_obj, exc_tb = sys.exc_info()
mycommon.myprint(str(inspect.stack()[0][3]) + " -" + str(e) + " - ERRORRRR AT Line : " + str(exc_tb.tb_lineno))
return False, "Impossible de dupliquer La promotion de formation"
return False, "Impossible de dupliquer le document"
@ -5780,12 +5780,12 @@ def Duplicate_List_Session_Formation_CREATE_1000_SESSION(diction):
if(cpt > 1 ):
return True, "("+str(cpt)+" sessions ont été correctement dupliquées "
else:
return True, "La promotion a été correctement dupliquée "
return True, "Le document a été correctement dupliqué "
except Exception as e:
exc_type, exc_obj, exc_tb = sys.exc_info()
mycommon.myprint(str(inspect.stack()[0][3]) + " -" + str(e) + " - ERRORRRR AT Line : " + str(exc_tb.tb_lineno))
return False, "Impossible de dupliquer La promotion de formation"
return False, "Impossible de dupliquer le document"
"""
Cette fonction les conventions par email de formation en partant de la session.
@ -5974,7 +5974,7 @@ def Prepare_and_Send_Convention_From_Session_By_Email(tab_files, Folder, diction
"""
La meme que la précedente mais pour un groupe d'inscrit
/!\ : Les convention entreprise se font par CLIENT.
Important : : Les convention entreprise se font par CLIENT.
On utilise l'_id des inscrit pour aller chercher la liste des clients concernée.
Donc cela veut dire que mm si je n'ai pas selectionné un inscrit, si il a meme client qu'un autre inscrit qui est
@ -6673,7 +6673,7 @@ def Prepare_and_Send_Convention_From_Session_By_PDF(diction):
"""
La meme que la précedente sauf qu'on fourni une liste d'inscrit en argument
/!\ : Les convention entreprise se font par CLIENT.
Important : : Les convention entreprise se font par CLIENT.
On utilise l'_id des inscrit pour aller chercher la liste des clients concernée.
Donc cela veut dire que mm si je n'ai pas selectionné un inscrit, si il a meme client qu'un autre inscrit qui est
@ -8242,7 +8242,7 @@ def Sent_Convocation_Stagiaire_By_Email(tab_files, Folder, diction):
# Verification de la validité des adresses email_recu
"""
/!\ : Si l'email de test est repli, alors on considere que c'est un test, on ne prend pas en compte l'email de email_production.
Important : : Si l'email de test est repli, alors on considere que c'est un test, on ne prend pas en compte l'email de email_production.
Ceci pour forcer les utilisateur à ne remplir que l'email de prod s'il veulent l'envoyer en prod.
Si l'adresse email_prodution = "defaul", cela veut dire qu'on envoie la convention à :
@ -8853,7 +8853,7 @@ def Sent_Attestation_Stagiaire_By_Email(tab_files, Folder, diction):
# Verification de la validité des adresses email_recu
"""
/!\ : Si l'email de test est repli, alors on considere que c'est un test, on ne prend pas en compte l'email de email_production.
Important : : Si l'email de test est repli, alors on considere que c'est un test, on ne prend pas en compte l'email de email_production.
Ceci pour forcer les utilisateur à ne remplir que l'email de prod s'il veulent l'envoyer en prod.
Si l'adresse email_prodution = "defaul", cela veut dire qu'on envoie la convention à :
@ -9266,10 +9266,10 @@ Sur une session :
- un participant qui est en autonome (donc pas de client )
- pour le facturer il faudra obligatoirement créer une client.
/!\ : On ajoute un champ 'invoiced' à chaque ligne.
Important : : On ajoute un champ 'invoiced' à chaque ligne.
ainsi si une lignes est déjà invoiced, alors on ne la refacture pas.
/!\ : Pour les inscrit sans client_rattachement_id, voici comment on procede :
Important : : Pour les inscrit sans client_rattachement_id, voici comment on procede :
1 - on verifier s'il y a un client avec la meme adresse email, si oui on recupere l'id du client
qu'on vient mettre sur l'inscription.
@ -9278,7 +9278,7 @@ on vient mettre à jour inscription.
Infiné, apres la facturation, toutes les lignes d'inscription on bel et bien un 'client_rattachement_id'
17/05/2024 : /!\
17/05/2024 : Important :
Maintenant on facture à partir du champs "facture_client_rattachement_id" et non
"client_rattachement_id" qui lui est concerné par les convention et autre documents
administratifs
@ -9665,7 +9665,7 @@ def Prepare_and_Send_Facture_From_Session_By_Email(tab_files, Folder, diction):
mycommon.myprint(" WARNING : Impossible de logguer l'historique l'inscription_id : " + str(val['_id']))
return_message = " La promotion a été correctement facturée.\nListe des factures : "
return_message = " Le document a été correctement facturé.\nListe facture(s) : "
for tmp in tab_local_invoice_ref_interne:
return_message += "\n - "+str(tmp)
@ -10057,7 +10057,7 @@ def Prepare_and_Send_Facture_From_Session_By_Email_SAVE_ORIG(tab_files, Folder,
mycommon.myprint(" WARNING : Impossible de logguer l'historique l'inscription_id : " + str(val['_id']))
return_message = " La promotion a été correctement facturée.\nListe des factures : "
return_message = " Le document a été correctement facturé.\nListe facture(s) : "
for tmp in tab_local_invoice_ref_interne:
return_message += "\n - "+str(tmp)
@ -10525,7 +10525,7 @@ def Sent_Facture_Stagiaire_By_Email_By_Partner_client(tab_files_name_full_path,
# Verification de la validité des adresses email_recu
"""
/!\ : Si l'email de test est repli, alors on considere que c'est un test, on ne prend pas en compte l'email de email_production.
Important : : Si l'email de test est repli, alors on considere que c'est un test, on ne prend pas en compte l'email de email_production.
Ceci pour forcer les utilisateur à ne remplir que l'email de prod s'il veulent l'envoyer en prod.
Si l'adresse email_prodution = "defaul", cela veut dire qu'on envoie la convention à :
@ -11256,11 +11256,11 @@ def Invoice_Inscrption_With_Split_Session_By_Inscription_Id( tab_files, diction)
Facturation partielles d'une session.
C'est a dire le cas ou on souhaite facturer que les lignes selectionnées
/!\ :
Important : :
Cette fonction est identique à la fonction : "Prepare_and_Send_Facture_From_Session_By_Email"
a l'exception qu'elle prend en compte les inscription_id à facturer
17/05/2024 : /!\
17/05/2024 : Important :
Maintenant on facture à partir du champs "facture_client_rattachement_id" et non
"client_rattachement_id" qui lui est concerné par les convention et autre documents
administratifs
@ -11757,7 +11757,7 @@ def Prepare_and_Send_Facture_From_Session_By_Inscription_Id(tab_files, Folder, d
if (local_status is False):
mycommon.myprint(" WARNING : Impossible de logguer l'historique l'inscription_id : " + str(val['_id']))
return_message = " La promotion a été correctement facturée.\nListe des factures : "
return_message = " Le document a été correctement facturé.\nListe facture(s) : "
for tmp in tab_local_invoice_ref_interne:
return_message += "\n - " + str(tmp)
@ -11922,7 +11922,7 @@ def Prepare_and_Send_Facture_From_Session_By_Inscription_Id_SAVE_ORIG(tab_files,
})
"""
/!\ 23/07/2024 : Ajouter ce client dans la table : "liste_client_rattachement_id'.
Important : 23/07/2024 : Ajouter ce client dans la table : "liste_client_rattachement_id'.
En fait, vu que la ligne d'inscription a maintenant un client_rattachement_id et facture_client_rattachement_id
"""
liste_client_rattachement_id.append(str(inscription_no_client_valide_no_locked_data['_id']))
@ -12043,7 +12043,7 @@ def Prepare_and_Send_Facture_From_Session_By_Inscription_Id_SAVE_ORIG(tab_files,
}})
"""
/!\ 23/07/2024 : Ajouter ce client dans la table : "liste_client_rattachement_id'.
Important : 23/07/2024 : Ajouter ce client dans la table : "liste_client_rattachement_id'.
En fait, vu que la ligne d'inscription a maintenant un client_rattachement_id et facture_client_rattachement_id
"""
liste_client_rattachement_id.append(str(inscription_no_client_valide_no_locked_data['_id']))
@ -12066,7 +12066,7 @@ def Prepare_and_Send_Facture_From_Session_By_Inscription_Id_SAVE_ORIG(tab_files,
tab_local_invoice_ref_interne = []
"""
/!\ : 23/07/2024 : A présent, toutes les lignes ont un client_rattachement_id et facture_client_rattachement_id
Important : : 23/07/2024 : A présent, toutes les lignes ont un client_rattachement_id et facture_client_rattachement_id
car pour ceux qui n'en avaient pas, la creation a ete faite ci-dessus.
"""
print( " ### la liste des liste_client_rattachement_id (client à facturer) : APRES GESTION inscriptions SANS CLIENT = ",
@ -12141,7 +12141,7 @@ def Prepare_and_Send_Facture_From_Session_By_Inscription_Id_SAVE_ORIG(tab_files,
tab_local_invoice_ref_interne.append(str(local_invoice_ref_interne))
return_message = " La promotion a été correctement facturée.\nListe des factures : "
return_message = " Le document a été correctement facturé.\nListe facture(s) : "
for tmp in tab_local_invoice_ref_interne:
return_message += "\n - " + str(tmp)
@ -12390,7 +12390,7 @@ def Prepare_and_Send_SPLITED_Facture_From_Session_By_Inscription_Id(tab_files, F
if (local_status is False):
mycommon.myprint(" WARNING : Impossible de logguer l'historique l'inscription_id : " + str(val['_id']))
"""
return_message = " La promotion a été correctement facturée.\nListe des factures : "
return_message = " Le document a été correctement facturé.\nListe facture(s) : "
for tmp in tab_local_invoice_ref_interne:
return_message += "\n - " + str(tmp)
@ -12409,7 +12409,7 @@ Creation des factures pour un client avec uniquement la liste des inscriptions c
Ex : je veux facturer que 2 des 5 inscrits d'un client donné.
/!\ : Cette fonction se base sur le champ "facture_client_rattachement_id" de la collection "inscription"
Important : : Cette fonction se base sur le champ "facture_client_rattachement_id" de la collection "inscription"
"""
@ -14212,7 +14212,7 @@ Le gestionnaire de formation, peut ensuire utiliser cette fonction pour demander
les noms et emails definitifs.
/!\ : On traite toute la liste d'un client, pas de traitement partiel
Important : : On traite toute la liste d'un client, pas de traitement partiel
"""
def Prepare_request_presinscription_data_validation(diction):
@ -14938,7 +14938,7 @@ Cette fonction permet de créer une session de formation
"""
Fonction de creation et mise à jour d'une session de formation.
/!\ : le champ 'source' definit la source de la creation de la session
Important : : le champ 'source' definit la source de la creation de la session
si le champ 'session_id' est renseigné alors c'est une mise à jour.
"""
@ -15181,10 +15181,10 @@ def Add_SessionFormation_From_Quotation_Line(diction):
new_data['type_apprenant'] = "1"
"""
/!\
Important :
22/04/2024 :On a besoin du token pour utiliser la fonction standard.
On va aller recuperer le token du compte principale du partner
/!\
Important :
"""
main_account_data = MYSY_GV.dbname['partnair_account'].find_one(
{'recid': str(diction['partner_owner_recid']),
@ -15215,7 +15215,7 @@ d'envoie automatique des documents d'une session de formation.
Par exemple :
- Envoyer les convention X avant le début de La promotion de formation
/!\ : Toute mise à jour reinitialise la valeur 'statut' à 0. (sans cele
Important : : Toute mise à jour reinitialise la valeur 'statut' à 0. (sans cele
le traitement ne va s'exécuté s'il a déjà ete exécuté 1 fois
"""
def Update_SessionFormation_Doc_Automatic_Setup(diction):
@ -15273,7 +15273,7 @@ def Update_SessionFormation_Doc_Automatic_Setup(diction):
return False, " Le status (actif/inactif) est invalide "
action_target_date = diction['action_target_date']
if (action_target_date not in ['start_session', 'end_session', 'every_session_sequence_day']):
if (action_target_date not in ['start_session', 'end_session', 'every_session_sequence_day', 'preinscription', 'inscription']):
mycommon.myprint(str(
inspect.stack()[0][
3]) + " La valeur du champ 'action_target_date' est invalide ")
@ -15516,12 +15516,12 @@ def Get_Given_SessionFormation_List_Automatic_Traitement_From(diction):
new_data['delta_day'] = "0"
elif ( datetime.strptime( str(todays_date).strip(), '%d/%m/%Y') < local_session_start_date ):
# /!\ Pr calculer le my_delta, on prend tjours par rapport au début de session, toujours toujours, car c'est à ce moment que le cron devrait tourner la 1ere fois
# Important : Pr calculer le my_delta, on prend tjours par rapport au début de session, toujours toujours, car c'est à ce moment que le cron devrait tourner la 1ere fois
my_delta = local_session_start_date - datetime.strptime( str(todays_date).strip(), '%d/%m/%Y')
new_data['delta_day'] = str(my_delta.days)
elif (datetime.strptime( str(todays_date).strip(), '%d/%m/%Y') > local_session_end_date ):
# /!\ Pr calculer le my_delta, on prend tjours par rapport au début de session, toujours toujours, car c'est à ce moment que le cron devrait tourner la 1ere fois
# Important : Pr calculer le my_delta, on prend tjours par rapport au début de session, toujours toujours, car c'est à ce moment que le cron devrait tourner la 1ere fois
my_delta = local_session_start_date - datetime.strptime( str(todays_date).strip(), '%d/%m/%Y')
new_data['delta_day'] = str(my_delta.days)

View File

@ -862,7 +862,7 @@ def Create_Automatic_Sequence_ORIG(diction):
liste_jours_travaille_code_day.append(str(jour['day_name']))
"""
/!\ Suppression des sequences qui existe et reservation dans les agenda par rapport à cette session
Important : Suppression des sequences qui existe et reservation dans les agenda par rapport à cette session
"""
for local_retval in MYSY_GV.dbname['session_formation_sequence'].find({'session_id': str(diction['session_id']),
'partner_owner_recid': str(my_partner['recid']),}):
@ -1092,7 +1092,7 @@ def Create_Automatic_Sequence(diction):
liste_jours_travaille_code_day.append(str(jour['day_name']))
"""
/!\ Suppression des sequences qui existe et reservation dans les agenda par rapport à cette session
Important : Suppression des sequences qui existe et reservation dans les agenda par rapport à cette session
"""
if( "ecrase_existing" in diction.keys() and diction['ecrase_existing'] == "1"):
for local_retval in MYSY_GV.dbname['session_formation_sequence'].find({'session_id': str(diction['session_id']),
@ -3353,7 +3353,7 @@ def Create_Automatic_Sequence_From_Week_Model(diction):
date_fin_periode_planif = datetime.strptime(str(diction['planif_date_fin'])[0:10], '%d/%m/%Y')
"""
/!\ Suppression des sequences qui existe et reservation dans les agenda par rapport à cette session
Important : Suppression des sequences qui existe et reservation dans les agenda par rapport à cette session
si l'option est activée
"""
if( "ecrase_existing" in diction.keys() and diction['ecrase_existing'] == "1"):
@ -3702,7 +3702,7 @@ def Create_Automatic_Sequence_From_Month_Model(diction):
date_fin_periode_planif = datetime.strptime(str(diction['planif_date_fin'])[0:10], '%d/%m/%Y')
"""
/!\ Suppression des sequences qui existe et reservation dans les agenda par rapport à cette session
Important : Suppression des sequences qui existe et reservation dans les agenda par rapport à cette session
si l'option est activée
"""
if( "ecrase_existing" in diction.keys() and diction['ecrase_existing'] == "1"):

View File

@ -43,7 +43,7 @@ from email import encoders
"""
Cette fonction ajoute ou met à jour un eventement de l'agenda
/!\ : Important :
Important : : Important :
- Pour les eemployé et le materiel, on utilise le related_collection_recid
"""
def Add_Update_Agenda_Event(diction):
@ -188,7 +188,7 @@ def Add_Update_Agenda_Event(diction):
"""
# Ajout de l'evenement dans l'historique
/!\ ici on le fait pour l'objet concerné par l'agenda
Important : ici on le fait pour l'objet concerné par l'agenda
"""
now = str(datetime.now().strftime("%d/%m/%Y %H:%M:%S"))
history_event_dict = {}
@ -222,7 +222,7 @@ def Add_Update_Agenda_Event(diction):
"""
# Ajout de l'evenement dans l'historique
/!\ ici on le fait pour l'objet concerné par l'agenda
Important : ici on le fait pour l'objet concerné par l'agenda
"""
now = str(datetime.now().strftime("%d/%m/%Y %H:%M:%S"))
history_event_dict = {}
@ -247,7 +247,7 @@ def Add_Update_Agenda_Event(diction):
"""
Cette fonction ajoute ou met à jour un eventement de l'agenda
/!\ : Important :
Important : : Important :
- Pour les apprenant (inscription), on utilise 'related_collection_email' car la clé des apprenant est l'email
"""
def Add_Update_Agenda_Event_Stagiaire(diction):
@ -301,7 +301,7 @@ def Add_Update_Agenda_Event_Stagiaire(diction):
# Verifier que 'related_collection_email' existe et est valide dans la collection 'related_collection'
"""
/!\ : 24/12/2023 -
Important : : 24/12/2023 -
Quand on est sur une inscription, on travail avec l'adresse emai. Cela devra bientot changé
une fois que le module 'apprenant' est ok, alors on pourra tout basculer sur l'apprenant et travailler avec l'_id
"""
@ -848,7 +848,7 @@ def Delete_Agenda_Event(diction):
"""
# Ajout de l'evenement dans l'historique
/!\ ici on le fait pour l'objet concerné par l'agenda
Important : ici on le fait pour l'objet concerné par l'agenda
"""
now = str(datetime.now().strftime("%d/%m/%Y %H:%M:%S"))
history_event_dict = {}

View File

@ -414,12 +414,12 @@ Mise à jour d'un appel d'offre.
la clé pour la mise à jour est : "external_code" et "partner_recid" issue du token
/!\ Le status de l'appel d'offre est comme suit :
Important : Le status de l'appel d'offre est comme suit :
- 0 : Draft, en cours de conception
- 1 : lancé / publié
- 2 : cloturé
/!\ le scope : scope : public (tout internet), plateforme (que les personne enregistrées sur le mysy), restreint (l'utilisateur saisie une liste d'adresse email a qui l'envoyer)
Important : le scope : scope : public (tout internet), plateforme (que les personne enregistrées sur le mysy), restreint (l'utilisateur saisie une liste d'adresse email a qui l'envoyer)
- 0 : Tout public
- 1 : plateforme
- 2 : restreint (liste email) 343

View File

@ -627,7 +627,7 @@ def Delete_Given_Apprenant(diction):
ret_val_apprenant = MYSY_GV.dbname['apprenant'].delete_many(delete_qry_apprenant)
# /!\ Dans le cas ou il aurait des inscriptions annulé, on va supprimer ces lignes car l'apprenant a été supprimé
# Important : Dans le cas ou il aurait des inscriptions annulé, on va supprimer ces lignes car l'apprenant a été supprimé
qry_delete_canceled_inscription = {'apprenant_id':str(diction['apprenant_id']), 'status': '-1', 'partner_owner_recid':str(my_partner['recid'])}
ret_val_cancelled_inscription = MYSY_GV.dbname['inscription'].delete_many(qry_delete_canceled_inscription)
@ -1612,7 +1612,7 @@ def Add_Update_Apprenant_Image(file_img=None, Folder=None, diction=None):
""" Recuperation de l'image d'un apprenant
/!\ important : on prend le 'related_collection_recid' comme le '_id' de la collection de l'apprenant
Important : important : on prend le 'related_collection_recid' comme le '_id' de la collection de l'apprenant
"""
def Get_Apprenant_Recorded_Image_from_front(diction=None):
try:
@ -2306,7 +2306,7 @@ def Update_Apprenant_Tuteurs(diction):
Fonction pour imprimer la fiche d'un apprenant (mode pdf).
Cette fonction est prevu pour gérer le choix d'un modèle ou le modèle de courrier par defaut.
/!\ si courrier_template_id = "default_pdf", alors on va chercher le modèle par defaut.
Important : si courrier_template_id = "default_pdf", alors on va chercher le modèle par defaut.
"""
def Print_Apprenant_PDF(diction):
try:
@ -2549,7 +2549,7 @@ def Get_List_Fiche_Apprenant(diction):
1 - On regarde le partenaire à des conventions qui sont personnalisées, si non
2 - On va sortir les conventions par defaut de MySy.
/!\ : On ne melange pas les 2. c'est l'un ou l'autre
Important : : On ne melange pas les 2. c'est l'un ou l'autre
"""
for retval in MYSY_GV.dbname['courrier_template'].find({'ref_interne': 'FICHE_APPRENANT',
'valide': '1',

View File

@ -675,7 +675,7 @@ Cette fonction crée un articles avis, avec les element de traàabilité :
Une fois que l'avis est bien ajouté, une notification est envoyer dans la collection
'user_message' à destination de l'adresse de contact du site.
/!\ : 30/12/2024 :
Important : : 30/12/2024 :
on va reconstituer le champs : 'img_path' en faisant
img_path = MYSY_GV.BLOG_IMG_URL+img_file_name
@ -785,7 +785,7 @@ def add_articles_avis(diction):
print(" #### my_internal_url = ", my_internal_url)
"""
/!\ 30/12/2024 : Avant d'ajouter un suffixe numerique, verifier si l'url est disponible ou pas.
Important : 30/12/2024 : Avant d'ajouter un suffixe numerique, verifier si l'url est disponible ou pas.
Si elle n'est pas disponible, on ajoute un suffixe jusqu'a trouver une url disponible
"""
url_dispo = False
@ -937,9 +937,9 @@ def add_articles_avis(diction):
"""
Cette fonction met à jour un article avis
/!\ : la mise à jour du titre ne modifie pas l'url interne car elle est potentiellement deja utilisée
Important : : la mise à jour du titre ne modifie pas l'url interne car elle est potentiellement deja utilisée
/!\ : 30/12/2024 :
Important : : 30/12/2024 :
on va reconstituer le champs : 'img_path' en faisant
img_path = MYSY_GV.BLOG_IMG_URL+img_file_name

View File

@ -54,10 +54,10 @@ effectue les controle de taille et de securité,
le stock dans une emplacement et
retourne le path complet.
/!\ : les metadata sont enregistrés dans une collection.
Important : : les metadata sont enregistrés dans une collection.
metadata :
- file_business_object : ici on definit a quoi correspond le fichier (ex : diplome 1, pièce identité, etc).
/!\ : ce champ est la clé. si un utilisateur envoie 2 fois un fichier pr le meme ob, une mise à jour sera faite dans la collection, en ecrasant l'ancien.
Important : : ce champ est la clé. si un utilisateur envoie 2 fois un fichier pr le meme ob, une mise à jour sera faite dans la collection, en ecrasant l'ancien.
- file_name
- full_path
- file_extention
@ -70,7 +70,7 @@ metadata :
1 : accepted
-1 : rejected
/!\ : 24/12/2024
Important : : 24/12/2024
- type_document : le champs 'file_business_object' semble problematique, nous allons donc introduire un champs : 'type_document' qui permettra de savori si c'est un devis, une convention, etc
(ce champs n'est pas obligatoire)
@ -218,7 +218,7 @@ def Store_User_Downloaded_File(file=None, Folder=None, diction=None):
"""
Cette fonction est la copie de la première a l'exception qu'il s'agit d'une utilisation interne
/!\ : 24/12/2024
Important : : 24/12/2024
- type_document : le champs 'file_business_object' semble problematique, nous allons donc introduire un champs : 'type_document' qui permettra de savori si c'est un devis, une convention, etc
(ce champs n'est pas obligatoire)

View File

@ -486,7 +486,7 @@ def Get_List_Modele_Attestion_Formation_With_Filter(diction):
1 - On regarde le partenaire à des conventions qui sont personnalisées, si non
2 - On va sortir les conventions par defaut de MySy.
/!\ : On ne melange pas les 2. c'est l'un ou l'autre
Important : : On ne melange pas les 2. c'est l'un ou l'autre
"""
qry = {'$and': [{'ref_interne': 'ATTESTATION_FORMATION',

View File

@ -17,7 +17,7 @@ Par defaut, les regles de calcul implémentées :
Nom : calcul_mode_3
Detail : (Moyenne Art.(TD) + Moyenne Art.(Contrôle Continue) + Examen Final*1.5 ) / 3
/!\ Important :
Important : Important :
La collection : "note_evaluation" :
- Elle contient toutes les evaluations (pas les note mais les evaluation).
- Elle contient les informations : class_id, class_eu_id, type_eval_id, session_id, eval_date_heure_debut, eval_date_heure_fin

View File

@ -4,7 +4,7 @@ permet de gerer le paramettrage de l'envoi automatique des documents.
par exemple :
- les Convocations doivent etre envoyées 7 jours avant le début de la session
/!\ principe d'utilisation :
Important : principe d'utilisation :
Il y aura un paramettrage par société qui va s'appliquer à tous les documents de la societe.
Ce paramettrage sera dubliqué sur chaque instance du document.
@ -42,9 +42,9 @@ les champs :
- action_target_date : Définit la date cible. exemple (start_session = Debut de la session, end_session = fin de la session, etc)
- collection_target : Définit la collection concernéer ( exe : session_formation)
/!\ : Pour un début on va rester sur des actions autours de sessions de formation
Important : : Pour un début on va rester sur des actions autours de sessions de formation
/!\ : Pour eviter les ecart de date trop long, une traitement automatique se trouver dans un intervalle de
Important : : Pour eviter les ecart de date trop long, une traitement automatique se trouver dans un intervalle de
+/- 30 jours avant ou après la session.

View File

@ -209,7 +209,7 @@ def Delete_Partner_session_step(diction):
"""
Recuperation de la liste des etapes de session d'un partenaire.
/!\ : Important :
Important : : Important :
Si il ya au moins une étape appartenant à un partenaire, alors on considere que partner
a activé la gestion des etapes de session.
@ -255,7 +255,7 @@ def Get_List_Partner_Or_Default_session_step(diction):
return local_status, my_partner
"""
/!\ On regarde si le partnenaire a au moins une etape de session de parametter
Important : On regarde si le partnenaire a au moins une etape de session de parametter
"""
is_partner_etape_session_count = MYSY_GV.dbname["base_partner_session_step"].count_documents({'partner_owner_recid':str(my_partner['recid']), 'valide':'1', 'locked':'0'})
if( is_partner_etape_session_count > 0 ):
@ -300,7 +300,7 @@ def Get_List_Partner_Or_Default_session_step(diction):
"""
Recuperation de la liste des etapes de session d'un partenaire.
/!\ : Important :
Important : : Important :
Ici on recuperer exclivement les données du partenaire
"""
def Get_List_Partner_session_step(diction):

View File

@ -227,7 +227,7 @@ def Add_specific_field(diction):
"""
Modification d'un champ spécifique.
/!\ : on ne peut pas modifier le nom technique d'un champ deja utilisé
Important : : on ne peut pas modifier le nom technique d'un champ deja utilisé
la requete de controle est : { "mon_champs" : { $exists : true, $ne: "" } }, si existe alors PAS de modification du nom technique
"""
def Update_specific_field(diction):

View File

@ -39,7 +39,7 @@ class JSONEncoder(json.JSONEncoder):
Cette fonction ajoute une formation
elle verifie le token de l'entité qui ajoute la formation.
/!\ : Le champ 'source' permet de savoir le système qui est la source de creation de cette info.
Important : : Le champ 'source' permet de savoir le système qui est la source de creation de cette info.
Par exemple : les formations créer depuis le LMS ou les formations envoyées par une
application tiers car on est sur des API.
'''
@ -154,7 +154,7 @@ def add_class(diction):
'''
Si l'internal_url reste à vide, alors le système va créer une internal url de la formation
/!\ : Il faut aller verifier si il a une formation ayant le meme code externe si oui récupérer son internal_url.
Important : : Il faut aller verifier si il a une formation ayant le meme code externe si oui récupérer son internal_url.
Si a chaque fois on créer un nouveau "internal_url", on va perdre les url à chaque mise à jour par excel.
Oui pire, si on modifie le tritre, c'est mort.... :(
'''
@ -167,7 +167,7 @@ def add_class(diction):
else :
# On est dans le cas ou la formation N'existe PAS, donc on fait un controle par rappart au nombre dans le pack.
"""
/!\ : Pour le controle du nombre de formation acheté Versus Ajout d'une nouvelle formation
Important : : Pour le controle du nombre de formation acheté Versus Ajout d'une nouvelle formation
l'utilisateur peut mettre à jour la formation autant de fois qu'il souhaite, *
MAIS il ne peut pas ajouter une formation s'il a atteint le nombre autororisé
@ -2442,7 +2442,7 @@ def get_class(diction):
# Verification de la validité du token dans le cas des user en mode connecté
'''
/!\ Important : si le token est vide, alors c'est une recherche faite en mode non-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.
@ -2897,7 +2897,7 @@ def get_class_for_partner_catalog(diction):
# Verification de la validité du token dans le cas des user en mode connecté
'''
/!\ Important : si le token est vide, alors c'est une recherche faite en mode non-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.
@ -3451,7 +3451,7 @@ def get_partner_class(diction):
# Verification de la validité du token dans le cas des user en mode connecté
'''
/!\ Important : le token ne doit jamais etre vide car cette fonction a pour objectif
Important : Important : le token ne doit jamais etre vide car cette fonction a pour objectif
de retourner les formations edité par un partenaire.
Il dont obligatoirement est en mode connecté
@ -3772,7 +3772,7 @@ def get_partner_class_Without_Scope_Action(diction):
# Verification de la validité du token dans le cas des user en mode connecté
'''
/!\ Important : le token ne doit jamais etre vide car cette fonction a pour objectif
Important : Important : le token ne doit jamais etre vide car cette fonction a pour objectif
de retourner les formations edité par un partenaire.
Il dont obligatoirement est en mode connecté
@ -4062,7 +4062,7 @@ def find_partner_class_like(diction):
# Verification de la validité du token dans le cas des user en mode connecté
'''
/!\ Important : le token ne doit jamais etre vide car cette fonction a pour objectif
Important : Important : le token ne doit jamais etre vide car cette fonction a pour objectif
de retourner les formations edité par un partenaire.
Il dont obligatoirement est en mode connecté
@ -4455,7 +4455,7 @@ def get_partner_class_external_code(diction):
# Verification de la validité du token dans le cas des user en mode connecté
'''
/!\ Important : le token ne doit jamais etre vide car cette fonction a pour objectif
Important : Important : le token ne doit jamais etre vide car cette fonction a pour objectif
de retourner les formations edité par un partenaire.
Il dont obligatoirement est en mode connecté
@ -5846,7 +5846,7 @@ Cette fonction modifier le ranking des formations d'un partenaire en masse.
Par exemple, lorqu'il change d'abonnement et passe
du standard au gold, toutes ses formation prenne le ranking des golds.
/!\ : Si le compte utilisateur est un compte de demo, le display_ranking prendra
Important : : Si le compte utilisateur est un compte de demo, le display_ranking prendra
une valeur max de 50. ceci pour que ses formations soient visibles tout de suite.
"""
def UpdataPartnerRankingClass(diction):
@ -5984,7 +5984,7 @@ def get_associated_class_of_partnair(diction):
# Verification de la validité du token dans le cas des user en mode connecté
'''
/!\ Important : si le token est vide, alors c'est une recherche faite en mode non-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.
@ -6201,7 +6201,7 @@ def RenseignementClass(diction):
"""
Cette fonction supprime definitivement une formation.
/!\ : Une formation n'est supprimable que si :
Important : : Une formation n'est supprimable que si :
1 - Il n'y a aucune session à venir. toutes les sessions sont passée.
2 - Si il y a des sessions, alors impossible de la supprimer. Proposer plus tard la notion d'archivage
3 - Dans la suppression, aller supprimer les champs dans la collection "elaindex"
@ -6437,7 +6437,7 @@ def delete_list_Class(diction):
"""
Cette fonction supprime definitivement une formation, en utilisant l'internal_url
/!\ : Une formation n'est supprimable que si :
Important : : Une formation n'est supprimable que si :
1 - Il n'y a aucune session à venir. toutes les sessions sont passée.
2 - Si il y a des sessions, alors impossible de la supprimer. Proposer plus tard la notion d'archivage
3 - Dans la suppression, aller supprimer les champs dans la collection "elaindex"
@ -6644,7 +6644,7 @@ def get_Class_From_Internal_Url(diction):
"""
Pour facilité la communication pr l'ingestion du des formation scrappées,
Cette fonction va retouner la formation avec la clé qui est un url
/!\ : on ne fais pas de controle de recid (car c'est le bot admin qui doit l'utiliser (revoir cette logique plus tard)
Important : : on ne fais pas de controle de recid (car c'est le bot admin qui doit l'utiliser (revoir cette logique plus tard)
"""
def get_Class_From_Url(diction):
try:
@ -7319,7 +7319,7 @@ A l'ajout d'une UE, les info necessaires sont :
- pres_dist_hyp : Présentiel/ distantiel/ hybride,
- Est_note (oui / non) pour savoir cette unité doit être notée
/!\ :
Important : :
on gere en mode nesred field, c'est a dire que les compétence dont directement ajouté à la collection myclass comme suit:
myclass:
@ -7588,7 +7588,7 @@ def Add_Update_UE_To_Class(diction):
"""
Cette fonction permet de supprimer une UE d'une formation.
/!\ : Pour rappel, on est en mode nested json sur la collection myclass
Important : : Pour rappel, on est en mode nested json sur la collection myclass
"""
def Delete_UE_From_Class(diction):
try:

View File

@ -1355,7 +1355,7 @@ def Get_CRM_List_Opportunite_Etape(diction):
"""
Supprimer une étape d'opportunité.
/!\ Ceci n'est possible que si aucune opportunité n'a cette étape
Important : Ceci n'est possible que si aucune opportunité n'a cette étape
"""
def Delete_CRM_List_Opportunite_Etape(diction):
try:

View File

@ -116,7 +116,7 @@ def get_invoice_by_customer(diction):
'''
Cette API enregistre la methode de payement.
/!\ un client a une seule mode de payement
Important : un client a une seule mode de payement
ceci est enregistré dans la collection : payement_mode
'''
def add_payement_mode(diction):
@ -448,7 +448,7 @@ def get_payement_mode(diction):
"""
Cette fonction crée une facture dans la collecion : factures.
/!\ : update du 09/07/2023 :
Important : : update du 09/07/2023 :
Apres la creation de la commande, une recap de la facture à venir est envoyé, ceci à titre d'information.
Le système recupere les informations depuis la plateforme strype. MAIS pour eviter des soucis de sychronisation,
@ -688,7 +688,7 @@ def createOrder(diction):
"""
/!\ : Si le montant à facturé à superieur à 0 alors on force le controle des données de facturation (email, adresse, etc)
Important : : Si le montant à facturé à superieur à 0 alors on force le controle des données de facturation (email, adresse, etc)
"""
#print(" ### TOTAL TTC à FACTURER = "+str(total_ttc_float))
invoice_nom_check = ""
@ -862,7 +862,7 @@ def createOrder(diction):
# Mise à jour du partenaire (ajouter le nouveau pack)
"""
/!\ Important :
Important : Important :
Si le partenaire avait deja une date d'arret de son abonnement, la creation d'une nouvelle commande
entraine automatiquement l'annulation de l'arret de l'abonnement.
"""

View File

@ -201,7 +201,7 @@ def ela_index_class(external_code="", source_field = "", partner_owner_recid = "
Indexation des mots clés.
Ceci etant particulier, il n'ya pas de gestion d'occurence.
/!\ : A faire.
Important : : A faire.
Pour chaque mot clé,
1 - Ajouter le mot dans la collection "word_not_stem" pour eviter les effets de traduction
2 - Ajouter les mot dans la collection "elaindex" avec une occurrence par defaut de 1000, source_field = 'keyword', moyanne = "1"
@ -286,7 +286,7 @@ def ela_index_all_classes(partner_owner_recid):
collection = MYSY_GV.dbname["myclass"]
'''
ATTENTION ATTENTION
/!\ : avant l'indexation, on vide la table des indexes.
Important : : avant l'indexation, on vide la table des indexes.
cette logique est tres gourmande.
ce quil faudrait faire :
- si une formation est indexée, mettre un fag pour dire : indexé => OK
@ -366,7 +366,7 @@ Pour ce faire elle prend en argument :
- internal_url
- partenaire_recid
/!\ Important : La fonction peut reindexer les formations si l'argument
Important : Important : La fonction peut reindexer les formations si l'argument
reindexe = 1
"""
@ -470,7 +470,7 @@ def ela_index_all_classes_title(partner_owner_recid):
collection = MYSY_GV.dbname["myclass"]
'''
ATTENTION ATTENTION
/!\ : avant l'indexation, on vide la table des indexes.
Important : : avant l'indexation, on vide la table des indexes.
cette logique est tres gourmande.
ce quil faudrait faire :
- si une formation est indexée, mettre un fag pour dire : indexé => OK
@ -517,7 +517,7 @@ Pour ce faire elle prend en argument :
- internal_url
- partenaire_recid
/!\ Important : La fonction peut reindexer les formations si l'argument
Important : Important : La fonction peut reindexer les formations si l'argument
reindexe = 1
"""
@ -624,7 +624,7 @@ def ela_index_all_classes_desc(partner_owner_recid):
collection = MYSY_GV.dbname["myclass"]
'''
ATTENTION ATTENTION
/!\ : avant l'indexation, on vide la table des indexes.
Important : : avant l'indexation, on vide la table des indexes.
cette logique est tres gourmande.
ce quil faudrait faire :
- si une formation est indexée, mettre un fag pour dire : indexé => OK
@ -676,7 +676,7 @@ def ela_index_all_classes_obj(partner_owner_recid):
collection = MYSY_GV.dbname["myclass"]
'''
ATTENTION ATTENTION
/!\ : avant l'indexation, on vide la table des indexes.
Important : : avant l'indexation, on vide la table des indexes.
cette logique est tres gourmande.
ce quil faudrait faire :
- si une formation est indexée, mettre un fag pour dire : indexé => OK
@ -727,7 +727,7 @@ def ela_index_all_classes_video_text(partner_owner_recid):
collection = MYSY_GV.dbname["myclass"]
'''
ATTENTION ATTENTION
/!\ : avant l'indexation, on vide la table des indexes.
Important : : avant l'indexation, on vide la table des indexes.
cette logique est tres gourmande.
ce quil faudrait faire :
- si une formation est indexée, mettre un fag pour dire : indexé => OK
@ -908,7 +908,7 @@ def mysy_recherche_levenshtein(tab_mot):
if( len( mot ) > 3):
"""
/!\ Update du 29/09/22 :
Important : Update du 29/09/22 :
J'ai rendu le mysy_recherche_levenshtein un peu souple en
en disant que si taille du mot > 5 alors j'accepte une distance de 2 à condition que 4 première lettre soient identiques
"""

View File

@ -1093,7 +1093,7 @@ def Reset_user_pwd_by_token(diction):
return False, " Les mots de passe ne sont pas identiques "
"""
/!\ ATTENTION : Pour les pro, on verifie le champ : "tmp_token_pwd" qui est token temporaire generé
Important : ATTENTION : Pour les pro, on verifie le champ : "tmp_token_pwd" qui est token temporaire generé
pour le lien de reinitialisation.
"""

View File

@ -1305,7 +1305,7 @@ def send_partner_account_mail(message, account_mail):
Apres l'activation du compte pro,
cet email envoie le token et mot de passe temporaire à l'utilisateur
/!\ : update du 27/09/2023 :
Important : : update du 27/09/2023 :
Apres l'activation du compte, il faut créer l'employé rattaché à cet utilisateur
'''
def Pro_Account_Token_Pass(account_mail, my_token):
@ -3021,7 +3021,7 @@ On va aller chercher dans la collection "related_collection" les donnée des per
En gros, si list_email_dest[x] = related_collection.email, alors ok.
Si on ne trouve pas la personne, on n'envoie par l'email.
/!\ Ceci est une sécurité pour eviter d'envoyer des email des personnes non connus de mysy/
Important : Ceci est une sécurité pour eviter d'envoyer des email des personnes non connus de mysy/
07/06/2025 : Si la valeur du champ :'store_file_in_ent' == '1', alors
les fichier sont stocker dans l'espace ENT des apprenant, si ils ont un compte utilisation.

View File

@ -234,7 +234,7 @@ def CreateTableauEmargement_From_Sequence(diction):
# Ici on doit mettre tous les champs possible (obligatoire ou non) de la BDD dans la liste
# field_list.
'''
field_list = ['class_internal_url', 'session_id', 'token']
field_list = ['class_internal_url', 'session_id', 'token', 'tab_inscrit_ids', 'tab_sequence_ids']
incom_keys = diction.keys()
for val in incom_keys:
if val not in field_list and val.startswith('my_') is False:
@ -266,6 +266,26 @@ def CreateTableauEmargement_From_Sequence(diction):
partner_recid = my_partner['recid']
tab_inscrit_ids = []
tab_inscrit_ids_Object = []
if ("tab_inscrit_ids" in diction.keys() and diction['tab_inscrit_ids']):
tab_inscrit_ids_work = str(diction['tab_inscrit_ids']).split(",")
for tmp in tab_inscrit_ids_work:
if(tmp):
tab_inscrit_ids.append(tmp)
tab_inscrit_ids_Object.append(ObjectId(tmp))
tab_sequence_ids = []
tab_sequence_ids_Object = []
if ("tab_sequence_ids" in diction.keys() and diction['tab_sequence_ids']):
tab_sequence_ids_work = str(diction['tab_sequence_ids']).split(",")
for tmp in tab_sequence_ids_work:
if (tmp):
tab_sequence_ids.append(tmp)
tab_sequence_ids_Object.append(ObjectId(tmp))
class_internal_url = ""
if ("class_internal_url" in diction.keys()):
@ -282,11 +302,6 @@ def CreateTableauEmargement_From_Sequence(diction):
"""
Recuperation des info de la session de formation
"""
date_du = ""
date_au = ""
ville = ""
code_postal = ""
adresse = ""
qry = {"_id":ObjectId(str(session_id)), "valide": "1", 'partner_owner_recid':str(partner_recid)}
# Verifier que la session existe
@ -301,10 +316,21 @@ def CreateTableauEmargement_From_Sequence(diction):
# Verifier qu'on a bien des sequences valides pour cette session de formation
is_existe_sequence_session_valide_count = MYSY_GV.dbname['session_formation_sequence'].count_documents({'session_id':str(diction['session_id']),
is_existe_sequence_session_valide_count = 0
if(len(tab_sequence_ids) <= 0 ):
is_existe_sequence_session_valide_count = MYSY_GV.dbname['session_formation_sequence'].count_documents({'session_id':str(diction['session_id']),
'valide':'1',
'locked':'0',
'partner_owner_recid':str(partner_recid)})
else:
is_existe_sequence_session_valide_count = MYSY_GV.dbname['session_formation_sequence'].count_documents(
{'session_id': str(diction['session_id']),
'valide': '1',
'locked': '0',
'partner_owner_recid': str(partner_recid),
'_id':{'$in':tab_sequence_ids_Object}}
)
if( is_existe_sequence_session_valide_count <= 0):
mycommon.myprint(
str(inspect.stack()[0][3]) + " - Aucune sequence valide pour cette session de formation ")
@ -318,19 +344,66 @@ def CreateTableauEmargement_From_Sequence(diction):
# On vide la collection emargement pour la session = str(session_id)
local_myquery = {"session_id": str(session_id), 'partner_owner_recid':str(partner_recid)}
filt_inscrit = {}
filt_inscrit_for_inscription_collection = {}
if (len(tab_inscrit_ids) > 0):
filt_inscrit = {'inscription_id': {'$in': tab_inscrit_ids},
'locked': '0',
'valide': '1',
'partner_owner_recid': str(
partner_recid)
}
filt_inscrit_for_inscription_collection = {'_id': {'$in': tab_inscrit_ids_Object},
'locked': '0',
'valide': '1',
'partner_owner_recid': str(
partner_recid)
}
filt_sequence = {}
filt_sequence_for_sequence_collection = {}
if (len(tab_sequence_ids) > 0):
filt_sequence = {'session_formation_sequence_id': {'$in': tab_sequence_ids},
'locked': '0',
'valide': '1',
'partner_owner_recid': str(
partner_recid)
}
filt_sequence_for_sequence_collection = {'_id': {'$in': tab_sequence_ids_Object},
'locked': '0',
'valide': '1',
'partner_owner_recid': str(
partner_recid)
}
local_myquery = {"$and":[ {"session_id": str(session_id), 'partner_owner_recid':str(partner_recid)},
filt_inscrit, filt_sequence
]}
x = MYSY_GV.dbname['emargement'].delete_many(local_myquery)
mycommon.myprint(
str(inspect.stack()[0][
3]) + " - INFO : "+str(x.deleted_count)+" Documents supprimés de la collection : emargement : session = "+str(session_id) )
# Verification qu'il y a bien des séquences de formation pour cette session
session_sequence_count = MYSY_GV.dbname['session_formation_sequence'].count_documents({'session_id': str(session_id),
session_sequence_count = MYSY_GV.dbname['session_formation_sequence'].count_documents(
{"$and":[ {'session_id': str(session_id),
'locked': '0',
'valide': '1',
'partner_owner_recid': str(
partner_recid)})
partner_recid)},
filt_sequence_for_sequence_collection]}
)
if( session_sequence_count <= 0 ):
mycommon.myprint(
@ -342,10 +415,13 @@ def CreateTableauEmargement_From_Sequence(diction):
coll_emargement = MYSY_GV.dbname['emargement']
#Recuperation de la liste des participants dont l'inscription est validée
for tmp_val in MYSY_GV.dbname['inscription'].find({'session_id':str(session_id),
for tmp_val in MYSY_GV.dbname['inscription'].find( {"$and":[ {'session_id':str(session_id),
'class_internal_url':str(class_internal_url),
'status':'1',
'partner_owner_recid':str(partner_recid)} ):
'partner_owner_recid':str(partner_recid)},
filt_inscrit_for_inscription_collection]} ):
my_local_data = {}
my_local_data['email'] = tmp_val['email']
my_local_data['nom'] = tmp_val['nom']
@ -355,10 +431,10 @@ def CreateTableauEmargement_From_Sequence(diction):
my_local_data['date_update'] = str(datetime.now())
# Recuperation de liste des sequences
for session_sequence in MYSY_GV.dbname['session_formation_sequence'].find({'session_id':str(session_id),
for session_sequence in MYSY_GV.dbname['session_formation_sequence'].find({"$and":[{'session_id':str(session_id),
'locked':'0',
'valide':'1',
'partner_owner_recid':str(partner_recid)} ):
'partner_owner_recid':str(partner_recid)}, filt_sequence_for_sequence_collection]} ):
query_key = {}
query_key['email'] = tmp_val['email']
query_key['session_id'] = tmp_val['session_id']
@ -369,6 +445,7 @@ def CreateTableauEmargement_From_Sequence(diction):
query_key['sequence_end'] = str(session_sequence['sequence_end'])
new_my_local_data = {}
new_my_local_data['session_formation_sequence_id'] = str(session_sequence['_id'])
new_my_local_data['inscription_id'] = str(tmp_val['_id'])
new_my_local_data['email'] = tmp_val['email']
new_my_local_data['nom'] = tmp_val['nom']
@ -1122,5 +1199,75 @@ def GerneratePDFEmargementList(diction):
return False, False
"""
Cette fonction supprime les demandes d'emargement .
règle :
seules les demande au statut 'init' (statut='0') sont supprimable
"""
def Delete_List_Emargement(diction):
try:
diction = mycommon.strip_dictionary(diction)
'''
# 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 = [ 'token', 'tab_ids',
]
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'est pas autorisé, Creation partenaire annulée")
return False, "Toutes les informations fournies ne sont pas valables"
"""
Verification de la liste des champs obligatoires
"""
field_list_obligatoire = [ 'token', 'tab_ids']
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, "Toutes les informations necessaires n'ont pas été fournies"
local_status, my_partner = mycommon.Check_Connexion_And_Return_Partner_Data(diction)
if (local_status is not True):
return local_status, my_partner
tab_ids = ""
if ("tab_ids" in diction.keys()):
if diction['tab_ids']:
tab_ids = diction['tab_ids']
tab_ids_splited = str(tab_ids).split(",")
tab_ids_splited_Objectid = []
for my_id in tab_ids_splited:
if(my_id ):
tab_ids_splited_Objectid.append(ObjectId(str(my_id)))
query_key = {}
query_key['_id'] ={'$in':tab_ids_splited_Objectid}
query_key['partner_owner_recid'] = str(my_partner['recid'])
query_key['statut'] = "0"
delete_row = MYSY_GV.dbname['emargement'].delete_many(query_key)
return True, str( delete_row.deleted_count) + " demande(s) supprimée(s)"
except Exception as e:
exc_type, exc_obj, exc_tb = sys.exc_info()
mycommon.myprint(str(inspect.stack()[0][3]) + " -" + str(e) + " - ERRORRRR AT Line : " + str(exc_tb.tb_lineno))
return False, "Impossible de supprimer les demandes d'émargement"

View File

@ -1672,7 +1672,7 @@ def Automatic_Split_Member_Inscrit_To_Grps(diction):
return local_status, my_partner
"""
# Recuperer le nombre de groupe en prenant en compte le type de groupe
/!\ : Il ne faut pas mélanger la gestion des types de groupe (TD, TP, PROJET, etc)
Important : : Il ne faut pas mélanger la gestion des types de groupe (TD, TP, PROJET, etc)
"""
nb_groupe = MYSY_GV.dbname['groupe_inscription'].count_documents({'class_id':str(diction['class_id']),
'session_id':str(diction['session_id']),

View File

@ -1565,13 +1565,13 @@ principe de base :
Cette fonction permet d'inscrire un apprenant 'inscrit_id' à un jury
/!\ : A un jury peux etre inscrit un apprenant dont l'inscription n'est pas totalement validé
Important : : A un jury peux etre inscrit un apprenant dont l'inscription n'est pas totalement validé
par exemple le cas de jury d'admission
Les jury etant liée à des aganda, on va ajouté l'id de l'agenda a 'jury_apprenant'
/!\ : Cette fonction permet de gerer aussi l'entrée dans l'agenda
Important : : Cette fonction permet de gerer aussi l'entrée dans l'agenda
"""
def Add_Update_Apprenant_To_Jury(diction):

View File

@ -305,8 +305,8 @@ def Create_MySy_LMS_User(diction):
## Si l'insertion dans la table user s'est bien passé, alors on ajoute le user_id à la table 'access_url_rel_user'
Cette table permet faire la recherche et d'envoyer des email dans le LMS.
Ainsi un utilisateur saisira juste les 3 première lettre du 'send to'
/!\ On l'ajout d'abord par defaut pour le l'url racine.
/!\ On va l'ajouter une 2ieme fois si le compte partenaire necessite la creation d'un nouvel url.
Important : On l'ajout d'abord par defaut pour le l'url racine.
Important : On va l'ajouter une 2ieme fois si le compte partenaire necessite la creation d'un nouvel url.
"""
my_query_access_url_rel_user = "INSERT INTO access_url_rel_user SET access_url_id='1' , user_id='" + str(
new_lms_user_id) + "' "
@ -361,8 +361,8 @@ def Create_MySy_LMS_User(diction):
mycommon.myprint(str(inspect.stack()[0][3]) + " - WARNING : impossible de créer le virtualHost dans le LMS ")
else:
"""
/!\ On va l'ajouter une 2ieme fois si le compte partenaire necessite la creation d'un nouvel url.
/!\ : on ajoute aussi le user admin qui a comme user_id = 1
Important : On va l'ajouter une 2ieme fois si le compte partenaire necessite la creation d'un nouvel url.
Important : : on ajoute aussi le user admin qui a comme user_id = 1
"""
virutal_host_id = local_virtualhost_id
virutal_host_url = local_virtualhost_full_url
@ -1109,10 +1109,10 @@ def Update_Pack_MySy_LMS_User(diction):
"""
Cette fonction verifie si un client mysy existe sur chamilo.
Si le client n'existe pas, il le crée avec le pack et le bon nombre de formation
/!\ : On stock dans mysy (collection partnair_account) l'id chamilo du user.
Important : : On stock dans mysy (collection partnair_account) l'id chamilo du user.
le nom du champ est : mysy_lms_user_id/
/!\ : si le pack utilisateur necessite d'avoir un compte LMS, 3 cas de figures se posent :
Important : : si le pack utilisateur necessite d'avoir un compte LMS, 3 cas de figures se posent :
1 - C'est un tout nouveau compte, alors on le crée simplement
2 - CAS CRITIQUE : C'est un ancien compte qui a changé plusieurs de fois de pack. il est passé d'un pack avec LMS vers un compte sans LMS puis vers un compte avec LMS.
dans cas, on reative simplement le compte.
@ -1264,7 +1264,7 @@ def Check_MySy_LMS_Account(diction):
else:
print(" ### ce partenaire A un compte. il faut mettre à jour le compte LMS avec le nouveau pack, le nombre max de formation")
"""
/!\ il ne faut pas oublier de gerer le cas ou le client à plus de cours de activé dans chamilo.
Important : il ne faut pas oublier de gerer le cas ou le client à plus de cours de activé dans chamilo.
une solition est serai de refuser tout changement tant que le nombre de formation dans mysy et dans lms ne sont pas cohérent.
DONC LE CONTROLE EST A FAIRE BIEN EN AMONT
@ -1735,7 +1735,7 @@ def Remove_User_From_LMS_Class(diction):
Cette fonction permet de créer un apprenant.
use case :
Lorsqu'une inscription est validée sur mysy, on va créer le user apprenant
/!\ : a ne pas confondre avec la creation d'un utilisateur enseignant """
Important : : a ne pas confondre avec la creation d'un utilisateur enseignant """
def Create_MySy_LMS_Apprenant(diction):
try:
@ -2129,7 +2129,7 @@ def LMS_Get_Partner_Data(diction):
lms_url = MYSY_GV.MYSY_LMS_URL
"""
/!\ On va brouiller le mot de passe en le recomposant comme suit :
Important : On va brouiller le mot de passe en le recomposant comme suit :
pwd_brouillé = 'mSyt'+$mysy_lms_user_id+"$date_day+$pwd.
par exemple, pour un mot de passe = "toto"
@ -2236,7 +2236,7 @@ def LMS_Create_VirtualHost(diction):
"""
/!\ : la regle pour definir l'url (url.iexercice.com) est :
Important : : la regle pour definir l'url (url.iexercice.com) est :
1 - on prend le nom, on enleve tous les caratères non acceptés dans une url
2 - on met tout en minuscule
3 - Du mot restant, on prends les 10 premiers caractère.
@ -2528,7 +2528,7 @@ def Get_LMS_Logo_And_Bannier_Img(diction=None):
Cette fonction permet de configurer le theme LMS d'un partenaire
Sur le front il choisi un theme / logo, cette fonction met à jour ces
info dans le lms chamilo.
/!\ : la fonction verifie si un setup existe deja (table : 'settings_current' avec
Important : : la fonction verifie si un setup existe deja (table : 'settings_current' avec
access_url = lms_virtualhost_id (dans mysy du user.)
@ -3270,7 +3270,7 @@ def Create_Class_From_Lms(diction):
print(" ### myquery = ", myquery)
cur.execute(myquery)
"""
/!\: Important :
Important : : Important :
Dans mysy lms, l'utilisateur crée un titre, puis une description. ex : "objectif": "detail de l'objectif" ou "méthode":"detail de la
de la méthode", etc.
Pour gérer les fautes de frappe dans l'identification des titres, on va utiliser le calcul de distance de Levenshtein
@ -3553,7 +3553,7 @@ def Update_Class_From_Lms(diction):
print(" ### myquery = ", myquery)
cur.execute(myquery)
"""
/!\: Important :
Important : : Important :
Dans mysy lms, l'utilisateur crée un titre, puis une description. ex : "objectif": "detail de l'objectif" ou "méthode":"detail de la
de la méthode", etc.
Pour gérer les fautes de frappe dans l'identification des titre, on va utiliser le calcul de distance de Levenshtein
@ -3766,7 +3766,7 @@ def Unpublish_Class_From_Lms(diction):
"""
Cette fonction permet de créer et mettre à jour une formation dans le MySy LMS
/!\ : Depuis MySy Search, on a un tag qui dit "pushed_lms", "date_pushed_lms", "date_updated_pushed_lms"
Important : : Depuis MySy Search, on a un tag qui dit "pushed_lms", "date_pushed_lms", "date_updated_pushed_lms"
Si le champ "pushed_lms" est à "1" alors la formation, alors la formation deja ete poussé, c'est une mise à jour à faire.
Liste des controle :

33
main.py
View File

@ -2767,6 +2767,21 @@ def Update_Given_Emargement_Data():
"""
API pour supprimer une liste de demande d'émargemen
règle :
seules les demande au statut 'init' (statut='0') sont supprimable
"""
@app.route('/myclass/api/Delete_List_Emargement/', methods=['POST','GET'])
@crossdomain(origin='*')
def Delete_List_Emargement():
# On recupere le corps (payload) de la requete
payload = mycommon.strip_dictionary (request.form.to_dict())
print(" ### Delete_List_Emargement : payload = ",str(payload))
localStatus, message= emargement.Delete_List_Emargement(payload)
return jsonify(status=localStatus, message=message )
"""
API d'Envoie de l'email de confirmation de l'inscription
@ -11376,6 +11391,24 @@ def Get_Survey_Stat_Data_For_Given_related_collection_id():
return jsonify(status=status, message=retval)
"""
API pour supprimer une liste d'enquete si elle n'ont pas été envoyé
statut = 0
"""
@app.route('/myclass/api/Delete_List_Survey/', methods=['POST','GET'])
@crossdomain(origin='*')
def Delete_List_Survey():
# On recupere le corps (payload) de la requete
payload = mycommon.strip_dictionary (request.form.to_dict())
print(" ### Delete_List_Survey payload = ",payload)
status, retval = survey_mgt.Delete_List_Survey(payload)
return jsonify(status=status, message=retval)
"""
API pour recuperer la liste des questions d'un 'related_collection' et 'related_collection_id'
avec statistique

View File

@ -1090,7 +1090,7 @@ def Init_And_Update_courrier_template_tracking_With_Partner_Data(my_partner):
"""
Cette fonction log un historique d'envoie email ou de telechargement
d'un document
/!\ : Dans certains cas on n'utilise pas de modele de courrier, comme l'accetation d'un inscription ou ,
Important : : Dans certains cas on n'utilise pas de modele de courrier, comme l'accetation d'un inscription ou ,
l'envoi des demande demande d'emargement (boff a reanalyser tout meme),
on laisse la valeur "courrier_template_id" a vide
"""
@ -1164,7 +1164,7 @@ def Editic_Log_History_Action(my_partner, courrier_template_data, related_collec
Cette fonction log un historique tout evenement lié à un element
de la collection courrier_template_tracking (CONF_INSCRIPTION, EMARGEMENT_FORMATION, etc)
/!\ : Dans certains cas on n'utilise pas de modele de courrier, comme l'accetation d'un inscription ou ,
Important : : Dans certains cas on n'utilise pas de modele de courrier, comme l'accetation d'un inscription ou ,
l'envoi des demande demande d'emargement (boff a reanalyser tout meme),
on laisse la valeur "courrier_template_id" a vide
"""
@ -1481,7 +1481,7 @@ def Get_Given_Session_Action_Status_By_Document(diction):
-- clé de recherche : document a traquer (courrier_template_tracking._id) et inscription_id
/!\ 08/05/2024 : cette logique n'est pas valable dans le cas des convention car certains partipants
Important : 08/05/2024 : cette logique n'est pas valable dans le cas des convention car certains partipants
doivent avoir une convention entreprise alors que d'autres ont un convention individuelle
"""

View File

@ -826,7 +826,7 @@ def Get_List_UE_Evaluation(diction):
"""
Suppression d'une evaluation d'une formation.
/!\ : les regles ne sont pas encore implément. il faut le faire
Important : : les regles ne sont pas encore implément. il faut le faire
"""
def Delete_Class_UE_Evaluation(diction):
try:

View File

@ -13,7 +13,7 @@ ex :
Ce fichier travaille principalement sur la collection : "base_partner_setup"
/!\ 10/05/2024 :
Important : 10/05/2024 :
On ajoute le module concerné à la collection pour pouvoir gerer les parametrage liée à des modules specifique.
on aura le champ : "related_collection" pour cela.

View File

@ -387,7 +387,7 @@ def Add_Partner_Client(diction):
line = line + 1
"""
/!\ : l'adresse etant directement enregistrée sur le client, alors verification que le ligne "adresse" contient bien les champs :
Important : : l'adresse etant directement enregistrée sur le client, alors verification que le ligne "adresse" contient bien les champs :
- adresse, code postal, ville, pays
"""
@ -757,7 +757,7 @@ def Add_Partner_Prospect(diction):
line = line + 1
"""
/!\ : l'adresse etant directement enregistrée sur le client, alors verification que le ligne "adresse" contient bien les champs :
Important : : l'adresse etant directement enregistrée sur le client, alors verification que le ligne "adresse" contient bien les champs :
- adresse, code postal, ville, pays
"""
@ -1241,7 +1241,7 @@ def Update_Partner_Client(diction):
address = ast.literal_eval(diction['address'])
data_update['address'] = ast.literal_eval(diction['address'])
""""
/!\ : l'adresse etant directement enregistrée sur le client, alors verification que le ligne "adresse" contient bien les champs :
Important : : l'adresse etant directement enregistrée sur le client, alors verification que le ligne "adresse" contient bien les champs :
- adresse, code postal, ville, pays
"""

View File

@ -10,7 +10,7 @@ A la creation, l'utilisateur devra choisir un objet (formation, stagiaire, etc),
Donc au debut, l'utilisateur peut :
1 - Modifier un document existant (convocation, confirmation inscription, annulation inscription, etc)
2 - Créer un nouveau document from scratch (attestation de presence)
/!\ : Prevoir un bouton previsualitation
Important : : Prevoir un bouton previsualitation
"""
import pymongo
from pymongo import MongoClient

View File

@ -196,7 +196,7 @@ def Invoice_Partner_Order(diction):
#2 - copier les données dans la collection 'facture'
"""
/!\ On va recopier les header et line, telqel.
Important : On va recopier les header et line, telqel.
On fera les changements plus tard si besoin
"""
@ -1965,7 +1965,7 @@ def Get_Given_Line_Of_Partner_Invoice_Lines(diction):
"""
Impression PDF d'une facture
/!\ : update du 05/06/2024 :
Important : : update du 05/06/2024 :
Si la facture a un document sécurisée (e_Invoice) associé dans la colonne :
'e_document_signe_id', alors on va aller recuperer le document securisé associé
@ -3207,7 +3207,7 @@ def Send_Partner_Invoice_By_Email(tab_files, Folder, diction):
"""
/!\ 26/04/2024
Important : 26/04/2024
La fonction de creation d'une facture va computer la commande associée, puis copier les ligne
or quand on fait une facturation a partir d'une session, il n'y pas de 'commande', donc pas de computation.
@ -3584,7 +3584,7 @@ def Add_Update_Invoice_Annotation(diction):
Cette fontion permet de créer un avoir sur la facture.
On par d'annulation totale, donc pas partiel
/!\ : On créer une souche spéciale pour les avoirs
Important : : On créer une souche spéciale pour les avoirs
apres la creation de l'avoir, on va ajouter sur la facture
la reference de l'avoir associé.

View File

@ -71,7 +71,7 @@ def Add_Partner_Order(diction):
'order_header_inclus_bpf']
"""
/!\ A noter que "order_lines" est tableau [] qui peut contenir les keys suivantes : 'order_line_formation', 'order_line_qty', 'order_line_prix_unitaire', 'order_line_tax', 'order_line_type_reduction', 'order_line_type_valeur', 'order_line_montant_reduction'
Important : A noter que "order_lines" est tableau [] qui peut contenir les keys suivantes : 'order_line_formation', 'order_line_qty', 'order_line_prix_unitaire', 'order_line_tax', 'order_line_type_reduction', 'order_line_type_valeur', 'order_line_montant_reduction'
ainsi, order_lines sera du style order_lines[ {order_line_formation:'xxx', order_line_qty:'2', etc }, {order_line_formation:'yyy', order_line_qty:'7', etc }, ....{}}
"""
@ -470,13 +470,13 @@ def Add_Partner_Order(diction):
"""
/!\ : A present que tous les controles sont ok, on va proceder à la creation dans les table.
Important : : A present que tous les controles sont ok, on va proceder à la creation dans les table.
"""
### 1 - Creation de l'entete
"""
/!\ Update du 24/09/2023 :
Important : Update du 24/09/2023 :
Si on ne trouve pas une sequence propre au partenaire (partner_owner_recid), alors on va chercher
la sequence par defaut dont partner_owner_recid = 'default'
"""
@ -501,7 +501,7 @@ def Add_Partner_Order(diction):
current_seq_value = str(retval_sequence_order['current_val'])
new_sequence_value = int(mycommon.tryInt(current_seq_value)) + 1
# /!\ Affectation de la reference interne de la commande
# Important : Affectation de la reference interne de la commande
data['order_header_ref_interne'] = retval_sequence_order['prefixe']+str(current_seq_value)
print(" #### diction['order_header_ref_interne'] = ", str( data['order_header_ref_interne']))
@ -619,7 +619,7 @@ def Add_Partner_Quotation(diction):
'total_lines_hors_taxe_before_lines_reduction', 'total_lines_montant_reduction', 'order_header_inclus_bpf']
"""
/!\ A noter que "order_lines" est tableau [] qui peut contenir les keys suivantes : 'order_line_formation', 'order_line_qty', 'order_line_prix_unitaire', 'order_line_tax', 'order_line_type_reduction', 'order_line_type_valeur', 'order_line_montant_reduction'
Important : A noter que "order_lines" est tableau [] qui peut contenir les keys suivantes : 'order_line_formation', 'order_line_qty', 'order_line_prix_unitaire', 'order_line_tax', 'order_line_type_reduction', 'order_line_type_valeur', 'order_line_montant_reduction'
ainsi, order_lines sera du style order_lines[ {order_line_formation:'xxx', order_line_qty:'2', etc }, {order_line_formation:'yyy', order_line_qty:'7', etc }, ....{}}
"""
@ -1012,7 +1012,7 @@ def Add_Partner_Quotation(diction):
"""
/!\ : A present que tous les controles sont ok, on va proceder à la creation dans les table.
Important : : A present que tous les controles sont ok, on va proceder à la creation dans les table.
"""
@ -1020,7 +1020,7 @@ def Add_Partner_Quotation(diction):
# Rcuperation de la sequence de l'objet "partner_quotation_header" dans la collection : "mysy_sequence"
"""
/!\ Update du 24/09/2023 :
Important : Update du 24/09/2023 :
Si on ne trouve pas une sequence propre au partenaire (partner_owner_recid), alors on va chercher
la sequence par defaut dont partner_owner_recid = 'default'
"""
@ -1044,7 +1044,7 @@ def Add_Partner_Quotation(diction):
current_seq_value = str(retval_sequence_order['current_val'])
new_sequence_value = int(mycommon.tryInt(current_seq_value)) + 1
# /!\ Affectation de la reference interne de la commande
# Important : Affectation de la reference interne de la commande
data['order_header_ref_interne'] = retval_sequence_order['prefixe'] + str(current_seq_value)
#print(" #### diction['order_header_ref_interne'] = ", str(data['order_header_ref_interne']))
@ -1547,7 +1547,7 @@ def Update_Partner_Order_Header(diction):
"""
/!\ : A present que tous les controles sont ok, on va proceder à la creation dans les table.
Important : : A present que tous les controles sont ok, on va proceder à la creation dans les table.
"""
@ -2051,7 +2051,7 @@ def Update_Partner_Quotation_Header(diction):
"""
/!\ : A present que tous les controles sont ok, on va proceder à la creation dans les table.
Important : : A present que tous les controles sont ok, on va proceder à la creation dans les table.
"""
@ -2436,7 +2436,7 @@ def Add_Update_Partner_Order_Line(diction):
order_line_session_id = str(diction['order_line_session_id'])
"""
/!\ : Il peut arrivé qu'on souhaite supprimer la session du devis ou la commande, alors on autorise la mise à jour meme si vide
Important : : Il peut arrivé qu'on souhaite supprimer la session du devis ou la commande, alors on autorise la mise à jour meme si vide
"""
data['order_line_session_id'] = order_line_session_id
@ -2735,7 +2735,7 @@ pour devis et pr commande.
Seules order au statut : Brouillon ou En cours, sont confirmables.
/!\ : Apres la confirmation, on procede au calcul des totaux (compute Order)
Important : : Apres la confirmation, on procede au calcul des totaux (compute Order)
"""
def Confirm_Partner_Order_Header_And_Lines(diction):
try:
@ -2821,7 +2821,7 @@ def Confirm_Partner_Order_Header_And_Lines(diction):
"""
/!\ : A present que tous les controles sont ok, on va proceder à la creation dans les table.
Important : : A present que tous les controles sont ok, on va proceder à la creation dans les table.
"""
@ -2981,7 +2981,7 @@ def Annule_Partner_Order_Header_And_Lines(diction):
"""
/!\ : A present que tous les controles sont ok, on va proceder à la creation dans les table.
Important : : A present que tous les controles sont ok, on va proceder à la creation dans les table.
"""
@ -5374,7 +5374,7 @@ def Compute_Order_Header(diction):
"""
"""
/!\ 20/08/204 :
Important : 20/08/204 :
mise à jour des calcul :
dans les lignes, le montant hors taxe, inclus la reduction (vrai HT - montant reduction).
@ -7199,7 +7199,7 @@ def Send_Partner_Order_By_Email(tab_files, Folder, diction):
"""
Apres la creation du document electronique, on envoie la demande de validation
/!\ on envoie le mail à chaque destinataire
Important : on envoie le mail à chaque destinataire
"""
for email in tab_emails_destinataire:
@ -7672,9 +7672,9 @@ A la validation, pour chaque ligne du devis,
3 - Apres la reservation, si le partenaire a activer et demandé d'appliquer la signature electronique
alors on declenche le processus de signature electronique
/!\ : lorsqu'on fait la reservation de place dans la session, on doit ajouter le client facturer = au client normal
Important : : lorsqu'on fait la reservation de place dans la session, on doit ajouter le client facturer = au client normal
/!\ : on insert que les les formation avec une session
Important : : on insert que les les formation avec une session
"""
def Insert_Quotation_To_Session(diction):
@ -7975,7 +7975,7 @@ def Insert_Quotation_To_Session(diction):
"""
Apres la creation du document electronique, on envoie la demande de validation
/!\ on envoie le mail à chaque destinataire
Important : on envoie le mail à chaque destinataire
"""
for email in tab_emails_destinataire:
@ -8173,10 +8173,10 @@ def Insert_Quotation_To_Session_From_Partner_Owner_Recid(diction):
new_data['status'] = "0"
"""
/!\
Important :
22/04/2024 :On a besoin du token pour utiliser la fonction standard.
On va aller recuperer le token du compte principale du partner
/!\
Important :
"""
main_account_data = MYSY_GV.dbname['partnair_account'].find_one({'recid':str(diction['partner_owner_recid']),
'active':'1', 'is_partner_admin_account':'1'})
@ -8316,7 +8316,7 @@ def Insert_Quotation_To_Session_From_Partner_Owner_Recid(diction):
"""
Apres la creation du document electronique, on envoie la demande de validation
/!\ on envoie le mail à chaque destinataire
Important : on envoie le mail à chaque destinataire
"""
for email in tab_emails_destinataire:

View File

@ -2,7 +2,7 @@
Ce fichier permet de gerer les produits et service qui peuvent etre ajouter à des devis et facture
Par exemple si dans la cadre d'une formation, on souhaite refacturer le deplacement de l'enseignant
ou si on facture des objets pédagogique.
/!\ : Un produit et service se differencient par le type de produit (produit ou service)
Important : : Un produit et service se differencient par le type de produit (produit ou service)
Un article (produit & service) est defini par :
code produit
@ -571,7 +571,7 @@ def Get_Given_Partner_Produit_Service(diction):
""" Recuperation de l'image d'un produit
/!\ important : on prend le 'related_collection_recid' comme le '_id' de la collection inscription
Important : important : on prend le 'related_collection_recid' comme le '_id' de la collection inscription
"""
def getRecoded_Partner_Product_Image_from_front(diction=None):
try:

View File

@ -939,7 +939,7 @@ La modification ne s'effectue que si le compte n'est pas verrouillé.
'locked'=0
/!\ : Juste apres la validation, le compte de payement est créé dans Stripe
Important : : Juste apres la validation, le compte de payement est créé dans Stripe
cette fontion initialise / initialisation des paramettre par defaut de chaque partenaire
'''
@ -1337,7 +1337,7 @@ Login du partenaire avec
- passwd
- cle secrete qui est son token fixe.
/!\ update du 28/09/2023 :
Important : update du 28/09/2023 :
Cette fonction retourne les droits d'acces de l'utilisateur
dans une champ : 'user_acces_right', idealement sous forme JSON
Cette info sera stocké et exploiré sous forme de cookie chez le client.

View File

@ -465,7 +465,7 @@ def get_parnter_stripe_stripe_paymentmethod_id_from_recid(recid = ""):
'''
recuperation du recid du user
/!\ : 22/12/2024 : cette fonction es un peu bizarre.
Important : : 22/12/2024 : cette fonction es un peu bizarre.
J'ai réecrée une fonction get_user_account_id_from_token qui retour _id de ligne au lieu du recid
'''
def get_user_recid_from_token(token = ""):
@ -585,7 +585,7 @@ def get_connected_data_from_token(connected_token = ""):
token_data = coll_token.find_one({'token': str(connected_token), 'valide': '1', 'locked': '0'})
"""
/!\ 21/12/2024 : en attendant de fusionner proprement les collection 'partnair_account' et 'user_account'
Important : 21/12/2024 : en attendant de fusionner proprement les collection 'partnair_account' et 'user_account'
on utiliser le champs 'partner_token['type'] pour savoir si on à faire un partner ou un user.
@ -627,7 +627,7 @@ def get_partner_data_from_token(token = ""):
token_data = coll_token.find_one({'token': str(token), 'valide': '1', 'locked': '0'})
"""
/!\ 21/12/2024 : en attendant de fusionner proprement les collection 'partnair_account' et 'user_account'
Important : 21/12/2024 : en attendant de fusionner proprement les collection 'partnair_account' et 'user_account'
on utiliser le champs 'partner_token['type'] pour savoir si on à faire un partner ou un user.
@ -730,7 +730,7 @@ def get_parnter_recid_from_token(token = ""):
return False
"""
/!\ 21/12/2024 : en attendant de fusionner proprement les collection 'partnair_account' et 'user_account'
Important : 21/12/2024 : en attendant de fusionner proprement les collection 'partnair_account' et 'user_account'
on utiliser le champs 'partner_token['type'] pour savoir si on à faire un partner ou un user.
@ -1076,7 +1076,7 @@ def Parse_Clean_Search_Text(sentence=None):
return False, ""
'''
/!\ : On supprime tous les caratère "spaciaux" et ponctuation EXCEPTE
Important : : On supprime tous les caratère "spaciaux" et ponctuation EXCEPTE
- le ":" dont on a besoin pour identifier les patterns et
- le ' " ' dont on a besoin pour identifier les patterns
'''
@ -1216,7 +1216,7 @@ Cette fonction prends un mot,
et retourne sont masculin / singulier
Cette fonction va s'etoffer au fur et à mesure
/!\ Cette fonction prend un pot, pas une phrase
Important : Cette fonction prend un pot, pas une phrase
'''
def GetMasculinSingulier(word=None):
try:
@ -1357,7 +1357,7 @@ def CronUSerMessage_Mail():
'''
Cette fonction prend un tableau
et retourn le meme tableau mais dans un order aléatoire
/!\ cette fonction est trop lente, je ne peux l'utiliser
Important : cette fonction est trop lente, je ne peux l'utiliser
'''
def RendomizeTab(table):
@ -1559,7 +1559,7 @@ def Migration_internal_url():
'''
Cette fonction prends un mot de X digit
et retourne le top X des mot ayant le meme digit
/!\ cette fonction est glement utilisee dans le car des
Important : cette fonction est glement utilisee dans le car des
des recherches vides
'''
def GetMotFromElaIndex(diction):
@ -3176,7 +3176,7 @@ Créer l'ID fonctionnel associé : session_id
la regles est :
Session_id = date_du+date_au+code_postal+adresse
/!\ : les dates sont au formation : jjmmaaaa.
Important : : les dates sont au formation : jjmmaaaa.
exemple de session_id : 10022023150220230enligne => du 10/02/2023 au 15/02/2023, au CP : 0, à l'adresse : 'en ligne'
"""
@ -3653,7 +3653,7 @@ def GetAttendeeDetail_perSession(diction):
"""
/!\ : 28/12/2023 - update
Important : : 28/12/2023 - update
S'il y a de la data dans la collection 'apprenant_collection' cela veut dire qu'il y a un dossier apprenant,
alors on va plutot retourner les info qui sont dans cette collection
"""
@ -4312,7 +4312,7 @@ def Check_Connexion_And_Return_Partner_Data(diction):
"""
/!\ Update du 26/11/2023 :
Important : Update du 26/11/2023 :
On a plutot besoin de recuperer les données du user connecté au lieu du partenaire,
"""
@ -4630,7 +4630,7 @@ def clean_session_dates():
"""
Cette fonction retourne les champs a utiliser pour les template de document/
/!\ : Les tables en paramettre contiennent des valeurs du type ObjectId("idddd")
Important : : Les tables en paramettre contiennent des valeurs du type ObjectId("idddd")
Cette fonction retour un json de ce type :
convention_dictionnary_data =
@ -5490,7 +5490,7 @@ def Configure_Partner_Init_Setup_No_Token(diction):
"""
Recuperer les données du partenaire.
/!\ : Ceci ne s'applique qu'a un compte de type admin -- test ko à refaire
Important : : Ceci ne s'applique qu'a un compte de type admin -- test ko à refaire
"""
my_partner_data = MYSY_GV.dbname['partnair_account'].find_one({'_id':ObjectId(str(diction['partner_id'])),
})

View File

@ -262,7 +262,7 @@ def Update_Group_Purchase_Price(diction):
"""
Suppression d'un groupe de prix d'achat
/!\ :
Important : :
Si le groupe de prix est deja utilisé, alors il est impossible de le supprimer
"""
def Delete_Group_Purchase_Price(diction):

View File

@ -2047,7 +2047,7 @@ def Get_Given_Ressource_Humaine(diction):
"""
Si on a des compétences associés, alors on va aller cherche la note dans la collection 'base_competence_type'.
/!\ on a volontaire fait ainsi pour garder la gestion de la note coté serveur.
Important : on a volontaire fait ainsi pour garder la gestion de la note coté serveur.
en cas de changement de note (donc d'echelle de note), pas de besoin de faire de la data migration
"""
@ -2244,7 +2244,7 @@ def DeleteImage_Ressource_Humaine(diction=None):
""" Recuperation de l'image d'un employé
/!\ important : on prend le 'related_collection_recid' comme le '_id' de la collection inscription
Important : important : on prend le 'related_collection_recid' comme le '_id' de la collection inscription
"""
def getRecoded_Employee_Image_from_front(diction=None):
try:
@ -4384,7 +4384,7 @@ def Update_Employee_Contrat(diction):
"""
Verifier que l'employé n'a pas un contrat actif qui se chevauche car à un instant T
une ressources humaine ne peut avoir qu'un seul contrat valdie
/!\ : faire attention à exclure present contrat
Important : : faire attention à exclure present contrat
"""
for retVal in MYSY_GV.dbname['ressource_humaine_contrat'].find({'rh_id': str(diction['rh_id']),
'_id': {'$ne': ObjectId(str(diction['_id'])) },
@ -4423,7 +4423,7 @@ def Update_Employee_Contrat(diction):
"""
# Verifier que 'groupe_prix_achat_id' existe si dans diction
01/01/2024 : /!\ Important :
01/01/2024 : Important : Important :
Si le contrat est rattaché à un groupe de prix, alors verifier que
les dates de début et de fin du contrat ne sont pas en contration avec les dates de validé
du groupe de prix.

View File

@ -1206,7 +1206,7 @@ def DeleteImage_Ressource_Materielle(diction=None):
""" Recuperation de l'image d'un employé
/!\ important : on prend le 'related_collection_recid' comme le '_id' de la collection inscription
Important : important : on prend le 'related_collection_recid' comme le '_id' de la collection inscription
"""
def getRecoded_Materielle_Image_from_front(diction=None):
try:
@ -1398,7 +1398,7 @@ def Get_List_Ressource_Materielle_Affectation(diction):
"""
Ajout d'une affectation d'une ressource materiel à une formation ou une session
/!\ ou a une employé
Important : ou a une employé
"""
def Add_Affectation_Ressource_Materielle_Poste(diction):

View File

@ -219,7 +219,7 @@ def create_update_payment_card(diction):
"""
/!\ IMPORTANT :
Important : IMPORTANT :
Si Le champ "stripe_paymentmethod_id" est rempli alors c'est une mise à jour :
a) on detache
b) on créer la nouvelle carte
@ -339,7 +339,7 @@ def confirm_suscription(diction):
)
"""
/!\ : le client a demarré un payement.
Important : : le client a demarré un payement.
1 - je supprimer son pack abonnement pour se premunir d'un echec au prelevement
2 - Je remettrai le bon pack lors qu'il aura confirmé
@ -646,7 +646,7 @@ def create_subscription(diction):
"""
/!\ Une fois l'abonnement créer, il faut l'enregistrer dans la collection 'abonnement'
Important : Une fois l'abonnement créer, il faut l'enregistrer dans la collection 'abonnement'
"""
# Recuperation du recid du client dans mysy
local_partner_data = MYSY_GV.dbname['partnair_account'].find_one({'stripe_account_id':customer_id, 'active':'1', 'locked':'0'})

View File

@ -635,7 +635,7 @@ def Send_Survey_Alert_Notif(diction):
"""
Survey for enduser : Cette fonction créer une enquete en prenant à partir d'une liste d'inscrit
/!\ : Cette fonction ne concerne uniquement et exclusibement les inscriptions validées (status = 1)
Important : : Cette fonction ne concerne uniquement et exclusibement les inscriptions validées (status = 1)
"""
def Add_Survey_Tab_Inscrit(diction):
@ -759,6 +759,9 @@ pas que les inscrits, (le cas de enseignants), on va rajouter
- related_collection = collection concernée
- related_collection_id = l'_id concernée dans la collection
04/07/205 : on ajoute 'tab_inscrit_ids' pour faire un survey
pour une liste d'inscrits
"""
def Init_Survey_Tab_For_All_Session_Inscrit(diction):
try:
@ -767,7 +770,8 @@ def Init_Survey_Tab_For_All_Session_Inscrit(diction):
"""
Verification des input acceptés
"""
field_list = ['session_id', 'token', 'formulaire_id', 'survey_type', 'sending_date', 'related_collection', 'related_collection_id']
field_list = ['session_id', 'token', 'formulaire_id', 'survey_type', 'sending_date', 'related_collection',
'related_collection_id', 'tab_inscrit_ids', ]
incom_keys = diction.keys()
for val in incom_keys:
@ -808,11 +812,50 @@ def Init_Survey_Tab_For_All_Session_Inscrit(diction):
3]) + " L'identifiant de la session est invalide ")
return False, " L'identifiant de la session est invalide "
tab_inscrit_ids = []
tab_inscrit_ids_Object = []
if ("tab_inscrit_ids" in diction.keys() and diction['tab_inscrit_ids']):
tab_inscrit_ids_work = str(diction['tab_inscrit_ids']).split(",")
for tmp in tab_inscrit_ids_work:
if (tmp):
tab_inscrit_ids.append(tmp)
tab_inscrit_ids_Object.append(ObjectId(tmp))
filt_inscrit = {}
filt_inscrit_for_inscription_collection = {}
filt_inscrit_for_survey_collection = {}
if (len(tab_inscrit_ids) > 0):
filt_inscrit = {'inscription_id': {'$in': tab_inscrit_ids},
'locked': '0',
'valide': '1',
'partner_owner_recid': str(my_partner['recid'])
}
filt_inscrit_for_survey_collection = {'inscription_id': {'$in': tab_inscrit_ids},
'partner_owner_recid': str(my_partner['recid'])
}
filt_inscrit_for_inscription_collection = {'_id': {'$in': tab_inscrit_ids_Object},
'locked': '0',
'valide': '1',
'partner_owner_recid': str(my_partner['recid'])
}
tab_my_inscription_ids = []
for my_inscription_id in MYSY_GV.dbname['inscription'].find({'session_id': str(diction['session_id']),
query_incrit = {}
if( len(tab_inscrit_ids) > 0):
# on force des inscrit peut importe leur statut (validé ou pas)
query_incrit = {"$and":[ {'session_id': str(diction['session_id']),
'partner_owner_recid': str(my_partner['recid']),
'valide':'1', 'status':'1'}):
'valide':'1',}, filt_inscrit_for_inscription_collection]}
else:
query_incrit = {'session_id': str(diction['session_id']),
'partner_owner_recid': str(my_partner['recid']),
'valide': '1', }
for my_inscription_id in MYSY_GV.dbname['inscription'].find(query_incrit):
tab_my_inscription_ids.append(str(my_inscription_id['_id']))
@ -839,9 +882,9 @@ def Init_Survey_Tab_For_All_Session_Inscrit(diction):
2 - la creation de l'enquete
"""
MYSY_GV.dbname['survey'].delete_many({'partner_owner_recid':str(my_partner['recid']),
MYSY_GV.dbname['survey'].delete_many({"$and":[{'partner_owner_recid':str(my_partner['recid']),
'session_id':str(diction['session_id']),
'survey_type':str(diction['survey_type'])})
'survey_type':str(diction['survey_type'])}, filt_inscrit_for_survey_collection]})
@ -854,7 +897,7 @@ def Init_Survey_Tab_For_All_Session_Inscrit(diction):
local_Insc_retval = MYSY_GV.dbname['inscription'].find_one({'session_id': str(diction['session_id']),
'_id':ObjectId(str(my_inscription_id)),
'partner_owner_recid': str(my_partner['recid']),
'valide': '1', 'status':'1'
'valide': '1',
})
if(local_Insc_retval is None ):
@ -896,7 +939,7 @@ def Init_Survey_Tab_For_All_Session_Inscrit(diction):
"""
/!\ à l'image de la fonction "Init_Survey_Tab_For_All_Session_Inscrit",
Important : à l'image de la fonction "Init_Survey_Tab_For_All_Session_Inscrit",
cette fonction permet de créer une enquete pour un related_collection et une liste de related_collection_id
données.
"""
@ -1376,7 +1419,7 @@ def Create_One_Survey_To_Except_Inscrit(diction):
Cette fonction permet d'envoyer la demande d'enquete à la personne concerné
/!\ : Cette fontion permet d'envoyer toutes les demande d'enquete, que soit :
Important : : Cette fontion permet d'envoyer toutes les demande d'enquete, que soit :
un questionnaire de positionnement, une demande d'evaluation a chaud,
une demande d'evaluation à froid, ou tout autre.
@ -1390,8 +1433,8 @@ par exemple :
- si survey.survey_type == 'hot_eval' ==> courrier_template_type_document_ref_interne = "EVAL_FORMATION" et
courrier_template.ref_interne = EVAL_FORMATION.
/!\ : 21/07/2024 : Dans le cas d'un Renvoi, on va desactiver la question precedenmment envoyée.
Important : : 21/07/2024 : Dans le cas d'un Renvoi, on va desactiver la question precedenmment envoyée.
"""
def Send_Survey_TabIds(diction):
@ -3843,7 +3886,7 @@ def Get_Entity_Question_List_With_Stat_For_Given_related_collection_id(diction):
"""
Si on a des class_id alors on cree les filtre
/!\ : quand utilise le filtre "class_id", on verrouille "related_collection" sur la valeur : "inscription"
Important : : quand utilise le filtre "class_id", on verrouille "related_collection" sur la valeur : "inscription"
"""
filt_class_id = {}
if ("class_id" in diction.keys() and diction['class_id']):
@ -3921,3 +3964,71 @@ def Get_Entity_Question_List_With_Stat_For_Given_related_collection_id(diction):
"""
Cette fonction supprime une liste d'enquete si elle n'ont pas été envoyé
statut = 0
"""
def Delete_List_Survey(diction):
try:
diction = mycommon.strip_dictionary(diction)
'''
# 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 = [ 'token', 'tab_ids',
]
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'est pas autorisé, Creation partenaire annulée")
return False, "Toutes les informations fournies ne sont pas valables"
"""
Verification de la liste des champs obligatoires
"""
field_list_obligatoire = [ 'token', 'tab_ids']
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, "Toutes les informations necessaires n'ont pas été fournies"
local_status, my_partner = mycommon.Check_Connexion_And_Return_Partner_Data(diction)
if (local_status is not True):
return local_status, my_partner
tab_ids = ""
if ("tab_ids" in diction.keys()):
if diction['tab_ids']:
tab_ids = diction['tab_ids']
tab_ids_splited = str(tab_ids).split(",")
tab_ids_splited_Objectid = []
for my_id in tab_ids_splited:
if(my_id ):
tab_ids_splited_Objectid.append(ObjectId(str(my_id)))
query_key = {}
query_key['_id'] ={'$in':tab_ids_splited_Objectid}
query_key['partner_owner_recid'] = str(my_partner['recid'])
query_key['statut'] = "0"
delete_row = MYSY_GV.dbname['survey'].delete_many(query_key)
return True, str( delete_row.deleted_count) + " demande(s) supprimé(s)"
except Exception as e:
exc_type, exc_obj, exc_tb = sys.exc_info()
mycommon.myprint(str(inspect.stack()[0][3]) + " -" + str(e) + " - ERRORRRR AT Line : " + str(exc_tb.tb_lineno))
return False, "Impossible de supprimer les demandes"

View File

@ -1014,7 +1014,7 @@ def format_emplee_contrat_agenda_events(tab_diction):
"""
# Calcul du cout total d'une tache
/!\ Le prix du contrat prend toujours le pas sur le prix rentré à la main.
Important : Le prix du contrat prend toujours le pas sur le prix rentré à la main.
C'est a dire que si un pour quelque raison que ce soit, sur la même période un employé
a un groupe de prix d'achat et une prix saisie à la main, alors les totaux seront calculés en se basant
sur le prix qui est dans le contrat
@ -1700,7 +1700,7 @@ def Delete_Nicole_Account(diction):
return False, " Vous devez fournir le compte principale pour supprimer l'abonnement "
"""
/!\ : Verifier le compte contient les chaines (email) : "nicole" ou "beauchesne"
Important : : Verifier le compte contient les chaines (email) : "nicole" ou "beauchesne"
"""

View File

@ -1250,7 +1250,7 @@ def Add_Update_Unite_Enseignement_Planif(diction):
"""
Supprimer une liste de planification UE.
/!\ : Une regles qui est planifiée ne peut etre supprimé
Important : : Une regles qui est planifiée ne peut etre supprimé
"""
def Delete_List_Unite_Enseignement_Planif(diction):

View File

@ -345,8 +345,8 @@ def Get_Matrix_Acces_Right_By_Profil(diction):
len(user_acces_right['profil_access_right']) > 0 ) :
for tmp_access in user_acces_right['profil_access_right']:
print(" tmp_access = ", tmp_access)
print(" retval = ", retval)
#print(" tmp_access = ", tmp_access)
#print(" retval = ", retval)
if( tmp_access['module_name'] == retval['module_name'] ):

View File

@ -595,12 +595,12 @@ def get_all_class_Given_partner_owner_recid_No_Login(diction):
Cette Fonction récupérer les formations dans la zone de l'utilisateur.
Par zone utilisateur j'entends : ville or pays
/!\ IMPORTANT :
Important : IMPORTANT :
Si on veut UNIQUEMENT diffuser une formation dans une ville, alors il faut :
- reseigner Le champ : zone_diffusion.city
- Laisser Le champ : zone_diffusion.country à VIDE.
/!\ IMPORTANT2 : La formation doit etre à la une :
Important : IMPORTANT2 : La formation doit etre à la une :
donc le paramttrafe "isalaune" = 1
Par defaut, le système cherche les diffuser dans un pays ou dans une ville.
@ -793,7 +793,7 @@ def recherche_text_simple(diction):
Recuperation de donnée du user connecté si connexion (user ou partner)
/!\ Important : si le token est vide, alors c'est une recherche faite en mode non-connecté.
Important : Important : si le token est vide, alors c'est une recherche faite en mode non-connecté.
on doit l'accepter.
Si non le champ "connection_type" permet de savoir si c'est un user ou un partner
@ -1112,10 +1112,10 @@ def recherche_text_simple(diction):
insertObject.append(mycommon.JSONEncoder().encode(user))
'''
/!\ Important : Recuperation des elements de la recherche etendue
Important : Important : Recuperation des elements de la recherche etendue
c'est a dire l'utilisation d'API externe
/!\ update du 20/05/22 : Cette approche relentie bcp le systeme avec l'appel externe.
Important : update du 20/05/22 : Cette approche relentie bcp le systeme avec l'appel externe.
donc on annule
# aller chercher la recherche etendue et la rajouter ici.
@ -1244,7 +1244,7 @@ def recherche_text_simple_for_partner_catalog(diction):
Recuperation de donnée du user connecté si connexion (user ou partner)
/!\ Important : si le token est vide, alors c'est une recherche faite en mode non-connecté.
Important : Important : si le token est vide, alors c'est une recherche faite en mode non-connecté.
on doit l'accepter.
Si non le champ "connection_type" permet de savoir si c'est un user ou un partner
@ -1559,10 +1559,10 @@ def recherche_text_simple_for_partner_catalog(diction):
insertObject.append(JSONEncoder().encode(user))
'''
/!\ Important : Recuperation des elements de la recherche etendue
Important : Important : Recuperation des elements de la recherche etendue
c'est a dire l'utilisation d'API externe
/!\ update du 20/05/22 : Cette approche relentie bcp le systeme avec l'appel externe.
Important : update du 20/05/22 : Cette approche relentie bcp le systeme avec l'appel externe.
donc on annule
# aller chercher la recherche etendue et la rajouter ici.