master
cherif 2024-04-21 19:13:15 +02:00
parent e32e0457d5
commit 8cc1075ba9
6 changed files with 1758 additions and 14 deletions

View File

@ -7,9 +7,7 @@
<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$/main.py" beforeDir="false" afterPath="$PROJECT_DIR$/main.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/partner_client.py" beforeDir="false" afterPath="$PROJECT_DIR$/partner_client.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/partner_document_mgt.py" beforeDir="false" afterPath="$PROJECT_DIR$/partner_document_mgt.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/prj_common.py" beforeDir="false" afterPath="$PROJECT_DIR$/prj_common.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/partner_order.py" beforeDir="false" afterPath="$PROJECT_DIR$/partner_order.py" afterDir="false" />
</list>
<option name="SHOW_DIALOG" value="false" />
<option name="HIGHLIGHT_CONFLICTS" value="true" />

View File

@ -74,7 +74,7 @@ def AddStagiairetoClass(diction):
'tuteur1_cp', 'tuteur1_ville', 'tuteur1_pays', 'tuteur1_include_com',
'tuteur2_nom', 'tuteur2_prenom', 'tuteur2_email', 'tuteur2_telephone', 'tuteur2_adresse',
'tuteur2_cp', 'tuteur2_ville', 'tuteur2_pays', 'tuteur2_include_com','date_naissance',
'financeur_rattachement_id', 'tuteur1_civilite', 'tuteur1_civilite'
'financeur_rattachement_id', 'tuteur1_civilite', 'tuteur1_civilite', 'quotation_id'
]
incom_keys = diction.keys()
@ -217,6 +217,27 @@ def AddStagiairetoClass(diction):
nom = str(diction['nom']).strip()
mydata['nom'] = nom
quotation_id = ""
if ("quotation_id" in diction.keys()):
if diction['quotation_id']:
quotation_id = str(diction['quotation_id']).strip()
is_valide_qotation = MYSY_GV.dbname['partner_order_header'].count_documents(
{'_id': ObjectId(str(diction['quotation_id'])),
'partner_owner_recid': str(my_partner['recid']),
'order_header_type': 'devis',
'valide': '1',
'locked': '0'})
if (is_valide_qotation != 1):
mycommon.myprint(
str(inspect.stack()[0][3]) + " L'identifiant du devis n'est pas valide ")
return False, " L'identifiant du devis n'est pas valide "
mydata['quotation_id'] = quotation_id
prenom = ""
if ("prenom" in diction.keys()):
if diction['prenom']:
@ -363,7 +384,7 @@ def AddStagiairetoClass(diction):
if diction['price']:
new_price = str(diction['price']).strip()
mydata['price'] = str(diction['price']).strip()
print(" aGRRRRRRRRRRRRRRRRRRR ")
# Verification des prix. si new_price = "-1" cela veut dire qu'il n'a pas de prix dans le diction ni sur la session
# Alors on va chercher le prix (prix public sans reduction) sur la formation
@ -444,7 +465,7 @@ def AddStagiairetoClass(diction):
"""
update du 25/08/23
On ne declenche l'envoie d'un email que l'inscription est soit :
- Preinscrit soit
- Preinscrit (hors reservation automatique - validation devis) soit
- inscrit soit
- annulé.
@ -455,7 +476,13 @@ def AddStagiairetoClass(diction):
if( inserted_id ):
# On verifie que le statut de l'inscription n'est pas (2 : en cours) avant de declencher des envoies d'email
if( new_status != "2"):
"""
update 21/04/2024 -
si le champs devis est remplis, alors il s'agit d'une inscription qui vient de la validation automatique d'un devis
pour le moment, dans ce cas figure, vu que les email ne sont pas bon car il s'agit d'un resa, alors on ne declenche
pas d'envoie d'email
"""
if( new_status != "2" and quotation_id == ""):
# Le stagaire a bien ete inseré, on declenche l'envoi des emaisl
## Envoie de l'email de preinscription
@ -465,7 +492,7 @@ def AddStagiairetoClass(diction):
mail_data['session_id'] = diction['session_id']
mail_data['inscription_id'] = ret_val['_id']
print(" ### l'inscription est ok, il faut declencher l'envoi des email a "+str(mail_data))
#print(" ### l'inscription est ok, il faut declencher l'envoi des email a "+str(mail_data))
local_status, message = SendPre_InscriptionEmail(mail_data)
if( local_status is False):
mycommon.myprint(" WARNING : Impossible d'envoyer le mail de preinscriton à "+

File diff suppressed because it is too large Load Diff

View File

@ -512,7 +512,7 @@ def Add_Update_SessionFormation(diction):
" WARNING : Impossible de logguer l'historique pour l'évènement : " + str(history_event_dict))
print("len(str(Warning_Message)) = ", len(str(Warning_Message)), )
#print("len(str(Warning_Message)) = ", len(str(Warning_Message)), )
if(len(str(Warning_Message)) > 2 ):
return True, str(Warning_Message)

22
main.py
View File

@ -5914,11 +5914,9 @@ def Convert_Quotation_to_Order():
"""
API pour mettre la commande 'pret pour facturation'
"""
"""
Conversion d'un devis en commande
API pour Conversion d'un devis en commande
"""
@app.route('/myclass/api/Order_Ready_To_Invoice/', methods=['GET','POST'])
@crossdomain(origin='*')
def Order_Ready_To_Invoice():
@ -5930,6 +5928,22 @@ def Order_Ready_To_Invoice():
"""
API qui permet qu'a la validation d'un devis ayant une session associée
de d'aller reserver les place dans la session.
"""
@app.route('/myclass/api/Insert_Quotation_To_Session/', methods=['GET','POST'])
@crossdomain(origin='*')
def Insert_Quotation_To_Session():
# On recupere le corps (payload) de la requete
payload = mycommon.strip_dictionary (request.form.to_dict())
print(" ### Insert_Quotation_To_Session payload = ", str(payload))
status, message = partner_order.Insert_Quotation_To_Session(payload)
return jsonify(status=status, message=message)
"""
API de recuperation de tous les champs personnalisables dans un document

View File

@ -18,6 +18,8 @@ import json
from bson import ObjectId
import re
from datetime import datetime
import Inscription_mgt
import prj_common as mycommon
import secrets
import inspect
@ -5198,4 +5200,226 @@ def Order_Ready_To_Invoice(diction):
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 mettre à jour le document "
return False, " Impossible de mettre à jour le document "
"""
Cette fonction permet qu'a la validation d'un devis ayant une session associée
de d'aller reserver les place dans la session.
ceci n'est possible que si la session n'est pas depassée et
qu'on ne parle de que personne "preinscrit"
algo :
A la validation, pour chaque ligne du devis,
1 - On supprimer toutes les preinscriptions dans la session ayant la valeur du devis
2 - On insert de nouvelles lignes qui auront :
nom = num_devis_Nom_cpt
prenom = num_devis_Prenom_cpt
email = num_devis_cpt@email.com
"""
def Insert_Quotation_To_Session(diction):
try:
# Dictionnaire des champs utilisables
'''
# 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', 'quotation_id' ]
incom_keys = diction.keys()
for val in incom_keys:
if val not in field_list and val.startswith('my_') is False:
mycommon.myprint(str(inspect.stack()[0][3]) + " - Le champ '" + val + "' n'est pas autorisé")
return False, "Impossible de créer le stagiaire. Toutes les informations fournies ne sont pas valables"
"""
Verification de la liste des champs obligatoires
"""
field_list_obligatoire = ['token', 'quotation_id' ]
for val in field_list_obligatoire:
if val not in diction:
mycommon.myprint(
str(inspect.stack()[0][3]) + " - : La valeur '" + val + "' n'est pas presente dans liste ")
return False, "Impossible de créer le stagiaire. La valeur '" + val + "' n'est pas presente dans liste"
local_status, my_partner = mycommon.Check_Connexion_And_Return_Partner_Data(diction)
if (local_status is not True):
return local_status, my_partner
"""
Verifier la validité du devis
"""
is_valide_qotation = MYSY_GV.dbname['partner_order_header'].count_documents({'_id':ObjectId(str(diction['quotation_id'])),
'partner_owner_recid':str(my_partner['recid']),
'order_header_type':'devis',
'valide':'1',
'locked':'0'})
if(is_valide_qotation != 1 ):
mycommon.myprint(
str(inspect.stack()[0][3]) + " L'identifiant du devis n'est pas valide ")
return False, " L'identifiant du devis n'est pas valide "
is_valide_qotation_data = MYSY_GV.dbname['partner_order_header'].find_one(
{'_id': ObjectId(str(diction['quotation_id'])),
'partner_owner_recid': str(my_partner['recid']),
'order_header_type': 'devis',
'valide': '1',
'locked': '0'})
if ("order_header_date_expiration" in is_valide_qotation_data.keys() and is_valide_qotation_data['order_header_date_expiration']):
qotation_date_expiration = str(is_valide_qotation_data['order_header_date_expiration']).strip()[0:10]
if (mycommon.CheckisDate(qotation_date_expiration) is False):
mycommon.myprint(
str(inspect.stack()[0][3]) + " La date d'expiration du devis n'est pas au format jj/mm/aaaa ")
return False, " La date d'expiration du devis n'est pas au format jj/mm/aaaa "
date_today = datetime.now().strftime("%d/%m/%Y")
if (datetime.strptime(str(qotation_date_expiration), '%d/%m/%Y') <= datetime.strptime(str(date_today), '%d/%m/%Y')):
mycommon.myprint(
str(inspect.stack()[0][
3]) + " La date d'expiration du devis " + str(qotation_date_expiration) + " est déjà dépassée ")
return False, " La date d'expiration du devis " + str(qotation_date_expiration) + " est déjà dépassée "
warning_msg = ""
is_warning = ""
"""
Recuperer les lignes du devis
"""
nb_resa_line = 0
for qotation_line in MYSY_GV.dbname['partner_order_line'].find({'order_header_id':str(diction['quotation_id']),
'partner_owner_recid':str(my_partner['recid']),
'order_line_type':'devis',
'valide':'1',
'locked':'0'}):
if( "order_line_session_id" in qotation_line.keys() and qotation_line['order_line_session_id']):
print(" ### la ligne suivant a une order_line_session_id : ", qotation_line)
# Verifier la validité de la session
is_order_line_session_id_valide = MYSY_GV.dbname['session_formation'].count_documents({'_id':ObjectId(str(qotation_line['order_line_session_id'])),
'valide':'1',
'partner_owner_recid':str(my_partner['recid'])})
if( is_order_line_session_id_valide != 1 ):
mycommon.myprint(
str(inspect.stack()[0][3]) + " L'identifiant de la session de formation n'est pas valide ")
return False, " L'identifiant de la session de formation n'est pas valide "
is_order_line_session_id_data = MYSY_GV.dbname['session_formation'].find_one(
{'_id': ObjectId(str(qotation_line['order_line_session_id'])),
'valide': '1',
'partner_owner_recid': str(my_partner['recid'])})
session_date_du = str(is_order_line_session_id_data['date_debut']).strip()[0:10]
if( mycommon.CheckisDate(session_date_du) is False ):
mycommon.myprint(
str(inspect.stack()[0][3]) + " La date de debut de session n'est pas au format jj/mm/aaaa ")
return False, " La date de debut de session n'est pas au format jj/mm/aaaa "
date_today = datetime.now().strftime("%d/%m/%Y")
if (datetime.strptime(str(session_date_du), '%d/%m/%Y') <= datetime.strptime( str(date_today), '%d/%m/%Y')):
mycommon.myprint(
str(inspect.stack()[0][
3]) + " La date de debut de session "+str(session_date_du)+" est déjà dépassée ")
return False, " La date de debut de session "+str(session_date_du)+" est déjà dépassée "
"""
1 - Suppression des eventuelles preinscrit dans cette session ayant le meme devis
"""
MYSY_GV.dbname['inscription'].delete_many({'partner_owner_recid':str(my_partner['recid']),
'session_id':str(qotation_line['order_line_session_id']),
'status':'0',
'quotation_id':str(diction['quotation_id'])})
"""
2 - Inserer les nouvelles lignes
"""
line_qotation_qty = mycommon.tryInt(str(qotation_line['order_line_qty']))
cpt = 0
while( cpt < line_qotation_qty ):
cpt = cpt + 1
new_data = {}
new_data['nom'] = str(qotation_line['order_header_ref_interne'])+"_Reservation_Nom_"+str(cpt)
new_data['prenom'] = str(qotation_line['order_header_ref_interne']) + "_Reservation_Prenom_" + str(cpt)
new_data['email'] = str(qotation_line['order_header_ref_interne']) + "_Reservation_mail_" + str(cpt)+"@mail.com"
new_data['telephone'] = "01010101"
new_data['modefinancement'] = ""
new_data['class_internal_url'] = str(is_order_line_session_id_data['class_internal_url'])
new_data['session_id'] = str(qotation_line['order_line_session_id'])
new_data['token'] = str(diction['token'])
new_data['client_rattachement_id'] = str(is_valide_qotation_data['order_header_client_id'])
new_data['civilite'] = "neutre"
new_data['quotation_id'] = str(qotation_line['order_header_id'])
new_data['status'] = "0"
local_insert_status, local_insert_retval = Inscription_mgt.AddStagiairetoClass(new_data)
if( local_insert_status is False ):
is_warning = "1"
warning_msg = warning_msg + "\n" + str(local_insert_retval)
else:
nb_resa_line = nb_resa_line + 1
"""
Mettre à jour du devis avec la date de validation et de reservation
"""
now = str(datetime.now())
update_data = {}
update_data['date_update'] = now
update_data['update_by'] = str(my_partner['_id'])
update_data['date_validation'] = now
update_data['date_reservation'] = now
update_data['mode_reservation'] = "automatique"
update_data['validation_by'] = str(my_partner['_id'])
update_data['reservation_by'] = str(my_partner['_id'])
MYSY_GV.dbname['partner_order_header'].update_many({'_id': ObjectId(str(diction['quotation_id'])),
'partner_owner_recid': str(my_partner['recid']),
'order_header_type': 'devis',
'valide': '1',
'locked': '0'},
{"$set": update_data},
)
if (is_warning == "1"):
return True, str(warning_msg)
return True, " Le devis a été correctement mis à jour. ("+str(nb_resa_line)+") réservation(s) faite(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 créer / mettre à jour la session de formation"