01/02/23 - 22h

master
cherif 2023-02-01 21:12:35 +01:00
parent 141c3dd06e
commit c177ca409b
13 changed files with 7520 additions and 270 deletions

View File

@ -1,17 +1,20 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ChangeListManager">
<list default="true" id="1122d9e2-679f-46d6-8c4f-97e9ae4041b5" name="Changes" comment="27/01:23 - 19h">
<list default="true" id="1122d9e2-679f-46d6-8c4f-97e9ae4041b5" name="Changes" comment="30/01/23 - 22h">
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
<change beforePath="$PROJECT_DIR$/Emargement/fichier_presence.pdf" beforeDir="false" afterPath="$PROJECT_DIR$/Emargement/fichier_presence.pdf" afterDir="false" />
<change beforePath="$PROJECT_DIR$/Attestation_Certificat.py" beforeDir="false" afterPath="$PROJECT_DIR$/Attestation_Certificat.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/Inscription_mgt.py" beforeDir="false" afterPath="$PROJECT_DIR$/Inscription_mgt.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/Log/log_file.log" beforeDir="false" afterPath="$PROJECT_DIR$/Log/log_file.log" afterDir="false" />
<change beforePath="$PROJECT_DIR$/Template/Mysy_attestion_modele2_tpl.html" beforeDir="false" afterPath="$PROJECT_DIR$/Template/Mysy_attestion_modele2_tpl.html" afterDir="false" />
<change beforePath="$PROJECT_DIR$/Template/invoice_RIB.html" beforeDir="false" afterPath="$PROJECT_DIR$/Template/invoice_RIB.html" afterDir="false" />
<change beforePath="$PROJECT_DIR$/class_mgt.py" beforeDir="false" afterPath="$PROJECT_DIR$/class_mgt.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/data_indexees.csv" beforeDir="false" afterPath="$PROJECT_DIR$/data_indexees.csv" afterDir="false" />
<change beforePath="$PROJECT_DIR$/ela_output_test_file_pandas_2.txt" beforeDir="false" afterPath="$PROJECT_DIR$/ela_output_test_file_pandas_2.txt" afterDir="false" />
<change beforePath="$PROJECT_DIR$/email_inscription_mgt.py" beforeDir="false" afterPath="$PROJECT_DIR$/email_inscription_mgt.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/main.py" beforeDir="false" afterPath="$PROJECT_DIR$/main.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/prj_common.py" beforeDir="false" afterPath="$PROJECT_DIR$/prj_common.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/email_mgt.py" beforeDir="false" afterPath="$PROJECT_DIR$/email_mgt.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/partners.py" beforeDir="false" afterPath="$PROJECT_DIR$/partners.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/tools_cherif/tools_cherif.py" beforeDir="false" afterPath="$PROJECT_DIR$/tools_cherif/tools_cherif.py" afterDir="false" />
</list>
<option name="SHOW_DIALOG" value="false" />
<option name="HIGHLIGHT_CONFLICTS" value="true" />
@ -259,7 +262,14 @@
<option name="project" value="LOCAL" />
<updated>1674844418103</updated>
</task>
<option name="localTasksCounter" value="27" />
<task id="LOCAL-00027" summary="30/01/23 - 22h">
<created>1675114173514</created>
<option name="number" value="00027" />
<option name="presentableId" value="LOCAL-00027" />
<option name="project" value="LOCAL" />
<updated>1675114173514</updated>
</task>
<option name="localTasksCounter" value="28" />
<servers />
</component>
<component name="Vcs.Log.Tabs.Properties">
@ -274,7 +284,6 @@
</option>
</component>
<component name="VcsManagerConfiguration">
<MESSAGE value="sss - init new pc" />
<MESSAGE value="18/11/22 - 23h30" />
<MESSAGE value="22/11/22 - 11h30" />
<MESSAGE value="22/11/22 - 22h30" />
@ -299,7 +308,8 @@
<MESSAGE value="25/01/23 - 20h" />
<MESSAGE value="27/01/23 - 15h" />
<MESSAGE value="27/01:23 - 19h" />
<option name="LAST_COMMIT_MESSAGE" value="27/01:23 - 19h" />
<MESSAGE value="30/01/23 - 22h" />
<option name="LAST_COMMIT_MESSAGE" value="30/01/23 - 22h" />
</component>
<component name="XDebuggerManager">
<breakpoint-manager>

View File

@ -53,10 +53,16 @@ def GetPartnerAttestation_Certificat(diction):
return False, "Impossible de recuperer la liste des attestations "
RetObject = []
local_cpt = 0
for ret_val in MYSY_GV.dbname['attestation_certificat'].find( {"$or":[ {"partner_recid":str(partner_recid), "valide":"1"},
{"partner_recid":'default', "valide":"1"}]}):
RetObject.append(mycommon.JSONEncoder().encode(ret_val))
{"partner_recid":'default', "valide":"1"}]}):
if( ret_val and ret_val['_id']):
RetObject.append(mycommon.JSONEncoder().encode(ret_val))
local_cpt = local_cpt + 1
if( local_cpt == 0):
mycommon.myprint(str(inspect.stack()[0][3]) + " Aucun certificat trouvé ")
return False, "Aucun certificat trouvé"
return True, RetObject

View File

@ -1683,6 +1683,8 @@ def SendAttendeeCertification(diction):
my_retrun_dict = {}
my_retrun_dict['partner_recid'] = partner_recid
my_template = ""
if ("template_name" in attestation_certificat.keys() and attestation_certificat['template_name']):
my_template = attestation_certificat['template_name']
@ -1752,6 +1754,16 @@ def SendAttendeeCertification(diction):
formateur = session_formation['formateur']
my_retrun_dict['formateur'] = formateur
presentiel = ""
if ("presentiel" in session_formation.keys() and session_formation['presentiel']):
presentiel = session_formation['presentiel']
my_retrun_dict['presentiel'] = presentiel
distantiel = ""
if ("distantiel" in session_formation.keys() and session_formation['distantiel']):
distantiel = session_formation['distantiel']
my_retrun_dict['distantiel'] = distantiel
#my_retrun_dict['formateur'] = session_formation['formateur']

File diff suppressed because one or more lines are too long

View File

@ -5,7 +5,11 @@
border: 2px solid; ">
<div style="border: 2px solid; margin: 5px;">
<div style="padding-top:10px;text-align:left;width:30%; border: 2px; float: left;">
{% if json_data.logo_url %}
<img src={{json_data.logo_url}} alt="Mysy Training Logo" width="80px" />
{% else %}
<img src="http://88.170.110.220/img/MYSY-LOGO-BLUE.png" alt="Mysy Training Logo" width="80px" />
{% endif %}
</div>
<div style="padding-top:10px;text-align:center;width:70%; border: none; float: center;">
@ -17,21 +21,56 @@ border: 2px solid; ">
serif;color:#454349;font-size:1.5rem;padding: 0px; border: none;">
<div style="width:100%">
<div style="text-align:center;border: none;">
<nav style="text-align:center;font-weight: bold;border: none;"> Formation </nav>
<div style="padding:12px 0px;text-align:center;font-family:Georgia, 'Times New Roman', Times,
serif;color:#454349;font-size:1.2rem; line-height: 2rem;border: none;">
<p style="border: none;">
<p style="border: none; text-align: left;">
{% if json_data.num_declation|length > 5 %}
Par la presente, l'oganisme de formation {{json_data.partner}} au Numero de declaration
{{json_data.num_declation}} <br />
atteste que {{json_data.nom}} &nbsp; {{json_data.prenom}} a suivi la formation <br />
<b> "{{json_data.class_title}}" </b> <br />
realisé par le formateur {{json_data.formateur}}
{% else %}
Par la presente, l'oganisme de formation {{json_data.partner}} au Numero de SIREN
{{json_data.mysy_partner_siren}} <br />
{% endif %}
</p>
<p style="border: none; text-align: center;"></p>
Atteste que <b> {{json_data.nom}} &nbsp;{{json_data.prenom}} </b> a suivi la formation <br />
<b> "{{json_data.class_title}}" </b> <br />
realisé par le formateur {{json_data.formateur}}
</p>
<p style="border: none;">
Cette formation a eu lieu du {{json_data.date_du}} au {{json_data.date_au}} à l'adresse
:{{json_data.adresse}}
{% if json_data.date_du == json_data.date_au %}
{% if json_data.presentiel == "1" %}
<p style="border: none; text-align: left;">
Cette formation a eu lieu le {{json_data.date_du}} à l'adresse
:{{json_data.adresse}}.
</p>
{% else %}
<p style="border: none;text-align: left;">
Cette formation a eu lieu le {{json_data.date_du}} en ligne.
</p>
{% endif %}
{% else %}
{% if json_data.presentiel == "1" %}
<p style="border: none;text-align: left;">
Cette formation a eu lieu du {{json_data.date_du}} au {{json_data.date_au}} à l'adresse
:{{json_data.adresse}}.
</p>
{% else %}
<p style="border: none;text-align: left;">
Cette formation a eu lieu du {{json_data.date_du}} au {{json_data.date_au}} en ligne.
</p>
{% endif %}
{% endif %}
</div>
<div
style="padding:12px 0px;text-align:left;font-family:Georgia, 'Times New Roman', Times, serif;color:#454349;font-size:1.2rem">
@ -42,14 +81,14 @@ border: 2px solid; ">
</div>
<div style="width: 30%; float: left;">
Fait à {{json_data.ville}} le {{json_data.date_impression}}
Fait à {{json_data.mysy_partner_adr_city}} le {{json_data.date_jour}}
</div>
<div style="width: 70%; float: left;text-align: right;">
Pour l'organisme de formation <br />
{% if json_data.img_url %}
{% if json_data.cachet_signature %}
<img src={{ json_data.signature }} width="200px" />
<img src={{ json_data.cachet_signature }} width="100px" />
{% endif %}

View File

@ -1,181 +1,191 @@
<!DOCTYPE html>
<html>
<body style="padding:20px 20px;padding-top:0px">
<div style="padding:0px;text-align:left;width:30%">
<img src="http://88.170.110.220/img/MYSY-LOGO-BLUE.png" alt="Mysy Training Logo" width="100px" /> </h2>
</div>
<div style="padding:0px;text-align:left;font-family:Georgia, 'Times New Roman', Times, serif;color:#454349;font-size:1.5rem;padding: 0px">
<div style="width:100%">
<div style="text-align:center;">
<nav style="text-align:center;font-weight: bold;"> Facture </nav>
<hr />
<div style="padding:12px 0px;text-align:right;font-family:Georgia, 'Times New Roman', Times, serif;color:#454349;font-size:0.9rem;">
{{json_data.client_name}}<br/>
{{json_data.client_address}}<br/>
{{json_data.client_zip_ville}}<br/>
{{json_data.client_pays}}<br/>
<html>
</div>
<div style="padding:12px 0px;text-align:center;font-family:Georgia, 'Times New Roman', Times, serif;color:#454349;font-size:0.9rem;font-weight: bold;">
Facture n° {{json_data.invoice_id}}
<body style="padding:20px 20px;padding-top:0px">
<div style="padding:0px;text-align:left;width:30%">
<img src="http://88.170.110.220/img/MYSY-LOGO-BLUE.png" alt="Mysy Training Logo" width="100px" /> </h2>
</div>
<div
style="padding:0px;text-align:left;font-family:Georgia, 'Times New Roman', Times, serif;color:#454349;font-size:1.5rem;padding: 0px">
<div style="width:100%">
<div style="text-align:center;">
<nav style="text-align:center;font-weight: bold;"> Facture </nav>
<hr/>
<div
style="padding:12px 0px;text-align:right;font-family:Georgia, 'Times New Roman', Times, serif;color:#454349;font-size:0.9rem;">
{{json_data.client_name}}<br />
{{json_data.client_address}}<br />
{{json_data.client_zip_ville}}<br />
{{json_data.client_pays}}<br />
</div>
</div>
<br/>
<table style="width:100%;padding: 5px;">
<div
style="padding:5px 0px;text-align:center;font-family:Georgia, 'Times New Roman', Times, serif;color:#454349;font-size:0.9rem;font-weight: bold;">
<tr style="padding: 0px; padding-top:5px;font-size:0.9rem;">
<td style="text-align:left;">Date de facture: {{json_data.invoice_date}} </td>
<td style="text-align:right;">Date échéance : {{json_data.due_date}}</td>
</tr>
Facture n° {{json_data.invoice_id}}
</table>
<div style="padding:12px 0px;text-align:left;font-family:Georgia, 'Times New Roman', Times, serif;color:#454349;font-size:0.9rem;width:100%;float:right;text-align:left;">Origine : {{json_data.orign_order}}
</div>
<div> &nbsp; </div>
<div style="padding:12px 0px;text-align:left;font-family:Georgia, 'Times New Roman', Times, serif;color:#454349;font-size:0.9rem;width:100%;float:right;text-align:left;">
<table style="width:100%;border: 1px solid black;padding: 0px;">
<tr style="border: 1px solid black;padding: 0px; padding-top:5px;">
<th style="text-align:center;border: 1px solid black;">Description</th>
<th style="text-align:center;border: 1px solid black;">Quantité</th>
<th style="text-align:center;border: 1px solid black;">Prix unitaire</th>
<th style="text-align:center;border: 1px solid black;">Montant</th>
</tr>
<tr style="border: 1px solid black;padding: 0px;padding: 0px; padding-top:5px;">
<td style="text-align:center;border: 1px solid black;">{{json_data.packs}}</td>
<td style="text-align:center;border: 1px solid black;">{{json_data.qty}}</td>
<td style="text-align:center;border: 1px solid black;">{{json_data.unit_price}}</td>
<td style="text-align:center;border: 1px solid black;">{{json_data.montant}}</td>
</tr>
<tr style="border: 1px solid black;">
<td style="text-align:center;border: 1px solid black;">{{json_data.packs1}}</td>
<td style="text-align:center;border: 1px solid black;">{{json_data.qty1}}</td>
<td style="text-align:center;border: 1px solid black;">{{json_data.unit_price1}}</td>
<td style="text-align:center;border: 1px solid black;">{{json_data.montant1}}</td>
</tr>
</table>
</div>
<div> &nbsp; </div>
</div>
<table style="width:100%;padding: 5px;">
<tr style="padding: 0px; padding-top:5px;font-size:0.9rem;">
<td style="text-align:left;">Date de facture: {{json_data.invoice_date}} </td>
<td style="text-align:right;">Date échéance : {{json_data.due_date}}</td>
</tr>
</table>
<div
style="padding:12px 0px;text-align:left;font-family:Georgia, 'Times New Roman', Times, serif;color:#454349;font-size:0.9rem;width:100%;float:right;text-align:left;">
Origine : {{json_data.orign_order}}
</div>
<div
style="padding:12px 0px;text-align:left;font-family:Georgia, 'Times New Roman', Times, serif;color:#454349;font-size:0.9rem;width:100%;float:right;text-align:left;">
<table style="width:100%;border: none;padding: 0px;">
<tr style="border: 1px solid black;padding: 0px; padding-top:5px;">
<th style="text-align:center;border: 1px solid black;">Description</th>
<th style="text-align:center;border: 1px solid black;">Quantité</th>
<th style="text-align:center;border: 1px solid black;">Prix unitaire</th>
<th style="text-align:center;border: 1px solid black;">Montant</th>
</tr>
<tr style="border: 1px solid black;padding: 0px;padding: 0px; padding-top:5px;">
<td style="text-align:center;border: 1px solid black;"> {{json_data.packs}} <br>
<nav style="text-align:left;font-size:0.6rem; font-style:italic;"> {{json_data.detail_packs}} </nav>
</td>
<td style="text-align:center;border: 1px solid black;">{{json_data.qty}}</td>
<td style="text-align:center;border: 1px solid black;">{{json_data.unit_price}}</td>
<td style="text-align:center;border: 1px solid black;">{{json_data.montant}}</td>
</tr>
<tr style="border: none;padding: 0px; padding-top:5px;">
<th style="text-align:center;border: none;" colspan="4">&nbsp;</th>
</tr>
</table>
</div>
</div>
<table style="width:100%;padding: 5px;float:right;padding:0px;">
<tr style="padding: 0px; padding-top:5px;font-size:0.9rem;">
<td style="text-align:left;">&nbsp; </td>
<td style="text-align:left;">&nbsp; </td>
<td style="text-align:center;">Montant HT: </td>
<td style="text-align:center;">{{json_data.total_ht}} &nbsp;</td>
</tr>
<tr style="padding:0px; padding-top:5px;font-size:0.9rem;">
<td style="text-align:left;">&nbsp; </td>
<td style="text-align:left;">&nbsp; </td>
<td style="text-align:center;">TVA 20% : </td>
<td style="text-align:center;">{{json_data.tva}} &nbsp;</td>
</tr>
<tr style="padding:0px; padding-top:5px;font-size:0.9rem;">
<td style="text-align:left;">&nbsp; </td>
<td style="text-align:left;">&nbsp; </td>
<td style="text-align:center;">Montant TTC : </td>
<td style="text-align:center;">{{json_data.total_ttc}}&nbsp;</td>
</tr>
</table>
<br/>
<br/>
<hr />
<p
style="font-weight:bold; font-size:1rem;text-align: center;width: 80%;margin-left: auto;margin-right: auto;">
Règlement : Virement bancaire</p>
<p style="font-size:0.7rem; margin-left: auto;width: 100%;">
> Relevé d'identité bancaire
</p>
<table style="font-size:0.7rem; margin-left: auto;width: 100%;">
<thead>
<tr>
<th scope="col" style="text-align: left;">Banque</th>
<th scope="col" style="text-align: left;">Indicatif</th>
<th scope="col" style="text-align: left;">Numéro de compte</th>
<th scope="col" style="text-align: left;">Clé RIB</th>
</tr>
</thead>
<tbody>
<tr>
<td scope="col" style="text-align: left;">17418</td>
<td scope="col" style="text-align: left;">00001</td>
<td scope="col" style="text-align: left;">00011010233</td>
<td scope="col" style="text-align: left;">69</td>
</tr>
</tbody>
</table>
<p style="font-size:0.7rem; margin-left: auto;width: 100%;">
> Identification internationale
</p>
<table style="font-size:0.7rem; margin-left: auto; width: 100%;">
<thead>
<tr>
<th scope="col" style="text-align: left;">IBAN</th>
<th scope="col" style="text-align: left;">Code BIC</th>
</tr>
</thead>
<tbody>
<tr>
<td scope="col" style="text-align: left;">FR76 1741 8000 0100 0110 1023 369 </td>
<td scope="col" style="text-align: left;">SNNNFR22XXX</td>
</tr>
</tbody>
</table>
</div>
</div>
<table style="width:100%;padding: 5px;float:right;padding:0px;">
<tr style="padding: 0px; padding-top:5px;font-size:0.9rem;">
<td style="text-align:left;">&nbsp; </td>
<td style="text-align:left;">&nbsp; </td>
<td style="text-align:center;">Montant HT: </td>
<td style="text-align:center;">{{json_data.total_ht}}</td>
</tr>
<hr />
<br/>
<br />
<footer>
<div
style="padding:20px 0px;text-align:center;font-family:Georgia, 'Times New Roman', Times, serif;color:#454349;font-size:0.8rem;font-style: italic;">
<tr style="padding:0px; padding-top:5px;font-size:0.9rem;">
<td style="text-align:left;">&nbsp; </td>
<td style="text-align:left;">&nbsp; </td>
<td style="text-align:center;">TVA 20% : </td>
<td style="text-align:center;">{{json_data.tva}}</td>
</tr>
<p>MySy Training<br />
<tr style="padding:0px; padding-top:5px;font-size:0.9rem;">
<td style="text-align:left;">&nbsp; </td>
<td style="text-align:left;">&nbsp; </td>
<td style="text-align:center;">Montant TTC : </td>
<td style="text-align:center;">{{json_data.total_ttc}}</td>
</tr>
</table>
<p> &nbsp;</p>
Cour du Havre 1, 75008, Paris<br />
<hr />
<p style="font-weight:bold; font-size:1rem;text-align: center;width: 80%;margin-left: auto;margin-right: auto;">
Règlement : Virement bancaire</p>
MySy Training Technology (MTT), société par actions simplifiée au capital de 1000 euros, dont le siège
social est
situé 2, place des magnolias, 77680, Roissy en Brie, immatriculée au Registre du Commerce et des
Sociétés sous le numéro 917 500 860 R.C.S. Melun
</p>
</div>
</footer>
</body>
<p style="font-size:0.9rem; margin-left: auto;width: 100%;">
> Relevé d'identité bancaire
</p>
<table style="font-size:0.9rem; margin-left: auto;width: 100%;">
<thead>
<tr>
<th scope="col" style="text-align: left;">Banque</th>
<th scope="col" style="text-align: left;">Indicatif</th>
<th scope="col" style="text-align: left;">Numéro de compte</th>
<th scope="col" style="text-align: left;">Clé RIB</th>
</tr>
</thead>
<tbody>
<tr>
<td scope="col" style="text-align: left;">17418</td>
<td scope="col" style="text-align: left;">00001</td>
<td scope="col"style="text-align: left;">00011010233</td>
<td scope="col" style="text-align: left;">69</td>
</tr>
</tbody>
</table>
<p style="font-size:0.9rem; margin-left: auto;width: 100%;">
> Identification internationale
</p>
<table style="font-size:0.9rem; margin-left: auto; width: 100%;">
<thead>
<tr>
<th scope="col" style="text-align: left;">IBAN</th>
<th scope="col" style="text-align: left;">Code BIC</th>
</tr>
</thead>
<tbody>
<tr>
<td scope="col" style="text-align: left;">FR76 1741 8000 0100 0110 1023 369 </td>
<td scope="col" style="text-align: left;">SNNNFR22XXX</td>
</tr>
</tbody>
</table>
<br/>
</div>
</div>
<hr />
<footer>
<div style="padding:20px 0px;text-align:center;font-family:Georgia, 'Times New Roman', Times, serif;color:#454349;font-size:0.8rem;font-style: italic;">
<p>MySy Training<br/>
Cour du Havre 1, 75008, Paris<br/>
MySy Training Technology (MTT), société par actions simplifiée au capital de 1000 euros, dont le siège social est
situé 2, place des magnolias, 77680, Roissy en Brie, immatriculée au Registre du Commerce et des Sociétés sous le numéro 917 500 860 R.C.S. Melun
</p>
</div>
</footer>
</body>
</html>
</html>

View File

@ -129,8 +129,17 @@ def add_class(diction):
'''
Si l'internal_url reste à vide, alors le système va créer une internal url de la formation
/!\ : Il faut aller verifier si il a une formation ayant le meme code externe si oui recuperer son internal_url.
Si a chaque fois on créer un nouveau "internal_url", on va perdre les url à chaque mise à jour par excel.
Oui pire, si on modifie le tritre, c'est mort.... :(
'''
if( len(class_internal_url) <= 0 ):
exist_class = MYSY_GV.dbname['myclass'].find_one({'external_code':str(diction['external_code']).strip(),
'valide':'1'})
if( exist_class and exist_class['internal_url'] and len(str(exist_class['internal_url'])) > 5):
class_internal_url = str(exist_class['internal_url'])
else :
status, class_internal_url = mycommon.CreateInternalUrl(diction['title'])
mydata['internal_url'] = class_internal_url
@ -1733,6 +1742,24 @@ def get_class(diction):
#print(' ICICICIC '+str(filt_external_code))
# Recuperation des info du partenaire propriaitaire comme : ces certification (qualiopi, datadock, etc) et son nom
tmp_class_data = MYSY_GV.dbname['myclass'].find_one({'valide':'1','locked':'0','internal_url':internal_url, 'published':'1'},
{"_id": 1, "partner_owner_recid": 1, } )
if( tmp_class_data is None or tmp_class_data["partner_owner_recid"] is None):
mycommon.myprint(str(inspect.stack()[0][3]) + " - impossible de recuperer les données du partenaire ")
return False, " impossible de recuperer les données du partenaire "
tmp_partenaire_data = MYSY_GV.dbname['partnair_account'].find_one({'active':'1','locked':'0','recid':str(tmp_class_data["partner_owner_recid"]), },
)
if (tmp_partenaire_data is None or tmp_partenaire_data["_id"] is None):
mycommon.myprint(str(inspect.stack()[0][3]) + " - impossible de recuperer les données du partenaire (2) ")
return False, " impossible de recuperer les données du partenaire (2) "
filt_title = {}
if ("title" in diction.keys()):
filt_title = {'title': {'$regex': str(diction['title'])}}
@ -1770,6 +1797,22 @@ def get_class(diction):
" d'une recherche de formation. Voir _id = ")
return False, "Impossible de faire un affichage detaillé "
if( "isdatadock" in tmp_partenaire_data.keys() and tmp_partenaire_data['isdatadock']):
retVal['isdatadock'] = tmp_partenaire_data['isdatadock']
if ("isqualiopi" in tmp_partenaire_data.keys() and tmp_partenaire_data['isqualiopi']):
retVal['isqualiopi'] = tmp_partenaire_data['isqualiopi']
if ("iscertitrace" in tmp_partenaire_data.keys() and tmp_partenaire_data['iscertitrace']):
retVal['iscertitrace'] = tmp_partenaire_data['iscertitrace']
if ("nom" in tmp_partenaire_data.keys() and tmp_partenaire_data['nom']):
retVal['nom_partenaire'] = tmp_partenaire_data['nom']
if ("website" in tmp_partenaire_data.keys() and tmp_partenaire_data['website']):
retVal['website_partenaire'] = tmp_partenaire_data['website']
if ("description" in retVal.keys()):
tmp_str = retVal['description']
no_html = mycommon.cleanhtml(retVal['description'])

View File

@ -1,5 +1,7 @@
,index,mots,occurence,moyenne,id_formation,source_field
0,0,certif,1,0.25,QPR_F2,keyword
1,1,pratiqu,1,0.25,QPR_F2,keyword
2,2,p,1,0.25,QPR_F2,keyword
3,3,agile,1,0.25,QPR_F2,keyword
0,0,bio,1,0.17,HIFMI_001,title
1,1,vegan,1,0.17,HIFMI_001,title
2,2,casher,1,0.17,HIFMI_001,title
3,3,tracabilite,1,0.17,HIFMI_001,title
4,4,halal,1,0.17,HIFMI_001,title
5,5,alimentaire,1,0.17,HIFMI_001,title

1 index mots occurence moyenne id_formation source_field
2 0 0 certif bio 1 0.25 0.17 QPR_F2 HIFMI_001 keyword title
3 1 1 pratiqu vegan 1 0.25 0.17 QPR_F2 HIFMI_001 keyword title
4 2 2 p casher 1 0.25 0.17 QPR_F2 HIFMI_001 keyword title
5 3 3 agile tracabilite 1 0.25 0.17 QPR_F2 HIFMI_001 keyword title
6 4 4 halal 1 0.17 HIFMI_001 title
7 5 5 alimentaire 1 0.17 HIFMI_001 title

View File

@ -1,5 +1,3 @@
mots occurence moyenne id_formation source_field
0 certif 1 0.25 QPR_F2 keyword
1 pratiqu 1 0.25 QPR_F2 keyword
2 p 1 0.25 QPR_F2 keyword
3 agile 1 0.25 QPR_F2 keyword
Empty DataFrame
Columns: [mots, occurence, moyenne, id_formation, source_field]
Index: []

View File

@ -647,7 +647,8 @@ def SendAttestion_to_attendee_by_email_standalone(diction):
Verification de la liste des champs obligatoires
"""
field_list_obligatoire = ['nom', 'prenom', 'email', 'date_du', 'date_au', 'adresse', 'title',
'attestation_tmpl', 'inscription_id']
'attestation_tmpl', 'inscription_id', 'partner_recid', 'formateur',
'presentiel', 'distantiel']
for val in field_list_obligatoire:
if val not in diction:
@ -661,9 +662,42 @@ def SendAttestion_to_attendee_by_email_standalone(diction):
msg = MIMEMultipart("alternative")
# Recuperation des données du partenaire formateur
mysy_partner = MYSY_GV.dbname['partnair_account'].find_one({'recid':str(diction['partner_recid']),
'active':"1",'locked':"0" })
if( mysy_partner is None or mysy_partner['_id'] is None):
mycommon.myprint(
str(inspect.stack()[0][3]) + " - Impossible de recuperer les données du partenaire")
return False, "Impossible de recuperer les données du partenaire "
mysy_partner_nom = ""
if ("nom" in mysy_partner.keys() and mysy_partner['nom']):
mysy_partner_nom = mysy_partner['nom']
mysy_partner_num_declation = ""
if ("num_nda" in mysy_partner.keys() and mysy_partner['num_nda']):
mysy_partner_num_declation = mysy_partner['num_nda']
mysy_partner_siren = ""
if ("siren" in mysy_partner.keys() and mysy_partner['siren']):
mysy_partner_siren = mysy_partner['siren']
mysy_partner_adr_city = ""
if ("adr_city" in mysy_partner.keys() and mysy_partner['adr_city']):
mysy_partner_adr_city = mysy_partner['adr_city']
if(len(mysy_partner_num_declation.strip()) == 0 and len(mysy_partner_siren.strip()) == 0):
mycommon.myprint(
str(inspect.stack()[0][3]) + " - Aucun numero de déclaration ni numero SIREN enregistré")
return False, "Aucun numero de déclaration ni numero SIREN enregistré"
msg['From'] = MYSY_GV.O365_SMTP_COUNT_From_User
msg['To'] = str(diction['email'])
ct = datetime.datetime.now()
ts = ct.timestamp()
date_jour = ct.strftime("%d/%m/%Y")
# msg = MIMEMultipart("alternative")
msg = EmailMessage()
@ -680,14 +714,23 @@ def SendAttestion_to_attendee_by_email_standalone(diction):
"params": {"nom": str(diction['nom']),
"prenom": str(diction['prenom']),
"date_du": str(diction['date_du'])[0:10],
"date_fin": str(diction['date_au'])[0:10],
"date_au": str(diction['date_au'])[0:10],
"adresse": str(diction['adresse']),
"title": str(diction['title']),
"class_title": str(diction['title']),
"email": str(diction['email']),
"formateur": str(diction['formateur']),
"presentiel": str(diction['presentiel']),
"distantiel": str(diction['distantiel']),
"partner": str(mysy_partner_nom),
"num_declation": str(mysy_partner_num_declation),
"mysy_partner_siren": str(mysy_partner_siren),
"mysy_partner_adr_city":str(mysy_partner_adr_city),
"date_jour":str(date_jour),
"cachet_signature": "https://img.mysy-training.com/perso/mysy_cachet.png",
"logo_url": "https://img.mysy-training.com/1000formation/LOGO-FORMATION1000.png"
}}
ct = datetime.datetime.now()
ts = ct.timestamp()
sourceHtml = template.render(json_data=body["params"])
@ -707,7 +750,7 @@ def SendAttestion_to_attendee_by_email_standalone(diction):
msg.set_content(sourceHtml, subtype='html')
msg['From'] = MYSY_GV.O365_SMTP_COUNT_From_User
msg['Bcc'] = 'contact@mysy-training.com'
msg['Bcc'] = 'contact@mysy-training.com, mysytraining@gmail.com'
msg['Subject'] = 'MySy Training : Votre attestation de formation : ' + str(diction['title'])
msg['To'] = str(diction['email'])

View File

@ -14,6 +14,7 @@ import inspect
import sys, os
from bson import ObjectId
from xhtml2pdf import pisa
import prj_common as mycommon
import GlobalVariable as MYSY_GV
@ -1845,16 +1846,16 @@ def ManualSendInvoiceEmailRIB(diction):
TEMPLATE_FILE = "Template/MySy_Invoice_RIB_tpl.html"
template = templateEnv.get_template(TEMPLATE_FILE)
body = {
"params": {"order_id": "MySy_00wheA",
"date_order": ": 01/11/2022",
"total_ht": "550",
"tva": "110",
"total_ttc": "660",
"client_name": "POTENTIALS",
"client_address": "21 RUE D ABOUKIR",
"client_zip_ville": "75002 Paris",
"params": {"order_id": "004G",
"date_order": ": 01/01/2023",
"total_ht": "90",
"tva": "18",
"total_ttc": "108",
"client_name": "5DISCOVERY",
"client_address": "7bis Rue du 13ème de ligne",
"client_zip_ville": "58000 Nevers",
"client_pays": "France",
"packs": "Gold",
"packs": "PACK GOLD ",
"detail_packs": "-- Support téléphonique -- "
"Reporting basique -- "
"Mots clés par formation -- "
@ -1862,13 +1863,14 @@ def ManualSendInvoiceEmailRIB(diction):
"Préférence/ Diffusion géographique -- "
"Publication d'un article -- "
"Reporting Dynamique et personnalisé",
"qty": "1",
"unit_price": "550",
"montant": "550",
"invoice_id": "FACT_221100019",
"invoice_date": "01/11/2022",
"due_date": "01/11/2022",
"orign_order": "MySy_00wheA",
"unit_price": "90",
"montant": "90",
"invoice_id": "FACT_230200020",
"invoice_date": "01/02/2023",
"due_date": "01/02/2022",
"orign_order": "Contrat 004G",
}
}
sourceHtml = template.render(params=body["params"])
@ -1876,7 +1878,7 @@ def ManualSendInvoiceEmailRIB(diction):
msg.set_content(sourceHtml, subtype='html')
msg['From'] = MYSY_GV.O365_SMTP_COUNT_From_User
msg['Bcc'] = 'contact@mysy-training.com'
msg['Subject'] = "[MySy Training Technology] : Votre facture N° FACT_221100019"
msg['Subject'] = "[MySy Training Technology] : Votre facture N° FACT_230200020"
msg['To'] = 'billardman1@gmail.com'
smtpserver.ehlo()
@ -1885,6 +1887,49 @@ def ManualSendInvoiceEmailRIB(diction):
val = smtpserver.send_message(msg)
smtpserver.close()
print(" Email envoyé " + str(val))
### CREATION DE LA FACTION PDF
templateLoader = jinja2.FileSystemLoader(searchpath="./")
templateEnv = jinja2.Environment(loader=templateLoader)
TEMPLATE_FILE = "Template/invoice_RIB.html"
template = templateEnv.get_template(TEMPLATE_FILE)
# This data can come from database query
"""
body = {
"data": {
"client_name": str(diction['invoice_nom']),
"client_address": str(diction['invoice_adr_street']),
"client_zip_ville": str(diction['invoice_adr_zip']) + " " + str(diction['invoice_adr_city']),
"client_pays": str(diction['invoice_adr_country']),
"invoice_id": str(diction['invoice_id']),
"invoice_date": str(diction['invoice_date']),
"due_date": str(diction['due_date']),
"orign_order": str(diction['order_id']),
"packs": str(diction['item_0']['code']),
"qty": str(diction['item_0']['qty']),
"unit_price": str(diction['item_0']['prix']),
"montant": str(diction['item_0']['amount']),
"total_ht": str(diction['total_ht']),
"tva": str(diction['total_tva']),
"total_ttc": str(diction['total_ttc']),
}
}
"""
sourceHtml = template.render(json_data=body["params"])
orig_file_name = "invoice_FACT_230200020.pdf"
outputFilename = str(MYSY_GV.INVOICE_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()
return True, " facture envoyée"

View File

@ -518,7 +518,8 @@ def update_partner_account(diction):
'email', 'pwd', 'telephone', 'contact_nom', 'contact_prenom', 'contact_tel',
'contact_mail', 'token', 'link_facebook', 'link_twitter', 'invoice_vat_num',
'invoice_nom', 'invoice_adr_street', 'invoice_adr_city', 'invoice_adr_zip',
'invoice_adr_country', 'invoice_email', 'invoice_telephone', 'invoice_vat_num']
'invoice_adr_country', 'invoice_email', 'invoice_telephone', 'invoice_vat_num',
'siren', 'num_nda', 'iscertitrace', 'isdatadock', 'isqualiopi']
incom_keys = diction.keys()
@ -561,96 +562,88 @@ def update_partner_account(diction):
mydata = {}
if ("nom" in diction.keys()):
if diction['nom']:
mydata['nom'] = diction['nom']
mydata['nom'] = diction['nom']
if ("adr_street" in diction.keys()):
if diction['adr_street']:
mydata['adr_street'] = diction['adr_street']
mydata['adr_street'] = diction['adr_street']
if ("adr_city" in diction.keys()):
if diction['adr_city']:
mydata['adr_city'] = diction['adr_city']
mydata['adr_city'] = diction['adr_city']
if ("adr_zip" in diction.keys()):
if diction['adr_zip']:
mydata['adr_zip'] = diction['adr_zip']
mydata['adr_zip'] = diction['adr_zip']
if ("adr_country" in diction.keys()):
if diction['adr_country']:
mydata['adr_country'] = diction['adr_country']
mydata['adr_country'] = diction['adr_country']
if ("siren" in diction.keys()):
mydata['siren'] = diction['siren']
if ("num_nda" in diction.keys()):
mydata['num_nda'] = diction['num_nda']
if ("iscertitrace" in diction.keys()):
mydata['iscertitrace'] = diction['iscertitrace']
if ("isdatadock" in diction.keys()):
mydata['isdatadock'] = diction['isdatadock']
if ("isqualiopi" in diction.keys()):
mydata['isqualiopi'] = diction['isqualiopi']
if ("email" in diction.keys()):
if diction['email']:
my_email = diction['email']
my_email = diction['email']
if ("telephone" in diction.keys()):
if diction['telephone']:
mydata['telephone'] = diction['telephone']
mydata['telephone'] = diction['telephone']
if ("pwd" in diction.keys()):
if diction['pwd']:
mydata['pwd'] = diction['pwd']
mydata['pwd'] = diction['pwd']
if ("contact_nom" in diction.keys()):
if diction['contact_nom']:
mydata['contact_nom'] = diction['contact_nom']
mydata['contact_nom'] = diction['contact_nom']
if ("contact_prenom" in diction.keys()):
if diction['contact_prenom']:
mydata['contact_prenom'] = diction['contact_prenom']
mydata['contact_prenom'] = diction['contact_prenom']
if ("contact_tel" in diction.keys()):
if diction['contact_tel']:
mydata['contact_tel'] = diction['contact_tel']
mydata['contact_tel'] = diction['contact_tel']
if ("contact_mail" in diction.keys()):
if diction['contact_mail']:
mydata['contact_mail'] = diction['contact_mail']
mydata['contact_mail'] = diction['contact_mail']
if ("link_linkedin" in diction.keys()):
if diction['link_linkedin']:
mydata['link_linkedin'] = diction['link_linkedin']
mydata['link_linkedin'] = diction['link_linkedin']
if ("link_facebook" in diction.keys()):
if diction['link_facebook']:
mydata['link_facebook'] = diction['link_facebook']
mydata['link_facebook'] = diction['link_facebook']
if ("link_twitter" in diction.keys()):
if diction['link_twitter']:
mydata['link_twitter'] = diction['link_twitter']
mydata['link_twitter'] = diction['link_twitter']
if ("invoice_vat_num" in diction.keys()):
if diction['invoice_vat_num']:
mydata['invoice_vat_num'] = diction['invoice_vat_num']
mydata['invoice_vat_num'] = diction['invoice_vat_num']
if ("invoice_nom" in diction.keys()):
if diction['invoice_nom']:
mydata['invoice_nom'] = diction['invoice_nom']
mydata['invoice_nom'] = diction['invoice_nom']
if ("invoice_adr_street" in diction.keys()):
if diction['invoice_adr_street']:
mydata['invoice_adr_street'] = diction['invoice_adr_street']
mydata['invoice_adr_street'] = diction['invoice_adr_street']
if ("invoice_adr_city" in diction.keys()):
if diction['invoice_adr_city']:
mydata['invoice_adr_city'] = diction['invoice_adr_city']
mydata['invoice_adr_city'] = diction['invoice_adr_city']
if ("invoice_adr_zip" in diction.keys()):
if diction['invoice_adr_zip']:
mydata['invoice_adr_zip'] = diction['invoice_adr_zip']
mydata['invoice_adr_zip'] = diction['invoice_adr_zip']
if ("invoice_adr_zip" in diction.keys()):
if diction['invoice_adr_country']:
mydata['invoice_adr_country'] = diction['invoice_adr_country']
mydata['invoice_adr_country'] = diction['invoice_adr_country']
if ("invoice_email" in diction.keys()):
if diction['invoice_email']:
mydata['invoice_email'] = diction['invoice_email']
mydata['invoice_email'] = diction['invoice_email']
if ("invoice_telephone" in diction.keys()):
if diction['invoice_telephone']:
mydata['invoice_telephone'] = diction['invoice_telephone']
mydata['invoice_telephone'] = diction['invoice_telephone']

View File

@ -24,9 +24,12 @@ def email_validation():
coll_emails = MYSY_GV.dbname['bdd_email']
cpt = 0
nb_doc = coll_emails.count_documents({'valide':'1', "checked_status": {"$ne": "1"}})
nb_doc = coll_emails.count_documents({'valide':'1', "checked": {"$ne": "1"}})
for val in coll_emails.find({'valide':'1', "checked_status": {"$ne": "1"}}):
print(" ### nb_doc = ", nb_doc)
for val in coll_emails.find({'valide':'1', "checked": {"$ne": "1"}}):
cpt = cpt + 1
if ("email_address" in val.keys()):