parent
e05e0ae097
commit
814a8403dd
|
@ -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>
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
||||
"""
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 d’utilisation, 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
|
||||
"""
|
||||
|
|
|
@ -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 :
|
||||
|
|
12
Job_Cron.py
12
Job_Cron.py
|
@ -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
|
||||
|
||||
"""
|
||||
|
|
|
@ -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"))
|
||||
|
|
10596
Log/log_file.log
10596
Log/log_file.log
File diff suppressed because one or more lines are too long
|
@ -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)
|
||||
|
||||
|
|
|
@ -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"):
|
||||
|
|
12
agenda.py
12
agenda.py
|
@ -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 = {}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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',
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
||||
|
|
|
@ -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',
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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.
|
||||
|
||||
|
||||
|
|
|
@ -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):
|
||||
|
|
|
@ -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):
|
||||
|
|
32
class_mgt.py
32
class_mgt.py
|
@ -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:
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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.
|
||||
"""
|
||||
|
|
|
@ -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
|
||||
"""
|
||||
|
|
|
@ -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.
|
||||
|
||||
"""
|
||||
|
|
|
@ -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.
|
||||
|
|
175
emargement.py
175
emargement.py
|
@ -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"
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -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']),
|
||||
|
|
|
@ -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):
|
||||
|
|
|
@ -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
33
main.py
|
@ -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
|
||||
|
|
|
@ -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
|
||||
"""
|
||||
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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.
|
||||
|
||||
|
|
|
@ -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
|
||||
"""
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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é.
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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'])),
|
||||
})
|
||||
|
|
|
@ -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):
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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):
|
||||
|
|
|
@ -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'})
|
||||
|
|
135
survey_mgt.py
135
survey_mgt.py
|
@ -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"
|
||||
|
||||
|
|
|
@ -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"
|
||||
"""
|
||||
|
||||
|
||||
|
|
|
@ -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):
|
||||
|
|
|
@ -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'] ):
|
||||
|
||||
|
|
16
wrapper.py
16
wrapper.py
|
@ -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.
|
||||
|
|
Loading…
Reference in New Issue