master
cherif 2024-05-12 17:35:08 +02:00
parent dc2d857421
commit 64ead66d7c
5 changed files with 7485 additions and 54 deletions

View File

@ -1,11 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<project version="4"> <project version="4">
<component name="ChangeListManager"> <component name="ChangeListManager">
<list default="true" id="c6d0259a-16e1-410d-91a1-830590ee2a08" name="Changes" comment="gdf"> <list default="true" id="c6d0259a-16e1-410d-91a1-830590ee2a08" name="Changes" comment="dd">
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" /> <change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
<change beforePath="$PROJECT_DIR$/GlobalVariable.py" beforeDir="false" afterPath="$PROJECT_DIR$/GlobalVariable.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.py" beforeDir="false" afterPath="$PROJECT_DIR$/Job_Cron.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$/Log/log_file.log" beforeDir="false" afterPath="$PROJECT_DIR$/Log/log_file.log" afterDir="false" />
<change beforePath="$PROJECT_DIR$/main.py" beforeDir="false" afterPath="$PROJECT_DIR$/main.py" afterDir="false" /> <change beforePath="$PROJECT_DIR$/partner_order.py" beforeDir="false" afterPath="$PROJECT_DIR$/partner_order.py" afterDir="false" />
</list> </list>
<option name="SHOW_DIALOG" value="false" /> <option name="SHOW_DIALOG" value="false" />
<option name="HIGHLIGHT_CONFLICTS" value="true" /> <option name="HIGHLIGHT_CONFLICTS" value="true" />
@ -75,13 +76,6 @@
<option name="presentableId" value="Default" /> <option name="presentableId" value="Default" />
<updated>1680804787304</updated> <updated>1680804787304</updated>
</task> </task>
<task id="LOCAL-00245" summary="20/03/2024 - 22h30">
<created>1710970329202</created>
<option name="number" value="00245" />
<option name="presentableId" value="LOCAL-00245" />
<option name="project" value="LOCAL" />
<updated>1710970329203</updated>
</task>
<task id="LOCAL-00246" summary="20/03/2024 - 22h30d"> <task id="LOCAL-00246" summary="20/03/2024 - 22h30d">
<created>1711130098363</created> <created>1711130098363</created>
<option name="number" value="00246" /> <option name="number" value="00246" />
@ -418,7 +412,14 @@
<option name="project" value="LOCAL" /> <option name="project" value="LOCAL" />
<updated>1715422956049</updated> <updated>1715422956049</updated>
</task> </task>
<option name="localTasksCounter" value="294" /> <task id="LOCAL-00294" summary="dd">
<created>1715448610311</created>
<option name="number" value="00294" />
<option name="presentableId" value="LOCAL-00294" />
<option name="project" value="LOCAL" />
<updated>1715448610313</updated>
</task>
<option name="localTasksCounter" value="295" />
<servers /> <servers />
</component> </component>
<component name="Vcs.Log.Tabs.Properties"> <component name="Vcs.Log.Tabs.Properties">
@ -460,7 +461,6 @@
</option> </option>
</component> </component>
<component name="VcsManagerConfiguration"> <component name="VcsManagerConfiguration">
<MESSAGE value="12/04/2024 - 15h05" />
<MESSAGE value="14/04/2024 - 23h05" /> <MESSAGE value="14/04/2024 - 23h05" />
<MESSAGE value="17/04/2024 - 21h04" /> <MESSAGE value="17/04/2024 - 21h04" />
<MESSAGE value="18/04/2024 - 21h50" /> <MESSAGE value="18/04/2024 - 21h50" />
@ -485,6 +485,7 @@
<MESSAGE value="0dfd" /> <MESSAGE value="0dfd" />
<MESSAGE value="10/05/2024 - 18h30" /> <MESSAGE value="10/05/2024 - 18h30" />
<MESSAGE value="gdf" /> <MESSAGE value="gdf" />
<option name="LAST_COMMIT_MESSAGE" value="gdf" /> <MESSAGE value="dd" />
<option name="LAST_COMMIT_MESSAGE" value="dd" />
</component> </component>
</project> </project>

View File

@ -557,9 +557,11 @@ En termes de process, un document de type devis peut avoir le un des statuts ci-
Brouillon => valeur 0 Brouillon => valeur 0
En cours => valeur 1 En cours => valeur 1
Fermé => valeur 2 Fermé => valeur 2
gagné => valeur 3
perdu => valeur 4
Annulé => valeur -1 Annulé => valeur -1
""" """
PARTNER_QUOTATION_STATUS = ['-1', '0', '1', '2'] PARTNER_QUOTATION_STATUS = ['-1', '0', '1', '2', '3', '4']
""" """

View File

@ -15,6 +15,7 @@ from datetime import datetime, date, timedelta
import module_editique import module_editique
import partner_order
import prj_common as mycommon import prj_common as mycommon
import secrets import secrets
import inspect import inspect
@ -185,7 +186,6 @@ def Cron_Send_Survey():
local_dicton['tab_ids'] = (str(val['_id'])) local_dicton['tab_ids'] = (str(val['_id']))
local_status, local_retval = survey_mgt.Automatic_Send_Survey_TabIds(local_dicton) local_status, local_retval = survey_mgt.Automatic_Send_Survey_TabIds(local_dicton)
#data['date_update'] = str(datetime.now()) #data['date_update'] = str(datetime.now())
@ -256,7 +256,8 @@ def Cron_Quotation_Relance():
devis_qery_match = {'$and': [{'partner_owner_recid':str(local_partner_owner_recid), devis_qery_match = {'$and': [{'partner_owner_recid':str(local_partner_owner_recid),
'valide':'1', 'valide':'1',
'locked':'0', 'locked':'0', 'order_header_type':'devis', 'order_header_status':'1',
'relance_auto':'1'}, 'relance_auto':'1'},
{ {
@ -279,8 +280,16 @@ def Cron_Quotation_Relance():
{'$match': devis_qery_match}, {'$match': devis_qery_match},
]) ])
#print(" ## pipe_qry Cron_Quotation_Relance = ", pipe_qry) print(" ## pipe_qry Cron_Quotation_Relance = ", pipe_qry)
for local_devis in MYSY_GV.dbname['partner_order_header'].aggregate(pipe_qry): for local_devis in MYSY_GV.dbname['partner_order_header'].aggregate(pipe_qry):
is_quotation_validated = 0
if( "validation_by" in local_devis.keys() and local_devis['validation_by'] and
"date_validation" in local_devis.keys() and local_devis['date_validation'] ):
# Ce devis a déjà ete validée, donc pas de relance
is_quotation_validated = 1
#print( "### local_devis a traiter = ", local_devis) #print( "### local_devis a traiter = ", local_devis)
relance_done = 0 relance_done = 0
@ -312,56 +321,87 @@ def Cron_Quotation_Relance():
print(" ### LA PROCHAINE RELANCE EST ", new_relance_date_ISODATE) print(" ### LA PROCHAINE RELANCE EST ", new_relance_date_ISODATE)
new_relance_date_no_ISODATE = str(new_relance_date_ISODATE.strftime("%d/%m/%Y"))
print(" ### LA PROCHAINE RELANCE EST (new_relance_date_no_ISODATE) ", new_relance_date_no_ISODATE)
if( relance_done <= nb_limite_relance ): datetime.strptime(str(todays_date), '%d/%m/%Y')
if( datetime.strptime(str(todays_date), '%d/%m/%Y') >= datetime.strptime( str(new_relance_date_no_ISODATE).strip(), '%d/%m/%Y') ):
print(" ### todays_date est SUPERIEUR = new_relance_date_ISODATE")
else:
print(" ### todays_date est INFERIEUR new_relance_date_ISODATE")
if( is_quotation_validated == 0 and relance_done <= nb_limite_relance and datetime.strptime(str(todays_date), '%d/%m/%Y') >= datetime.strptime( str(new_relance_date_no_ISODATE).strip(), '%d/%m/%Y') ):
print(" ### OUIIII on fait la relanceeeeeeeeeeeee")
""" """
On fait le traitement, on envoie le mail On fait le traitement, on envoie le mail
1 - recuperation des data
""" """
""" local_status, my_partner = mycommon.Get_Connected_User_Partner_Data_From_RecID(str(local_devis['partner_owner_recid']))
Une fois la relance faite, on met à jour le devis avec les infos suivant : if (local_status is not True):
- liste_relance return local_status, my_partner
"""
frequence_relance_auto_reached = "0"
if("list_relance" in local_devis.keys() and local_devis['list_relance']): tab_client = []
local_node = {} tab_client.append(ObjectId(str(local_devis['order_header_client_id'])))
local_node['date_relance'] = str(date.today())
local_devis['list_relance'].append(local_node)
else : local_diction = {'token':str(my_partner['token']), 'order_id': str(local_devis['_id'])}
local_node = {} local_send_remind_status, local_send_remind_retval = partner_order.Send_Quotation_Remind_Level1(local_diction)
local_node['date_relance'] = str(date.today())
local_devis['list_relance'] = []
local_devis['list_relance'].append(local_node)
nb_relance = str(len(local_devis['list_relance'])) print(" relance return local_send_remind_status = ", local_send_remind_status)
local_data_update = local_devis if( local_send_remind_status is True):
id_to_update = str(local_data_update['_id']) print(" RELANCE FAIT ET OK ")
"""
Une fois la relance faite, on met à jour le devis avec les infos suivant :
- liste_relance
"""
del local_data_update['_id'] frequence_relance_auto_reached = "0"
del local_data_update['mysy_devis_expiration_date']
local_data_update['nb_relance'] = str(nb_relance) if("list_relance" in local_devis.keys() and local_devis['list_relance']):
local_data_update['date_dernier_relance_auto'] = str(todays_date) local_node = {}
local_node['date_relance'] = str(date.today())
local_node['mesg_relance'] = str(local_send_remind_retval)
local_devis['list_relance'].append(local_node)
result = MYSY_GV.dbname['partner_order_header'].find_one_and_update( else :
{'_id': ObjectId(str(id_to_update)),
'valide': '1', local_node = {}
'locked': '0'}, local_node['date_relance'] = str(date.today())
{"$set": local_data_update}, local_devis['list_relance'] = []
upsert=False, local_devis['list_relance'].append(local_node)
return_document=ReturnDocument.AFTER local_node['mesg_relance'] = str(local_send_remind_retval)
)
nb_relance = str(len(local_devis['list_relance']))
local_data_update = local_devis
id_to_update = str(local_data_update['_id'])
del local_data_update['_id']
del local_data_update['mysy_devis_expiration_date']
local_data_update['nb_relance'] = str(nb_relance)
local_data_update['date_dernier_relance_auto'] = str(todays_date)
result = MYSY_GV.dbname['partner_order_header'].find_one_and_update(
{'_id': ObjectId(str(id_to_update)),
'valide': '1',
'locked': '0'},
{"$set": local_data_update},
upsert=False,
return_document=ReturnDocument.AFTER
)
else: else:
print(" ### NoNNNNNNNNNN on NEEEE fait la relanceeeeeeeeeeeee")
print(" limite relance atteint : ") print(" limite relance atteint : ")
print(" limite relance_done : ", relance_done) print(" limite relance_done : ", relance_done)
print(" limite nb_limite_relance : ", nb_limite_relance) print(" limite nb_limite_relance : ", nb_limite_relance)

File diff suppressed because it is too large Load Diff

View File

@ -1793,7 +1793,7 @@ def Update_Partner_Quotation_Header(diction):
order_header_vendeur_id = "" order_header_vendeur_id = ""
if ("order_header_vendeur_id" in diction.keys()): if ("order_header_vendeur_id" in diction.keys() and diction['order_header_vendeur_id']):
order_header_vendeur_id = diction['order_header_vendeur_id'] order_header_vendeur_id = diction['order_header_vendeur_id']
# local_qry = {'_id': ObjectId(str(order_header_vendeur_id)), 'valide': '1', 'locked': '0', 'partner_recid': str(my_partner['recid'])} # local_qry = {'_id': ObjectId(str(order_header_vendeur_id)), 'valide': '1', 'locked': '0', 'partner_recid': str(my_partner['recid'])}
@ -2243,6 +2243,36 @@ def Add_Update_Partner_Order_Line(diction):
str(inspect.stack()[0][3]) + " - Impossible de mettre à jour la ligne (3)") str(inspect.stack()[0][3]) + " - Impossible de mettre à jour la ligne (3)")
return False, " Impossible de mettre à jour la ligne (3) " return False, " Impossible de mettre à jour la ligne (3) "
"""
Une fois qu'on a modifier une ligne, il faut remettre les statuts d'entete et de ligne à 'brouillon'
pour obligier l'utilisateur à revalider le devis
"""
local_update_data = {}
local_update_data['date_update'] = str(datetime.now())
local_update_data['update_by'] = str(my_partner['_id'])
local_update_data['order_header_status'] = "0"
upadate_header = MYSY_GV.dbname['partner_order_header'].find_one_and_update(
{'_id': ObjectId(str(diction['order_header_id'])), 'valide': '1', 'locked': '0',
'partner_owner_recid': str(my_partner['recid'])},
{"$set": local_update_data},
return_document=ReturnDocument.AFTER,
upsert=False,
)
local_update_data = {}
local_update_data['date_update'] = str(datetime.now())
local_update_data['update_by'] = str(my_partner['_id'])
local_update_data['order_line_status'] = "0"
upadate_line = MYSY_GV.dbname['partner_order_line'].find_one_and_update(
{'order_header_id': str(diction['order_header_id']), 'valide': '1', 'locked': '0',
'partner_owner_recid': str(my_partner['recid'])},
{"$set": local_update_data},
return_document=ReturnDocument.AFTER,
upsert=False,
)
else: else:
# Il s'agit d'une creation d'une nouvelle ligne # Il s'agit d'une creation d'une nouvelle ligne
@ -2260,6 +2290,40 @@ def Add_Update_Partner_Order_Line(diction):
" Impossible de créer la ligne la commande ") " Impossible de créer la ligne la commande ")
return False, " Impossible de créer la ligne la commande " return False, " Impossible de créer la ligne la commande "
"""
Une fois qu'on a modifier une ligne, il faut remettre les statuts d'entete et de ligne à 'brouillon'
pour obligier l'utilisateur à revalider le devis
"""
local_update_data = {}
local_update_data['date_update'] = str(datetime.now())
local_update_data['update_by'] = str(my_partner['_id'])
local_update_data['order_header_status'] = "0"
upadate_header = MYSY_GV.dbname['partner_order_header'].find_one_and_update(
{'_id': ObjectId(str(diction['order_header_id'])), 'valide': '1', 'locked': '0',
'partner_owner_recid': str(my_partner['recid'])},
{"$set": local_update_data},
return_document=ReturnDocument.AFTER,
upsert=False,
)
local_update_data = {}
local_update_data['date_update'] = str(datetime.now())
local_update_data['update_by'] = str(my_partner['_id'])
local_update_data['order_line_status'] = "0"
upadate_line = MYSY_GV.dbname['partner_order_line'].find_one_and_update(
{'order_header_id': str(diction['order_header_id']), 'valide': '1', 'locked': '0',
'partner_owner_recid': str(my_partner['recid'])},
{"$set": local_update_data},
return_document=ReturnDocument.AFTER,
upsert=False,
)
return True, " La ligne de commande a été correctement ajoutée/mise à jour" return True, " La ligne de commande a été correctement ajoutée/mise à jour"
except Exception as e: except Exception as e:
@ -5310,9 +5374,13 @@ def Send_Partner_Order_By_Email(diction):
Mettre à jour la commande /devis pour dire que quand le document a été envoyé Mettre à jour la commande /devis pour dire que quand le document a été envoyé
""" """
updata_data = {} updata_data = {}
updata_data['date_update'] = datetime.now() updata_data['date_update'] = str(datetime.now())
updata_data['update_by'] = str(my_partner['recid']) updata_data['update_by'] = str(my_partner['recid'])
updata_data['date_envoi_quotation'] = datetime.now() updata_data['date_envoi_quotation'] = str(datetime.now())
todays_date = str(date.today().strftime("%d/%m/%Y"))
updata_data['date_dernier_relance_auto'] = str(todays_date)
MYSY_GV.dbname['partner_order_header'].find_one_and_update( MYSY_GV.dbname['partner_order_header'].find_one_and_update(
{'_id': ObjectId(str(Order_header_data['_id'])), {'_id': ObjectId(str(Order_header_data['_id'])),
@ -5375,7 +5443,7 @@ def Convert_Quotation_to_Order(diction):
# Verification de la validité du devis à convertir # Verification de la validité du devis à convertir
qry = {'_id': ObjectId(str(diction['order_id'])), 'valide': '1', 'locked': '0','order_header_type':'devis', qry = {'_id': ObjectId(str(diction['order_id'])), 'valide': '1', 'locked': '0','order_header_type':'devis',
'partner_owner_recid': str(my_partner['recid'])} 'partner_owner_recid': str(my_partner['recid'])}
print(" ### qry = ", qry) #print(" ### qry = ", qry)
is_Order_Existe_Count = MYSY_GV.dbname['partner_order_header'].count_documents( is_Order_Existe_Count = MYSY_GV.dbname['partner_order_header'].count_documents(
{'_id': ObjectId(str(diction['order_id'])), {'_id': ObjectId(str(diction['order_id'])),
@ -5430,10 +5498,16 @@ def Convert_Quotation_to_Order(diction):
Supprimer les data qui ne concernent pas la commande Supprimer les data qui ne concernent pas la commande
comme la date de validation du devis, la date reservation, etc comme la date de validation du devis, la date reservation, etc
""" """
for val in ['is_validated', 'date_reservation', 'mode_reservation', 'validation_by', 'reservation_by', 'date_validation', 'update_by'] : list_champ_to_delete = ['validation_by', 'date_validation', 'mode_reservation', 'date_reservation',
'date_envoi_quotation', 'date_dernier_relance_auto', 'nb_relance',
'list_relance', 'frequence_relance_auto', 'relance_auto', 'nb_relance_auto',
'is_validated', 'reservation_by', 'update_by']
for val in list_champ_to_delete :
if( val in New_Order_Header.keys() ): if( val in New_Order_Header.keys() ):
del New_Order_Header[val] del New_Order_Header[val]
local_status, local_message, local_retval = Add_Partner_Order(New_Order_Header) local_status, local_message, local_retval = Add_Partner_Order(New_Order_Header)
if( local_status is False ): if( local_status is False ):
@ -5441,7 +5515,7 @@ def Convert_Quotation_to_Order(diction):
new_created_order = MYSY_GV.dbname['partner_order_header'].find_one({'order_header_ref_interne':str(local_retval)}) new_created_order = MYSY_GV.dbname['partner_order_header'].find_one({'order_header_ref_interne':str(local_retval)})
print(" ### La nouvelle Entete a été créer le num_order = ", new_created_order['order_header_ref_interne']) #print(" ### La nouvelle Entete a été créer le num_order = ", new_created_order['order_header_ref_interne'])
# Traitement des lignes # Traitement des lignes
@ -5454,7 +5528,7 @@ def Convert_Quotation_to_Order(diction):
print( " #### qry convert = ", qyr_convert) #print( " #### qry convert = ", qyr_convert)
for Quotation_line_data in MYSY_GV.dbname['partner_order_line'].find({'order_header_id': str(diction['order_id']), for Quotation_line_data in MYSY_GV.dbname['partner_order_line'].find({'order_header_id': str(diction['order_id']),
'valide': '1', 'locked': '0', 'valide': '1', 'locked': '0',
@ -5472,11 +5546,63 @@ def Convert_Quotation_to_Order(diction):
New_Order_Line['token'] = mytoken New_Order_Line['token'] = mytoken
New_Order_Line['order_line_id'] = "" New_Order_Line['order_line_id'] = ""
New_Order_Line['order_line_status'] = "0" New_Order_Line['order_line_status'] = "0"
list_champ_to_delete = ['validation_by', 'date_validation', 'mode_reservation', 'date_reservation',
'date_envoi_quotation', 'date_dernier_relance_auto', 'nb_relance',
'list_relance', 'frequence_relance_auto', 'relance_auto', 'nb_relance_auto',
'is_validated', 'reservation_by', 'update_by']
for val in list_champ_to_delete:
if (val in New_Order_Line.keys()):
del New_Order_Line[val]
##print(" ### New_Order_Line = ",New_Order_Line)
local_add_line_status, local_add_line_retval = Add_Update_Partner_Order_Line(New_Order_Line) local_add_line_status, local_add_line_retval = Add_Update_Partner_Order_Line(New_Order_Line)
print(" Ligne = ", cpt_line) print(" Ligne = ", cpt_line)
cpt_line = cpt_line + 1 cpt_line = cpt_line + 1
"""
Apres la convertion, on met à jour le devis pour dire qu'il a été gagné
"""
data_update = {}
data_update['date_update'] = str(datetime.now())
data_update['update_by'] = str(my_partner['_id'])
data_update['order_header_status'] = "3"
result = MYSY_GV.dbname['partner_order_header'].find_one_and_update(
{'_id': ObjectId(str(diction['order_id'])),
'valide': '1', 'locked': '0',
'order_header_type': 'devis',
'partner_owner_recid': str(
my_partner['recid'])}
,
{"$set": data_update},
upsert=False,
return_document=ReturnDocument.AFTER
)
data_update = {}
data_update['date_update'] = str(datetime.now())
data_update['update_by'] = str(my_partner['_id'])
data_update['order_line_status'] = "3"
result = MYSY_GV.dbname['partner_order_header'].update_many(
{'_id': ObjectId(str(diction['order_id'])),
'valide': '1', 'locked': '0',
'order_header_type': 'devis',
'partner_owner_recid': str(
my_partner['recid'])}
,
{"$set": data_update},
)
mycommon.myprint( mycommon.myprint(
str(inspect.stack()[0][3]) + " Le devis "+str(Quotation_header_data_tmp['order_header_ref_interne'])+" a été correctement convertie en commande avec le numero : "+ new_created_order['order_header_ref_interne']) str(inspect.stack()[0][3]) + " Le devis "+str(Quotation_header_data_tmp['order_header_ref_interne'])+" a été correctement convertie en commande avec le numero : "+ new_created_order['order_header_ref_interne'])
return True, " Le devis a été correctement convertit en commande. Ref. Commande est : "+str(str(new_created_order['order_header_ref_interne'])), str(new_created_order['order_header_ref_interne']) return True, " Le devis a été correctement convertit en commande. Ref. Commande est : "+str(str(new_created_order['order_header_ref_interne'])), str(new_created_order['order_header_ref_interne'])
@ -6283,3 +6409,409 @@ def Insert_Quotation_To_Session_From_Partner_Owner_Recid(diction):
exc_type, exc_obj, exc_tb = sys.exc_info() 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)) 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" return False, "Impossible de créer / mettre à jour la session de formation"
"""
Cette fonction envoie une relance d'email, niveau 1
"""
def Send_Quotation_Remind_Level1(diction):
try:
field_list = ['order_id', 'token',]
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]) + " - La valeur '" + val + "' n'est pas presente dans liste ")
return False, "Les informations fournies sont incorrectes"
"""
Verification de la liste des champs obligatoires
"""
field_list_obligatoire = ['order_id', 'token', ]
for val in field_list_obligatoire:
if val not in diction:
mycommon.myprint(
str(inspect.stack()[0][3]) + " - : La valeur '" + val + "' n'est pas presente dans liste ")
return False, " Les informations fournies sont incorrectes "
query_get_data = {}
mytoken = ""
if ("token" in diction.keys()):
if diction['token']:
mytoken = diction['token']
local_status, my_partner = mycommon.Check_Connexion_And_Return_Partner_Data(diction)
if (local_status is not True):
return local_status, my_partner
# Verification de la validité de l'order
qry = {'_id': ObjectId(str(diction['order_id'])), 'valide': '1', 'locked': '0',
'partner_owner_recid': str(my_partner['recid'])}
# print(" ### qry = ", qry)
is_Order_Existe_Count = MYSY_GV.dbname['partner_order_header'].count_documents(
{'_id': ObjectId(str(diction['order_id'])),
'valide': '1', 'locked': '0', 'order_header_type':'devis',
'partner_owner_recid': str(my_partner['recid'])})
if (is_Order_Existe_Count != 1):
mycommon.myprint(
str(inspect.stack()[0][3]) + " - La commande n'est pas valide ")
return False, " La commande n'est pas valide",
Order_header_data = MYSY_GV.dbname['partner_order_header'].find_one({'_id': ObjectId(str(diction['order_id'])),
'valide': '1', 'locked': '0','order_header_type':'devis',
'partner_owner_recid': str(
my_partner['recid'])})
partner_document_CONF_ORDER_data_qry = {'partner_owner_recid': str(my_partner['recid']),
'valide': '1', 'locked': '0', 'ref_interne': 'PART_ORDER',
'type_doc': 'email'}
# print(" ### partner_document_CONF_ORDER_data_qry = ", partner_document_CONF_ORDER_data_qry)
partner_document_CONF_ORDER_data = MYSY_GV.dbname['courrier_template'].find_one(
{'partner_owner_recid': str(my_partner['recid']),
'valide': '1', 'locked': '0', 'ref_interne': 'PART_ORDER', 'type_doc': 'email'})
if (partner_document_CONF_ORDER_data is None):
# Il n'existe pas de personnalisation de la preinscription pour ce partenaire, on va aller récupérer la presinscription pa defaut
partner_document_CONF_ORDER_data = MYSY_GV.dbname['courrier_template'].find_one(
{'partner_owner_recid': 'default',
'valide': '1', 'locked': '0', 'ref_interne': 'PART_ORDER', 'type_doc': 'email'})
if (partner_document_CONF_ORDER_data is None):
mycommon.myprint(
str(inspect.stack()[0][
3]) + "Aucun document parametré ")
return False, "Aucun document parametré "
if ("contenu_doc" not in partner_document_CONF_ORDER_data or len(
str(partner_document_CONF_ORDER_data['contenu_doc'])) <= 0):
mycommon.myprint(str(inspect.stack()[0][
3]) + " - Le parametrage du document est invalide")
return False, " Le parametrage du document est invalide "
# Recuperation des données du client
if ("order_header_client_id" in Order_header_data.keys()):
Order_header_client_data = MYSY_GV.dbname['partner_client'].find_one(
{'_id': ObjectId(str(Order_header_data['order_header_client_id'])),
'partner_recid': str(my_partner['recid']), 'valide': '1', 'locked': '0'})
if (Order_header_client_data is None):
mycommon.myprint(str(inspect.stack()[0][
3]) + " - Le client est invalide")
return False, " Le client est invalide"
# Recuperation des details de lignes de : partner_order_line
filt_class_partner_recid = {'partner_owner_recid': str(my_partner['recid'])}
filt_order_header_order_id = {'order_header_id': str(diction['order_id'])}
query = [{'$match': {'$and': [filt_order_header_order_id,
{'partner_owner_recid': str(my_partner['recid'])}]}},
{'$lookup':
{
'from': 'myclass',
'localField': 'order_line_formation',
'foreignField': 'internal_url',
'pipeline': [{'$match': {'$and': [filt_class_partner_recid]}},
{'$project': {'title': 1, 'domaine': 1,
'duration': 1,
'duration_unit': 1,
'external_code': 1}}],
'as': 'myclass_collection'
}
}
]
# print("#### Get_Given_Partner_Order_Lines_From_order_ref_interne : query pip= ", query)
val_tmp = 0
Order_header_lines_data = []
for retval in MYSY_GV.dbname['partner_order_line'].aggregate(query):
if ('myclass_collection' in retval.keys() and len(retval['myclass_collection']) > 0):
user = {}
user['id'] = str(val_tmp)
val_tmp = val_tmp + 1
user['_id'] = retval['_id']
user['order_line_formation'] = retval['order_line_formation']
user['order_line_qty'] = retval['order_line_qty']
user['order_line_prix_unitaire'] = retval['order_line_prix_unitaire']
user['order_header_id'] = retval['order_header_id']
user['order_header_ref_interne'] = retval['order_header_ref_interne']
user['valide'] = retval['valide']
user['locked'] = retval['locked']
if ("order_line_montant_reduction" in retval.keys()):
user['order_line_montant_reduction'] = retval['order_line_montant_reduction']
else:
user['order_line_montant_reduction'] = "0"
if ("order_line_montant_toutes_taxes" in retval.keys()):
user['order_line_montant_toutes_taxes'] = retval['order_line_montant_toutes_taxes']
else:
user['order_line_montant_toutes_taxes'] = "0"
if ("order_line_tax" in retval.keys()):
user['order_line_tax'] = retval['order_line_tax']
else:
user['order_line_tax'] = ""
if ("order_line_tax_amount" in retval.keys()):
user['order_line_tax_amount'] = retval['order_line_tax_amount']
else:
user['order_line_tax_amount'] = "0"
if ("order_line_type_reduction" in retval.keys()):
user['order_line_type_reduction'] = retval['order_line_type_reduction']
else:
user['order_line_montant_reduction'] = ""
if ("order_line_type_valeur" in retval.keys()):
user['order_line_type_valeur'] = retval['order_line_type_valeur']
else:
user['order_line_type_valeur'] = "0"
if ("order_line_montant_hors_taxes" in retval.keys()):
user['order_line_montant_hors_taxes'] = str(
round(mycommon.tryFloat(str(retval['order_line_montant_hors_taxes'])), 2))
else:
user['order_line_montant_hors_taxes'] = "0"
user['date_update'] = retval['date_update']
user['partner_owner_recid'] = retval['partner_owner_recid']
user['order_line_type'] = retval['order_line_type']
user['order_line_status'] = retval['order_line_status']
if ("order_line_comment" in retval.keys()):
user['order_line_comment'] = retval['order_line_comment']
else:
user['order_line_comment'] = ""
user['title'] = retval['myclass_collection'][0]['title']
user['order_line_formation_external_code'] = retval['myclass_collection'][0]['external_code']
if ("domaine" in retval['myclass_collection'][0].keys()):
user['domaine'] = retval['myclass_collection'][0]['domaine']
else:
user['domaine'] = ""
user['duration'] = retval['myclass_collection'][0]['duration']
user['duration_unit'] = retval['myclass_collection'][0]['duration_unit']
if (str(retval['myclass_collection'][0]['duration_unit']) == "heure"):
user['duration_concat'] = str(retval['myclass_collection'][0]['duration']) + " h"
elif (str(retval['myclass_collection'][0]['duration_unit']) == "jour"):
user['duration_concat'] = str(retval['myclass_collection'][0]['duration']) + " j"
elif (str(retval['myclass_collection'][0]['duration_unit']) == "semaine"):
user['duration_concat'] = str(retval['myclass_collection'][0]['duration']) + " s"
elif (str(retval['myclass_collection'][0]['duration_unit']) == "mois"):
user['duration_concat'] = str(retval['myclass_collection'][0]['duration']) + " m"
elif (str(retval['myclass_collection'][0]['duration_unit']) == "annee"):
user['duration_concat'] = str(retval['myclass_collection'][0]['duration']) + " a"
elif (str(retval['myclass_collection'][0]['duration_unit']) == "user_rythme"):
user['duration_concat'] = str(retval['myclass_collection'][0]['duration']) + " u"
else:
user['duration_concat'] = str(retval['myclass_collection'][0]['duration']) + " ?"
Order_header_lines_data.append(user)
if (len(Order_header_lines_data) <= 0):
mycommon.myprint(str(inspect.stack()[0][
3]) + " - Aucune ligne de détail pour cette commande ")
return False, " Aucune ligne de détail pour cette commande "
# print(" ### Order_header_lines_data = ", Order_header_lines_data)
contenu_doc_Template = jinja2.Template(str(partner_document_CONF_ORDER_data['contenu_doc']))
contenu_doc_Template_subject = jinja2.Template(str(partner_document_CONF_ORDER_data['sujet']))
# print(" #### Order_header_data = ", Order_header_data)
Order_header_data['order_header_type'] = str(Order_header_data['order_header_type']).capitalize()
sourceHtml = contenu_doc_Template.render(params=Order_header_data, param_order_lines=Order_header_lines_data)
sujetHtml = str(Order_header_data['order_header_type']) + " : " + str(
Order_header_data['order_header_ref_interne'])
new_model_courrier_with_code_tag = str(
sourceHtml) + " <p style='width: 300px; text-align: right;'> Signature Client <br/> <img style='height:150px; width:150px' 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(",", "")[-2:]
orig_file_name = "Devis_" + str(my_partner['recid'])[0:5] + "_" + str(todays_date) + "_" + str(ts) + ".pdf"
outputFilename = str(MYSY_GV.TEMPORARY_DIRECTORY) + "/" + str(orig_file_name)
# open output file for writing (truncated binary)
resultFile = open(outputFilename, "w+b")
# convert HTML to PDF
pisaStatus = pisa.CreatePDF(
src=sourceHtml, # the HTML to convert
dest=resultFile) # file handle to receive result
# close output file
resultFile.close()
"""
Recuperation des parametre SMTP du partner si le client a decidé d'utiliser son propre smpt
"""
partner_own_smtp_value = "0"
partner_own_smtp = MYSY_GV.dbname['base_partner_setup'].find_one(
{'partner_owner_recid': str(my_partner['recid']),
'config_name': 'partner_smtp',
'valide': '1',
'locked': '0'})
if (partner_own_smtp and "config_value" in partner_own_smtp.keys()):
partner_own_smtp_value = partner_own_smtp['config_value']
if (str(partner_own_smtp_value) == "1"):
partner_SMTP_COUNT_password = str(MYSY_GV.dbname['base_partner_setup'].find_one(
{'partner_owner_recid': str(my_partner['recid']),
'config_name': 'smtp_user_pwd',
'valide': '1',
'locked': '0'}, {'config_value': 1})['config_value'])
partner_SMTP_COUNT_smtpsrv = str(MYSY_GV.dbname['base_partner_setup'].find_one(
{'partner_owner_recid': str(my_partner['recid']),
'config_name': 'smtp_server',
'valide': '1',
'locked': '0'}, {'config_value': 1})['config_value'])
partner_SMTP_COUNT_user = str(MYSY_GV.dbname['base_partner_setup'].find_one(
{'partner_owner_recid': str(my_partner['recid']),
'config_name': 'smtp_user',
'valide': '1',
'locked': '0'}, {'config_value': 1})['config_value'])
partner_SMTP_COUNT_From_User = str(MYSY_GV.dbname['base_partner_setup'].find_one(
{'partner_owner_recid': str(my_partner['recid']),
'config_name': 'smtp_count_from_name',
'valide': '1',
'locked': '0'}, {'config_value': 1})['config_value'])
partner_SMTP_COUNT_port = str(MYSY_GV.dbname['base_partner_setup'].find_one(
{'partner_owner_recid': str(my_partner['recid']),
'config_name': 'smtp_count_port',
'valide': '1',
'locked': '0'}, {'config_value': 1})['config_value'])
if (str(partner_own_smtp_value) == "1"):
print("debut envoi mail de test ")
msg = EmailMessage()
msg.set_content(sourceHtml, subtype='html')
smtpserver = smtplib.SMTP(partner_SMTP_COUNT_smtpsrv, partner_SMTP_COUNT_port)
"""
La commande est envoyée à l'adresse email qui se trouve sur la commande, le champ : 'order_header_email_client'.
Si ce champ est vide alors on regarde si il y a un email sur la fiche client.
"""
client_main_mail_tmp = ""
if ("order_header_email_client" in Order_header_data.keys() and Order_header_data[
'order_header_email_client']):
client_main_mail_tmp = str(Order_header_data['order_header_email_client'])
if (mycommon.isEmailValide(client_main_mail_tmp) is True):
msg['To'] = client_main_mail_tmp
else:
mycommon.myprint(str(inspect.stack()[0][
3]) + " - L'adresse email sur la commande n'est pas valide ")
return False, " L'adresse email sur la commande n'est pas valide "
else:
mycommon.myprint(str(inspect.stack()[0][
3]) + " - Aucune adresse email sur la commande ")
return False, " Aucune adresse email sur la commande "
msg['From'] = partner_SMTP_COUNT_From_User
msg['Bcc'] = 'contact@mysy-training.com'
msg['Subject'] = sujetHtml
smtpserver.ehlo()
smtpserver.starttls()
smtpserver.login(partner_SMTP_COUNT_user, partner_SMTP_COUNT_password)
val = smtpserver.send_message(msg)
smtpserver.close()
print(" Email envoyé " + str(val))
else:
print("debut envoi mail de test ")
msg = EmailMessage()
msg.set_content(sourceHtml, subtype='html')
smtpserver = smtplib.SMTP(MYSY_GV.O365_SMTP_COUNT_smtpsrv, MYSY_GV.O365_SMTP_COUNT_port)
"""
La commande est envoyée à l'adresse email qui se trouve sur la commande, le champ : 'order_header_email_client'.
Si ce champ est vide alors on regarde si il y a un email sur la fiche client.
"""
client_main_mail_tmp = ""
if ("order_header_email_client" in Order_header_data.keys() and Order_header_data[
'order_header_email_client']):
client_main_mail_tmp = str(Order_header_data['order_header_email_client'])
if (mycommon.isEmailValide(client_main_mail_tmp) is True):
msg['To'] = client_main_mail_tmp
else:
mycommon.myprint(str(inspect.stack()[0][
3]) + " - L'adresse email sur la commande n'est pas valide ")
return False, " L'adresse email sur la commande n'est pas valide "
else:
mycommon.myprint(str(inspect.stack()[0][
3]) + " - Aucune adresse email sur la commande ")
return False, " Aucune adresse email sur la commande "
msg['From'] = MYSY_GV.O365_SMTP_COUNT_From_User
msg['Bcc'] = 'contact@mysy-training.com'
msg['Subject'] = sujetHtml
smtpserver.ehlo()
smtpserver.starttls()
smtpserver.login(MYSY_GV.O365_SMTP_COUNT_user, MYSY_GV.O365_SMTP_COUNT_password)
val = smtpserver.send_message(msg)
smtpserver.close()
print(" Email envoyé " + str(val))
"""
Mettre à jour la commande /devis pour dire que quand le document a été envoyé
"""
updata_data = {}
updata_data['date_update'] = str(datetime.now())
updata_data['update_by'] = str(my_partner['recid'])
updata_data['date_envoi_quotation'] = str(datetime.now())
todays_date = str(date.today().strftime("%d/%m/%Y"))
updata_data['date_dernier_relance_auto'] = str(todays_date)
MYSY_GV.dbname['partner_order_header'].find_one_and_update(
{'_id': ObjectId(str(Order_header_data['_id'])),
'partner_owner_recid': str(Order_header_data['partner_owner_recid'])},
{'$set': updata_data})
return True, " Relance envoyé à : '" + str(client_main_mail_tmp) + "' "
except Exception as e:
exc_type, exc_obj, exc_tb = sys.exc_info()
print(str(inspect.stack()[0][3]) + " -" + str(e) + " - ERRORRRR AT Line : " + str(exc_tb.tb_lineno))
return False, "Impossible de faire la relance du devis "