24/03/2024 - 13h

master
cherif 2024-03-24 13:07:33 +01:00
parent c9e4a6e1a8
commit a0a955ed0e
12 changed files with 10670 additions and 3332 deletions

View File

@ -4,7 +4,16 @@
<list default="true" id="c6d0259a-16e1-410d-91a1-830590ee2a08" name="Changes" comment="20/03/2024 - 22h30dss">
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
<change beforePath="$PROJECT_DIR$/E_Sign_Document.py" beforeDir="false" afterPath="$PROJECT_DIR$/E_Sign_Document.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/GlobalVariable.py" beforeDir="false" afterPath="$PROJECT_DIR$/GlobalVariable.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/Inscription_mgt.py" beforeDir="false" afterPath="$PROJECT_DIR$/Inscription_mgt.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/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$/crm_opportunite.py" beforeDir="false" afterPath="$PROJECT_DIR$/crm_opportunite.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$/main.py" beforeDir="false" afterPath="$PROJECT_DIR$/main.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/prj_common.py" beforeDir="false" afterPath="$PROJECT_DIR$/prj_common.py" afterDir="false" />
</list>
<option name="SHOW_DIALOG" value="false" />
<option name="HIGHLIGHT_CONFLICTS" value="true" />
@ -74,13 +83,6 @@
<option name="presentableId" value="Default" />
<updated>1680804787304</updated>
</task>
<task id="LOCAL-00199" summary="21/01/2024 -18h30">
<created>1705859319077</created>
<option name="number" value="00199" />
<option name="presentableId" value="LOCAL-00199" />
<option name="project" value="LOCAL" />
<updated>1705859319077</updated>
</task>
<task id="LOCAL-00200" summary="22/01/2024 -22h00">
<created>1705957023841</created>
<option name="number" value="00200" />
@ -417,7 +419,14 @@
<option name="project" value="LOCAL" />
<updated>1711148467160</updated>
</task>
<option name="localTasksCounter" value="248" />
<task id="LOCAL-00248" summary="20/03/2024 - 22h30dss">
<created>1711149396482</created>
<option name="number" value="00248" />
<option name="presentableId" value="LOCAL-00248" />
<option name="project" value="LOCAL" />
<updated>1711149396483</updated>
</task>
<option name="localTasksCounter" value="249" />
<servers />
</component>
<component name="Vcs.Log.Tabs.Properties">

View File

@ -176,6 +176,8 @@ def Create_E_Document(diction):
new_diction['source_document'] = str(diction['source_document'])
new_diction['date_update'] = str(datetime.now())
new_diction['update_by'] = str(my_partner['_id'])
new_diction['created_by'] = str(my_partner['_id'])
val = MYSY_GV.dbname['e_document_signe'].insert_one(new_diction)
@ -509,7 +511,7 @@ def checkIntegrity(calculated_hash, decrypted_hash):
"""
Signature du document
"""
def Create_E_Signature_For_E_Document(diction):
def Create_E_Signature_For_E_Document(file_img=None, Folder=None, diction=None):
try:
diction = mycommon.strip_dictionary(diction)
@ -545,6 +547,18 @@ def Create_E_Signature_For_E_Document(diction):
if diction['token']:
token = diction['token']
saved_file = ""
image_signature_manuelle_string = ""
if( file_img ):
status, saved_file = mycommon.Upload_Save_IMG_File(file_img, Folder)
if (status is False):
mycommon.myprint(str(saved_file))
return False, str(saved_file)
print(" signature manuelle = ", saved_file)
with open(saved_file, "rb") as imageFile:
image_signature_manuelle_string = base64.b64encode(imageFile.read()).decode()
"""
local_status, my_partner = mycommon.Check_Connexion_And_Return_Partner_Data(diction)
if (local_status is not True):
@ -626,6 +640,7 @@ def Create_E_Signature_For_E_Document(diction):
new_data['signed_email'] = str(diction['email_destinataire'])
new_data['signed_ip_adress'] = str(diction['user_ip'])
new_data['statut'] = "1"
new_data['signature_nanuelle_img'] = image_signature_manuelle_string
qry_key = {'valide': '1', 'locked': '0',
@ -665,6 +680,22 @@ def Create_E_Signature_For_E_Document(diction):
e_document_date_2 = MYSY_GV.dbname['e_document_signe'].find_one(qry_key)
user_created_e_document = MYSY_GV.dbname['partnair_account'].find_one({'_id':ObjectId(e_document_date_2['created_by']),
'active':'1',
'locked':'0',
})
if( user_created_e_document is None or "email" not in user_created_e_document.keys() ):
mycommon.myprint(
str(inspect.stack()[0][3]) + " L'initiateur du document est invalide ")
return False, " L'initiateur du document est invalide "
if( mycommon.isEmailValide(user_created_e_document['email']) is False ):
mycommon.myprint(
str(inspect.stack()[0][3]) + " L'adresse email de initiateur du document est invalide ")
return False, " L'adresse email de initiateur du document est invalide "
local_partner_owner_recid = e_document_date_2['partner_owner_recid']
local_signature_digitale = decrypt.decrypt(e_document_date_2['signature_digitale'])
@ -703,7 +734,7 @@ def Create_E_Signature_For_E_Document(diction):
str(inspect.stack()[0][3]) + " Impossible de recupérer les données du partenaire ")
return False, " Impossible de recupérer les données du partenaire "
Create_E_Signature_For_E_Document
# Creation du dictionnaire d'information à utiliser pour la creation du doc
convention_dictionnary_data = {}
new_diction = {}
@ -724,6 +755,7 @@ def Create_E_Signature_For_E_Document(diction):
convention_dictionnary_data["mysy_signature_digitale"] = str(local_signature_digitale)
convention_dictionnary_data["mysy_url_securite"] = local_url_securite
convention_dictionnary_data["mysy_qrcode_securite"] = "data:image/png;base64," + qr_code_converted_string
convention_dictionnary_data["mysy_manual_signature_img"] = "data:image/png;base64," + image_signature_manuelle_string
body = {
"params": convention_dictionnary_data
@ -940,8 +972,8 @@ def Create_E_Signature_For_E_Document(diction):
msg.attach(html_mime)
msg['From'] = partner_SMTP_COUNT_From_User
msg['Bcc'] = 'contact@mysy-training.com'
msg['Subject'] = " Votre Document Signé "
# msg['to'] = "billardman01@hotmail.com"
msg['Subject'] = " Votre Convention Signée "
msg['cc'] = user_created_e_document['email']
msg['to'] = str(diction['email_destinataire'])
# Attacher l'eventuelle pièces jointes
@ -956,8 +988,8 @@ def Create_E_Signature_For_E_Document(diction):
msg.attach(html_mime)
msg['From'] = MYSY_GV.O365_SMTP_COUNT_From_User
msg['Bcc'] = 'contact@mysy-training.com'
msg['Subject'] = " Votre Document Signé "
# msg['to'] = "billardman01@hotmail.com"
msg['Subject'] = " Votre Convention Signée"
msg['cc'] = user_created_e_document['email']
msg['to'] = msg['to'] = str(diction['email_destinataire'])

View File

@ -659,4 +659,12 @@ Statut de facturation d'un session de formation : invoiced_statut
- Si au moins une inscription associée à une session est facturé ==> invoiced_statut de la session = 1
- Si non invoiced_statut de la session =0
"""
"""
"""
Gestion des sequences de formation ( en rapport avec les emargements) :
- option = 0 ==> on prend le calendrier
- option = 1 ==> on prend la demi-journée
- option = 2 ==> on prend la journée
"""
EMARGEMENT_OPTION = ["0", "1", "2"]

View File

@ -7683,6 +7683,23 @@ def Sent_Convention_Stagiaire_By_Email(tab_files, Folder, diction):
if (local_status is not True):
return local_status, my_partner
"""
20/03/2024 : Creation du E-Document à signer
On verifier si le partenaire dispose de l'option "signature_digital" dans la collection base_partner_setup
ET SI DEPUIS LE FRONT, L'UTILISATEUR DECIDE DE L'UTILISER
"""
is_partner_digital_signature = ""
if ("request_digital_signature" in diction.keys() and diction['request_digital_signature'] == "1"):
is_signature_digital_count = MYSY_GV.dbname['base_partner_setup'].count_documents(
{'partner_owner_recid': str(my_partner['recid']),
'config_name': 'signature_digital',
'valide': '1',
'locked': '0',
'config_value': '1'})
if (is_signature_digital_count == 1):
is_partner_digital_signature = "1"
# Verifier que le stagiaire est bien inscrit. Le statut de l'inscription doit etre "1"
is_inscription_valide = MYSY_GV.dbname['inscription'].count_documents({'_id':ObjectId(str(diction['inscription_id'])),
@ -7922,6 +7939,10 @@ def Sent_Convention_Stagiaire_By_Email(tab_files, Folder, diction):
sourceHtml = contenu_doc_Template.render(params=body["params"])
new_model_courrier_with_code_tag = str(
sourceHtml) + " <p style='width: 300px; text-align: right;'> Signature Client <br/> <img style='height:250px; width:250px;' src='{{ params.mysy_manual_signature_img }}'>&nbsp;</p> <br/> " \
" <p style='width: 300px; text-align: center;'> <img style='height:150px; width:150px;' src='{{ params.mysy_qrcode_securite }}'>&nbsp;</p> "
todays_date = str(date.today().strftime("%d/%m/%Y"))
ts = datetime.now().timestamp()
ts = str(ts).replace(".", "").replace(",", "")[-5:]
@ -7963,6 +7984,42 @@ def Sent_Convention_Stagiaire_By_Email(tab_files, Folder, diction):
# Creation de l'email à enoyer
msg = MIMEMultipart("alternative")
"""
20/03/2024 : la convention pdf a été créée.
Si le partenaire a l'option de signature digitale, alors on créé le e-document
"""
if (is_partner_digital_signature == "1"):
new_e_document_diction = {}
new_e_document_diction['token'] = diction['token']
new_e_document_diction['file_name'] = outputFilename
toaddrs = ", ".join(tab_emails_destinataire)
new_e_document_diction['email_destinataire'] = str(toaddrs)
new_e_document_diction['source_document'] = new_model_courrier_with_code_tag
new_e_document_diction['related_collection'] = ""
new_e_document_diction['related_collection_id'] = ""
local_status_e_doc, local_retval_e_doc = E_Sign_Document.Create_E_Document(new_e_document_diction)
if (local_status_e_doc is False):
return local_status_e_doc, local_retval_e_doc
"""
Apres la creation du document electronique, on envoie la demande de validation
/!\ on envoie le mail à chaque destinataire
"""
for email in tab_emails_destinataire:
print(" ### traitement du mail : ", email)
new_send_e_document_diction = {}
new_send_e_document_diction['token'] = diction['token']
new_send_e_document_diction['e_doc_id'] = str(local_retval_e_doc)
new_send_e_document_diction['user_email'] = str(email)
local_status_send_e_doc, local_send_retval_e_doc = E_Sign_Document.Sent_E_Document_Signature_Request(
new_send_e_document_diction)
if (local_status_send_e_doc is False):
return local_status_send_e_doc, local_send_retval_e_doc
else:
# Il s'agit d'une simple email
@ -9447,7 +9504,8 @@ donc on n'envoie pas l'email à l'adresss de prod ou contact du client
def Sent_Convention_Stagiaire_By_Email_By_Partner_client(tab_files_name_full_path, Folder, diction):
try:
field_list_obligatoire = ['token', 'courrier_template_id', 'email_test', 'email_production', 'partner_client_id', 'session_id']
field_list_obligatoire = ['token', 'courrier_template_id', 'email_test', 'email_production', 'partner_client_id', 'session_id',
'request_digital_signature']
for val in field_list_obligatoire:
if val not in diction:
@ -9468,16 +9526,20 @@ def Sent_Convention_Stagiaire_By_Email_By_Partner_client(tab_files_name_full_pat
"""
20/03/2024 : Creation du E-Document à signer
On verifier si le partenaire dispose de l'option "signature_digital" dans la collection base_partner_setup
ET SI DEPUIS LE FRONT, L'UTILISATEUR DECIDE DE L'UTILISER
"""
is_partner_digital_signature = ""
is_signature_digital_count = MYSY_GV.dbname['base_partner_setup'].count_documents(
{'partner_owner_recid': str(my_partner['recid']),
'config_name': 'signature_digital',
'valide': '1',
'locked': '0',
'config_value': '1'})
if (is_signature_digital_count == 1):
is_partner_digital_signature = "1"
if( "request_digital_signature" in diction.keys() and diction['request_digital_signature'] == "1"):
is_signature_digital_count = MYSY_GV.dbname['base_partner_setup'].count_documents(
{'partner_owner_recid': str(my_partner['recid']),
'config_name': 'signature_digital',
'valide': '1',
'locked': '0',
'config_value': '1'})
if (is_signature_digital_count == 1):
is_partner_digital_signature = "1"
@ -9719,8 +9781,8 @@ def Sent_Convention_Stagiaire_By_Email_By_Partner_client(tab_files_name_full_pat
sourceHtml = contenu_doc_Template.render(params=body["params"])
new_model_courrier_with_code_tag = str(sourceHtml) + "<br/> <div> Lien sécurisé = {{ params.mysy_url_securite }} </div> <br/> " \
" <p style='width: 300px; text-align: center;'> <img style='height:200px; width:200px;' src='{{ params.mysy_qrcode_securite }}'>&nbsp;</p> "
new_model_courrier_with_code_tag = str(sourceHtml) + " <p style='width: 300px; text-align: right;'> Signature Client <br/> <img style='height:250px; width:250px;' src='{{ params.mysy_manual_signature_img }}'>&nbsp;</p> <br/> " \
" <p style='width: 300px; text-align: center;'> <img style='height:150px; width:150px;' src='{{ params.mysy_qrcode_securite }}'>&nbsp;</p> "

File diff suppressed because one or more lines are too long

View File

@ -4329,6 +4329,10 @@ def Prepare_and_Send_Convention_From_Session_By_Email(tab_files, Folder, diction
new_diction_client['email_test'] = diction['email_test']
new_diction_client['email_production'] = str(list_local_email_production)
new_diction_client['session_id'] = diction['session_id']
new_diction_client['request_digital_signature'] = ""
if( "request_digital_signature" in diction.keys() ):
new_diction_client['request_digital_signature'] = diction['request_digital_signature']
print(" ##### new_diction_client 0102 = ", new_diction_client)
@ -4367,6 +4371,9 @@ def Prepare_and_Send_Convention_From_Session_By_Email(tab_files, Folder, diction
new_diction_no_client['session_id'] = diction['session_id']
new_diction_no_client['email_test'] = diction['email_test']
new_diction_no_client['email_production'] = diction['email_production']
new_diction_no_client['request_digital_signature'] = ""
if ("request_digital_signature" in diction.keys()):
new_diction_no_client['request_digital_signature'] = diction['request_digital_signature']
print(" ##### new_diction_no_client = ", new_diction_no_client)
local_status, local_retval = Inscription_mgt.Sent_Convention_Stagiaire_By_Email(tab_saved_file_full_path, Folder, new_diction_no_client)
@ -4626,6 +4633,9 @@ def Prepare_and_Send_Default_Convention_From_Session_By_Email(tab_files, Folder,
new_diction_client['session_id'] = diction['session_id']
new_diction_client['request_digital_signature'] = ""
if ("request_digital_signature" in diction.keys()):
new_diction_client['request_digital_signature'] = diction['request_digital_signature']
local_status, local_retval = Inscription_mgt.Sent_Convention_Stagiaire_By_Email_By_Partner_client(tab_saved_file_full_path, Folder, new_diction_client)

View File

@ -243,7 +243,7 @@ Alogo :
"""
def Create_Automatic_Sequence(diction):
def Create_Automatic_Sequence_ORIG(diction):
try:
diction = mycommon.strip_dictionary(diction)
@ -412,7 +412,7 @@ def Create_Automatic_Sequence(diction):
date_debut_session = datetime.strptime(str(date_debut_session), '%d/%m/%Y')
date_fin_session = datetime.strptime(str(date_fin_session), '%d/%m/%Y')
print(" les jours travaillé ")
liste_jours_travaille = []
liste_jours_travaille_code_day = []
if ("jours" in is_existe_valide_journee_model_data.keys()):
@ -492,6 +492,379 @@ def Create_Automatic_Sequence(diction):
"""
Cette fonction des sequences automatiques en travaillant en fonction des options :
- option = 0 ==> on prend le calendrier
- option = 1 ==> on prend la demi-journée
- option = 2 ==> on prend la journée
"""
def Create_Automatic_Sequence(diction):
try:
diction = mycommon.strip_dictionary(diction)
"""
Verification des input acceptés
"""
field_list = ['token', 'session_id', 'jounree_modele_id', 'option' ]
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é")
return False, " Les informations fournies sont incorrectes"
"""
Verification des champs obligatoires
"""
field_list_obligatoire = ['token', 'session_id', 'jounree_modele_id', 'option' ]
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 liste ")
return False, " Les informations fournies sont incorrectes"
"""
Verification de l'identité et autorisation de l'entité qui
appelle cette API
"""
token = ""
if ("token" in diction.keys()):
if diction['token']:
token = diction['token']
if( diction['option'] not in MYSY_GV.EMARGEMENT_OPTION ):
mycommon.myprint(
str(inspect.stack()[0][3]) + " La valeur '" + diction['option'] + "' n'est pas autorisé. Les valeurs autorisées sont : "+str(MYSY_GV.EMARGEMENT_OPTION))
return False, " La valeur '" + diction['option'] + "' n'est pas autorisé. Les valeurs autorisées sont : "+str(MYSY_GV.EMARGEMENT_OPTION)
local_status, my_partner = mycommon.Check_Connexion_And_Return_Partner_Data(diction)
if (local_status is not True):
return local_status, my_partner
# Verification de l'existence et de la session
is_existe_valide_session_id = MYSY_GV.dbname["session_formation"].count_documents(
{'_id': ObjectId(str(diction['session_id'])),
'partner_owner_recid': str(my_partner['recid']),
'valide': '1'})
if (is_existe_valide_session_id <= 0):
mycommon.myprint(
str(inspect.stack()[0][3]) + " - L'identifiant de la session n'est pas valide ")
return False, "L'identifiant de la session n'est pas valide "
"""
Si le "jounree_modele_id" est vide, cela veut dire qu'il faut aller chercher le modele par default
"""
jounree_modele_id = ""
if (str(diction['jounree_modele_id']) == ""):
jounree_modele_data = MYSY_GV.dbname['base_config_modele_journee'].find_one(
{'partner_owner_recid': str(my_partner['recid']),
'valide': '1', 'locked': '0'})
if (jounree_modele_data is None):
# On ne trouve pas de modele par defaut pour ce client. On va aller le chercher le modele par defaut de MySy
jounree_modele_data_mysy = MYSY_GV.dbname['base_config_modele_journee'].find_one(
{'partner_owner_recid': "default", 'valide': '1', 'locked': '0'})
if (jounree_modele_data_mysy is None):
mycommon.myprint(
str(inspect.stack()[0][3]) + " - Aucun modèle de journée n'est configuré dans le système ")
return False, " Aucun modèle de journée n'est configuré dans le système "
jounree_modele_id = str(jounree_modele_data_mysy['_id'])
else:
jounree_modele_id = str(jounree_modele_data['_id'])
else:
jounree_modele_id = str(diction['jounree_modele_id'])
if (str(jounree_modele_id).strip() == ""):
mycommon.myprint(
str(inspect.stack()[0][3]) + " - Aucun modèle de journée n'est configuré dans le système (2) ")
return False, " Aucun modèle de journée n'est configuré dans le système (2) "
# Verification de l'existence du modele de journée
is_existe_valide_journee_model_id = MYSY_GV.dbname["base_config_modele_journee"].count_documents(
{'_id': ObjectId(str(jounree_modele_id)),
'partner_owner_recid': str(my_partner['recid']),
'valide': '1', 'locked': '0'})
if (is_existe_valide_journee_model_id <= 0):
mycommon.myprint(
str(inspect.stack()[0][3]) + " - L'identifiant du modèle de journee n'est pas valide ")
return False, " L'identifiant du modèle de journee n'est pas valide "
# Recuperation des data de la journée modele
is_existe_valide_journee_model_data = MYSY_GV.dbname["base_config_modele_journee"].find_one(
{'_id': ObjectId(str(jounree_modele_id)),
'partner_owner_recid': str(my_partner['recid']),
'valide': '1', 'locked': '0'})
is_existe_valide_session_data = MYSY_GV.dbname["session_formation"].find_one(
{'_id': ObjectId(str(diction['session_id'])),
'partner_owner_recid': str(my_partner['recid']),
'valide': '1'})
date_debut_session = ""
if ("date_debut" in is_existe_valide_session_data.keys()):
if is_existe_valide_session_data['date_debut']:
date_debut_session = str(is_existe_valide_session_data['date_debut'])[0:10]
local_status = mycommon.CheckisDate(date_debut_session)
if (local_status is False):
mycommon.myprint(
str(inspect.stack()[0][
3]) + " La date de debut de session " + str(
date_debut_session) + " n'est pas au format 'jj/mm/aaaa' ")
return False, " La date de debut de session " + str(
date_debut_session) + " n'est pas au format 'jj/mm/aaaa' "
date_fin_session = ""
if ("date_fin" in is_existe_valide_session_data.keys()):
if is_existe_valide_session_data['date_fin']:
date_fin_session = str(is_existe_valide_session_data['date_fin'])[0:10]
local_status = mycommon.CheckisDate(date_fin_session)
if (local_status is False):
mycommon.myprint(
str(inspect.stack()[0][
3]) + " La date de fin de session " + str(
date_fin_session) + " n'est pas au format 'jj/mm/aaaa'")
return False, " La date de fin de session " + str(
date_fin_session) + " n'est pas au format 'jj/mm/aaaa'"
date_debut_session = datetime.strptime(str(date_debut_session), '%d/%m/%Y')
date_fin_session = datetime.strptime(str(date_fin_session), '%d/%m/%Y')
liste_jours_travaille = []
liste_jours_travaille_code_day = []
if ("jours" in is_existe_valide_journee_model_data.keys()):
for jour in is_existe_valide_journee_model_data['jours']:
if (str(jour['travail']) == "1"):
liste_jours_travaille.append(str(jour['jour']))
liste_jours_travaille_code_day.append(str(jour['day_name']))
"""
/!\ 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']), }):
deleted_data_agenda = MYSY_GV.dbname['agenda'].delete_many({'sequence_session_id': str(local_retval['_id']),
'partner_owner_recid': str(
my_partner['recid']), })
deleted_data_affectation = MYSY_GV.dbname['session_formation_sequence_affectation'].delete_many(
{'sequence_session_id': str(local_retval['_id']),
'partner_owner_recid': str(my_partner['recid']), })
deleted_data_sequence = MYSY_GV.dbname['session_formation_sequence'].delete_many(
{'session_id': str(diction['session_id']),
'partner_owner_recid': str(my_partner['recid']), })
cpt = 10
nb_sequence = 0
for single_date in mycommon.daterange(date_debut_session, date_fin_session):
# print(single_date.strftime("%Y-%m-%d"))
# print(single_date.strftime("%A"))
# print(" Les date off sont : ", is_existe_valide_journee_model_data['date_off'])
date_jour = str(single_date.strftime("%Y-%m-%d"))
jour_name = single_date.strftime("%A")
# Recuperation des sequences associées à jour_name
jours_name_list_sequence = is_existe_valide_journee_model_data[jour_name]["tab_sequence"]
# print(" ### les sequences du ", jour_name, " sont ", jours_name_list_sequence)
#
if( diction['option'] == "1"):
# Sequences / Emargement à la demi journée (matin & apres midi )
# Vu qu'on prend les journée
#Verifer que le jour n'est pas off. (ex : les dimanches sont paramettré comme off)
is_off_day_of_week = "0"
if (str(jour_name) in is_existe_valide_journee_model_data.keys()):
is_off_day_of_week = is_existe_valide_journee_model_data[str(jour_name)]['is_off_day']
# Verifier que ce n'est pas une date off (ex : 01/01/aaaa)
if (date_jour not in is_existe_valide_journee_model_data['date_off'] and is_off_day_of_week != "1"):
# La sequence de la matinée
# Recuperation des heures de debut et fin des matinée et appres midi
matine_heure_debut = ""
matine_heure_fin = ""
apres_midi_heure_debut = ""
apres_midi_heure_fin = ""
if( "decoupage_journee" in is_existe_valide_journee_model_data.keys()):
if( "matinee_debut" in is_existe_valide_journee_model_data['decoupage_journee'].keys() ):
matine_heure_debut = is_existe_valide_journee_model_data['decoupage_journee']['matinee_debut']
if ("matinee_fin" in is_existe_valide_journee_model_data['decoupage_journee'].keys()):
matine_heure_fin = is_existe_valide_journee_model_data['decoupage_journee'][
'matinee_fin']
if ("apres_midi_debut" in is_existe_valide_journee_model_data['decoupage_journee'].keys()):
apres_midi_heure_debut = is_existe_valide_journee_model_data['decoupage_journee'][
'apres_midi_debut']
if ("apres_midi_fin" in is_existe_valide_journee_model_data['decoupage_journee'].keys()):
apres_midi_heure_fin = is_existe_valide_journee_model_data['decoupage_journee'][
'apres_midi_fin']
if( matine_heure_debut == "" or matine_heure_fin == "" or apres_midi_heure_debut == "" or apres_midi_heure_fin == ""):
mycommon.myprint(str(
inspect.stack()[0][3]) + " La configuration de decoupage de la journée en matinée et apres midi est invalide ")
return False, " La configuration de decoupage de la journée en matinée et apres midi est invalide "
sequence_data = {}
sequence_data['token'] = diction['token']
sequence_data['session_id'] = diction['session_id']
sequence_data['sequence_title'] = "Seq_Auto_" + str(cpt)
sequence_data['sequence_start'] = str(single_date.strftime("%d/%m/%Y")) + " "+str(matine_heure_debut)
sequence_data['sequence_end'] = str(single_date.strftime("%d/%m/%Y")) + " "+str(matine_heure_fin)
# print(" ### sequence_data = ", sequence_data)
local_status, local_val = Add_Session_Sequence(sequence_data)
if (local_status is False):
mycommon.myprint(
str(inspect.stack()[0][3]) + " WARNING : " + str(local_val))
else:
nb_sequence = nb_sequence + 1
# La sequence de la l'apres midi
sequence_data = {}
sequence_data['token'] = diction['token']
sequence_data['session_id'] = diction['session_id']
sequence_data['sequence_title'] = "Seq_Auto_" + str(cpt)
sequence_data['sequence_start'] = str(single_date.strftime("%d/%m/%Y")) + " "+str(apres_midi_heure_debut)
sequence_data['sequence_end'] = str(single_date.strftime("%d/%m/%Y")) + " "+str(apres_midi_heure_fin)
# print(" ### sequence_data = ", sequence_data)
local_status, local_val = Add_Session_Sequence(sequence_data)
if (local_status is False):
mycommon.myprint(
str(inspect.stack()[0][3]) + " WARNING : " + str(local_val))
else:
nb_sequence = nb_sequence + 1
cpt = cpt + 1
# Pour chaque sequence de la journée
if (diction['option'] == "2"):
# Sequences / Emargement à la journée
# Verifer que le jour n'est pas off. (ex : les dimanches sont paramettré comme off)
is_off_day_of_week = "0"
if (str(jour_name) in is_existe_valide_journee_model_data.keys()):
is_off_day_of_week = is_existe_valide_journee_model_data[str(jour_name)]['is_off_day']
if (date_jour not in is_existe_valide_journee_model_data['date_off'] and is_off_day_of_week != "1"):
# Recuperation des heures de debut et fin des matinée et appres midi
matine_heure_debut = ""
matine_heure_fin = ""
apres_midi_heure_debut = ""
apres_midi_heure_fin = ""
if ("decoupage_journee" in is_existe_valide_journee_model_data.keys()):
if ("matinee_debut" in is_existe_valide_journee_model_data['decoupage_journee'].keys()):
matine_heure_debut = is_existe_valide_journee_model_data['decoupage_journee'][
'matinee_debut']
if ("matinee_fin" in is_existe_valide_journee_model_data['decoupage_journee'].keys()):
matine_heure_fin = is_existe_valide_journee_model_data['decoupage_journee'][
'matinee_fin']
if ("apres_midi_debut" in is_existe_valide_journee_model_data['decoupage_journee'].keys()):
apres_midi_heure_debut = is_existe_valide_journee_model_data['decoupage_journee'][
'apres_midi_debut']
if ("apres_midi_fin" in is_existe_valide_journee_model_data['decoupage_journee'].keys()):
apres_midi_heure_fin = is_existe_valide_journee_model_data['decoupage_journee'][
'apres_midi_fin']
if (
matine_heure_debut == "" or matine_heure_fin == "" or apres_midi_heure_debut == "" or apres_midi_heure_fin == ""):
mycommon.myprint(str(
inspect.stack()[0][
3]) + " La configuration de decoupage de la journée en matinée et apres midi est invalide ")
return False, " La configuration de decoupage de la journée en matinée et apres midi est invalide "
sequence_data = {}
sequence_data['token'] = diction['token']
sequence_data['session_id'] = diction['session_id']
sequence_data['sequence_title'] = "Seq_Auto_" + str(cpt)
sequence_data['sequence_start'] = str(single_date.strftime("%d/%m/%Y")) + " "+str(matine_heure_debut)
sequence_data['sequence_end'] = str(single_date.strftime("%d/%m/%Y")) + " "+str(apres_midi_heure_fin)
# print(" ### sequence_data = ", sequence_data)
local_status, local_val = Add_Session_Sequence(sequence_data)
if (local_status is False):
mycommon.myprint(
str(inspect.stack()[0][3]) + " WARNING : " + str(local_val))
else:
nb_sequence = nb_sequence + 1
cpt = cpt + 1
else:
# Si pas la journée, ni la demi journée alors on crée les sequences selon le calendrier
# print(" ### les sequences du ", jour_name, " sont ", jours_name_list_sequence)
# Pour chaque sequence de la journée
if (date_jour not in is_existe_valide_journee_model_data['date_off']):
for local_val in jours_name_list_sequence:
sequence_data = {}
sequence_data['token'] = diction['token']
sequence_data['session_id'] = diction['session_id']
sequence_data['sequence_title'] = "Seq_Auto_" + str(cpt)
sequence_data['sequence_start'] = str(single_date.strftime("%d/%m/%Y")) + " " + str(
local_val['heure_debut']).strip()
sequence_data['sequence_end'] = str(single_date.strftime("%d/%m/%Y")) + " " + str(
local_val['heure_fin']).strip()
# print(" ### sequence_data = ", sequence_data)
local_status, local_val = Add_Session_Sequence(sequence_data)
if (local_status is False):
mycommon.myprint(
str(inspect.stack()[0][3]) + " WARNING : " + str(local_val))
else:
nb_sequence = nb_sequence + 1
cpt = cpt + 1
return True, str(nb_sequence) + " séquence(s) automatiquement créée(s) "
except Exception as e:
exc_type, exc_obj, exc_tb = sys.exc_info()
mycommon.myprint(str(inspect.stack()[0][3]) + " -" + str(e) + " - Line : " + str(exc_tb.tb_lineno))
return False, " Impossible de créer automatiquement les séquences "
"""

View File

@ -73,7 +73,7 @@ def Add_CRM_Opportunite(diction):
"""
field_list = ['token', 'partner_client_id', 'contact_civilite', 'contact_nom', 'contact_email', 'contact_telephone',
'titre', 'description', 'revenu_cible', 'probabilite_gain', 'statut_id', 'priorite', 'commentaire',
'vendeur_id', 'date_fermeture']
'vendeur_id', 'date_fermeture', 'raison_perte', 'raison_gain' ]
incom_keys = diction.keys()
for val in incom_keys:
@ -199,7 +199,7 @@ def Update_CRM_Opportunite(diction):
"""
field_list = ['token', 'partner_client_id', 'contact_civilite', 'contact_nom', 'contact_email', 'contact_telephone',
'titre', 'description', 'revenu_cible', 'probabilite_gain', 'statut_id', 'priorite', 'commentaire',
'vendeur_id', 'date_fermeture', 'opport_id']
'vendeur_id', 'date_fermeture', 'opport_id', 'date_fermeture', 'raison_perte', 'raison_gain',]
incom_keys = diction.keys()
for val in incom_keys:

View File

@ -1929,7 +1929,7 @@ def SendEmargementMail( diction):
A présent que la demande d'émargement est envoyée, on met à jour la collection 'emargement' pour
dire que la demande a été envoyé, et quel jour
"""
now = str(datetime.datetime.now().strftime("%d/%m/%Y, %H:%M:%S"))
now = str(datetime.datetime.now().strftime("%d/%m/%Y %H:%M:%S"))
updata_data = {}
updata_data['date_update'] = now
updata_data['update_by'] = str(my_partner['_id'])

View File

@ -469,6 +469,9 @@ def GetTableauEmargement(diction):
if ("date_envoi" not in retval.keys()):
user['date_envoi'] = ""
if ("date_emargement" not in retval.keys()):
user['date_emargement'] = ""
user['id'] = str(val_tmp)
RetObject.append(mycommon.JSONEncoder().encode(user))
val_tmp = val_tmp + 1

25
main.py
View File

@ -2170,7 +2170,7 @@ API : pour préparer et envoyer les convention en partant d'une session
def Prepare_and_Send_Convention_From_Session_By_Email():
# On recupere le corps (payload) de la requete
payload = mycommon.strip_dictionary (request.form.to_dict())
print(" ### Prepare_Convention_From_Session_By_Email : payload = ",str(payload))
print(" ### Prepare_and_Send_Convention_From_Session_By_Email : payload = ",str(payload))
file = []
if request.method == 'POST':
@ -7971,6 +7971,20 @@ def Configure_Partner_Init_Setup_No_Token():
return jsonify(status=status, message=retval)
"""
API permet de savoir si un partenaire dispose de la signature digital
"""
@app.route('/myclass/api/Is_Partnair_Has_Digital_Signature/', methods=['POST','GET'])
@crossdomain(origin='*')
def Is_Partnair_Has_Digital_Signature():
# On recupere le corps (payload) de la requete
payload = mycommon.strip_dictionary (request.form.to_dict())
print(" ### Is_Partnair_Has_Digital_Signature payload = ",payload)
status, retval = mycommon.Is_Partnair_Has_Digital_Signature(payload)
return jsonify(status=status, message=retval)
"""
API pour ajouter un document electronique à signer
@ -8023,13 +8037,20 @@ def Create_E_Signature_For_E_Document():
payload = mycommon.strip_dictionary (request.form.to_dict())
print(" ### Create_E_Signature_For_E_Document payload = ",payload)
file_img = None
if request.method == 'POST':
# Create variable for uploaded file
if ('signature_img' in request.files.keys()):
file_img = request.files['signature_img']
user_ip = ""
headers_list = request.headers.getlist("X-Forwarded-For")
user_ip = headers_list[0] if headers_list else request.remote_addr
payload['user_ip'] = user_ip
status, retval = E_Sign_Document.Create_E_Signature_For_E_Document(payload)
status, retval = E_Sign_Document.Create_E_Signature_For_E_Document(file_img, MYSY_GV.TEMPORARY_DIRECTORY_V2, payload)
return jsonify(status=status, message=retval)

File diff suppressed because it is too large Load Diff