14/09/2023 - 21h

master
cherif 2023-09-14 20:48:36 +02:00
parent a9e355b762
commit 3ebb91a7a9
8 changed files with 3706 additions and 62 deletions

View File

@ -1,10 +1,14 @@
<?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="12/09/2023 - 18h"> <list default="true" id="c6d0259a-16e1-410d-91a1-830590ee2a08" name="Changes" comment="13/09/2023 - 18h">
<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$/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$/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$/class_mgt.py" beforeDir="false" afterPath="$PROJECT_DIR$/class_mgt.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/main.py" beforeDir="false" afterPath="$PROJECT_DIR$/main.py" afterDir="false" /> <change beforePath="$PROJECT_DIR$/main.py" beforeDir="false" afterPath="$PROJECT_DIR$/main.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/partner_document_mgt.py" beforeDir="false" afterPath="$PROJECT_DIR$/partner_document_mgt.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/partner_order.py" beforeDir="false" afterPath="$PROJECT_DIR$/partner_order.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" />
@ -69,13 +73,6 @@
<option name="presentableId" value="Default" /> <option name="presentableId" value="Default" />
<updated>1680804787304</updated> <updated>1680804787304</updated>
</task> </task>
<task id="LOCAL-00055" summary="29/07/23 - 29h">
<created>1690661811531</created>
<option name="number" value="00055" />
<option name="presentableId" value="LOCAL-00055" />
<option name="project" value="LOCAL" />
<updated>1690661811531</updated>
</task>
<task id="LOCAL-00056" summary="30/07/23 - 17h"> <task id="LOCAL-00056" summary="30/07/23 - 17h">
<created>1690731459970</created> <created>1690731459970</created>
<option name="number" value="00056" /> <option name="number" value="00056" />
@ -412,7 +409,14 @@
<option name="project" value="LOCAL" /> <option name="project" value="LOCAL" />
<updated>1694533712541</updated> <updated>1694533712541</updated>
</task> </task>
<option name="localTasksCounter" value="104" /> <task id="LOCAL-00104" summary="13/09/2023 - 18h">
<created>1694620818831</created>
<option name="number" value="00104" />
<option name="presentableId" value="LOCAL-00104" />
<option name="project" value="LOCAL" />
<updated>1694620818831</updated>
</task>
<option name="localTasksCounter" value="105" />
<servers /> <servers />
</component> </component>
<component name="Vcs.Log.Tabs.Properties"> <component name="Vcs.Log.Tabs.Properties">
@ -427,7 +431,6 @@
</option> </option>
</component> </component>
<component name="VcsManagerConfiguration"> <component name="VcsManagerConfiguration">
<MESSAGE value="22/08/23 - 13h" />
<MESSAGE value="22/08/23 - 20h" /> <MESSAGE value="22/08/23 - 20h" />
<MESSAGE value="23/08/23 - 20h" /> <MESSAGE value="23/08/23 - 20h" />
<MESSAGE value="24/08/23 - 12h" /> <MESSAGE value="24/08/23 - 12h" />
@ -452,6 +455,7 @@
<MESSAGE value="11/09/23 - 12h30" /> <MESSAGE value="11/09/23 - 12h30" />
<MESSAGE value="11/09/23 - 19h" /> <MESSAGE value="11/09/23 - 19h" />
<MESSAGE value="12/09/2023 - 18h" /> <MESSAGE value="12/09/2023 - 18h" />
<option name="LAST_COMMIT_MESSAGE" value="12/09/2023 - 18h" /> <MESSAGE value="13/09/2023 - 18h" />
<option name="LAST_COMMIT_MESSAGE" value="13/09/2023 - 18h" />
</component> </component>
</project> </project>

View File

@ -1608,18 +1608,18 @@ def AddStagiairetoClass_mass(file=None, Folder=None, diction=None):
# Ici on doit mettre tous les champs possible (obligatoire ou non) de la BDD dans la liste # Ici on doit mettre tous les champs possible (obligatoire ou non) de la BDD dans la liste
# field_list. # field_list.
''' '''
field_list = ['token', 'code_session', 'class_internal_url'] field_list = ['token', 'session_id', 'class_internal_url']
incom_keys = diction.keys() incom_keys = diction.keys()
for val in incom_keys: for val in incom_keys:
if val not in field_list: if val not in field_list:
mycommon.myprint(str(inspect.stack()[0][3]) + " Le champ '" + val + "' n'existe pas, Creation participants annulée") mycommon.myprint(str(inspect.stack()[0][3]) + " Le champ '" + val + "' n'existe pas, Creation participants annulée")
return False, " Verifier votre API" return False, " Verifier votre API, Toutes les informations techniques ne sont pas fournies"
''' '''
Une fois qu'on a controlé que toutes les clés mise dans l'API sont correcte. etape precedente, Une fois qu'on a controlé que toutes les clés mise dans l'API sont correcte. etape precedente,
On controle que les champs obligatoires sont presents dans la liste On controle que les champs obligatoires sont presents dans la liste
''' '''
field_list_obligatoire = ['token', 'code_session', 'class_internal_url'] field_list_obligatoire = ['token', 'session_id', 'class_internal_url']
for val in field_list_obligatoire: for val in field_list_obligatoire:
if val not in diction: if val not in diction:
@ -1643,11 +1643,10 @@ def AddStagiairetoClass_mass(file=None, Folder=None, diction=None):
return "Err_Connexion", " La session de connexion n'est pas valide" return "Err_Connexion", " La session de connexion n'est pas valide"
session_id = ""
code_session = "" if ("session_id" in diction.keys()):
if ("code_session" in diction.keys()): if diction['session_id']:
if diction['code_session']: session_id = diction['session_id']
code_session = diction['code_session']
class_internal_url = "" class_internal_url = ""
if ("class_internal_url" in diction.keys()): if ("class_internal_url" in diction.keys()):
@ -1655,6 +1654,34 @@ def AddStagiairetoClass_mass(file=None, Folder=None, diction=None):
class_internal_url = diction['class_internal_url'] class_internal_url = diction['class_internal_url']
# Verification de l'existance de la session
## Verification de l'existance de session et recuperation du "code_session"
session_count = MYSY_GV.dbname['session_formation'].count_documents(
{'class_internal_url': str(class_internal_url), 'valide': '1',
'_id': ObjectId(str(session_id)), 'partner_owner_recid': str(partner_recid)})
if (session_count <= 0):
mycommon.myprint(
str(inspect.stack()[0][3]) + " -" + str(session_id) + " : ' Cette session n'est pas valide ")
return False, " Code de la session de formation n'est pas valide "
if (session_count > 1):
mycommon.myprint(
str(inspect.stack()[0][3]) + " -" + str(session_id) + " : ' Cette session existe en double ")
return False, " Les données de la session de formation sont incohérentes "
session_data = MYSY_GV.dbname['session_formation'].find_one(
{'class_internal_url': str(class_internal_url), 'valide': '1',
'_id': ObjectId(str(session_id)), 'partner_owner_recid': str(partner_recid)})
if( "code_session" not in session_data.keys() ):
mycommon.myprint(
str(inspect.stack()[0][3]) + " - Cette session de formation n'a pas de code_session ")
return False, " Cette session de formation n'a pas de code_session "
code_session = session_data['code_session']
# Verification de l'existance de la formation (class_internal_url) # Verification de l'existance de la formation (class_internal_url)
tmp_count = MYSY_GV.dbname['myclass'].count_documents({'internal_url': str(class_internal_url), 'valide': '1', tmp_count = MYSY_GV.dbname['myclass'].count_documents({'internal_url': str(class_internal_url), 'valide': '1',
'locked':'0', 'partner_owner_recid':str(partner_recid)}) 'locked':'0', 'partner_owner_recid':str(partner_recid)})
@ -1664,23 +1691,16 @@ def AddStagiairetoClass_mass(file=None, Folder=None, diction=None):
mycommon.myprint(str(inspect.stack()[0][3]) + " -" + str(class_internal_url) + " : ' Cette formation n'est pas valide ") mycommon.myprint(str(inspect.stack()[0][3]) + " -" + str(class_internal_url) + " : ' Cette formation n'est pas valide ")
return False, " Cette formation n'est pas valide " return False, " Cette formation n'est pas valide "
MyClass_Data = MYSY_GV.dbname['myclass'].find_one({'internal_url': str(class_internal_url), 'valide': '1',
'locked': '0',
'partner_owner_recid': str(partner_recid)})
## Verification de l'existance de session et recuperation de de "_id" if( "external_code" not in MyClass_Data.keys()):
session_count = MYSY_GV.dbname['session_formation'].count_documents({'class_internal_url':str(class_internal_url), 'valide': '1',
'code_session':str(code_session), 'partner_owner_recid':str(partner_recid)})
if (session_count <= 0):
mycommon.myprint( mycommon.myprint(
str(inspect.stack()[0][3]) + " -" + str(code_session) + " : ' Cette session n'est pas valide ") str(inspect.stack()[0][3]) + " -" + str(class_internal_url) + " : ' Cette formation n'est pas valide (2)")
return False, " La session de formation "+str(code_session)+" n'est pas valide " return False, " Cette formation n'est pas valide (2)"
if (session_count > 1): MyClass_external_code = MyClass_Data['external_code']
mycommon.myprint(
str(inspect.stack()[0][3]) + " -" + str(code_session) + " : ' Cette session existe en double ")
return False, " La session de formation "+str(code_session)+" n'est est incohérente "
session_data = MYSY_GV.dbname['session_formation'].find_one(
{'class_internal_url': str(class_internal_url), 'valide': '1',
'code_session': str(code_session), 'partner_owner_recid': str(partner_recid)}, {'_id':1})
status, saved_file = mycommon.Upload_Save_CSV_File(file, Folder) status, saved_file = mycommon.Upload_Save_CSV_File(file, Folder)
@ -1692,14 +1712,25 @@ def AddStagiairetoClass_mass(file=None, Folder=None, diction=None):
#print(" Lecture du fichier : "+saved_file) #print(" Lecture du fichier : "+saved_file)
nb_line = 0 nb_line = 0
""""
update du 31/08/23 : Controle de l'integrité du fichier avant import
"""
local_controle_status, local_controle_message = Controle_AddStagiairetoClass_mass(saved_file, Folder,diction)
if (local_controle_status is False):
return local_controle_status, local_controle_message
print(" #### local_controle_message = ", local_controle_message)
df = pd.read_csv(saved_file, encoding='utf8', on_bad_lines='skip', sep=';', encoding_errors='ignore') df = pd.read_csv(saved_file, encoding='utf8', on_bad_lines='skip', sep=';', encoding_errors='ignore')
df = df.fillna('') df = df.fillna('')
# Dictionnaire des champs utilisables # Dictionnaire des champs utilisables
''' '''
# Verification que les noms des colonne sont bien corrects" # Verification que les noms des colonne sont bien corrects"
''' '''
field_list = ['prenom', 'nom', 'employeur', 'telephone', 'email', 'modefinancement', field_list = ['formation_code_externe', 'code_session', 'prenom', 'nom', 'employeur',
'opco', 'status', 'prix', 'adresse', 'code_postal', 'ville', 'pays', 'client_rattachement_email', 'client_rattachement_nom'] 'telephone', 'email', 'modefinancement','opco', 'status', 'prix', 'adresse', 'code_postal', 'ville',
'pays', 'client_rattachement_email', 'client_rattachement_nom']
# Controle du nombre de lignes dans le fichier. # Controle du nombre de lignes dans le fichier.
@ -1715,7 +1746,7 @@ def AddStagiairetoClass_mass(file=None, Folder=None, diction=None):
if str(val).lower() not in field_list: if str(val).lower() not in field_list:
mycommon.myprint( mycommon.myprint(
str(inspect.stack()[0][3])+" : entete du fichier csv. '" + val + "' n'est pas acceptée") str(inspect.stack()[0][3])+" : entete du fichier csv. '" + val + "' n'est pas acceptée")
return False, " Entete du fichier csv. '" + val + "' n'est pas acceptée" return False, " Entete du fichier csv. La Colonne '" + val + "' n'est pas acceptée"
# Verification des champs obligatoires dans le fichier # Verification des champs obligatoires dans le fichier
field_list_obligatoire_file = ['prenom', 'nom', 'email', 'modefinancement', 'status', 'prix'] field_list_obligatoire_file = ['prenom', 'nom', 'email', 'modefinancement', 'status', 'prix']
@ -1762,6 +1793,27 @@ def AddStagiairetoClass_mass(file=None, Folder=None, diction=None):
modefinancement = str(df['modefinancement'].values[n]) modefinancement = str(df['modefinancement'].values[n])
mydata['modefinancement'] = modefinancement mydata['modefinancement'] = modefinancement
formation_code_externe = ""
if ("formation_code_externe" in df.keys()):
if (str(df['formation_code_externe'].values[n])):
formation_code_externe = str(df['formation_code_externe'].values[n]).strip()
if( str(formation_code_externe).lower() != str(MyClass_external_code).lower()):
mycommon.myprint(
str(inspect.stack()[0][3]) + "Le code externe de la formation" + str(df['formation_code_externe'].values[n]) + " ne correspond pas la formation en cours")
return False, " Le code externe de la formation" + str(df['formation_code_externe'].values[n]) + " ne correspond pas la formation en cours"
local_code_session = ""
if ("code_session" in df.keys()):
if (str(df['code_session'].values[n])):
local_code_session = str(df['code_session'].values[n]).strip()
if (str(local_code_session).lower() != str(code_session).lower()):
mycommon.myprint(
str(inspect.stack()[0][3]) + "Le code session de la formation" + str(
df['code_session'].values[n]) + " ne correspond pas au code de la session en cours")
return False, " Le code externer de la formation" + str(
df['code_session'].values[n]) + " ne correspond pas au code de la session en cours"
opco = "" opco = ""
if ("opco" in df.keys()): if ("opco" in df.keys()):
@ -1873,7 +1925,319 @@ def AddStagiairetoClass_mass(file=None, Folder=None, diction=None):
return False, "Impossible d'importer les participants en masse " return False, "Impossible d'importer les participants en masse "
"""
Controle du fichier à importer avant import
"""
def Controle_AddStagiairetoClass_mass(saved_file=None, Folder=None, diction=None):
try:
'''
# 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', 'session_id', 'class_internal_url']
incom_keys = diction.keys()
for val in incom_keys:
if val not in field_list:
mycommon.myprint(str(
inspect.stack()[0][3]) + " Le champ '" + val + "' n'existe pas, Creation participants annulée")
return False, " Verifier votre API, Toutes les informations techniques ne sont pas fournies"
'''
Une fois qu'on a controlé que toutes les clés mise dans l'API sont correcte. etape precedente,
On controle que les champs obligatoires sont presents dans la liste
'''
field_list_obligatoire = ['token', 'session_id', 'class_internal_url']
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, " Verifier votre API, Toutes les informations techniques ne sont pas fournies"
my_token = ""
if ("token" in diction.keys()):
if diction['token']:
my_token = diction['token']
partner_recid = mycommon.get_parnter_recid_from_token(my_token)
if (partner_recid is False):
mycommon.myprint(
str(inspect.stack()[0][3]) + " - partner_recid KO : Impossible d'importer la liste des participants ")
return False, " Les information de connexion sont incorrectes. Impossible d'importer la liste des participants"
# Verifier la validité du token
retval = mycommon.check_partner_token_validity("", my_token)
if retval is False:
return "Err_Connexion", " La session de connexion n'est pas valide"
session_id = ""
if ("session_id" in diction.keys()):
if diction['session_id']:
session_id = diction['session_id']
class_internal_url = ""
if ("class_internal_url" in diction.keys()):
if diction['class_internal_url']:
class_internal_url = diction['class_internal_url']
# Verification de l'existance de la session
## Verification de l'existance de session et recuperation du "code_session"
session_count = MYSY_GV.dbname['session_formation'].count_documents(
{'class_internal_url': str(class_internal_url), 'valide': '1',
'_id': ObjectId(str(session_id)), 'partner_owner_recid': str(partner_recid)})
if (session_count <= 0):
mycommon.myprint(
str(inspect.stack()[0][3]) + " -" + str(session_id) + " : ' Cette session n'est pas valide ")
return False, " Code de la session de formation n'est pas valide "
if (session_count > 1):
mycommon.myprint(
str(inspect.stack()[0][3]) + " -" + str(session_id) + " : ' Cette session existe en double ")
return False, " Les données de la session de formation sont incohérentes "
session_data = MYSY_GV.dbname['session_formation'].find_one(
{'class_internal_url': str(class_internal_url), 'valide': '1',
'_id': ObjectId(str(session_id)), 'partner_owner_recid': str(partner_recid)})
if ("code_session" not in session_data.keys()):
mycommon.myprint(
str(inspect.stack()[0][3]) + " - Cette session de formation n'a pas de code_session ")
return False, " Cette session de formation n'a pas de code_session "
code_session = session_data['code_session']
# Verification de l'existance de la formation (class_internal_url)
tmp_count = MYSY_GV.dbname['myclass'].count_documents({'internal_url': str(class_internal_url), 'valide': '1',
'locked': '0',
'partner_owner_recid': str(partner_recid)})
# logging.info(" TMP = "+str(tmp))
if (tmp_count <= 0):
mycommon.myprint(
str(inspect.stack()[0][3]) + " -" + str(class_internal_url) + " : ' Cette formation n'est pas valide ")
return False, " Cette formation n'est pas valide "
MyClass_Data = MYSY_GV.dbname['myclass'].find_one({'internal_url': str(class_internal_url), 'valide': '1',
'locked': '0',
'partner_owner_recid': str(partner_recid)})
if ("external_code" not in MyClass_Data.keys()):
mycommon.myprint(
str(inspect.stack()[0][3]) + " -" + str(
class_internal_url) + " : ' Cette formation n'est pas valide (2)")
return False, " Cette formation n'est pas valide (2)"
MyClass_external_code = MyClass_Data['external_code']
# " Lecture du fichier "
# print(" Lecture du fichier : "+saved_file)
nb_line = 0
df = pd.read_csv(saved_file, encoding='utf8', on_bad_lines='skip', sep=';', encoding_errors='ignore')
df = df.fillna('')
# Dictionnaire des champs utilisables
'''
# Verification que les noms des colonne sont bien corrects"
'''
field_list = ['formation_code_externe', 'code_session', 'prenom', 'nom', 'employeur',
'telephone', 'email', 'modefinancement', 'opco', 'status', 'prix', 'adresse', 'code_postal',
'ville',
'pays', 'client_rattachement_email', 'client_rattachement_nom']
# Controle du nombre de lignes dans le fichier.
total_rows = len(df)
if (total_rows > MYSY_GV.MAX_PARTICIPANT_BY_CSV):
mycommon.myprint(
str(inspect.stack()[0][3]) + " Le fichier comporte plus de " + str(
MYSY_GV.MAX_PARTICIPANT_BY_CSV) + " lignes.")
return False, " Le fichier comporte plus de " + str(MYSY_GV.MAX_PARTICIPANT_BY_CSV) + " lignes."
# print(df.columns)
for val in df.columns:
if str(val).lower() not in field_list:
mycommon.myprint(
str(inspect.stack()[0][3]) + " : entete du fichier csv. '" + val + "' n'est pas acceptée")
return False, " Entete du fichier csv. La Colonne '" + val + "' n'est pas acceptée"
# Verification des champs obligatoires dans le fichier
field_list_obligatoire_file = ['prenom', 'nom', 'email', 'modefinancement', 'status', 'prix']
for val in field_list_obligatoire_file:
if val not in df.columns:
mycommon.myprint(
str(inspect.stack()[0][
3]) + " : Le champ '" + val + "' n'est pas présent dans le fichier. Il est obligatoire")
return False, " Le champ '" + val + "' n'est pas présent dans le fichier. Il est obligatoire "
"""
# Recuperation des info de la session.
session_data = MYSY_GV.dbname['session_formation'].find_one({'formation_session_id':str(session_id)})
if( session_data is None ):
mycommon.myprint(
str(inspect.stack()[0][
3]) + " La session de formation n'existe pas : Impossible d'importer la liste des participants ")
return False, "la session de formation n'existe pas. Impossible d'importer la liste des participants"
#print(" #### session_data = ",session_data)
"""
x = range(0, total_rows)
for n in x:
mydata = {}
mydata['prenom'] = str(df['prenom'].values[n])
mydata['nom'] = str(df['nom'].values[n])
mydata['employeur'] = str(df['employeur'].values[n])
mydata['telephone'] = str(df['telephone'].values[n])
mydata['email'] = str(df['email'].values[n])
regex = r'\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,7}\b'
if (not re.fullmatch(regex, str(df['email'].values[n]))):
mycommon.myprint(
str(inspect.stack()[0][3]) + " l'adresse email " + str(df['email'].values[n]) + " est invalide")
return False, " l'adresse email -" + str(df['email'].values[n]) + "- est invalide"
mydata['session_id'] = str(session_data['_id'])
mydata['token'] = str(my_token)
modefinancement = ""
if ("modefinancement" in df.keys()):
if (str(df['modefinancement'].values[n])):
modefinancement = str(df['modefinancement'].values[n])
mydata['modefinancement'] = modefinancement
formation_code_externe = ""
if ("formation_code_externe" in df.keys()):
if (str(df['formation_code_externe'].values[n])):
formation_code_externe = str(df['formation_code_externe'].values[n]).strip()
if (str(formation_code_externe).lower() != str(MyClass_external_code).lower()):
mycommon.myprint(
str(inspect.stack()[0][3]) + "Le code externe de la formation" + str(
df['formation_code_externe'].values[
n]) + " ne correspond pas la formation en cours")
return False, " Le code externe de la formation" + str(
df['formation_code_externe'].values[n]) + " ne correspond pas la formation en cours"
local_code_session = ""
if ("code_session" in df.keys()):
if (str(df['code_session'].values[n])):
local_code_session = str(df['code_session'].values[n]).strip()
if (str(local_code_session).lower() != str(code_session).lower()):
mycommon.myprint(
str(inspect.stack()[0][3]) + "Le code session de la formation" + str(
df['code_session'].values[n]) + " ne correspond pas au code de la session en cours")
return False, " Le code externer de la formation" + str(
df['code_session'].values[n]) + " ne correspond pas au code de la session en cours"
opco = ""
if ("opco" in df.keys()):
if (str(df['opco'].values[n])):
opco = str(df['opco'].values[n])
mydata['opco'] = opco
adresse = ""
if ("adresse" in df.keys()):
if (str(df['adresse'].values[n])):
adresse = str(df['adresse'].values[n])
mydata['adresse'] = adresse
code_postal = ""
if ("code_postal" in df.keys()):
if (str(df['code_postal'].values[n])):
code_postal = str(df['code_postal'].values[n])
mydata['code_postal'] = code_postal
ville = ""
if ("ville" in df.keys()):
if (str(df['ville'].values[n])):
ville = str(df['ville'].values[n])
mydata['ville'] = ville
pays = ""
if ("pays" in df.keys()):
if (str(df['pays'].values[n])):
pays = str(df['pays'].values[n])
mydata['pays'] = pays
""""
Gestion du client de rattachement/
Avec l'email et le nom, on va aller recuperer l'_id du client
"""
client_rattachement_email = ""
if ("client_rattachement_email" in df.keys()):
if (str(df['client_rattachement_email'].values[n]) and str(
df['client_rattachement_email'].values[n]) != "nan"):
client_rattachement_email = str(df['client_rattachement_email'].values[n])
client_rattachement_nom = ""
if ("client_rattachement_nom" in df.keys() and str(df['client_rattachement_nom'].values[n]) != "nan"):
if (str(df['client_rattachement_nom'].values[n])):
client_rattachement_nom = str(df['client_rattachement_nom'].values[n])
if (client_rattachement_email and client_rattachement_nom):
local_client_retval_qry = {'email': str(client_rattachement_email),
'nom': str(client_rattachement_nom), 'valide': '1',
'locked': '0', 'partner_recid': str(partner_recid)}
local_client_retval_count = MYSY_GV.dbname['partner_client'].count_documents(
local_client_retval_qry)
if (local_client_retval_count > 1):
mycommon.myprint(
str(inspect.stack()[0][3]) + "Ligne : " + str(
n) + ". Plusieurs clients correspondent aux critère de nom :" + str(
client_rattachement_nom) + " et email : " + str(client_rattachement_email))
return False, "Ligne : " + str(
n) + ". Plusieurs clients correspondent aux critère de nom :" + str(
client_rattachement_nom) + " et email : " + str(client_rattachement_email)
if (local_client_retval_count < 1):
mycommon.myprint(
str(inspect.stack()[0][3]) + "Ligne : " + str(
n) + ". Aucun client ne repond aux critères de nom :" + str(
client_rattachement_nom) + " et email : " + str(client_rattachement_email))
return False, "Ligne : " + str(n) + ". Aucun client ne repond aux critères de nom :" + str(
client_rattachement_nom) + " et email : " + str(client_rattachement_email)
local_client_retval_data = MYSY_GV.dbname['partner_client'].find_one(local_client_retval_qry)
if (local_client_retval_data is not None):
mydata['client_rattachement_id'] = local_client_retval_data['_id']
mydata['status'] = str(df['status'].values[n]).strip()
if (str(mydata['status']) != "0" and str(mydata['status']) != "1" and str(mydata['status']) != "2"):
mycommon.myprint(
str(inspect.stack()[0][3]) + " Le champs 'status' de ligne " + str(
n) + " est incorrecte. Valeurs acceptées : 0,1,2")
return False, " Le champs status de la ligne " + str(
n) + " est incorrecte. Valeurs acceptées : 0,1,2"
if (str(df['status'].values[n]).strip() == "1"):
mydata['inscription_validation_date'] = str(datetime.now().strftime("%d/%m/%Y %H:%M:%S"))
mydata['class_internal_url'] = str(class_internal_url)
local_price = str(df['prix'].values[n]).strip()
local_status, new_price = mycommon.IsFloat(local_price)
if (local_status is False):
mycommon.myprint(
str(inspect.stack()[0][3]) + " Le champs 'prix' de ligne " + str(n) + " est incorrecte.")
return False, " Le champs prix de ligne " + str(n) + " est incorrecte. "
mydata['price'] = local_price
return True, str(total_rows) + " participants lus dans le fichier excel"
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 controler le fichier "
""" """
@ -1980,7 +2344,7 @@ def AddStagiairetoClass_mass_for_many_session(file=None, Folder=None, diction=No
if str(val).lower() not in field_list: if str(val).lower() not in field_list:
mycommon.myprint( mycommon.myprint(
str(inspect.stack()[0][3])+" : entete du fichier csv. '" + val + "' n'est pas acceptée") str(inspect.stack()[0][3])+" : entete du fichier csv. '" + val + "' n'est pas acceptée")
return False, " Entete du fichier csv. '" + val + "' n'est pas acceptée" return False, " Entete du fichier csv.La Colonne '" + val + "' n'est pas acceptée"
# Verification des champs obligatoires dans le fichier # Verification des champs obligatoires dans le fichier
field_list_obligatoire_file = ['prenom', 'nom', 'email', 'modefinancement', 'status', 'prix'] field_list_obligatoire_file = ['prenom', 'nom', 'email', 'modefinancement', 'status', 'prix']
@ -2296,7 +2660,7 @@ def Controle_AddStagiairetoClass_mass_for_many_session(saved_file=None, Folder=N
if str(val).lower() not in field_list: if str(val).lower() not in field_list:
mycommon.myprint( mycommon.myprint(
str(inspect.stack()[0][3])+" : entete du fichier csv. '" + val + "' n'est pas acceptée") str(inspect.stack()[0][3])+" : entete du fichier csv. '" + val + "' n'est pas acceptée")
return False, " Entete du fichier csv. '" + val + "' n'est pas acceptée" return False, " Entete du fichier csv. La Colonne '" + val + "' n'est pas acceptée"
# Verification des champs obligatoires dans le fichier # Verification des champs obligatoires dans le fichier
field_list_obligatoire_file = ['prenom', 'nom', 'email', 'modefinancement', 'status', 'prix'] field_list_obligatoire_file = ['prenom', 'nom', 'email', 'modefinancement', 'status', 'prix']
@ -3816,7 +4180,7 @@ def DeleteAttendeeInscription(diction):
# Recuperation des données de la session # Recuperation des données de la session
local_session = MYSY_GV.dbname['session_formation'].find_one( local_session = MYSY_GV.dbname['session_formation'].find_one(
{'code_session': str(diction['session_id']), 'class_internal_url': str(diction['class_internal_url']), 'valide':'1',}) {'_id': ObjectId(str(diction['session_id'])), 'class_internal_url': str(diction['class_internal_url']), 'valide':'1',})
if (local_session is None): if (local_session is None):
mycommon.myprint(str(inspect.stack()[0][3]) + " - Impossible de recuperer les données de la session ") mycommon.myprint(str(inspect.stack()[0][3]) + " - Impossible de recuperer les données de la session ")

File diff suppressed because it is too large Load Diff

View File

@ -1161,12 +1161,6 @@ def Add_Update_SessionFormation_mass(file=None, Folder=None, diction=None):
3]) + " Le code de la formation est vide : Impossible d'importer la liste des sessions ") 3]) + " Le code de la formation est vide : Impossible d'importer la liste des sessions ")
return False, "Le code de la formation est vide. Impossible d'importer la liste des sessions" return False, "Le code de la formation est vide. Impossible d'importer la liste des sessions"
# Verifier la validité du token
retval = mycommon.check_partner_token_validity("", my_token)
if retval is False:
return "Err_Connexion", " La session de connexion n'est pas valide"
partner_recid = mycommon.get_parnter_recid_from_token(my_token) partner_recid = mycommon.get_parnter_recid_from_token(my_token)
if (partner_recid is False): if (partner_recid is False):
@ -1219,7 +1213,7 @@ def Add_Update_SessionFormation_mass(file=None, Folder=None, diction=None):
if str(val).lower() not in field_list: if str(val).lower() not in field_list:
mycommon.myprint( mycommon.myprint(
str(inspect.stack()[0][3]) + " : entete du fichier csv. '" + val + "' n'est pas acceptée") str(inspect.stack()[0][3]) + " : entete du fichier csv. '" + val + "' n'est pas acceptée")
return False, " Entete du fichier csv. '" + val + "' n'est pas acceptée" return False, " Entete du fichier csv. La Colonne '" + val + "' n'est pas acceptée"
# Verification des champs obligatoires dans le fichier # Verification des champs obligatoires dans le fichier
@ -1630,11 +1624,6 @@ def Controle_Add_Update_SessionFormation_mass(saved_file=None, Folder=None, dict
3]) + " Le code de la formation est vide : Impossible d'importer la liste des sessions ") 3]) + " Le code de la formation est vide : Impossible d'importer la liste des sessions ")
return False, "Le code de la formation est vide. Impossible d'importer la liste des sessions" return False, "Le code de la formation est vide. Impossible d'importer la liste des sessions"
# Verifier la validité du token
retval = mycommon.check_partner_token_validity("", my_token)
if retval is False:
return "Err_Connexion", " La session de connexion n'est pas valide"
partner_recid = mycommon.get_parnter_recid_from_token(my_token) partner_recid = mycommon.get_parnter_recid_from_token(my_token)
if (partner_recid is False): if (partner_recid is False):
@ -1668,7 +1657,7 @@ def Controle_Add_Update_SessionFormation_mass(saved_file=None, Folder=None, dict
if str(val).lower() not in field_list: if str(val).lower() not in field_list:
mycommon.myprint( mycommon.myprint(
str(inspect.stack()[0][3]) + " : entete du fichier csv. '" + val + "' n'est pas acceptée") str(inspect.stack()[0][3]) + " : entete du fichier csv. '" + val + "' n'est pas acceptée")
return False, " Entete du fichier csv. '" + val + "' n'est pas acceptée" return False, " Entete du fichier csv. La Colonne '" + val + "' n'est pas acceptée"
# Verification des champs obligatoires dans le fichier # Verification des champs obligatoires dans le fichier
field_list_obligatoire_file = ['date_debut', 'date_fin', 'session_status', 'code_session', field_list_obligatoire_file = ['date_debut', 'date_fin', 'session_status', 'code_session',
@ -1795,7 +1784,7 @@ def Controle_Add_Update_SessionFormation_mass(saved_file=None, Folder=None, dict
mycommon.myprint( mycommon.myprint(
str(inspect.stack()[0][3]) + " Le champs 'nb_participant' de ligne " + str( str(inspect.stack()[0][3]) + " Le champs 'nb_participant' de ligne " + str(
n + 2) + " est incorrecte.") n + 2) + " est incorrecte.")
return False, " Le champs nb_participant de ligne " + str(n + 2) + " est incorrecte. " return False, " Le champs nb_participant de ligne " + str(n + 2) + " est incorrecte. Un nombre Entier Positif doit être fourni "
mydata['nb_participant'] = str(new_participants) mydata['nb_participant'] = str(new_participants)
@ -2098,7 +2087,7 @@ def Add_Update_SessionFormation_mass_for_many_class(file=None, Folder=None, dict
if str(val).lower() not in field_list: if str(val).lower() not in field_list:
mycommon.myprint( mycommon.myprint(
str(inspect.stack()[0][3]) + " : entete du fichier csv. '" + val + "' n'est pas acceptée") str(inspect.stack()[0][3]) + " : entete du fichier csv. '" + val + "' n'est pas acceptée")
return False, " Entete du fichier csv. '" + val + "' n'est pas acceptée" return False, " Entete du fichier csv. La Colonne '" + val + "' n'est pas acceptée"
# Verification des champs obligatoires dans le fichier # Verification des champs obligatoires dans le fichier
field_list_obligatoire_file = ['date_debut', 'date_fin', 'session_status', 'code_session', 'formation_code_externe'] field_list_obligatoire_file = ['date_debut', 'date_fin', 'session_status', 'code_session', 'formation_code_externe']

View File

@ -2659,7 +2659,17 @@ def add_class_mass(file=None, Folder=None, diction=None):
for val in field_list_obligatoire: for val in field_list_obligatoire:
if val not in diction: if val not in diction:
mycommon.myprint(str(inspect.stack()[0][3]) + " - La valeur '" + val + "' n'est pas presente dans liste ") mycommon.myprint(str(inspect.stack()[0][3]) + " - La valeur '" + val + "' n'est pas presente dans liste ")
return False, " Verifier votre API" return False, " Les informations de connexion sont invalides"
# Verifier la validité du token
my_token = ""
if ("token" in diction.keys()):
if diction['token']:
my_token = diction['token']
retval = mycommon.check_partner_token_validity("", my_token)
if retval is False:
return "Err_Connexion", " La session de connexion n'est pas valide"
status, saved_file = mycommon.Upload_Save_CSV_File(file, Folder) status, saved_file = mycommon.Upload_Save_CSV_File(file, Folder)
@ -2670,6 +2680,15 @@ def add_class_mass(file=None, Folder=None, diction=None):
#print(" Lecture du fichier : "+saved_file) #print(" Lecture du fichier : "+saved_file)
nb_line = 0 nb_line = 0
""""
update du 31/08/23 : Controle de l'integrité du fichier avant import
"""
local_controle_status, local_controle_message = Controle_add_class_mass(saved_file, Folder, diction)
if (local_controle_status is False):
return local_controle_status, local_controle_message
print(" #### local_controle_message = ", local_controle_message)
df = pd.read_csv(saved_file, encoding='utf8', on_bad_lines='skip', sep=';', encoding_errors='ignore') df = pd.read_csv(saved_file, encoding='utf8', on_bad_lines='skip', sep=';', encoding_errors='ignore')
df = df.fillna('') df = df.fillna('')
@ -2690,7 +2709,7 @@ def add_class_mass(file=None, Folder=None, diction=None):
if str(val).lower() not in field_list: if str(val).lower() not in field_list:
mycommon.myprint( mycommon.myprint(
str(inspect.stack()[0][3])+" : entete du fichier csv. '" + val + "' n'est pas acceptée") str(inspect.stack()[0][3])+" : entete du fichier csv. '" + val + "' n'est pas acceptée")
return False, " Entete du fichier csv. '" + val + "' n'est pas acceptée" return False, " Entete du fichier csv. La Colonne '" + val + "' n'est pas acceptée"
# Recuperation du recid de l'utilisateur # Recuperation du recid de l'utilisateur
user_recid = mycommon.get_parnter_recid_from_token(diction['token']) user_recid = mycommon.get_parnter_recid_from_token(diction['token'])
@ -3026,6 +3045,361 @@ def add_class_mass(file=None, Folder=None, diction=None):
return False, "Impossible d'inserer les formation en masse -" + str(e) return False, "Impossible d'inserer les formation en masse -" + str(e)
"""
Fonction qui permet de controler le fichier a importer avant import
"""
def Controle_add_class_mass(saved_file=None, Folder=None, diction=None):
try:
'''
# 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']
incom_keys = diction.keys()
for val in incom_keys:
if val not in field_list:
mycommon.myprint(str(inspect.stack()[0][
3]) + " - Creation formation : Le champ '" + val + "' n'existe pas, Creation formation annulée")
return False, " Le champ '" + val + "' n'existe pas, Creation formation annulée"
'''
Une fois qu'on a controlé que toutes les clés mise dans l'API sont correcte. etape precedente,
On controle que les champs obligatoires sont presents dans la liste
'''
field_list_obligatoire = ['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, " Verifier votre API"
# " Lecture du fichier "
# print(" Lecture du fichier : "+saved_file)
nb_line = 0
df = pd.read_csv(saved_file, encoding='utf8', on_bad_lines='skip', sep=';', encoding_errors='ignore')
df = df.fillna('')
# Dictionnaire des champs utilisables
'''
# Verification que les noms des colonne sont bien corrects"
'''
field_list = ['external_code', 'titre', 'description', 'formateur', 'institut_formation',
'distantiel', 'presentiel', 'prix', 'domaine', 'url', 'duree', 'duree_unite', 'plus_produit',
'mots_cle', 'zone_diffusion', 'metier', 'publie', 'img_url',
'objectif', 'programme', 'prerequis', 'formateur', 'note', 'cpf', 'certif',
'class_inscription_url', 'pourqui', 'support', 'img_banner_detail_class']
total_rows = len(df)
# print(df.columns)
for val in df.columns:
if str(val).lower() not in field_list:
mycommon.myprint(
str(inspect.stack()[0][3]) + " : entete du fichier csv. '" + val + "' n'est pas acceptée")
return False, " Entete du fichier csv. La Colonne '" + val + "' n'est pas acceptée"
# Recuperation du recid de l'utilisateur
user_recid = mycommon.get_parnter_recid_from_token(diction['token'])
if user_recid is False:
mycommon.myprint(
str(inspect.stack()[0][3]) + " - Impossible de recuperer le token du partenaire")
return False, " Les informations d'identification sont incorrectes"
x = range(0, total_rows)
ignored_line = ""
nb_inserted_line = 0
for n in x:
mydata = {}
if ("external_code" not in df.keys()):
mycommon.myprint(str(
inspect.stack()[0][
3]) + " - Absence de 'external_code' pour la formation à la ligne " + str(n + 2))
return False, " Absence de 'external_code' pour la formation à la ligne " + str(n + 2)
if ("titre" not in df.keys()):
mycommon.myprint(str(
inspect.stack()[0][
3]) + " - Absence de 'titre' pour la formation à la ligne " + str(n + 2))
return False, " Absence de 'titre' pour la formation à la ligne " + str(n + 2)
if ("domaine" not in df.keys()):
mycommon.myprint(str(
inspect.stack()[0][
3]) + " - Absence de 'domaine' pour la formation à la ligne " + str(n + 2))
return False, " Absence de 'domaine' pour la formation à la ligne " + str(n + 2)
if ("description" not in df.keys()):
mycommon.myprint(str(
inspect.stack()[0][
3]) + " - Absence de 'description' pour la formation à la ligne " + str(n + 2))
return False, " Absence de 'description' pour la formation à la ligne " + str(n + 2)
nb_inserted_line = nb_inserted_line + 1
# Si une ligne n'a aucune information obligatoire, alors on ignore la ligne
if (str(df['external_code'].values[n]) == "nan" or str(df['titre'].values[n]) == "nan"):
mycommon.myprint(str(
inspect.stack()[0][
3]) + " - La ligne " + str(n + 2) + " a été ignorée")
ignored_line = str(n + 2) + " , " + str(ignored_line)
nb_inserted_line = nb_inserted_line - 1
continue
mydata['external_code'] = str(df['external_code'].values[n]).strip()
mydata['title'] = str(df['titre'].values[n]).strip()
mydata['domaine'] = str(df['domaine'].values[n]).strip()
tmp_desc = str(df['description'].values[n]).strip()
tmp_desc = mycommon.format_MySy_Text_Tag(tmp_desc)
mydata['description'] = tmp_desc
"""
Verifier que le domaine est bien dans la liste acceptée
"""
count_domaine = MYSY_GV.dbname['liste_domaine_metier'].count_documents(
{'domaine': str(mydata['domaine']).lower(), 'valide': '1', 'locked': '0'})
if (count_domaine <= 0):
mycommon.myprint(str(
inspect.stack()[0][
3]) + " - Le domaine '" + str(mydata['domaine']) + "' pour la formation à la ligne " + str(
n + 2) + " n'est pas autorisé. Verifier la liste des domaines autorisés")
return False, " - Le domaine '" + str(mydata['domaine']) + "' pour la formation à la ligne " + str(
n + 2) + " n'est pas autorisé. Verifier la liste des domaines autorisés"
formateur = ""
if ("formateur" in df.keys()):
if (str(df['formateur'].values[n])):
formateur = str(df['formateur'].values[n]).strip()
mydata['trainer'] = formateur
institut_formation = ""
if ("institut_formation" in df.keys()):
if (str(df['institut_formation'].values[n])):
institut_formation = str(df['institut_formation'].values[n]).strip()
mydata['institut_formation'] = institut_formation
# mydata['duration'] = float(str(df['duree'].values[n]))
url = ""
if ("url" in df.keys()):
if (str(df['url'].values[n])):
url = str(df['url'].values[n]).strip()
mydata['url'] = url
duration = "0"
if ("duree" in df.keys()):
if (str(df['duree'].values[n])):
duration = str(df['duree'].values[n]).strip()
mydata['duration'] = duration
plus_produit = ""
if ("plus_produit" in df.keys()):
if (str(df['plus_produit'].values[n])):
plus_produit = str(df['plus_produit'].values[n]).strip()
plus_produit = mycommon.format_MySy_Text_Tag(plus_produit)
mydata['plus_produit'] = plus_produit
presentiel = "0"
if ("presentiel" in df.keys()):
if (str(df['presentiel'].values[n])):
presentiel = str(df['presentiel'].values[n]).strip()
mydata['presentiel'] = presentiel
distantiel = "0"
if ("distantiel" in df.keys()):
if (str(df['distantiel'].values[n])):
distantiel = str(df['distantiel'].values[n]).strip()
mydata['distantiel'] = distantiel
price = "0"
if ("prix" in df.keys()):
if (str(df['prix'].values[n])):
price = str(df['prix'].values[n]).strip()
mydata['price'] = price
metier = ""
if ("metier" in df.keys()):
if (str(df['metier'].values[n])):
metier = str(df['metier'].values[n]).strip()
"""
Verifier que le metier est bien dans la liste acceptée
"""
count_domaine = MYSY_GV.dbname['liste_domaine_metier'].count_documents(
{'metier': str(metier).lower(), 'valide': '1', 'locked': '0'})
if (count_domaine <= 0):
mycommon.myprint(str(
inspect.stack()[0][3]) + " - Le metier '" + str(
metier) + "' pour la formation à la ligne " + str(
n + 2) + " n'est pas autorisé. Verifier la liste des domaines autorisés")
return False, " - Le metier '" + str(metier) + "' pour la formation à la ligne " + str(
n + 2) + " n'est pas autorisé. Verifier la liste des domaines autorisés"
mydata['metier'] = metier
published = "1"
if ("published" in df.keys()):
if (str(df['published'].values[n])):
published = str(df['published'].values[n]).strip()
mydata['published'] = published
mycpf = "0"
if ("cpf" in df.keys()):
if (str(df['cpf'].values[n])):
mycpf = str(df['cpf'].values[n]).strip()
mydata['cpf'] = mycpf
class_inscription_url = ""
if ("class_inscription_url" in df.keys()):
if (str(df['class_inscription_url'].values[n])):
class_inscription_url = str(df['class_inscription_url'].values[n]).strip()
mydata['class_inscription_url'] = class_inscription_url
certif = "0"
if ("certif" in df.keys()):
if (str(df['certif'].values[n])):
certif = str(df['certif'].values[n]).strip()
mydata['certif'] = certif
objectif = ""
if ("objectif" in df.keys()):
if (str(df['objectif'].values[n])):
objectif = str(df['objectif'].values[n]).strip()
objectif = mycommon.format_MySy_Text_Tag(objectif)
mydata['objectif'] = objectif
note = ""
if ("note" in df.keys()):
if (str(df['note'].values[n])):
note = str(df['note'].values[n]).strip()
mydata['note'] = note
programme = ""
if ("programme" in df.keys()):
if (str(df['programme'].values[n])):
programme = str(df['programme'].values[n]).strip()
programme = mycommon.format_MySy_Text_Tag(programme)
mydata['programme'] = programme
prerequis = ""
if ("prerequis" in df.keys()):
if (str(df['prerequis'].values[n])):
prerequis = str(df['prerequis'].values[n]).strip()
prerequis = mycommon.format_MySy_Text_Tag(prerequis)
mydata['prerequis'] = prerequis
pourqui = ""
if ("pourqui" in df.keys()):
if (str(df['pourqui'].values[n])):
pourqui = str(df['pourqui'].values[n]).strip()
pourqui = mycommon.format_MySy_Text_Tag(pourqui)
mydata['pourqui'] = pourqui
support = ""
if ("support" in df.keys()):
if (str(df['support'].values[n])):
support = str(df['support'].values[n]).strip()
mydata['support'] = support
img_banner_detail_class = ""
if ("img_banner_detail_class" in df.keys()):
if (str(df['img_banner_detail_class'].values[n])):
img_banner_detail_class = str(df['img_banner_detail_class'].values[n]).strip()
mydata['img_banner_detail_class'] = img_banner_detail_class
if ("duree_unite" in df.keys()):
if (str(df['duree_unite'].values[n]).strip() not in MYSY_GV.CLASS_DURATION_UNIT):
mycommon.myprint(
str(inspect.stack()[0][3]) + " : le champ 'duration_unit' contient une valeur erronées."
" Les valeurs acceptées sont " + str(
MYSY_GV.CLASS_DURATION_UNIT) + " ")
return False, " : le champ 'duration_unit' contient une valeur erronées." \
" Les valeurs acceptées sont " + str(MYSY_GV.CLASS_DURATION_UNIT)
mydata['duration_unit'] = str(df['duree_unite'].values[n]).strip()
else:
mydata['duration_unit'] = "jour"
'''
Verification de l'image
'''
if ("img_url" in df.keys()):
mydata['img_url'] = str(df['img_url'].values[n]).strip()
if (str(df['img_url'].values[n]) == 'nan'):
mydata['img_url'] = ""
# print(" ### mydata['img_url'] = '"+str(mydata['img_url'])+"' ")
if (len(str(mydata['img_url'])) > 0):
# Verifier si l'image existe
status_tmp, img = mycommon.TryUrlImage(str(mydata['img_url']))
if (status_tmp is False):
mycommon.myprint(
str(inspect.stack()[0][3]) + " : l'url de l'image de la formation " + str(
mydata['external_code']) + " est incorrecte ")
return False, " l'url de l'image de la formation " + str(
mydata['external_code']) + " est incorrecte "
'''
Verification du nombre de mots clée : limite MYSY_GV.MAX_KEYWORD (3)
'''
mots_cle = ""
if ("mots_cle" in df.keys()):
if (str(df['mots_cle'].values[n])):
mots_cle = str(df['mots_cle'].values[n]).strip()
if (mots_cle.endswith(';')):
mots_cle = mots_cle[:-1]
nb_keyword = mots_cle.split(";")
if (len(str(mots_cle).strip()) > 0 and len(nb_keyword) > 0):
for local_nb_keyword in nb_keyword:
if (len(str(local_nb_keyword).strip()) <= 0):
mycommon.myprint(
str(inspect.stack()[0][3]) + " : La formation " + str(
mydata['external_code']) + " contient des valeur vide (2)")
return False, " La formation " + str(mydata['external_code']) + " contient des valeurs vides"
if (len(nb_keyword) > MYSY_GV.MAX_KEYWORD):
mycommon.myprint(
str(inspect.stack()[0][3]) + " : La formation " + str(
mydata['external_code']) + " a plus de " + str(MYSY_GV.MAX_KEYWORD) + " mots clés")
return False, " La formation " + str(mydata['external_code']) + " a plus de " + str(
MYSY_GV.MAX_KEYWORD) + " mots clés"
mydata['mots_cle'] = mots_cle
'''
Traitement de la zone de diffusion
'''
zone_diffusion = ""
if ("zone_diffusion" in df.keys()):
if (str(df['zone_diffusion'].values[n])):
zone_diffusion = str(df['zone_diffusion'].values[n]).strip()
return True, str(nb_inserted_line) + " formations ont été controlé / Mises à jour. "
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 controler le fichier à importer "
''' '''
Cette fonction retourne les formation par metier Cette fonction retourne les formation par metier

80
main.py
View File

@ -4447,6 +4447,19 @@ def Get_Given_Partner_Document():
return jsonify(status=status, message=retval) return jsonify(status=status, message=retval)
"""
API de recuperation d'un document par default : un document par defaut qui EST UNIQUEMENT paramettré avec un "partner_owner_recid" = "default"
"""
@app.route('/myclass/api/Get_Given_DFAULT_Partner_Document/', methods=['POST','GET'])
@crossdomain(origin='*')
def Get_Given_DFAULT_Partner_Document():
# On recupere le corps (payload) de la requete
payload = mycommon.strip_dictionary (request.form.to_dict())
print(" ### Get_Given_DFAULT_Partner_Document payload = ",payload)
status, retval = partner_document_mgt.Get_Given_DFAULT_Partner_Document(payload)
return jsonify(status=status, message=retval)
""" """
API de recuperation d'un document d'orignine (template) API de recuperation d'un document d'orignine (template)
""" """
@ -4536,6 +4549,73 @@ def Send_Partner_Order_By_Email():
status, message = partner_order.Send_Partner_Order_By_Email(payload) status, message = partner_order.Send_Partner_Order_By_Email(payload)
return jsonify(status=status, message=message) return jsonify(status=status, message=message)
"""
Conversion d'un devis en commande
"""
@app.route('/myclass/api/Convert_Quotation_to_Order/', methods=['GET','POST'])
@crossdomain(origin='*')
def Convert_Quotation_to_Order():
# On recupere le corps (payload) de la requete
payload = mycommon.strip_dictionary (request.form.to_dict())
print(" ### Convert_Quotation_to_Order payload = ", str(payload))
status, message = partner_order.Convert_Quotation_to_Order(payload)
return jsonify(status=status, message=message)
"""
API de recuperation de tous les champs personnalisables dans un document
"""
@app.route('/myclass/api/Get_All_Personnalisable_Collection_Fields/', methods=['POST','GET'])
@crossdomain(origin='*')
def Get_All_Personnalisable_Collection_Fields():
# On recupere le corps (payload) de la requete
payload = mycommon.strip_dictionary (request.form.to_dict())
print(" ### Get_All_Personnalisable_Collection_Fields payload = ",payload)
status, retval = partner_document_mgt.Get_All_Personnalisable_Collection_Fields(payload)
return jsonify(status=status, message=retval)
"""
API de recuperation des champs personnalisable d'un 'courrier_template_ref_interne' donné
"""
@app.route('/myclass/api/Get_Given_Personnalisable_Fields_By_template_ref_interne/', methods=['POST','GET'])
@crossdomain(origin='*')
def Get_Given_Personnalisable_Fields_By_template_ref_interne():
# On recupere le corps (payload) de la requete
payload = mycommon.strip_dictionary (request.form.to_dict())
print(" ### Get_Given_Personnalisable_Fields_By_template_ref_interne payload = ",payload)
status, retval = partner_document_mgt.Get_Given_Personnalisable_Fields_By_template_ref_interne(payload)
return jsonify(status=status, message=retval)
"""
API de Recuperation des champs personnalisable d'un 'courrier_template_id' donné, avec un partner_owner_recid = "default"
"""
@app.route('/myclass/api/Get_Given_Personnalisable_Fields_By_courrier_template_id/', methods=['POST','GET'])
@crossdomain(origin='*')
def Get_Given_Personnalisable_Fields_By_courrier_template_id():
# On recupere le corps (payload) de la requete
payload = mycommon.strip_dictionary (request.form.to_dict())
print(" ### Get_Given_Personnalisable_Fields_By_courrier_template_id payload = ",payload)
status, retval = partner_document_mgt.Get_Given_Personnalisable_Fields_By_courrier_template_id(payload)
return jsonify(status=status, message=retval)
"""
API de recuperation de la liste des documents par defautl
"""
@app.route('/myclass/api/Get_List_Default_Partner_Document/', methods=['POST','GET'])
@crossdomain(origin='*')
def Get_List_Default_Partner_Document():
# On recupere le corps (payload) de la requete
payload = mycommon.strip_dictionary (request.form.to_dict())
print(" ### Get_List_Default_Partner_Document payload = ",payload)
status, retval = partner_document_mgt.Get_List_Default_Partner_Document(payload)
return jsonify(status=status, message=retval)

View File

@ -113,6 +113,19 @@ def Add_Partner_Document(diction):
data['sujet'] = diction['sujet'] data['sujet'] = diction['sujet']
cible = ""
if ("cible" in diction.keys()):
if diction['cible']:
cible = diction['cible']
if (len(str(cible)) > 255):
mycommon.myprint(
str(inspect.stack()[0][
3]) + " - Le champ 'cible' fait plus de 255 caractères ")
return False, " - Le champ 'cible' fait plus de 255 caractères "
data['cible'] = diction['cible']
type_doc = "" type_doc = ""
if ("type_doc" in diction.keys()): if ("type_doc" in diction.keys()):
if diction['type_doc']: if diction['type_doc']:
@ -271,6 +284,20 @@ def Update_Partner_Document(diction):
return False, " - Le champ 'sujet' fait plus de 255 caractères " return False, " - Le champ 'sujet' fait plus de 255 caractères "
data_update['sujet'] = diction['sujet'] data_update['sujet'] = diction['sujet']
cible = ""
if ("cible" in diction.keys()):
if diction['cible']:
cible = diction['cible']
if (len(str(cible)) > 255):
mycommon.myprint(
str(inspect.stack()[0][
3]) + " - Le champ 'cible' fait plus de 255 caractères ")
return False, " - Le champ 'cible' fait plus de 255 caractères "
data_update['cible'] = diction['cible']
type_doc = "" type_doc = ""
if ("type_doc" in diction.keys()): if ("type_doc" in diction.keys()):
if diction['type_doc']: if diction['type_doc']:
@ -470,6 +497,77 @@ def Get_List_Partner_Document(diction):
mycommon.myprint(str(inspect.stack()[0][3]) + " -" + str(e) + " - Line : " + str(exc_tb.tb_lineno)) mycommon.myprint(str(inspect.stack()[0][3]) + " -" + str(e) + " - Line : " + str(exc_tb.tb_lineno))
return False, " Impossible de recuperer la liste des modèles de document " return False, " Impossible de recuperer la liste des modèles de document "
"""
Recuperation de la liste des documents par defaut
"""
def Get_List_Default_Partner_Document(diction):
try:
diction = mycommon.strip_dictionary(diction)
"""
Verification des input acceptés
"""
field_list = ['token', ]
incom_keys = diction.keys()
for val in incom_keys:
if val not in field_list:
mycommon.myprint(str(
inspect.stack()[0][3]) + " Le champ '" + val + "' n'existe pas")
return False, " Les informations fournies sont incorrectes",
"""
Verification des champs obligatoires
"""
field_list_obligatoire = ['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",
"""
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']
local_status, my_partner = mycommon.Check_Connexion_And_Return_Partner_Data(diction)
if (local_status is not True):
return local_status, my_partner
"""
Clés de mise à jour
"""
data_cle = {}
data_cle['partner_owner_recid'] = "default"
data_cle['locked'] = "0"
data_cle['valide'] = "1"
RetObject = []
val_tmp = 1
for retval in MYSY_GV.dbname['courrier_template'].find(data_cle, {'_id':1, 'nom':1, 'ref_interne':1 }):
user = retval
user['id'] = str(val_tmp)
val_tmp = val_tmp + 1
RetObject.append(mycommon.JSONEncoder().encode(user))
return True, RetObject
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 recuperer la liste des modèles de document "
""" """
Recuperation d'un modèle de dcument donnée en se basant sur on token, _id, Recuperation d'un modèle de dcument donnée en se basant sur on token, _id,
""" """
@ -526,7 +624,7 @@ def Get_Given_Partner_Document(diction):
RetObject = [] RetObject = []
val_tmp = 1 val_tmp = 1
#print(" ### data_cle = ", data_cle) print(" ### Get_Given_Partner_Documentdata_cle = ", data_cle)
for retval in MYSY_GV.dbname['courrier_template'].find(data_cle): for retval in MYSY_GV.dbname['courrier_template'].find(data_cle):
user = retval user = retval
user['id'] = str(val_tmp) user['id'] = str(val_tmp)
@ -543,6 +641,78 @@ def Get_Given_Partner_Document(diction):
mycommon.myprint(str(inspect.stack()[0][3]) + " -" + str(e) + " - Line : " + str(exc_tb.tb_lineno)) mycommon.myprint(str(inspect.stack()[0][3]) + " -" + str(e) + " - Line : " + str(exc_tb.tb_lineno))
return False, " Impossible de recuperer le modèle de document " return False, " Impossible de recuperer le modèle de document "
"""
Recuperation d'un document par defaut qui EST UNIQUEMENT paramettré avec un "partner_owner_recid" = "default"
"""
def Get_Given_DFAULT_Partner_Document(diction):
try:
diction = mycommon.strip_dictionary(diction)
"""
Verification des input acceptés
"""
field_list = ['token', '_id']
incom_keys = diction.keys()
for val in incom_keys:
if val not in field_list:
mycommon.myprint(str(
inspect.stack()[0][3]) + " Le champ '" + val + "' n'existe pas")
return False, " Les informations fournies sont incorrectes",
"""
Verification des champs obligatoires
"""
field_list_obligatoire = ['token', '_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, " 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']
local_status, my_partner = mycommon.Check_Connexion_And_Return_Partner_Data(diction)
if (local_status is not True):
return local_status, my_partner
"""
Clés de mise à jour
"""
data_cle = {}
data_cle['partner_owner_recid'] = "default"
data_cle['_id'] = ObjectId(str(diction['_id']))
data_cle['valide'] = "1"
data_cle['locked'] = "0"
RetObject = []
val_tmp = 1
print(" ### Get_Given_DFAULT_Partner_Document = ", data_cle)
for retval in MYSY_GV.dbname['courrier_template'].find(data_cle):
user = retval
user['id'] = str(val_tmp)
val_tmp = val_tmp + 1
RetObject.append(mycommon.JSONEncoder().encode(user))
#print(" ### RetObject = ", RetObject)
return True, RetObject
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 recuperer le modèle de document "
""" """
@ -693,3 +863,242 @@ def Get_Default_Partner_Document_By_Internal_Ref(diction):
mycommon.myprint(str(inspect.stack()[0][3]) + " -" + str(e) + " - Line : " + str(exc_tb.tb_lineno)) mycommon.myprint(str(inspect.stack()[0][3]) + " -" + str(e) + " - Line : " + str(exc_tb.tb_lineno))
return False, " Impossible de recuperer le modèle de document d'origine " return False, " Impossible de recuperer le modèle de document d'origine "
"""
Recuperation de tous les champs personnalisables
"""
def Get_All_Personnalisable_Collection_Fields(diction):
try:
diction = mycommon.strip_dictionary(diction)
"""
Verification des input acceptés
"""
field_list = ['token',]
incom_keys = diction.keys()
for val in incom_keys:
if val not in field_list:
mycommon.myprint(str(
inspect.stack()[0][3]) + " Le champ '" + val + "' n'existe pas")
return False, " Les informations fournies sont incorrectes",
"""
Verification des champs obligatoires
"""
field_list_obligatoire = ['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",
"""
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']
local_status, my_partner = mycommon.Check_Connexion_And_Return_Partner_Data(diction)
if (local_status is not True):
return local_status, my_partner
"""
Clés de mise à jour
"""
data_cle = {}
data_cle['partner_owner_recid'] = 'default'
data_cle['valide'] = "1"
data_cle['locked'] = "0"
RetObject = []
val_tmp = 1
#print(" ### data_cle = ", data_cle)
for retval in MYSY_GV.dbname['courrier_template_champ_config'].find(data_cle):
user = retval
user['id'] = str(val_tmp)
val_tmp = val_tmp + 1
RetObject.append(mycommon.JSONEncoder().encode(user))
#print(" ### RetObject = ", RetObject)
return True, RetObject
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 recuperer les champs personnalisables "
"""
Recuperation des champs personnalisable d'un 'courrier_template_ref_interne' donné
"""
def Get_Given_Personnalisable_Fields_By_template_ref_interne(diction):
try:
diction = mycommon.strip_dictionary(diction)
"""
Verification des input acceptés
"""
field_list = ['token','courrier_template_ref_interne']
incom_keys = diction.keys()
for val in incom_keys:
if val not in field_list:
mycommon.myprint(str(
inspect.stack()[0][3]) + " Le champ '" + val + "' n'existe pas")
return False, " Les informations fournies sont incorrectes",
"""
Verification des champs obligatoires
"""
field_list_obligatoire = ['token', 'courrier_template_ref_interne' ]
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']
local_status, my_partner = mycommon.Check_Connexion_And_Return_Partner_Data(diction)
if (local_status is not True):
return local_status, my_partner
"""
Clés de mise à jour
"""
data_cle = {}
data_cle['partner_owner_recid'] = 'default'
data_cle['courrier_template_ref_interne'] = diction['courrier_template_ref_interne']
data_cle['valide'] = "1"
data_cle['locked'] = "0"
RetObject = []
val_tmp = 1
#print(" ### data_cle = ", data_cle)
for retval in MYSY_GV.dbname['courrier_template_champ_config'].find(data_cle):
user = retval
user['id'] = str(val_tmp)
val_tmp = val_tmp + 1
RetObject.append(mycommon.JSONEncoder().encode(user))
#print(" ### RetObject = ", RetObject)
return True, RetObject
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 recuperer les champs personnalisables de l'objet "
"""
Recuperation des champs personnalisable d'un 'courrier_template_id' donné, avec un partner_owner_recid = "default"
"""
def Get_Given_Personnalisable_Fields_By_courrier_template_id(diction):
try:
diction = mycommon.strip_dictionary(diction)
"""
Verification des input acceptés
"""
field_list = ['token','courrier_template_id']
incom_keys = diction.keys()
for val in incom_keys:
if val not in field_list:
mycommon.myprint(str(
inspect.stack()[0][3]) + " Le champ '" + val + "' n'existe pas")
return False, " Les informations fournies sont incorrectes",
"""
Verification des champs obligatoires
"""
field_list_obligatoire = ['token', 'courrier_template_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, " 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']
local_status, my_partner = mycommon.Check_Connexion_And_Return_Partner_Data(diction)
if (local_status is not True):
return local_status, my_partner
# Recuperation du ref interne du courrie_template, avec un partner_owner_recid = "default"
courrier_template_data = MYSY_GV.dbname['courrier_template'].find_one({'partner_owner_recid':'default', '_id':ObjectId(str(diction['courrier_template_id'])),
'valide':'1', 'locked':'0'})
if( courrier_template_data is None):
mycommon.myprint(
str(inspect.stack()[0][3]) + " - L'Id du modèle de courrier est invalide ")
return False, " L'Id du modèle de courrier est invalide",
if( "ref_interne" not in courrier_template_data.keys() ):
mycommon.myprint(
str(inspect.stack()[0][3]) + " - La ref_interne du modèle de courrier est invalide ")
return False, " La ref_interne du modèle de courrier est invalide",
"""
Clés de mise à jour
"""
data_cle = {}
data_cle['partner_owner_recid'] = 'default'
data_cle['courrier_template_ref_interne'] = courrier_template_data['ref_interne']
data_cle['valide'] = "1"
data_cle['locked'] = "0"
RetObject = []
val_tmp = 1
#print(" ### data_cle = ", data_cle)
for retval in MYSY_GV.dbname['courrier_template_champ_config'].find(data_cle):
user = retval
user['id'] = str(val_tmp)
val_tmp = val_tmp + 1
RetObject.append(mycommon.JSONEncoder().encode(user))
#print(" ### RetObject = ", RetObject)
return True, RetObject
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 recuperer les champs personnalisables de l'objet "

View File

@ -59,7 +59,7 @@ def Add_Partner_Order(diction):
'order_header_condition_paiement', 'order_header_ref_client', 'order_header_vendeur_id', 'order_header_condition_paiement', 'order_header_ref_client', 'order_header_vendeur_id',
'order_header_ref_interne', 'order_header_total_ht', 'order_header_total_tax', 'order_header_total_ttc', 'order_header_status', 'order_header_type_reduction', 'order_header_ref_interne', 'order_header_total_ht', 'order_header_total_tax', 'order_header_total_ttc', 'order_header_status', 'order_header_type_reduction',
'order_header_type_reduction_valeur', 'order_header_montant_reduction', 'order_lines', 'order_header_type', 'order_header_type_reduction_valeur', 'order_header_montant_reduction', 'order_lines', 'order_header_type',
'order_header_location_type'] 'order_header_location_type', 'order_header_origin']
""" """
/!\ A noter que "order_lines" est tableau [] qui peut contenir les keys suivantes : 'order_line_formation', 'order_line_qty', 'order_line_prix_unitaire', 'order_line_tax', 'order_line_type_reduction', 'order_line_type_valeur', 'order_line_montant_reduction' /!\ A noter que "order_lines" est tableau [] qui peut contenir les keys suivantes : 'order_line_formation', 'order_line_qty', 'order_line_prix_unitaire', 'order_line_tax', 'order_line_type_reduction', 'order_line_type_valeur', 'order_line_montant_reduction'
@ -187,6 +187,18 @@ def Add_Partner_Order(diction):
data['order_header_status'] = "0" data['order_header_status'] = "0"
order_header_origin = ""
if ("order_header_origin" in diction.keys()):
if diction['order_header_origin']:
order_header_origin = diction['order_header_origin']
if (len(str(order_header_origin)) > 255):
mycommon.myprint(
str(inspect.stack()[0][
3]) + " - Le champ 'order_header_origin' fait plus de 255 caractères ")
return False, " - Le champ 'order_header_origin' fait plus de 255 caractères "
data['order_header_origin'] = diction['order_header_origin']
order_header_ref_externe = "" order_header_ref_externe = ""
if ("order_header_ref_externe" in diction.keys()): if ("order_header_ref_externe" in diction.keys()):
if diction['order_header_ref_externe']: if diction['order_header_ref_externe']:
@ -199,6 +211,8 @@ def Add_Partner_Order(diction):
return False, " - Le champ 'ref_externe' fait plus de 255 caractères " return False, " - Le champ 'ref_externe' fait plus de 255 caractères "
data['order_header_ref_externe'] = diction['order_header_ref_externe'] data['order_header_ref_externe'] = diction['order_header_ref_externe']
order_header_location_type = "" order_header_location_type = ""
if ("order_header_location_type" in diction.keys()): if ("order_header_location_type" in diction.keys()):
if diction['order_header_location_type']: if diction['order_header_location_type']:
@ -521,7 +535,7 @@ def Add_Partner_Quotation(diction):
'order_header_ref_interne', 'order_header_total_ht', 'order_header_total_tax', 'order_header_ref_interne', 'order_header_total_ht', 'order_header_total_tax',
'order_header_total_ttc', 'order_header_status', 'order_header_type_reduction', 'order_header_total_ttc', 'order_header_status', 'order_header_type_reduction',
'order_header_type_reduction_valeur', 'order_header_montant_reduction', 'order_lines', 'order_header_type_reduction_valeur', 'order_header_montant_reduction', 'order_lines',
'order_header_type', 'order_header_location_type'] 'order_header_type', 'order_header_location_type', 'order_header_origin']
""" """
/!\ A noter que "order_lines" est tableau [] qui peut contenir les keys suivantes : 'order_line_formation', 'order_line_qty', 'order_line_prix_unitaire', 'order_line_tax', 'order_line_type_reduction', 'order_line_type_valeur', 'order_line_montant_reduction' /!\ A noter que "order_lines" est tableau [] qui peut contenir les keys suivantes : 'order_line_formation', 'order_line_qty', 'order_line_prix_unitaire', 'order_line_tax', 'order_line_type_reduction', 'order_line_type_valeur', 'order_line_montant_reduction'
@ -669,6 +683,20 @@ def Add_Partner_Quotation(diction):
return False, " - Le champ 'ref_externe' fait plus de 255 caractères " return False, " - Le champ 'ref_externe' fait plus de 255 caractères "
data['order_header_ref_externe'] = diction['order_header_ref_externe'] data['order_header_ref_externe'] = diction['order_header_ref_externe']
order_header_origin = ""
if ("order_header_origin" in diction.keys()):
if diction['order_header_origin']:
order_header_origin = diction['order_header_origin']
if (len(str(order_header_origin)) > 255):
mycommon.myprint(
str(inspect.stack()[0][
3]) + " - Le champ 'order_header_origin' fait plus de 255 caractères ")
return False, " - Le champ 'order_header_origin' fait plus de 255 caractères "
data['order_header_origin'] = diction['order_header_origin']
order_header_vendeur_id = "" order_header_vendeur_id = ""
if ("order_header_vendeur_id" in diction.keys()): if ("order_header_vendeur_id" in diction.keys()):
if diction['order_header_vendeur_id']: if diction['order_header_vendeur_id']:
@ -976,7 +1004,7 @@ def Update_Partner_Order_Header(diction):
'order_header_ref_interne', 'order_header_total_ht', 'order_header_total_tax', 'order_header_ref_interne', 'order_header_total_ht', 'order_header_total_tax',
'order_header_total_ttc', 'order_header_status', 'order_header_type_reduction', 'order_header_total_ttc', 'order_header_status', 'order_header_type_reduction',
'order_header_type_reduction_valeur', 'order_header_montant_reduction', 'order_header_type_reduction_valeur', 'order_header_montant_reduction',
'order_header_id', 'order_header_type', 'order_header_location_type'] 'order_header_id', 'order_header_type', 'order_header_location_type', 'order_header_origin']
@ -1145,6 +1173,18 @@ def Update_Partner_Order_Header(diction):
return False, " - Le champ 'ref_externe' fait plus de 255 caractères " return False, " - Le champ 'ref_externe' fait plus de 255 caractères "
data['order_header_ref_externe'] = diction['order_header_ref_externe'] data['order_header_ref_externe'] = diction['order_header_ref_externe']
order_header_origin = ""
if ("order_header_origin" in diction.keys()):
order_header_origin = diction['order_header_origin']
if (len(str(order_header_origin)) > 255):
mycommon.myprint(
str(inspect.stack()[0][
3]) + " - Le champ 'order_header_origin' fait plus de 255 caractères ")
return False, " - Le champ 'order_header_origin' fait plus de 255 caractères "
data['order_header_origin'] = diction['order_header_origin']
order_header_type_reduction = "" order_header_type_reduction = ""
if ("order_header_type_reduction" in diction.keys()): if ("order_header_type_reduction" in diction.keys()):
order_header_type_reduction = diction['order_header_type_reduction'] order_header_type_reduction = diction['order_header_type_reduction']
@ -1417,7 +1457,7 @@ def Update_Partner_Quotation_Header(diction):
'order_header_ref_interne', 'order_header_total_ht', 'order_header_total_tax', 'order_header_ref_interne', 'order_header_total_ht', 'order_header_total_tax',
'order_header_total_ttc', 'order_header_status', 'order_header_type_reduction', 'order_header_total_ttc', 'order_header_status', 'order_header_type_reduction',
'order_header_type_reduction_valeur', 'order_header_montant_reduction', 'order_header_type_reduction_valeur', 'order_header_montant_reduction',
'order_header_id', 'order_header_type', 'order_header_location_type'] 'order_header_id', 'order_header_type', 'order_header_location_type', 'order_header_origin']
incom_keys = diction.keys() incom_keys = diction.keys()
for val in incom_keys: for val in incom_keys:
@ -1589,6 +1629,18 @@ def Update_Partner_Quotation_Header(diction):
return False, " - Le champ 'ref_externe' fait plus de 255 caractères " return False, " - Le champ 'ref_externe' fait plus de 255 caractères "
data['order_header_ref_externe'] = diction['order_header_ref_externe'] data['order_header_ref_externe'] = diction['order_header_ref_externe']
order_header_origin = ""
if ("order_header_origin" in diction.keys()):
order_header_origin = diction['order_header_origin']
if (len(str(order_header_origin)) > 255):
mycommon.myprint(
str(inspect.stack()[0][
3]) + " - Le champ 'order_header_origin' fait plus de 255 caractères ")
return False, " - Le champ 'order_header_origin' fait plus de 255 caractères "
data['order_header_origin'] = diction['order_header_origin']
order_header_type_reduction = "" order_header_type_reduction = ""
if ("order_header_type_reduction" in diction.keys()): if ("order_header_type_reduction" in diction.keys()):
order_header_type_reduction = diction['order_header_type_reduction'] order_header_type_reduction = diction['order_header_type_reduction']
@ -3692,6 +3744,17 @@ def GerneratePDF_Partner_Order(diction):
3]) + " - Le client est invalide") 3]) + " - Le client est invalide")
return False, " Le client est invalide" return False, " Le client est invalide"
### Ajout des données du client sur l'entete de la commande, exemple : le nom, email, etc
if("raison_sociale" in Order_header_client_data.keys() ):
Order_header_data['client_raison_sociale'] = Order_header_client_data['raison_sociale']
if ("nom" in Order_header_client_data.keys()):
Order_header_data['client_nom'] = Order_header_client_data['nom']
if ("email" in Order_header_client_data.keys()):
Order_header_data['client_email'] = Order_header_client_data['email']
# Recuperation des details de lignes de : partner_order_line # Recuperation des details de lignes de : partner_order_line
filt_class_partner_recid = {'partner_owner_recid': str(my_partner['recid'])} filt_class_partner_recid = {'partner_owner_recid': str(my_partner['recid'])}
filt_order_header_order_id = {'order_header_id': str(diction['order_id'])} filt_order_header_order_id = {'order_header_id': str(diction['order_id'])}
@ -3815,7 +3878,7 @@ def GerneratePDF_Partner_Order(diction):
sourceHtml = contenu_doc_Template.render(params=Order_header_data, param_order_lines=Order_header_lines_data) sourceHtml = contenu_doc_Template.render(params=Order_header_data, param_order_lines=Order_header_lines_data)
orig_file_name = "Part_Order_"+str(Order_header_data['order_header_ref_interne'])+".pdf" orig_file_name = "Partner_Order_"+str(Order_header_data['order_header_ref_interne'])+".pdf"
outputFilename = str(MYSY_GV.TEMPORARY_DIRECTORY) +"/"+ str(orig_file_name) outputFilename = str(MYSY_GV.TEMPORARY_DIRECTORY) +"/"+ str(orig_file_name)
# open output file for writing (truncated binary) # open output file for writing (truncated binary)
@ -4095,3 +4158,113 @@ def Send_Partner_Order_By_Email(diction):
"""
Conversion un devis en commande.
Cette fonction prends uniquement un devis, le duplique avec en mettant le type = commande
"""
def Convert_Quotation_to_Order(diction):
try:
field_list = ['order_id', 'token', ]
incom_keys = diction.keys()
for val in incom_keys:
if val not in field_list:
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','order_header_type':'devis',
'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",
Quotation_header_data_tmp = 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'])},
)
Quotation_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'])},
{'order_header_comment':0, '_id':0, 'date_update':0,
'order_header_type':0, 'order_header_ref_interne':0,
'partner_owner_recid':0,
'valide':0, 'locked':0})
New_Order_Header = Quotation_header_data
New_Order_Header['order_header_origin'] = Quotation_header_data_tmp['order_header_ref_interne']
New_Order_Header['order_header_type'] = "commande"
New_Order_Header['token'] = mytoken
local_status, local_retval = Add_Partner_Order(New_Order_Header)
if( local_status is False ):
return local_status, local_retval
new_created_order = MYSY_GV.dbname['partner_order_header'].find_one({'order_header_origin':str(Quotation_header_data_tmp['order_header_ref_interne'])})
print(" La nouvelle Entete a été créer le num_order = ", new_created_order['order_header_ref_interne'])
# Traitement des ligne
for Quotation_line_data in MYSY_GV.dbname['partner_order_line'].find({'order_header_id': str(diction['order_id']),
'valide': '1', 'locked': '0',
'order_line_type':'devis',
'partner_owner_recid': str(
my_partner['recid'])},
{'order_header_comment':0, '_id':0, 'date_update':0,
'order_line_status':0, 'order_line_type':0,
'order_header_ref_interne':0, 'partner_owner_recid':0,
'valide':0, 'locked':0}):
New_Order_Line = Quotation_line_data
New_Order_Line['order_header_ref_interne'] = new_created_order['order_header_ref_interne']
New_Order_Line['order_header_id'] = str(new_created_order['_id'])
New_Order_Line['order_line_type'] = "commande"
New_Order_Line['token'] = mytoken
New_Order_Line['order_line_id'] = ""
New_Order_Line['order_line_status'] = "0"
local_add_line_status, local_add_line_retval = Add_Update_Partner_Order_Line(New_Order_Line)
return True, " Le devis a été correctement convertit en commande "
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 convertir le devis en commande"