ddsdfsd
parent
dc2d857421
commit
64ead66d7c
|
@ -1,11 +1,12 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<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$/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$/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>
|
||||
<option name="SHOW_DIALOG" value="false" />
|
||||
<option name="HIGHLIGHT_CONFLICTS" value="true" />
|
||||
|
@ -75,13 +76,6 @@
|
|||
<option name="presentableId" value="Default" />
|
||||
<updated>1680804787304</updated>
|
||||
</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">
|
||||
<created>1711130098363</created>
|
||||
<option name="number" value="00246" />
|
||||
|
@ -418,7 +412,14 @@
|
|||
<option name="project" value="LOCAL" />
|
||||
<updated>1715422956049</updated>
|
||||
</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 />
|
||||
</component>
|
||||
<component name="Vcs.Log.Tabs.Properties">
|
||||
|
@ -460,7 +461,6 @@
|
|||
</option>
|
||||
</component>
|
||||
<component name="VcsManagerConfiguration">
|
||||
<MESSAGE value="12/04/2024 - 15h05" />
|
||||
<MESSAGE value="14/04/2024 - 23h05" />
|
||||
<MESSAGE value="17/04/2024 - 21h04" />
|
||||
<MESSAGE value="18/04/2024 - 21h50" />
|
||||
|
@ -485,6 +485,7 @@
|
|||
<MESSAGE value="0dfd" />
|
||||
<MESSAGE value="10/05/2024 - 18h30" />
|
||||
<MESSAGE value="gdf" />
|
||||
<option name="LAST_COMMIT_MESSAGE" value="gdf" />
|
||||
<MESSAGE value="dd" />
|
||||
<option name="LAST_COMMIT_MESSAGE" value="dd" />
|
||||
</component>
|
||||
</project>
|
|
@ -557,9 +557,11 @@ En termes de process, un document de type devis peut avoir le un des statuts ci-
|
|||
• Brouillon => valeur 0
|
||||
• En cours => valeur 1
|
||||
• Fermé => valeur 2
|
||||
• gagné => valeur 3
|
||||
• perdu => valeur 4
|
||||
• Annulé => valeur -1
|
||||
"""
|
||||
PARTNER_QUOTATION_STATUS = ['-1', '0', '1', '2']
|
||||
PARTNER_QUOTATION_STATUS = ['-1', '0', '1', '2', '3', '4']
|
||||
|
||||
|
||||
"""
|
||||
|
|
108
Job_Cron.py
108
Job_Cron.py
|
@ -15,6 +15,7 @@ from datetime import datetime, date, timedelta
|
|||
|
||||
|
||||
import module_editique
|
||||
import partner_order
|
||||
import prj_common as mycommon
|
||||
import secrets
|
||||
import inspect
|
||||
|
@ -185,7 +186,6 @@ def Cron_Send_Survey():
|
|||
local_dicton['tab_ids'] = (str(val['_id']))
|
||||
|
||||
|
||||
|
||||
local_status, local_retval = survey_mgt.Automatic_Send_Survey_TabIds(local_dicton)
|
||||
|
||||
#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),
|
||||
'valide':'1',
|
||||
'locked':'0',
|
||||
'locked':'0', 'order_header_type':'devis', 'order_header_status':'1',
|
||||
|
||||
'relance_auto':'1'},
|
||||
|
||||
{
|
||||
|
@ -279,8 +280,16 @@ def Cron_Quotation_Relance():
|
|||
{'$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):
|
||||
|
||||
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)
|
||||
|
||||
relance_done = 0
|
||||
|
@ -312,56 +321,87 @@ def Cron_Quotation_Relance():
|
|||
|
||||
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
|
||||
1 - recuperation des data
|
||||
"""
|
||||
|
||||
"""
|
||||
Une fois la relance faite, on met à jour le devis avec les infos suivant :
|
||||
- liste_relance
|
||||
|
||||
"""
|
||||
local_status, my_partner = mycommon.Get_Connected_User_Partner_Data_From_RecID(str(local_devis['partner_owner_recid']))
|
||||
if (local_status is not True):
|
||||
return local_status, my_partner
|
||||
|
||||
frequence_relance_auto_reached = "0"
|
||||
|
||||
if("list_relance" in local_devis.keys() and local_devis['list_relance']):
|
||||
local_node = {}
|
||||
local_node['date_relance'] = str(date.today())
|
||||
local_devis['list_relance'].append(local_node)
|
||||
tab_client = []
|
||||
tab_client.append(ObjectId(str(local_devis['order_header_client_id'])))
|
||||
|
||||
else :
|
||||
local_diction = {'token':str(my_partner['token']), 'order_id': str(local_devis['_id'])}
|
||||
|
||||
local_node = {}
|
||||
local_node['date_relance'] = str(date.today())
|
||||
local_devis['list_relance'] = []
|
||||
local_devis['list_relance'].append(local_node)
|
||||
local_send_remind_status, local_send_remind_retval = partner_order.Send_Quotation_Remind_Level1(local_diction)
|
||||
|
||||
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']
|
||||
del local_data_update['mysy_devis_expiration_date']
|
||||
frequence_relance_auto_reached = "0"
|
||||
|
||||
local_data_update['nb_relance'] = str(nb_relance)
|
||||
local_data_update['date_dernier_relance_auto'] = str(todays_date)
|
||||
if("list_relance" in local_devis.keys() and local_devis['list_relance']):
|
||||
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(
|
||||
{'_id': ObjectId(str(id_to_update)),
|
||||
else :
|
||||
|
||||
'valide': '1',
|
||||
'locked': '0'},
|
||||
{"$set": local_data_update},
|
||||
upsert=False,
|
||||
return_document=ReturnDocument.AFTER
|
||||
)
|
||||
local_node = {}
|
||||
local_node['date_relance'] = str(date.today())
|
||||
local_devis['list_relance'] = []
|
||||
local_devis['list_relance'].append(local_node)
|
||||
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:
|
||||
print(" ### NoNNNNNNNNNN on NEEEE fait la relanceeeeeeeeeeeee")
|
||||
print(" limite relance atteint : ")
|
||||
print(" limite relance_done : ", relance_done)
|
||||
print(" limite nb_limite_relance : ", nb_limite_relance)
|
||||
|
|
6856
Log/log_file.log
6856
Log/log_file.log
File diff suppressed because it is too large
Load Diff
546
partner_order.py
546
partner_order.py
|
@ -1793,7 +1793,7 @@ def Update_Partner_Quotation_Header(diction):
|
|||
|
||||
|
||||
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']
|
||||
|
||||
# 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)")
|
||||
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:
|
||||
# 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 ")
|
||||
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"
|
||||
|
||||
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é
|
||||
"""
|
||||
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['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(
|
||||
{'_id': ObjectId(str(Order_header_data['_id'])),
|
||||
|
@ -5375,7 +5443,7 @@ def Convert_Quotation_to_Order(diction):
|
|||
# Verification de la validité du devis à convertir
|
||||
qry = {'_id': ObjectId(str(diction['order_id'])), 'valide': '1', 'locked': '0','order_header_type':'devis',
|
||||
'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(
|
||||
{'_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
|
||||
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() ):
|
||||
del New_Order_Header[val]
|
||||
|
||||
|
||||
local_status, local_message, local_retval = Add_Partner_Order(New_Order_Header)
|
||||
|
||||
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)})
|
||||
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
|
||||
|
@ -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']),
|
||||
'valide': '1', 'locked': '0',
|
||||
|
@ -5472,11 +5546,63 @@ def Convert_Quotation_to_Order(diction):
|
|||
New_Order_Line['token'] = mytoken
|
||||
New_Order_Line['order_line_id'] = ""
|
||||
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)
|
||||
|
||||
print(" Ligne = ", cpt_line)
|
||||
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(
|
||||
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'])
|
||||
|
@ -6283,3 +6409,409 @@ def Insert_Quotation_To_Session_From_Partner_Owner_Recid(diction):
|
|||
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"
|
||||
|
||||
|
||||
"""
|
||||
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 }}'> </p> <br/> " \
|
||||
" <p style='width: 300px; text-align: center;'> <img style='height:150px; width:150px;' src='{{ params.mysy_qrcode_securite }}'> </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 "
|
||||
|
||||
|
|
Loading…
Reference in New Issue