from __future__ import print_function
import smtplib

from email.message import EmailMessage
from email.mime.base import MIMEBase
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email import encoders


import locale
import datetime
import inspect
import sys, os

from bson import ObjectId
from xhtml2pdf import pisa

import prj_common as mycommon
import GlobalVariable as MYSY_GV
from dateutil import tz
import pytz
import sib_api_v3_sdk
from sib_api_v3_sdk.rest import ApiException
import jinja2
import strype_payement as strype_payement
import ressources_humaines as ressources_humaines

configuration = sib_api_v3_sdk.Configuration()
configuration.api_key['api-key'] = MYSY_GV.SENDINBLUE_API_KEY

api_instance = sib_api_v3_sdk.TransactionalEmailsApi(sib_api_v3_sdk.ApiClient(configuration))

locale.setlocale(category=locale.LC_ALL, locale='fr_FR.utf8')



smtp_address = 'smtp-relay.sendinblue.com'
port = 587
sender = 'contact@mysy-training.com'
receiver = ["cbalde3@mysy-training.com","billardman1@gmail.com"]


user = 'contact@mysy-training.com'
password = 'yGmzqBfrjb3YCvQN'



def send_user_account_mail_old(message, account_mail):
    try:
        tomorrow = datetime.date.today() + datetime.timedelta(days=1)
        tomorrow_day = tomorrow.strftime("%A")

        print("debut envoi mail de test ")
        # on rentre les renseignements pris sur le site du fournisseur

        msg = MIMEMultipart("alternative")

        msg['Subject'] = 'MySy Training : Activez votre compte '
        msg['From'] = 'contact@mysy-training.com'
        msg['To'] = str(account_mail)
        to = [{"email":str(account_mail)}]
        bcc = [{"email": "contact@mysy-training.com"}]

        my_url = ""
        if (MYSY_GV.MYSY_ENV == "PROD"):
            my_url = "https://apimysy.mysy-training.com/myclass/api/valide_user_account/"+str(message)
        elif (MYSY_GV.MYSY_ENV == "DEV"):
            my_url = "http://localhost:"+str(MYSY_GV.MYSY_PORT_DEV)+"/myclass/api/valide_user_account/"+str(message)
        elif (MYSY_GV.MYSY_ENV == "REC"):
            my_url = "https://devapimysy.mysy-training.com/myclass/api/valide_user_account/" + str(message)
        elif (MYSY_GV.MYSY_ENV == "DEM"):
            my_url = "https://demoapi.mysy-training.com/myclass/api/valide_user_account/" + str(message)


        send_smtp_email = sib_api_v3_sdk.SendSmtpEmail(template_id=15, params={"mysyurl": my_url,
                                                                               "user_name": str(account_mail),
                                                                               "id": "122CSR_id"}, to=to, bcc=bcc
                                                       )


        api_response = api_instance.send_transac_email(send_smtp_email)
        print(api_response)

        return True

    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 d'envoyer l'email de notification "

'''
Cette fonction envoie un mail de remerciement apres l'activation 
du compte d'un utilisateur 
'''

def send_user_thks_mail_old(message, account_mail):
    try:
        tomorrow = datetime.date.today() + datetime.timedelta(days=1)
        tomorrow_day = tomorrow.strftime("%A")

        print("debut envoi mail de test ")
        # on rentre les renseignements pris sur le site du fournisseur

        msg = MIMEMultipart("alternative")

        msg['Subject'] = 'MySy Training : Votre compte est actif '
        msg['From'] = 'contact@mysy-training.com'
        msg['To'] = str(account_mail)

        to = [{"email": str(account_mail)}]
        bcc = [{"email": "contact@mysy-training.com"}]


        my_url = ""
        if (MYSY_GV.MYSY_ENV == "PROD"):
            my_url = "https://apimysy.mysy-training.com/myclass/api/valide_user_account/" + str(message)
        elif (MYSY_GV.MYSY_ENV == "DEV"):
            my_url = "http://localhost:"+str(MYSY_GV.MYSY_PORT_DEV)+"/myclass/api/valide_user_account/" + str(message)
        elif (MYSY_GV.MYSY_ENV == "REC"):
            my_url = "https://devapimysy.mysy-training.com/myclass/api/valide_user_account/" + str(message)

        elif (MYSY_GV.MYSY_ENV == "DEM"):
            my_url = "https://demoapi.mysy-training.com/myclass/api/valide_user_account/" + str(message)


        send_smtp_email = sib_api_v3_sdk.SendSmtpEmail(template_id=16, params={ "user_name": str(account_mail),},
                                                       to=to, bcc=bcc )

        api_response = api_instance.send_transac_email(send_smtp_email)
        print(api_response)

        return True

    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 d'envoyer l'email de notification "


def send_partner_account_mail_old(message, account_mail):

    try:
        tomorrow = datetime.date.today() + datetime.timedelta(days=1)
        tomorrow_day = tomorrow.strftime("%A")

        receiver = [str(account_mail)]
        toaddrs = ", ".join(receiver)

        my_url = ""
        if (MYSY_GV.MYSY_ENV == "PROD"):
            my_url = "https://apimysy.mysy-training.com/myclass/api/valide_partnair_account/" + str(message)
        elif (MYSY_GV.MYSY_ENV == "DEV"):
            my_url = "http://localhost:"+str(MYSY_GV.MYSY_PORT_DEV)+"/myclass/api/valide_partnair_account/"+str(message)
        elif (MYSY_GV.MYSY_ENV == "REC"):
            my_url = "https://devapimysy.mysy-training.com/myclass/api/valide_partnair_account/"+str(message)

        elif (MYSY_GV.MYSY_ENV == "DEM"):
            my_url = "https://demoapi.mysy-training.com/myclass/api/valide_partnair_account/"+str(message)


        print(" mail enoye à toaddrs : "+toaddrs)


        print("debut envoi mail de test ")
        # on rentre les renseignements pris sur le site du fournisseur

        msg = MIMEMultipart("alternative")

        msg['Subject'] = '[MySy Training]: activation de votre compte PRO'
        msg['From'] = 'contact@mysy-training.com'
        msg['To'] = str(toaddrs)
        msg['Bcc'] = 'contact@mysy-training.com'

        to = [{"email": str(account_mail)}]
        bcc = [{"email": "contact@mysy-training.com"}]


        send_smtp_email = sib_api_v3_sdk.SendSmtpEmail(template_id=17, params={"mysyurl": my_url,
                                                                               "user_name": str(account_mail),
                                                                               }, to=to, bcc=bcc
                                                       )

        api_response = api_instance.send_transac_email(send_smtp_email)
        print(api_response)

        return True
    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 d'envoyer l'email de notification"

'''
Envoie de l'email de reinitialisation du mot de passe du user
'''
def send_user_init_pwd_mail_pwd(token, account_mail, type_account):
    try:
        tomorrow = datetime.date.today() + datetime.timedelta(days=1)
        tomorrow_day = tomorrow.strftime("%A")

        print("debut envoi mail de test ")
        # on rentre les renseignements pris sur le site du fournisseur

        msg = MIMEMultipart("alternative")

        msg['Subject'] = '[MySy Training Technology] : Reinitialisez votre mot de passe'
        msg['From'] = 'contact@mysy-training.com'
        msg['To'] = str(account_mail)

        my_url = ""
        if (MYSY_GV.MYSY_ENV == "PROD"):
            my_url = "https://www.mysy-training.com/ResetUserPwd/" + str(token)+"/"+str(type_account)
        elif (MYSY_GV.MYSY_ENV == "DEV"):
            my_url = "http://localhost:3009/ResetUserPwd/" + str(token)+"/"+str(type_account)




        to = [{"email": str(account_mail)}]
        bcc = [{"email": "contact@mysy-training.com"}]

        send_smtp_email = sib_api_v3_sdk.SendSmtpEmail(template_id=19, params={"mysyurl": my_url,
                                                                               "user_name": str(account_mail),
                                                                               }, to=to, bcc=bcc
                                                       )

        api_response = api_instance.send_transac_email(send_smtp_email)
        print(api_response)

        return True

    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 d'envoyer l'email de notification "


'''
Envoie de l'email de suppression du compte utilisateur
'''
def send_user_delete_account(token, account_mail):
    try:
        tomorrow = datetime.date.today() + datetime.timedelta(days=1)
        tomorrow_day = tomorrow.strftime("%A")

        msg = MIMEMultipart("alternative")

        msg['Subject'] = '[MySy Training Technology] : Suppression de votre'
        msg['From'] = 'contact@mysy-training.com'
        msg['To'] = str(account_mail)

        my_url = ""
        if( MYSY_GV.MYSY_ENV == "PROD"):
            my_url = "https://www.mysy-training.com/DeleteUserAccount/" + str(token)
        elif (MYSY_GV.MYSY_ENV == "DEV"):
            my_url = "http://localhost:3009/DeleteUserAccount/" + str(token)

        to = [{"email": str(account_mail)}]
        bcc = [{"email": "contact@mysy-training.com"}]

        send_smtp_email = sib_api_v3_sdk.SendSmtpEmail(template_id=20, params={"mysyurl": my_url,
                                                                               "user_name": str(account_mail),
                                                                               }, to=to, bcc=bcc
                                                       )

        api_response = api_instance.send_transac_email(send_smtp_email)
        print(api_response)

        return True

    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 d'envoyer l'email de notification "


'''
Cette fonction envoir n'import quel email avec les varibable : 
- recever_email
- objet_mail
- message_mail
'''
def SendGenericEmail(mail_recever=None, mail_object=None, mail_message=None):
    try:
        tomorrow = datetime.date.today() + datetime.timedelta(days=1)
        tomorrow_day = tomorrow.strftime("%A")

        print("debut envoi mail de test ")
        # on rentre les renseignements pris sur le site du fournisseur

        msg = MIMEMultipart("alternative")

        msg['Subject'] = '[MySy Training Technology] : '+str(mail_object)
        msg['From'] = MYSY_GV.INTERNAL_MAIL_SENDER
        msg['To'] = str(mail_recever)

        html = '''
    <!DOCTYPE html>
    <html>
        <body>
            <div style="background-color:#eee;padding:0px;text-align:center;width:100%">
                <h2 style="font-family:Georgia, 'Times New Roman', Times, serif;color#454349;">
                <img  src="http://88.170.110.220/img/MYSY-LOGO-BLUE.png" alt="Mysy Training Logo" width="110px" height="70px"/> </h2>
            </div>
            <div style="padding:20px 0px;text-align:center;font-family:Georgia, 'Times New Roman', Times, serif;color#454349;font-size:2rem;">
                <div style="width:100%">
                    <div style="text-align:center;">
                        Bonjour
                        <div style="padding:20px 0px;text-align:center;font-family:Georgia, 'Times New Roman', Times, serif;color#454349;font-size:1.2rem;">

			Message de  <font color="green">MySy-Training Technology </font>.<br/>
			{mymessage}
            </div>
        </body>
    </html>  '''.format(mymessage=mail_message)

        html_mime = MIMEText(html, 'html')

        # msg.attach(texte_mime)
        msg.attach(html_mime)

        print("html_mime =" + str(html))

        toaddr = str(mail_recever)
        cc = ['cbalde@mysy-training.com']
        toaddrs = [toaddr] + cc

        # msg.attach(MIMEText(open(filename).read()))

        with smtplib.SMTP(smtp_address, port) as server:
            server.starttls()  # Secure the connection

            server.login(user, password)
            server.sendmail(sender, toaddrs, msg.as_string())
            mycommon.myprint("mail successfully sent to " + str(toaddrs))
        
        return True
    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


'''
Apres l'activation du compte pro, 
cet email envoie le token et mot de passe temporaire à l'utilisateur
'''
def Pro_Account_Token_Pass_old(account_mail, my_token):
    try:
        tomorrow = datetime.date.today() + datetime.timedelta(days=1)
        tomorrow_day = tomorrow.strftime("%A")

        receiver = [str(account_mail)]
        toaddrs = ", ".join(receiver)

        print(" mail enoye à toaddrs : " + toaddrs)
        print("debut envoi mail de test ")
        # on rentre les renseignements pris sur le site du fournisseur

        msg = MIMEMultipart("alternative")

        msg['Subject'] = '[MySy Training]: votre compte PRO est pret'
        msg['From'] = 'contact@mysy-training.com'
        msg['To'] = str(toaddrs)
        msg['Bcc'] = 'contact@mysy-training.com'

        cle = my_token

        print(" mail enoye à toaddrs : " + str(msg['To']))
        to = [{"email": str(account_mail)}]
        bcc = [{"email": "contact@mysy-training.com"}]

        send_smtp_email = sib_api_v3_sdk.SendSmtpEmail(template_id=18, params={"user_name": str(account_mail), "secrete":str(my_token) },
                                                       to=to, bcc=bcc)

        api_response = api_instance.send_transac_email(send_smtp_email)
        print(api_response)

        return True
    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


'''
Cette fonction envoie l'email de confirmation de la commande de vente
'''
def SalesOrderConfirmationEmail_old(account_mail, diction):
    try:
        '''
        Verification des données obligatoires
        '''
        '''
               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 = ['invoice_nom', 'invoice_adr_city', 'invoice_adr_country', 'invoice_adr_street',
                                  'invoice_adr_zip', 'periodicite', 'total_ht', 'total_tva', 'total_ttc',
                                  'order_id', 'date_update', 'nb_product', 'order_date']

        for val in field_list_obligatoire:
            if val not in diction:
                mycommon.myprint(str(inspect.stack()[0][3]) + " - La valeur '" + val + "' n'est pas presente dans liste ")
                return False, " Impossible d'envoyer l'email de confirmation"

        total_ht = diction['total_ht']
        tva = diction['total_tva']
        total_ttc = diction['total_ttc']
        client_name = diction['invoice_nom']
        client_address = diction['invoice_adr_street']
        client_zip_ville = diction['invoice_adr_zip']+" "+diction['invoice_adr_city']
        client_pays = diction['invoice_adr_country']
        order_id = diction['order_id']
        date_order = diction['order_date']
        my_end_date = ""

        if ("end_date" in diction.keys()):
            if  diction.keys():
                my_end_date = "*Offre valable jusqu'au "+str(diction['end_date'])

        nb_line = mycommon.tryInt(diction['nb_product'])

        if( nb_line == 0 ):
            mycommon.myprint(str(inspect.stack()[0][3]) + " - nb_line  = '" + nb_line + "' : Aucun produit à facturer")
            return False, " Impossible d'envoyer l'email de confirmation"

        #print("client_name = "+str(client_name))
        #print("client_address = " + str(client_address))
        #print("client_zip_ville = " + str(client_zip_ville))
        #print("client_pays = " + str(client_pays))
        #print("order_id = " + str(order_id))
        #print("date_order = " + str(date_order))
        #print("nb_line = " + str(nb_line))
        #print("End Date = " + str(my_end_date))

        # Recuperation des produits (max 3 produits)
        # produit 1
        if ("item_0" in diction.keys()):
            if( diction["item_0"] ):
                packs =  diction["item_0"]['code']
                qty = diction["item_0"]['qty']
                unit_price =  diction["item_0"]['prix']
                montant = diction["item_0"]['amount']
                detail_packs = diction["item_0"]['pack_products']
                #print("diction['item_0']['pack_products']  = "+str(diction["item_0"]['pack_products']))

        # produit 2
        if ("item_1" in diction.keys()):
            if (diction["item_1"]):
                packs1 = diction["item_1"]['code']
                qty1 = diction["item_0"]['qty']
                unit_price1 = diction["item_1"]['prix']
                montant1 = diction["item_1"]['amount']
                detail_packs1 = diction["item_1"]['pack_products']

        # produit 3
        if ("item_2" in diction.keys()):
            if (diction["item_2"]):
                packs2 = diction["item_2"]['code']
                qty2 = diction["item_0"]['qty']
                unit_price2 = diction["item_2"]['prix']
                montant2 = diction["item_2"]['amount']
                detail_packs2 = diction["item_1"]['pack_products']


        i = 0
        while (i < nb_line):
            row = "item_" + str(i)
            #print(" product = "+ str(diction[str(row)]))
            i = i + 1

        receiver = [str(account_mail)]
        toaddrs = ", ".join(receiver)

        #print(" mail enoye à toaddrs : " + toaddrs)
        #print("debut envoi mail de test ")
        # on rentre les renseignements pris sur le site du fournisseur

        msg = MIMEMultipart("alternative")

        msg['Subject'] = '[MySy Training]: votre compte PRO est pret'
        msg['From'] = 'contact@mysy-training.com'
        msg['To'] = str(toaddrs)
        msg['Bcc'] = 'contact@mysy-training.com'

        to = [{"email": str(account_mail)}]

        #print(" ############# to = "+str(to))
        bcc = [{"email": "contact@mysy-training.com"}]


        send_smtp_email = sib_api_v3_sdk.SendSmtpEmail(template_id=22, params={"order_id": order_id,
                                                                               "date_order": date_order,

                                                                               "total_ht": total_ht,
                                                                               "tva": tva,
                                                                               "total_ttc": total_ttc,
                                                                               "client_name": client_name,
                                                                               "client_address": client_address,
                                                                               "client_zip_ville": client_zip_ville,
                                                                               "client_pays": client_pays,

                                                                               "packs": packs,
                                                                               "detail_packs": detail_packs,
                                                                               "qty": qty,
                                                                               "unit_price": unit_price,
                                                                               "montant":montant,
                                                                               "end_date": my_end_date,

                                                                               }, to=to, bcc=bcc)
        api_response = api_instance.send_transac_email(send_smtp_email)
        print(api_response)
        return True





    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


"""
Cette fonction envoi les factures OLD
"""
def SendInvoiceEmail_Old(account_mail, diction):
    try:
        '''
        Verification des données obligatoires
        '''
        '''
               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 = ['invoice_nom', 'invoice_adr_street', 'invoice_adr_zip', 'invoice_adr_city',
                                  'invoice_adr_country', 'invoice_id', 'invoice_date', 'due_date', 'order_id', 'item_0',
                                  'total_ht', 'total_tva', 'total_ttc', ]

        for val in field_list_obligatoire:
            if val not in diction:
                mycommon.myprint(str(inspect.stack()[0][3]) + " - La valeur '" + val + "' n'est pas presente dans liste ")
                return False, " Impossible d'envoyer la facture par email"


        order_id = diction['order_id']
        date_order = diction['order_date']
        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'])

        my_end_date = ""

        if ("end_date" in diction.keys()):
            if  diction.keys():
                my_end_date = "*Offre valable jusqu'au "+str(diction['end_date'])

        nb_line = mycommon.tryInt(diction['nb_product'])

        if( nb_line == 0 ):
            mycommon.myprint(str(inspect.stack()[0][3]) + " - nb_line  = '" + nb_line + "' : Aucun produit à facturer")
            return False, " Impossible d'envoyer l'email de confirmation"

        #print("Facture client_name = "+str(client_name))
        #print("Facture client_address = " + str(client_address))
        #print("Facture client_zip_ville = " + str(client_zip_ville))
        #print("Facture client_pays = " + str(client_pays))
        #print("Facture order_id = " + str(order_id))
        #print("Facture date_order = " + str(date_order))
        #print("Facture nb_line = " + str(nb_line))
        #print("Facture End Date = " + str(my_end_date))

        # Recuperation des produits (max 3 produits)
        # produit 1
        if ("item_0" in diction.keys()):
            if( diction["item_0"] ):
                packs =  diction["item_0"]['code']
                qty = diction["item_0"]['qty']
                unit_price =  diction["item_0"]['prix']
                montant = diction["item_0"]['amount']
                detail_packs = diction["item_0"]['pack_products']
                #print("diction['item_0']['pack_products']  = "+str(diction["item_0"]['pack_products']))

        # produit 2
        if ("item_1" in diction.keys()):
            if (diction["item_1"]):
                packs1 = diction["item_1"]['code']
                qty1 = diction["item_0"]['qty']
                unit_price1 = diction["item_1"]['prix']
                montant1 = diction["item_1"]['amount']
                detail_packs1 = diction["item_1"]['pack_products']

        # produit 3
        if ("item_2" in diction.keys()):
            if (diction["item_2"]):
                packs2 = diction["item_2"]['code']
                qty2 = diction["item_0"]['qty']
                unit_price2 = diction["item_2"]['prix']
                montant2 = diction["item_2"]['amount']
                detail_packs2 = diction["item_1"]['pack_products']


        i = 0
        while (i < nb_line):
            row = "item_" + str(i)
            #print(" product = "+ str(diction[str(row)]))
            i = i + 1

        receiver = [str(account_mail)]
        toaddrs = ", ".join(receiver)

        #print("Facture  mail enoye à toaddrs : " + toaddrs)
        #print("Facture debut envoi mail de test ")
        # on rentre les renseignements pris sur le site du fournisseur

        msg = MIMEMultipart("alternative")

        msg['Subject'] = '[MySy Training]: votre compte PRO est pret'
        msg['From'] = 'contact@mysy-training.com'
        msg['To'] = str(toaddrs)
        msg['Bcc'] = 'contact@mysy-training.com'

        to = [{"email": str(account_mail)}]

        #print(" Facture ############# to = "+str(to))
        bcc = [{"email": "contact@mysy-training.com"}]


        send_smtp_email = sib_api_v3_sdk.SendSmtpEmail(template_id=23, params={"order_id": order_id,
                                                                               "date_order": date_order,

                                                                               "total_ht": total_ht,
                                                                               "tva": tva,
                                                                               "total_ttc": total_ttc,
                                                                               "client_name": client_name,
                                                                               "client_address": client_address,
                                                                               "client_zip_ville": client_zip_ville,
                                                                               "client_pays": client_pays,
                                                                               "packs": packs,
                                                                               "detail_packs": detail_packs,
                                                                               "qty": qty,
                                                                               "unit_price": unit_price,
                                                                               "montant":montant,
                                                                               "invoice_id":invoice_id,
                                                                               "invoice_date":invoice_date,
                                                                                "due_date":due_date,
                                                                               "orign_order":orign_order,
                                                                               }, to=to, bcc=bcc)
        api_response = api_instance.send_transac_email(send_smtp_email)
        #print("Facture "+str(api_response))
        return True

    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


"""
Email generic pour se subsituer sendinblu
"""
def MysyGenericEmail( ):
    try:
        tomorrow = datetime.date.today() + datetime.timedelta(days=1)
        tomorrow_day = tomorrow.strftime("%A")
        mail_recever = "billardman01@hotmail.com"
        mail_object = " new mysy email"
        mail_message = " le message : corps du mail "
        
        
        smtpserver = smtplib.SMTP(MYSY_GV.O365_SMTP_COUNT_smtpsrv, MYSY_GV.O365_SMTP_COUNT_port)


        print("debut envoi mail de test ")
        # on rentre les renseignements pris sur le site du fournisseur

        #msg = MIMEMultipart("alternative")
        msg = EmailMessage()
        msg['Subject'] = '[MySy Training Technology] : ' + str(mail_object)
        msg['From'] = "cbalde@mysy-training.com"
        msg['To'] = str(mail_recever)
        """
        html = '''
    <!DOCTYPE html>
    <html>
        <body>
            <div style="background-color:#eee;padding:0px;text-align:center;width:100%">
                <h2 style="font-family:Georgia, 'Times New Roman', Times, serif;color#454349;">
                <img  src="http://88.170.110.220/img/MYSY-LOGO-BLUE.png" alt="Mysy Training Logo" width="110px" height="70px"/> </h2>
            </div>
            <div style="padding:20px 0px;text-align:center;font-family:Georgia, 'Times New Roman', Times, serif;color#454349;font-size:2rem;">
                <div style="width:100%">
                    <div style="text-align:center;">
                        Bonjour
                        <div style="padding:20px 0px;text-align:center;font-family:Georgia, 'Times New Roman', Times, serif;color#454349;font-size:1.2rem;">

			Message de  <font color="green">MySy-Training Technology </font>.<br/>
			 ici le message de cherif <br/>
			 {mymessage}
            </div>
        </body>
    </html>  '''.format(mymessage=mail_message)
        """
        msg.set_content('''
<!DOCTYPE html>
<html>
  <body
    style="
      width: 50%;
      margin-left: auto;
      margin-right: auto;
      text-align: center;
      background-color: #EFF2F7;
    "
  >
    <div style="background-color: #FFFFFF; padding: 10px 20px">
      <div style="background-color: #EEEEEE;  margin-top: 1rem; margin-bottom: 1rem;">
       
        <img
            src="https://img.mysy-training.com/MYSY-LOGO-BLUE.png" alt="Mysy Training Logo" style="max-width: 15%;" 
           
          />
      </div>
      <div>
        <div style="margin-left: auto;
        margin-right: auto;">
          <img
            src="https://dummyimage.com/500x300/000/fff&text=Dummy+image"
            style="height: 300px"
          />
          <div style="text-align: center">
            <h3>Article 1</h3>
            <p>
              Lorem ipsum dolor sit amet consectetur, adipisicing elit. A
              ducimus deleniti nemo quibusdam iste sint!
            </p>
            <a href="#">Read more</a>
          </div>
        </div>
      </div>
    </div>

  </body>
</html>


        ''', subtype='html')
        #html_mime = MIMEText(html, 'html')

        # msg.attach(texte_mime)
        #msg.attach(html_mime)

        smtpserver.ehlo()
        smtpserver.starttls()
        smtpserver.login(MYSY_GV.O365_SMTP_COUNT_user, MYSY_GV.O365_SMTP_COUNT_password)
        smtpserver.send_message(msg)
        smtpserver.close()

        """
        print("html_mime =" + str(html))

        toaddr = str(mail_recever)
        cc = ['cbalde@mysy-training.com']
        toaddrs = [toaddr] + cc

        # msg.attach(MIMEText(open(filename).read()))

        with smtplib.SMTP(smtp_address, port) as server:
            server.starttls()  # Secure the connection

            server.login(user, password)
            server.sendmail(sender, toaddrs, msg.as_string())
            mycommon.myprint("mail successfully sent to " + str(toaddrs))
        """

        return True, "mail envoyé"
    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 d'envoyer le mail"


""" envoie email avec template """
def MysyGenericEmail_tpl():
    try:
        tomorrow = datetime.date.today() + datetime.timedelta(days=1)
        tomorrow_day = tomorrow.strftime("%A")
        mail_recever = "billardman01@hotmail.com,cherif.balde@yahoo.fr,cbalde@mysy-training.com"
        mail_object = " new mysy email"
        mail_message = " le message : corps du mail "
        
        smtpserver = smtplib.SMTP(MYSY_GV.O365_SMTP_COUNT_smtpsrv, MYSY_GV.O365_SMTP_COUNT_port)
        

        print("debut envoi mail de test ")
        # on rentre les renseignements pris sur le site du fournisseur

        # msg = MIMEMultipart("alternative")
        msg = EmailMessage()
        msg['Subject'] = '[MySy Training Technology] : ' + str(mail_object)
        msg['From'] = "cbalde@mysy-training.com"
        msg['To'] = str(mail_recever)

        # JINJA2
        templateLoader = jinja2.FileSystemLoader(searchpath="./")
        templateEnv = jinja2.Environment(loader=templateLoader)
        TEMPLATE_FILE = "Template/tpl_mail_test.html"
        template = templateEnv.get_template(TEMPLATE_FILE)
        # This data can come from database query
        body = {
            "user": {"nom":"BALDE", "prenom":"sekou"},
            "session": {"title":"le titre", "date_du": "01/01/01", "date_fin": "02/02/02"}
        }
        sourceHtml = template.render(user=body["user"], session=body["session"])


        print('### sourceHtml = '+str(sourceHtml))


        # END JINJA

        msg.set_content(sourceHtml, subtype='html')
        # html_mime = MIMEText(html, 'html')

        # msg.attach(texte_mime)
        # msg.attach(html_mime)

        smtpserver.ehlo()
        smtpserver.starttls()
        smtpserver.login(MYSY_GV.O365_SMTP_COUNT_user, MYSY_GV.O365_SMTP_COUNT_password)
        smtpserver.send_message(msg)
        smtpserver.close()

        """
        print("html_mime =" + str(html))

        toaddr = str(mail_recever)
        cc = ['cbalde@mysy-training.com']
        toaddrs = [toaddr] + cc

        # msg.attach(MIMEText(open(filename).read()))

        with smtplib.SMTP(smtp_address, port) as server:
            server.starttls()  # Secure the connection

            server.login(user, password)
            server.sendmail(sender, toaddrs, msg.as_string())
            mycommon.myprint("mail successfully sent to " + str(toaddrs))
        """

        return True, "mail envoyé"
    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 d'envoyer le mail"


""" Envoie de l'email de commande avec un template local """
def MysyOrderEmail_tpl():
    try:
        tomorrow = datetime.date.today() + datetime.timedelta(days=1)
        tomorrow_day = tomorrow.strftime("%A")
        mail_recever = "billardman01@hotmail.com,cherif.balde@yahoo.fr,cbalde@mysy-training.com"
        mail_object = " new mysy email"
        mail_message = " le message : corps du mail "

        
        
        smtpserver = smtplib.SMTP(MYSY_GV.O365_SMTP_COUNT_smtpsrv, MYSY_GV.O365_SMTP_COUNT_port)
        

        print("debut envoi mail de test ")
        # on rentre les renseignements pris sur le site du fournisseur

        # msg = MIMEMultipart("alternative")
        msg = EmailMessage()


        # JINJA2
        templateLoader = jinja2.FileSystemLoader(searchpath="./")
        templateEnv = jinja2.Environment(loader=templateLoader)
        TEMPLATE_FILE = "Template/MySy_Sales_Order_tpl.html"
        template = templateEnv.get_template(TEMPLATE_FILE)
        # This data can come from database query
        body = {
            "params": {"client_name":"BALDE",
                       "client_address":"sekou",
                       "client_zip_ville": "sekou",
                       "client_pays": "sekou",
                       "order_id": "sekou",
                       "date_order": "sekou",
                       "packs": "sekou",
                       "qty": "sekou",
                       "unit_price": "sekou",
                       "montant": "sekou",
                       "detail_packs": "sekou",
                       "total_ht": "sekou",
                       "tva": "sekou",
                       "montant": "sekou",
                       },
            "user":{"nom":"balde", "prenom":"sekou"},

        }
        sourceHtml = template.render(params=body["params"], user=body["user"])

        msg.set_content(sourceHtml, subtype='html')

        msg['Subject'] = "[MySy Training] : Confirmation commande N°1222"
        msg['From'] = "cbalde@mysy-training.com"
        msg['To'] = str(mail_recever)

        # html_mime = MIMEText(html, 'html')

        # msg.attach(texte_mime)
        # msg.attach(html_mime)

        smtpserver.ehlo()
        smtpserver.starttls()
        smtpserver.login(MYSY_GV.O365_SMTP_COUNT_user, MYSY_GV.O365_SMTP_COUNT_password)
        smtpserver.send_message(msg)
        smtpserver.close()

        """
        print("html_mime =" + str(html))

        toaddr = str(mail_recever)
        cc = ['cbalde@mysy-training.com']
        toaddrs = [toaddr] + cc

        # msg.attach(MIMEText(open(filename).read()))

        with smtplib.SMTP(smtp_address, port) as server:
            server.starttls()  # Secure the connection

            server.login(user, password)
            server.sendmail(sender, toaddrs, msg.as_string())
            mycommon.myprint("mail successfully sent to " + str(toaddrs))
        """

        return True, "mail envoyé"
    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 d'envoyer le mail"


'''
Cette fonction envoie l'email de confirmation de la commande de vente
'''
def SalesOrderConfirmationEmail(account_mail, diction):
    try:

        """
        Liste des champs autorisés
        """
        field_list= ['invoice_nom', 'periodicite', 'total_ht', 'total_tva', 'total_ttc',
                                  'order_id', 'date_update', 'nb_product', 'order_date',
                     'discount_code', 'discount_type', 'discount_valeur', 'discount_montant_remise']

        '''
        Verification des données obligatoires
        '''
        '''
               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 
               '''
        if(len(str(account_mail).strip()) == 0 ):
            mycommon.myprint(str(inspect.stack()[0][3]) + " - La valeur '" + str(account_mail) + "' est vide ")
            return False, " Impossible d'envoyer l'email de confirmation. l'adresse email est vide"


        field_list_obligatoire = ['invoice_nom', 'periodicite', 'total_ht', 'total_tva', 'total_ttc',
                                  'order_id', 'date_update', 'nb_product', 'order_date']

        for val in field_list_obligatoire:
            if val not in diction:
                mycommon.myprint(str(inspect.stack()[0][3]) + " - La valeur '" + val + "' n'est pas presente dans liste ")
                return False, " Impossible d'envoyer l'email de confirmation"

        total_ht = diction['total_ht']
        tva = diction['total_tva']
        total_ttc = diction['total_ttc']
        client_name = diction['invoice_nom']
        client_address = diction['invoice_adr_street']
        client_zip_ville = diction['invoice_adr_zip']+" "+diction['invoice_adr_city']
        client_pays = diction['invoice_adr_country']
        order_id = diction['order_id']
        date_order = diction['order_date']

        discount_code = ""
        if ("discount_code" in diction.keys()):
            if diction['discount_code']:
                discount_code = diction['discount_code']

        discount_type = ""
        if ("discount_type" in diction.keys()):
            if diction['discount_type']:
                discount_type = diction['discount_type']

        discount_valeur = ""
        if ("discount_valeur" in diction.keys()):
            if diction['discount_valeur']:
                discount_valeur = diction['discount_valeur']

        discount_montant_remise = ""
        if ("discount_montant_remise" in diction.keys()):
            if diction['discount_montant_remise']:
                discount_montant_remise = diction['discount_montant_remise']


        my_end_date = ""

        if ("end_date" in diction.keys()):
            if  diction.keys():
                my_end_date = "*Offre valable jusqu'au "+str(diction['end_date'])

        nb_line = mycommon.tryInt(diction['nb_product'])

        if( nb_line == 0 ):
            mycommon.myprint(str(inspect.stack()[0][3]) + " - nb_line  = '" + nb_line + "' : Aucun produit à facturer")
            return False, " Impossible d'envoyer l'email de confirmation"



        # Recuperation des produits (max 3 produits)
        # produit 1
        if ("item_0" in diction.keys()):
            if( diction["item_0"] ):
                packs =  diction["item_0"]['code']
                qty = diction["item_0"]['qty']
                unit_price =  diction["item_0"]['prix']
                montant = diction["item_0"]['amount']
                detail_packs = diction["item_0"]['pack_products']
                #print("diction['item_0']['pack_products']  = "+str(diction["item_0"]['pack_products']))

        # produit 2
        if ("item_1" in diction.keys()):
            if (diction["item_1"]):
                packs1 = diction["item_1"]['code']
                qty1 = diction["item_0"]['qty']
                unit_price1 = diction["item_1"]['prix']
                montant1 = diction["item_1"]['amount']
                detail_packs1 = diction["item_1"]['pack_products']

        # produit 3
        if ("item_2" in diction.keys()):
            if (diction["item_2"]):
                packs2 = diction["item_2"]['code']
                qty2 = diction["item_0"]['qty']
                unit_price2 = diction["item_2"]['prix']
                montant2 = diction["item_2"]['amount']
                detail_packs2 = diction["item_1"]['pack_products']


        i = 0
        while (i < nb_line):
            row = "item_" + str(i)
            #print(" product = "+ str(diction[str(row)]))
            i = i + 1

        receiver = [str(account_mail)]
        toaddrs = ", ".join(receiver)
       # on rentre les renseignements pris sur le site du fournisseur

        #----------
        mail_recever = str(toaddrs)
        
        smtpserver = smtplib.SMTP(MYSY_GV.O365_SMTP_COUNT_smtpsrv, MYSY_GV.O365_SMTP_COUNT_port)
        

        print("debut envoi mail de test ")
        # on rentre les renseignements pris sur le site du fournisseur

        discount_display_text = ""
        if( discount_type == "fix"):
            discount_display_text = " -"+str(discount_valeur)+" €"
        elif( discount_type == "percent"):
            discount_display_text = " -"+str(discount_valeur)+" %"

        # msg = MIMEMultipart("alternative")
        msg = EmailMessage()

        # JINJA2
        templateLoader = jinja2.FileSystemLoader(searchpath="./")
        templateEnv = jinja2.Environment(loader=templateLoader)
        TEMPLATE_FILE = "Template/MySy_Sales_Order_tpl.html"
        template = templateEnv.get_template(TEMPLATE_FILE)
        # This data can come from database query
        body = {
            "params": {"order_id": order_id,
                       "date_order": date_order,
                       "total_ht": total_ht,
                       "tva": tva,
                       "total_ttc": total_ttc,
                       "client_name": client_name,
                       "client_email":str(account_mail),
                       "client_address": client_address,
                       "client_zip_ville": client_zip_ville,
                       "client_pays": client_pays,
                       "packs": packs,
                       "detail_packs": detail_packs,
                       "qty": qty,
                       "unit_price": unit_price,
                       "montant": montant,
                       "end_date": my_end_date,
                       "discount_montant_remise": discount_montant_remise,
                       "discount_code": discount_code,
                       "discount_type": discount_type,
                       "discount_valeur": discount_valeur,
                       "discount_display_text": discount_display_text,

                       },

        }
        sourceHtml = template.render(params=body["params"])

        msg.set_content(sourceHtml, subtype='html')

        msg['Subject'] = "[MySy Training] : Confirmation commande N°"+str(order_id)
        msg['From'] = MYSY_GV.O365_SMTP_COUNT_From_User
        msg['To'] = str(mail_recever)
        msg['Bcc'] = 'contact@mysy-training.com'

        msg.add_attachment('./Template/MySy_CGV.pdf')
        with open('./Template/MySy_CGV.pdf', 'rb') as content_file:
            content = content_file.read()
            msg.add_attachment(content, maintype='application', subtype='pdf', filename='MySy_CGV.pdf')


        # html_mime = MIMEText(html, 'html')

        # msg.attach(texte_mime)
        # msg.attach(html_mime)

        smtpserver.ehlo()
        smtpserver.starttls()
        smtpserver.login(MYSY_GV.O365_SMTP_COUNT_user, MYSY_GV.O365_SMTP_COUNT_password)
        smtpserver.send_message(msg)
        smtpserver.close()

        return True, " Creation commande OK"


    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 créer la commande "


"""
Envoi du nouvel email de creation de compte avec mes propres template
"""
def send_user_account_mail(message, account_mail):
    try:
        tomorrow = datetime.date.today() + datetime.timedelta(days=1)
        tomorrow_day = tomorrow.strftime("%A")

        my_url = ""
        if (MYSY_GV.MYSY_ENV == "PROD"):
            my_url = "https://apimysy.mysy-training.com/myclass/api/valide_user_account/"+str(message)
        elif (MYSY_GV.MYSY_ENV == "DEV"):
            my_url = "http://localhost:"+str(MYSY_GV.MYSY_PORT_DEV)+"/myclass/api/valide_user_account/"+str(message)
        elif (MYSY_GV.MYSY_ENV == "REC"):
            my_url = "https://devapimysy.mysy-training.com/myclass/api/valide_user_account/" + str(message)

        elif (MYSY_GV.MYSY_ENV == "DEM"):
            my_url = "https://demoapi.mysy-training.com/myclass/api/valide_user_account/" + str(message)

        
        smtpserver = smtplib.SMTP(MYSY_GV.O365_SMTP_COUNT_smtpsrv, MYSY_GV.O365_SMTP_COUNT_port)
        

        print("debut envoi mail de test ")
        # on rentre les renseignements pris sur le site du fournisseur

        # msg = MIMEMultipart("alternative")
        msg = EmailMessage()

        # JINJA2
        templateLoader = jinja2.FileSystemLoader(searchpath="./")
        templateEnv = jinja2.Environment(loader=templateLoader)
        TEMPLATE_FILE = "Template/MySy_Create_User_account_tpl.html"
        template = templateEnv.get_template(TEMPLATE_FILE)
        # This data can come from database query
        body = {
        "params": {"mysyurl": my_url,
                  "user_name": str(account_mail),
                  "id": "122CSR_id"},
        }


        sourceHtml = template.render(params=body["params"])

        msg.set_content(sourceHtml, subtype='html')

        msg['Subject'] = '[MySy Training] : Activez votre compte '
        msg['From'] = MYSY_GV.O365_SMTP_COUNT_From_User
        msg['To'] = str(account_mail)
        to = [{"email": str(account_mail)}]
        bcc = [{"email": "contact@mysy-training.com"}]

        smtpserver.ehlo()
        smtpserver.starttls()

        smtpserver.login(MYSY_GV.O365_SMTP_COUNT_user, MYSY_GV.O365_SMTP_COUNT_password)
        val = smtpserver.send_message(msg)
        smtpserver.close()
        print(" Email envoyé "+str(val))
        return True


    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 d'envoyer l'email de notification "

"""
Creation du compte PRO avec mes template
"""
def send_partner_account_mail(message, account_mail):

    try:
        tomorrow = datetime.date.today() + datetime.timedelta(days=1)
        tomorrow_day = tomorrow.strftime("%A")

        receiver = [str(account_mail)]
        toaddrs = ", ".join(receiver)

        my_url = ""
        if (MYSY_GV.MYSY_ENV == "PROD"):
            my_url = "https://apimysy.mysy-training.com/myclass/api/valide_partnair_account/" + str(message)
        elif (MYSY_GV.MYSY_ENV == "DEV"):
            my_url = "http://localhost:"+str(MYSY_GV.MYSY_PORT_DEV)+"/myclass/api/valide_partnair_account/"+str(message)
        elif (MYSY_GV.MYSY_ENV == "REC"):
            my_url = "https://devapimysy.mysy-training.com/myclass/api/valide_partnair_account/" + str(message)

        elif (MYSY_GV.MYSY_ENV == "DEM"):
            my_url = "https://demoapi.mysy-training.com/myclass/api/valide_partnair_account/" + str(message)

        
        smtpserver = smtplib.SMTP(MYSY_GV.O365_SMTP_COUNT_smtpsrv, MYSY_GV.O365_SMTP_COUNT_port)
        

        print("debut envoi mail de test ")
        # on rentre les renseignements pris sur le site du fournisseur

        # msg = MIMEMultipart("alternative")
        msg = EmailMessage()

        # JINJA2
        templateLoader = jinja2.FileSystemLoader(searchpath="./")
        templateEnv = jinja2.Environment(loader=templateLoader)
        TEMPLATE_FILE = "Template/MySy_Create_PRO_account_tpl.html"
        template = templateEnv.get_template(TEMPLATE_FILE)
        # This data can come from database query
        body = {
            "params": {"mysyurl": my_url,
                      "user_name": str(account_mail),
                      }
        }

        sourceHtml = template.render(params=body["params"])

        msg.set_content(sourceHtml, subtype='html')


        msg['Subject'] = '[MySy Training]: activation de votre compte PRO'
        msg['From'] = MYSY_GV.O365_SMTP_COUNT_From_User
        msg['To'] = str(toaddrs)
        msg['Bcc'] = 'contact@mysy-training.com'
        to = [{"email": str(account_mail)}]
        bcc = [{"email": "contact@mysy-training.com"}]

        smtpserver.ehlo()
        smtpserver.starttls()
        smtpserver.login(MYSY_GV.O365_SMTP_COUNT_user, MYSY_GV.O365_SMTP_COUNT_password)
        val = smtpserver.send_message(msg)
        smtpserver.close()
        print(" Email envoyé " + str(val))
        return True

    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 d'envoyer l'email de notification"


'''
Apres l'activation du compte pro, 
cet email envoie le token et mot de passe temporaire à l'utilisateur

/!\ : update du 27/09/2023 :
Apres l'activation du compte, il faut créer l'employé rattaché à cet utilisateur
'''
def Pro_Account_Token_Pass(account_mail, my_token):
    try:
        tomorrow = datetime.date.today() + datetime.timedelta(days=1)
        tomorrow_day = tomorrow.strftime("%A")

        receiver = [str(account_mail)]
        toaddrs = ", ".join(receiver)

        print(" mail enoye à toaddrs : " + toaddrs)
        print("debut envoi mail de test ")
        # on rentre les renseignements pris sur le site du fournisseur



        """send_smtp_email = sib_api_v3_sdk.SendSmtpEmail(template_id=18, params={"user_name": str(account_mail), "secrete":str(my_token) },
                                                       to=to, bcc=bcc)
        """

        smtpserver = smtplib.SMTP(MYSY_GV.O365_SMTP_COUNT_smtpsrv, MYSY_GV.O365_SMTP_COUNT_port)
        

        # msg = MIMEMultipart("alternative")
        msg = EmailMessage()

        url_environnement = MYSY_GV.CLIENT_URL_BASE
        # JINJA2
        templateLoader = jinja2.FileSystemLoader(searchpath="./")
        templateEnv = jinja2.Environment(loader=templateLoader)
        TEMPLATE_FILE = "Template/MySy_account_pro_enabled_tpl.html"
        template = templateEnv.get_template(TEMPLATE_FILE)
        # This data can come from database query
        body = {
            "params":{"user_name": str(account_mail),
                      "secrete": str(my_token),
                      "url_connexion":str(url_environnement)}
        }

        sourceHtml = template.render(params=body["params"])

        msg.set_content(sourceHtml, subtype='html')

        msg['Subject'] = '[MySy Training]: votre compte PRO est pret'
        cle = my_token
        msg['From'] = MYSY_GV.O365_SMTP_COUNT_From_User
        msg['To'] = str(toaddrs)
        msg['Bcc'] = 'contact@mysy-training.com'
        to = [{"email": str(account_mail)}]
        bcc = [{"email": "contact@mysy-training.com"}]

        smtpserver.ehlo()
        smtpserver.starttls()
        smtpserver.login(MYSY_GV.O365_SMTP_COUNT_user, MYSY_GV.O365_SMTP_COUNT_password)
        val = smtpserver.send_message(msg)
        smtpserver.close()
        print(" Email envoyé " + str(val))
        """
        Update du 27/09/2023 : Apres activation du compte pro, on va créer l'employé rattaché à ce compte        
        """

        # Recuperation des données du partner
        my_partner = MYSY_GV.dbname['partnair_account'].find_one({'email':str(account_mail)})
        if( my_partner is None):
            mycommon.myprint(" WARNING : Impossible de recuperer les données du partner. Impossible de créer le compte employé de l'administrateur")
            return True


        data_employe_admin = {}
        data_employe_admin['partner_recid'] = str(my_partner['recid'])
        data_employe_admin['nom'] = str(my_partner['nom'])
        data_employe_admin['email'] = str(account_mail)
        data_employe_admin['comment'] = "Compte Administrateur"
        data_employe_admin['is_partner_admin_account'] = "1"
        data_employe_admin['account_partner_id'] = str(my_partner['_id'])


        print(" #### data_employe_admin = ", str(data_employe_admin))
        local_status, local_retval_inserted_id = ressources_humaines.Add_Partner_Admin_Ressource_Humaine_No_Toke(data_employe_admin)

        if( local_status is False):
            mycommon.myprint(str(local_retval_inserted_id))
            return True

        return True

    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


"""
Email d'info apres activation du compte utilisateur
"""
def send_user_thks_mail(message, account_mail):
    try:
        tomorrow = datetime.date.today() + datetime.timedelta(days=1)
        tomorrow_day = tomorrow.strftime("%A")

        print("debut envoi mail de test ")
        # on rentre les renseignements pris sur le site du fournisseur

        my_url = ""
        if (MYSY_GV.MYSY_ENV == "PROD"):
            my_url = "https://apimysy.mysy-training.com/myclass/api/valide_user_account/" + str(message)
        elif (MYSY_GV.MYSY_ENV == "DEV"):
            my_url = "http://localhost:"+str(MYSY_GV.MYSY_PORT_DEV)+"/myclass/api/valide_user_account/" + str(message)
        elif (MYSY_GV.MYSY_ENV == "REC"):
            my_url = "https://devapimysy.mysy-training.com/myclass/api/valide_user_account/" + str(message)

        elif (MYSY_GV.MYSY_ENV == "DEM"):
            my_url = "https://demoapi.mysy-training.com/myclass/api/valide_user_account/" + str(message)

        """
        send_smtp_email = sib_api_v3_sdk.SendSmtpEmail(template_id=16, params={ "user_name": str(account_mail),},
                                                       to=to, bcc=bcc )
        """
        
        
        smtpserver = smtplib.SMTP(MYSY_GV.O365_SMTP_COUNT_smtpsrv, MYSY_GV.O365_SMTP_COUNT_port)
        

        # msg = MIMEMultipart("alternative")
        msg = EmailMessage()

        # JINJA2
        templateLoader = jinja2.FileSystemLoader(searchpath="./")
        templateEnv = jinja2.Environment(loader=templateLoader)
        TEMPLATE_FILE = "Template/MySy_User_account_enabled_tpl.html"
        template = templateEnv.get_template(TEMPLATE_FILE)
        # This data can come from database query
        body = {

            "params":{"user_name": str(account_mail), }
        }

        sourceHtml = template.render(params=body["params"])

        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]: Votre compte est actif '
        msg['To'] = str(account_mail)

        smtpserver.ehlo()
        smtpserver.starttls()
        smtpserver.login(MYSY_GV.O365_SMTP_COUNT_user, MYSY_GV.O365_SMTP_COUNT_password)
        val = smtpserver.send_message(msg)
        smtpserver.close()
        print(" Email envoyé " + str(val))
        return True

    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 d'envoyer l'email de notification "

"""
Mail de reinitialisation de mot de passe
"""
def send_user_init_pwd_mail(token, account_mail, type_account):
    try:
        tomorrow = datetime.date.today() + datetime.timedelta(days=1)
        tomorrow_day = tomorrow.strftime("%A")

        print("debut envoi mail de test ")
        # on rentre les renseignements pris sur le site du fournisseur

        my_url = ""
        if (MYSY_GV.MYSY_ENV == "PROD"):
            my_url = "https://www.mysy-training.com/ResetUserPwd/" + str(token)+"/"+str(type_account)
        elif (MYSY_GV.MYSY_ENV == "DEV"):
            my_url = "http://localhost:3009/ResetUserPwd/" + str(token)+"/"+str(type_account)
        elif (MYSY_GV.MYSY_ENV == "REC"):
            my_url = "https://dev.mysy-training.com/ResetUserPwd/" + str(token) + "/" + str(type_account)

        elif (MYSY_GV.MYSY_ENV == "DEM"):
            my_url = "https://demo.mysy-training.com/ResetUserPwd/" + str(token) + "/" + str(type_account)

        """send_smtp_email = sib_api_v3_sdk.SendSmtpEmail(template_id=19, params={"mysyurl": my_url,
                                                                               "user_name": str(account_mail),
                                                                               }, to=to, bcc=bcc
                                                       )
        """

        smtpserver = smtplib.SMTP(MYSY_GV.O365_SMTP_COUNT_smtpsrv, MYSY_GV.O365_SMTP_COUNT_port)

        # msg = MIMEMultipart("alternative")
        msg = EmailMessage()

        # JINJA2
        templateLoader = jinja2.FileSystemLoader(searchpath="./")
        templateEnv = jinja2.Environment(loader=templateLoader)
        TEMPLATE_FILE = "Template/MySy_User_account_change_pwd_tpl.html"
        template = templateEnv.get_template(TEMPLATE_FILE)
        # This data can come from database query
        body = {
            "params":{"mysyurl": my_url,
                      "user_name": str(account_mail),
                      },

        }

        sourceHtml = template.render(params=body["params"])

        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] : Reinitialisez votre mot de passe'
        msg['To'] = str(account_mail)

        smtpserver.ehlo()
        smtpserver.starttls()
        smtpserver.login(MYSY_GV.O365_SMTP_COUNT_user, MYSY_GV.O365_SMTP_COUNT_password)
        val = smtpserver.send_message(msg)
        smtpserver.close()
        print(" Email envoyé " + str(val))
        return True


    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 d'envoyer l'email de notification "


""" 
Envoi de l'email de la demande d'information
sur une formation 
"""

def EmailDemandeInfoClass( diction):
    try:
        tomorrow = datetime.date.today() + datetime.timedelta(days=1)
        tomorrow_day = tomorrow.strftime("%A")

        print("debut envoi mail de test ")
        # on rentre les renseignements pris sur le site du fournisseur


        smtpserver = smtplib.SMTP(MYSY_GV.O365_SMTP_COUNT_smtpsrv, MYSY_GV.O365_SMTP_COUNT_port)

        # msg = MIMEMultipart("alternative")
        msg = EmailMessage()

        # JINJA2
        templateLoader = jinja2.FileSystemLoader(searchpath="./")
        templateEnv = jinja2.Environment(loader=templateLoader)
        TEMPLATE_FILE = "Template/MySy_Demande_Info_Class_tpl.html"
        template = templateEnv.get_template(TEMPLATE_FILE)
        # This data can come from database query
        body = {
            "params":{"nom": str(diction['nom']),
                      "prenom": str(diction['prenom']),
                      "email": str(diction['email']),
                      "email_partnair": str(diction['email_partnair']),
                      "class_title": str(diction['class_title']),
                      "telephone": str(diction['telephone']),
                      "employeur": str(diction['employeur']),
                      "message": str(diction['message']),
                      "class_internal_url": str(diction['class_internal_url']),
                      },
        }

        sourceHtml = template.render(params=body["params"])

        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] : Demande d'information sur une formation"
        msg['To'] = str(diction['email_partnair'])

        smtpserver.ehlo()
        smtpserver.starttls()
        smtpserver.login(MYSY_GV.O365_SMTP_COUNT_user, MYSY_GV.O365_SMTP_COUNT_password)
        val = smtpserver.send_message(msg)
        smtpserver.close()
        print(" Email envoyé " + str(val))
        return True


    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 d'envoyer l'email de notification "

"""
Cette fonction envoi les factures
"""
def SendInvoiceEmail(account_mail, diction):
    try:
        '''
        Verification des données obligatoires
        '''
        '''
               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 = ['invoice_nom', 'invoice_adr_street', 'invoice_adr_zip', 'invoice_adr_city',
                                  'invoice_adr_country', 'invoice_id', 'invoice_date', 'due_date', 'order_id', 'item_0',
                                  'total_ht', 'total_tva', 'total_ttc', 'client_recid' ]

        for val in field_list_obligatoire:
            if val not in diction:
                mycommon.myprint(str(inspect.stack()[0][3]) + " - La valeur '" + val + "' n'est pas presente dans liste ")
                return False, " Impossible d'envoyer la facture par email"


        order_id = diction['order_id']
        date_order = diction['order_date']
        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'])


        my_end_date = ""
        if ("end_date" in diction.keys()):
            if  diction.keys():
                my_end_date = "*Offre valable jusqu'au "+str(diction['end_date'])

        discount_code = ""
        if ("discount_code" in diction.keys()):
            if diction['discount_code']:
                discount_code = diction['discount_code']

        discount_type = ""
        if ("discount_type" in diction.keys()):
            if diction['discount_type']:
                discount_type = diction['discount_type']

        discount_valeur = ""
        if ("discount_valeur" in diction.keys()):
            if diction['discount_valeur']:
                discount_valeur = diction['discount_valeur']

        discount_montant_remise = ""
        if ("discount_montant_remise" in diction.keys()):
            if diction['discount_montant_remise']:
                discount_montant_remise = diction['discount_montant_remise']


        nb_line = mycommon.tryInt(diction['nb_product'])

        if( nb_line == 0 ):
            mycommon.myprint(str(inspect.stack()[0][3]) + " - nb_line  = '" + nb_line + "' : Aucun produit à facturer")
            return False, " Impossible d'envoyer l'email de confirmation"

        #print("Facture client_name = "+str(client_name))
        #print("Facture client_address = " + str(client_address))
        #print("Facture client_zip_ville = " + str(client_zip_ville))
        #print("Facture client_pays = " + str(client_pays))
        #print("Facture order_id = " + str(order_id))
        #print("Facture date_order = " + str(date_order))
        #print("Facture nb_line = " + str(nb_line))
        #print("Facture End Date = " + str(my_end_date))

        # Recuperation des produits (max 3 produits)
        # produit 1
        if ("item_0" in diction.keys()):
            if( diction["item_0"] ):
                packs =  diction["item_0"]['code']
                qty = diction["item_0"]['qty']
                unit_price =  diction["item_0"]['prix']
                montant = diction["item_0"]['amount']
                detail_packs = diction["item_0"]['pack_products']
                #print("diction['item_0']['pack_products']  = "+str(diction["item_0"]['pack_products']))

        # produit 2
        if ("item_1" in diction.keys()):
            if (diction["item_1"]):
                packs1 = diction["item_1"]['code']
                qty1 = diction["item_0"]['qty']
                unit_price1 = diction["item_1"]['prix']
                montant1 = diction["item_1"]['amount']
                detail_packs1 = diction["item_1"]['pack_products']

        # produit 3
        if ("item_2" in diction.keys()):
            if (diction["item_2"]):
                packs2 = diction["item_2"]['code']
                qty2 = diction["item_0"]['qty']
                unit_price2 = diction["item_2"]['prix']
                montant2 = diction["item_2"]['amount']
                detail_packs2 = diction["item_1"]['pack_products']


        i = 0
        while (i < nb_line):
            row = "item_" + str(i)
            #print(" product = "+ str(diction[str(row)]))
            i = i + 1

        receiver = [str(account_mail)]
        toaddrs = ", ".join(receiver)



        #print("Facture  mail enoye à toaddrs : " + toaddrs)
        #print("Facture debut envoi mail de test ")
        # on rentre les renseignements pris sur le site du fournisseur

        tomorrow = datetime.date.today() + datetime.timedelta(days=1)
        tomorrow_day = tomorrow.strftime("%A")

        print("debut envoi mail de test ")
        # on rentre les renseignements pris sur le site du fournisseur

        smtpserver = smtplib.SMTP(MYSY_GV.O365_SMTP_COUNT_smtpsrv, MYSY_GV.O365_SMTP_COUNT_port)

        # msg = MIMEMultipart("alternative")
        msg = EmailMessage()

        discount_display_text = ""
        if( discount_type == "fix"):
            discount_display_text = " -"+str(discount_valeur)+" €"
        elif( discount_type == "percent"):
            discount_display_text = " -"+str(discount_valeur)+" %"

        # JINJA2
        templateLoader = jinja2.FileSystemLoader(searchpath="./")
        templateEnv = jinja2.Environment(loader=templateLoader)
        TEMPLATE_FILE = "Template/MySy_Invoice_tpl.html"
        print(" ############ TEMPLATE_FILE = "+str(TEMPLATE_FILE))
        template = templateEnv.get_template(TEMPLATE_FILE)
        body = {
            "params": {"order_id": order_id,
                       "date_order": date_order,
                       "total_ht": total_ht,
                       "tva": tva,
                       "total_ttc": total_ttc,
                       "client_name": client_name,
                       "client_address": client_address,
                       "client_zip_ville": client_zip_ville,
                       "client_pays": client_pays,
                       "packs": packs,
                       "detail_packs": detail_packs,
                       "qty": qty,
                       "unit_price": unit_price,
                       "montant": montant,
                       "invoice_id": invoice_id,
                       "invoice_date": invoice_date,
                       "due_date": due_date,
                       "orign_order": orign_order,
                       "discount_montant_remise": discount_montant_remise,
                       "discount_code": discount_code,
                       "discount_type": discount_type,
                       "discount_valeur": discount_valeur,
                       "discount_display_text": discount_display_text,
                       }
        }
        sourceHtml = template.render(params=body["params"])

        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° "+str(invoice_id)
        msg['To'] = str(toaddrs)

        smtpserver.ehlo()
        smtpserver.starttls()
        smtpserver.login(MYSY_GV.O365_SMTP_COUNT_user, MYSY_GV.O365_SMTP_COUNT_password)
        val = smtpserver.send_message(msg)
        smtpserver.close()
        print(" Email envoyé " + str(val))
        return True


    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


"""
Cette fonction envoi une demande de validation de presence
à une formation.
C'est l'emargement electronique 
"""
def SendEmargementMail( diction):
    try:
        field_list_obligatoire = ['token', 'tab_ids']

        for val in field_list_obligatoire:
            if val not in diction:
                mycommon.myprint(
                    str(inspect.stack()[0][3]) + " - La valeur '" + val + "' n'est pas presente dans liste ")
                return False, " Impossible d'envoyer les emails d'emargement"

        my_token = ""
        if ("token" in diction.keys()):
            if diction['token']:
                my_token = diction['token']

        # 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"

        my_emarge_ids = ""
        if ("tab_ids" in diction.keys()):
            if diction['tab_ids']:
                my_emarge_ids = diction['tab_ids']

        partner_recid = mycommon.get_parnter_recid_from_token(my_token)
        if (partner_recid is False):
            mycommon.myprint(str(inspect.stack()[0][3]) + " - partner_recid est KO ")
            return False, "Impossible d'envoyer les emails d'emargement "

        tab_my_emarge_ids = str(my_emarge_ids).split(",")
        for my_emarge_id  in tab_my_emarge_ids :
            # Recuperation des infos de l'emargement
            print("my_emarge_id = " + str(my_emarge_id))

            val_emarge = MYSY_GV.dbname['emargement'].find_one({'_id':ObjectId(my_emarge_id), 'partner_owner_recid':str(partner_recid)})


            # recuperation du titre de la formation
            local_class_title = MYSY_GV.dbname['myclass'].find_one({'internal_url':str(val_emarge['class_internal_url']),
                                                                    'partner_owner_recid':str(partner_recid), 'valide':'1', 'locked':'0'})


            if( local_class_title is None):
                mycommon.myprint(str(inspect.stack()[0][3]) + " - Aucune formation valide ")
                return False, " La formation n'est pas valide"

            # recuperation du titre de la session
            local_session_data = MYSY_GV.dbname['session_formation'].find_one(
                {'_id': ObjectId(str(val_emarge['session_id'])),
                 'partner_owner_recid': str(partner_recid), 'valide': '1',})

            if (local_session_data is None):
                mycommon.myprint(str(inspect.stack()[0][3]) + " - Aucune session valide ")
                return False, " La session de formation n'est pas valide"


            print("debut envoi mail de test ")
            # on rentre les renseignements pris sur le site du fournisseur

            smtpserver = smtplib.SMTP(MYSY_GV.O365_SMTP_COUNT_smtpsrv, MYSY_GV.O365_SMTP_COUNT_port)

            # msg = MIMEMultipart("alternative")
            msg = EmailMessage()

            # JINJA2
            templateLoader = jinja2.FileSystemLoader(searchpath="./")
            templateEnv = jinja2.Environment(loader=templateLoader)
            TEMPLATE_FILE = "Template/MySy_Emargement.html"
            template = templateEnv.get_template(TEMPLATE_FILE)
            # This data can come from database query
            # envoie de l'emargement du matin
            #myurl = "http://127.0.0.1:5001/myclass/api/UserEmargementValidation/"+str(val_emarge['_id'])+"/1"

            if (MYSY_GV.MYSY_ENV == "PROD"):
                myurl = "https://apimysy.mysy-training.com/myclass/api/UserEmargementValidation/" + str(val_emarge['_id']) + "/1"
            elif (MYSY_GV.MYSY_ENV == "DEV"):
                myurl = "http://127.0.0.1:5001/myclass/api/UserEmargementValidation/"+str(val_emarge['_id'])+"/1"
            elif (MYSY_GV.MYSY_ENV == "REC"):
                myurl = "https://devapimysy.mysy-training.com/myclass/api/UserEmargementValidation/" + str(val_emarge['_id']) + "/1"

            elif (MYSY_GV.MYSY_ENV == "DEM"):
                myurl = "https://demoapi.mysy-training.com/myclass/api/UserEmargementValidation/" + str(val_emarge['_id']) + "/1"

            body = {
                "params":{"nom": str(val_emarge['nom']),
                          "prenom": str(val_emarge['prenom']),
                          "email": str(val_emarge['email']),
                          "class_title": str(local_class_title['title']),
                          "date": str(val_emarge['date']),
                          "session": str(val_emarge['sequence_start'])+" - "+str(val_emarge['sequence_end']),
                          "code_session":str(local_session_data['code_session']),
                          "mysyurl": str(myurl),

                          },
            }

            sourceHtml = template.render(params=body["params"])

            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] : Emargement  "+str(val_emarge['sequence_start'])+" - "+str(val_emarge['sequence_end'])
            msg['To'] = str(val_emarge['email'])

            smtpserver.ehlo()
            smtpserver.starttls()
            smtpserver.login(MYSY_GV.O365_SMTP_COUNT_user, MYSY_GV.O365_SMTP_COUNT_password)
            val = smtpserver.send_message(msg)
            #smtpserver.close()
            print(" Email matinée envoyé " + str(my_emarge_id))

            """ 
            # envoie de l'emargement de l'apres midi
            myurl = "http://127.0.0.1:5001/myclass/api/UserEmargementValidation/" + str(val_emarge['_id']) + "/2"

            if (MYSY_GV.MYSY_ENV == "PROD"):
                myurl = "https://apimysy.mysy-training.com/myclass/api/UserEmargementValidation/" + str(
                    val_emarge['_id']) + "/2"
            elif (MYSY_GV.MYSY_ENV == "DEV"):
                myurl = "http://127.0.0.1:5001/myclass/api/UserEmargementValidation/" + str(val_emarge['_id']) + "/2"
            elif (MYSY_GV.MYSY_ENV == "REC"):
                myurl = "https://devapimysy.mysy-training.com/myclass/api/UserEmargementValidation/" + str(
                    val_emarge['_id']) + "/2"


            body = {
                "params": {"nom": str(val_emarge['nom']),
                           "prenom": str(val_emarge['prenom']),
                           "email": str(val_emarge['email']),
                           "class_title": str(local_class_title['title']),
                           "date": str(val_emarge['date']),
                           "session": "Après-midi",
                           "code_session": str(local_session_data['code_session']),
                           "mysyurl": str(myurl),

                           },
            }

            sourceHtml = template.render(params=body["params"])
            msg_2 = EmailMessage()
            msg_2.set_content(sourceHtml, subtype='html')
            msg_2['From'] = MYSY_GV.O365_SMTP_COUNT_From_User
            msg_2['Cc'] = 'contact@mysy-training.com'
            msg_2['Subject'] = "[MySy Training Technology] :  Emargement Après-midi du "+str(val_emarge['date'])
            msg_2['To'] = str(val_emarge['email'])

            #smtpserver.ehlo()
            #smtpserver.starttls()
            #smtpserver.login(MYSY_GV.O365_SMTP_COUNT_user, MYSY_GV.O365_SMTP_COUNT_password)
            val = smtpserver.send_message(msg_2)
            smtpserver.close()

            print(" Email Apres midi envoyé " + str(my_emarge_id))
            """

        return True, "Email envoyé "


    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 d'envoyer l'email de notification "

"""
Creation manuelle d'une facture avec RIB
"""
def ManualSendInvoiceEmailRIB(diction):
    try:
        '''
        Verification des données obligatoires
        '''
        '''
               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 
               '''

        tomorrow = datetime.date.today() + datetime.timedelta(days=1)
        tomorrow_day = tomorrow.strftime("%A")

        print("debut envoi mail de test ")
        # on rentre les renseignements pris sur le site du fournisseur

        smtpserver = smtplib.SMTP(MYSY_GV.O365_SMTP_COUNT_smtpsrv, MYSY_GV.O365_SMTP_COUNT_port)

        # msg = MIMEMultipart("alternative")
        msg = EmailMessage()

        # JINJA2
        templateLoader = jinja2.FileSystemLoader(searchpath="./")
        templateEnv = jinja2.Environment(loader=templateLoader)
        TEMPLATE_FILE = "Template/MySy_Invoice_RIB_tpl.html"
        template = templateEnv.get_template(TEMPLATE_FILE)
        body = {
            "params": {"order_id": "007G",
                       "date_order": ": 03/04/2023",
                       "total_ht": "171",
                       "tva": "34,2",
                       "total_ttc": "205,2",
                       "client_name": "CAP SANTE",
                       "client_address": "4 Allée des Jacquiers",
                       "client_zip_ville": "97427 L'Etang Salé",
                       "client_pays": "France",
                       "packs": "PACK GOLD ",
                       "detail_packs": "-- Support téléphonique -- "
                                       "Reporting basique -- "
                                       "Mots clés par formation -- "
                                       "Customisation de l'affichage d'une formation -- "
                                       "Préférence/ Diffusion géographique -- "
                                       "Publication d'un article -- "
                                       "Envoi de 1000 emails markéting / mois  --"
                                       "Reporting Dynamique et personnalisé",

                       "qty": "2",
                       "unit_price": "85.5",
                       "montant": "171",
                       "invoice_id": "FACT_230400029",
                       "invoice_date": "03/04/2023",
                       "due_date": "03/04/2022",
                       "orign_order": "Contrat 007G",
                       }
        }
        sourceHtml = template.render(params=body["params"])

        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_230200020"
        msg['To'] = 'billardman1@gmail.com'

        smtpserver.ehlo()
        smtpserver.starttls()
        smtpserver.login(MYSY_GV.O365_SMTP_COUNT_user, MYSY_GV.O365_SMTP_COUNT_password)
        val = smtpserver.send_message(msg)
        smtpserver.close()
        print(" Email envoyé " + str(val))

        ### 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_230400029.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"


    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 d'envoyer la facure"


"""
Creation manuelle d'une facture avec RIB pour Port Cities - perso
"""
def ManualSendInvoiceEmailRIB_PortCities(diction):
    try:
        '''
        Verification des données obligatoires
        '''
        '''
               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 
               '''

        tomorrow = datetime.date.today() + datetime.timedelta(days=1)
        tomorrow_day = tomorrow.strftime("%A")

        print("debut envoi mail de test ")
        # on rentre les renseignements pris sur le site du fournisseur

        #smtpserver = smtplib.SMTP(MYSY_GV.O365_SMTP_COUNT_smtpsrv, MYSY_GV.O365_SMTP_COUNT_port)

        # msg = MIMEMultipart("alternative")
        #msg = EmailMessage()

        # JINJA2
        templateLoader = jinja2.FileSystemLoader(searchpath="./")
        templateEnv = jinja2.Environment(loader=templateLoader)
        TEMPLATE_FILE = "Template/MySy_Invoice_RIB_PortCities_Perso_tpl.html"
        template = templateEnv.get_template(TEMPLATE_FILE)
        body = {
            "params": {"order_id": "0010G",
                       "date_order": ": 01/06/2023",
                       "total_ht": "3 200",
                       "tva": "640",
                       "total_ttc": "3 840",
                       "client_name": "Port Cities France SAS",
                       "client_address": "180 Av. du Prado",
                       "client_zip_ville": "13008 Marseille",
                       "client_pays": "France",
                       "packs": "Chef de projet Odoo ",
                       "detail_packs": "Avignon - Siège CAPL ",
                       "qty": "4 jrs",
                       "unit_price": "800 €",
                       "montant": "3 200€",


                       "invoice_id": "FACT_230800038",
                       "invoice_date": "15/08/2023",
                       "due_date": "15/08/2023",
                       "orign_order": "Contrat N°0010G",
                       }
        }

        #print(" ### body 1 = ", body)
        sourceHtml = template.render(params=body["params"])

        """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_230500030"
        msg['To'] = 'billardman1@gmail.com'

        smtpserver.ehlo()
        smtpserver.starttls()
        smtpserver.login(MYSY_GV.O365_SMTP_COUNT_user, MYSY_GV.O365_SMTP_COUNT_password)
        val = smtpserver.send_message(msg)
        smtpserver.close()
        """
        #print(" Email envoyé " + str(val))

        ### CREATION DE LA FACTION PDF
        templateLoader = jinja2.FileSystemLoader(searchpath="./")
        templateEnv = jinja2.Environment(loader=templateLoader)
        #TEMPLATE_FILE = "Template/MySy_Invoice_RIB_tpl.html"
        TEMPLATE_FILE = "Template/invoice_RIB_PortCities_perso_tpl.html"

        template = templateEnv.get_template(TEMPLATE_FILE)
        # This data can come from database query

        #print(" ### body 22 = ", body)

        sourceHtml = template.render(json_data=body["params"])
        orig_file_name = "invoice_FACT_230800038.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"


    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 d'envoyer la facure"



"""
Cette fonction envoie un email pour notifier a un partenaire l'arrete d'un abonnement
"""
def EmailStopAbonnement( partners_email, partners_pack_service, partners_date_arret, partners_nom):
    try:
        tomorrow = datetime.date.today() + datetime.timedelta(days=1)
        tomorrow_day = tomorrow.strftime("%A")



        smtpserver = smtplib.SMTP(MYSY_GV.O365_SMTP_COUNT_smtpsrv, MYSY_GV.O365_SMTP_COUNT_port)

        # msg = MIMEMultipart("alternative")
        msg = EmailMessage()

        # JINJA2
        templateLoader = jinja2.FileSystemLoader(searchpath="./")
        templateEnv = jinja2.Environment(loader=templateLoader)
        TEMPLATE_FILE = "Template/MySy_Stop_Abonnement_tpl.html"
        template = templateEnv.get_template(TEMPLATE_FILE)
        # This data can come from database query
        body = {
            "params":{"user_name": str(partners_nom),
                      "packs": str(partners_pack_service),
                      "end_date_abonnement": str(partners_date_arret),
                      "email": str(partners_email),

                      },
        }

        sourceHtml = template.render(params=body["params"])

        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] : Arret de votre abonnement "+str(partners_pack_service)
        msg['To'] = str(partners_email)

        smtpserver.ehlo()
        smtpserver.starttls()
        smtpserver.login(MYSY_GV.O365_SMTP_COUNT_user, MYSY_GV.O365_SMTP_COUNT_password)
        val = smtpserver.send_message(msg)
        smtpserver.close()
        print(" Email envoyé " + str(val))
        return True


    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 d'envoyer l'email de notification "


"""
Cette fonction notifier à un partenaire la modification de son abonnement avec de nouvelle quantité
"""
def EmailChangeAbonnementQty( partners_email, partners_pack_service, partners_date_arret, partners_nom, old_qty, new_qty ):
    try:
        tomorrow = datetime.date.today() + datetime.timedelta(days=1)
        tomorrow_day = tomorrow.strftime("%A")



        smtpserver = smtplib.SMTP(MYSY_GV.O365_SMTP_COUNT_smtpsrv, MYSY_GV.O365_SMTP_COUNT_port)

        # msg = MIMEMultipart("alternative")
        msg = EmailMessage()

        # JINJA2
        templateLoader = jinja2.FileSystemLoader(searchpath="./")
        templateEnv = jinja2.Environment(loader=templateLoader)
        TEMPLATE_FILE = "Template/MySy_Update_Qty_Abonnement_tpl.html"
        template = templateEnv.get_template(TEMPLATE_FILE)
        # This data can come from database query
        body = {
            "params":{"user_name": str(partners_nom),
                      "packs": str(partners_pack_service),
                      "end_date_abonnement": str(partners_date_arret),
                      "email": str(partners_email),
                      "old_qty": str(old_qty),
                      "new_qty": str(new_qty),

                      },
        }

        sourceHtml = template.render(params=body["params"])

        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] : Modification de votre abonnement "+str(partners_pack_service)
        msg['To'] = str(partners_email)

        smtpserver.ehlo()
        smtpserver.starttls()
        smtpserver.login(MYSY_GV.O365_SMTP_COUNT_user, MYSY_GV.O365_SMTP_COUNT_password)
        val = smtpserver.send_message(msg)
        smtpserver.close()
        print(" Email envoyé " + str(val))
        return True


    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 d'envoyer l'email de notification "



"""
Cette fonction notifier à un partenaire la modification de son abonnement. Cas du changement de plan. 
par exemple : gold vers standard... 
"""
def EmailChangeAbonnementPlan( partners_email, partners_pack_service,  partners_nom, qty ):
    try:
        tomorrow = datetime.date.today() + datetime.timedelta(days=1)
        tomorrow_day = tomorrow.strftime("%A")



        smtpserver = smtplib.SMTP(MYSY_GV.O365_SMTP_COUNT_smtpsrv, MYSY_GV.O365_SMTP_COUNT_port)

        # msg = MIMEMultipart("alternative")
        msg = EmailMessage()

        # JINJA2
        templateLoader = jinja2.FileSystemLoader(searchpath="./")
        templateEnv = jinja2.Environment(loader=templateLoader)
        TEMPLATE_FILE = "Template/MySy_Update_Plan_Abonnement_tpl.html"
        template = templateEnv.get_template(TEMPLATE_FILE)
        # This data can come from database query
        body = {
            "params":{"user_name": str(partners_nom),
                      "packs": str(partners_pack_service),
                      "email": str(partners_email),
                      "qty": str(qty),
                      },
        }

        sourceHtml = template.render(params=body["params"])

        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] : Modification de votre abonnement "+str(partners_pack_service)
        msg['To'] = str(partners_email)

        smtpserver.ehlo()
        smtpserver.starttls()
        smtpserver.login(MYSY_GV.O365_SMTP_COUNT_user, MYSY_GV.O365_SMTP_COUNT_password)
        val = smtpserver.send_message(msg)
        smtpserver.close()
        print(" Email envoyé " + str(val))
        return True


    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 d'envoyer l'email de notification "



"""
Cette fonction envoie la notification d'evaluation à un institut de formation
"""
def EmailNotifEvaluation_Done(diction):
    try:
        tomorrow = datetime.date.today() + datetime.timedelta(days=1)
        tomorrow_day = tomorrow.strftime("%A")

        field_list_obligatoire = ['inscription_id', 'eval_note', 'eval_eval', 'eval_pedagogie', '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, " Les informations fournies sont incorrectes"

        note = str(diction['eval_note']).strip()
        if (mycommon.IsFloat(note) is False):
            mycommon.myprint(
                str(inspect.stack()[0][
                        3]) + "  La note d'evaluation est incorrecte ")
            return False, " La note d'evaluation est incorrecte "

        note_peda = str(diction['eval_pedagogie']).strip()
        if (mycommon.IsFloat(note_peda) is False):
            mycommon.myprint(
                str(inspect.stack()[0][
                        3]) + "  La note pédagogique est incorrecte ")
            return False, " La note d'pédagogique est incorrecte "

        # Recuperation du titre de la formation
        local_class = MYSY_GV.dbname['myclass'].find_one({"internal_url":diction['class_internal_url'], 'valide':'1',
                                                          'locked': '0'})
        if( local_class is None ):
            mycommon.myprint(
                str(inspect.stack()[0][
                        3]) + "  Impossible d'envoyer la notification. La formation est introuvable ")
            return False, " Impossible d'envoyer la notification. La formation est introuvable "


        if ("title" not in local_class.keys()):
            mycommon.myprint(
                str(inspect.stack()[0][
                        3]) + "  Impossible d'envoyer la notification. La formation est introuvable (2) ")
            return False, " Impossible d'envoyer la notification. La formation est introuvable (2) "

        # Recuperation des données du partenaire
        local_partner = MYSY_GV.dbname['partnair_account'].find_one({'recid': str(local_class['partner_owner_recid'])})
        if (local_partner is None):
            mycommon.myprint(
                str(inspect.stack()[0][
                        3]) + "  Impossible d'envoyer la notification. Le compte partenaire est introuvable ")
            return False, " Impossible d'envoyer la notification. Le compte partenaire est introuvable  "

        if ("nom" not in local_partner.keys() or "email" not in local_partner.keys()):
            mycommon.myprint(
                str(inspect.stack()[0][
                        3]) + "  Impossible d'envoyer la notification. Le compte partenaire est introuvable  (2) ")
            return False, " Impossible d'envoyer la notification. Le compte partenaire est introuvable  (2) "


        # Recuperation des donnée d'inscription
        local_inscription = MYSY_GV.dbname['inscription'].find_one({'_id': ObjectId(str(str(diction['inscription_id']).strip())),})
        if (local_inscription is None):
            mycommon.myprint(
                str(inspect.stack()[0][
                        3]) + "  Impossible d'envoyer la notification. L'inscription  est introuvable ")
            return False, " Impossible d'envoyer la notification. L'inscription est introuvable  "

        insc_nom = ""
        if ("nom" in local_inscription.keys()):
            insc_nom = local_inscription['nom']

        insc_prenom = ""
        if ("prenom" in local_inscription.keys()):
            insc_prenom = local_inscription['prenom']

        date_du = ""
        if ("date_du" in local_inscription.keys()):
            date_du = local_inscription['date_du']

        date_au = ""
        if ("date_au" in local_inscription.keys()):
            date_au = local_inscription['nom']

        partenaire_name = ""
        if ("nom" in local_partner.keys()):
            partenaire_name = local_partner['nom']

        partenaire_email = ""
        if ("email" in local_partner.keys()):
            partenaire_email = local_partner['email']

        eval_note = ""
        if ("eval_note" in local_inscription.keys()):
            eval_note = local_inscription['eval_note']

        eval_pedagogie = ""
        if ("eval_pedagogie" in local_inscription.keys()):
            eval_pedagogie = local_inscription['eval_pedagogie']

        eval_date = ""
        if ("eval_date" in local_inscription.keys()):
            eval_date = str(local_inscription['eval_date'])[0:10]

        eval_eval = ""
        if ("eval_eval" in local_inscription.keys()):
            eval_eval = mycommon.cleanhtml(str(local_inscription['eval_eval']))

        title = ""
        if ("title" in local_class.keys()):
            title = mycommon.cleanhtml(str(local_class['title']))


        smtpserver = smtplib.SMTP(MYSY_GV.O365_SMTP_COUNT_smtpsrv, MYSY_GV.O365_SMTP_COUNT_port)

        # msg = MIMEMultipart("alternative")
        msg = EmailMessage()

        # JINJA2
        templateLoader = jinja2.FileSystemLoader(searchpath="./")
        templateEnv = jinja2.Environment(loader=templateLoader)
        TEMPLATE_FILE = "Template/MySy_Evaluation_Class_done_Notif_tpl.html"
        template = templateEnv.get_template(TEMPLATE_FILE)
        # This data can come from database query
        body = {
             "params":{"partenaire_name": partenaire_name,
                      "prenom": insc_prenom,
                      "nom": insc_nom,
                      "date_du": date_du,
                      "date_fin": date_au,
                      "eval_note":eval_note,
                      "eval_pedagogie": eval_pedagogie,
                      "eval_eval": eval_eval,
                      "eval_date": eval_date,
                      "title":title
                      },

        }

        #print(" ### body = ", body)
        sourceHtml = template.render(params=body["params"])

        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 formation a été évaluée "
        msg['To'] = partenaire_email

        smtpserver.ehlo()
        smtpserver.starttls()
        smtpserver.login(MYSY_GV.O365_SMTP_COUNT_user, MYSY_GV.O365_SMTP_COUNT_password)
        val = smtpserver.send_message(msg)
        smtpserver.close()
        print(" Email envoyé " + str(val))
        return True, "ok"


    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 d'envoyer l'email de notification "


"""
Cette fonction envoie un email à partenaire avec ses identfiants
de connexion à son espace hebergement de formation
"""
def Email_Part_Espace_Hosting( diction):
    try:
        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, " Impossible d'envoyer les emails avec les information d'hébergement"

        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 est KO ")
            return False, "Impossible d'envoyer les emails avec les information d'hébergement "

        # Recuperation des données du partenaire
        local_status, my_partner = mycommon.get_partner_data_from_recid(partner_recid)
        if (local_status is False):
            mycommon.myprint(str(inspect.stack()[0][3]) + " - impossible de récupérer les données du partenaire")
            return False, str(inspect.stack()[0][3]) + "  - impossible de récupérer les données du partenaire"

        print(" ### in Email_Part_Espace_Hosting my_partner data = ", my_partner)
        nom = ""
        if ("nom" in my_partner.keys()):
            nom = my_partner['nom']

        mysy_pack = ""
        if ("pack_service" in my_partner.keys()):
            mysy_pack = my_partner['pack_service']

        nb_formation = ""
        if ("nb_formation" in my_partner.keys()):
            nb_formation = my_partner['nb_formation']

        mysy_url = MYSY_GV.CLIENT_URL_BASE

        lms_url = ""
        if ("lms_virtualhost_url" in my_partner.keys()):
            lms_url = my_partner['lms_virtualhost_url']

        login = ""
        if ("lms_username" in my_partner.keys()):
            login = my_partner['lms_username']


        print(" ### in Email_Part_Espace_Hosting login = ", login)

        if( login == ""):
            mycommon.myprint(str(inspect.stack()[0][3]) + " - Le login du partenaire est incorrecte")
            return False, str(inspect.stack()[0][3]) + "  - Le login du partenaire est incorrecte"

        tomorrow = datetime.date.today() + datetime.timedelta(days=1)
        tomorrow_day = tomorrow.strftime("%A")

        smtpserver = smtplib.SMTP(MYSY_GV.O365_SMTP_COUNT_smtpsrv, MYSY_GV.O365_SMTP_COUNT_port)

        # msg = MIMEMultipart("alternative")
        msg = EmailMessage()

        # JINJA2
        templateLoader = jinja2.FileSystemLoader(searchpath="./")
        templateEnv = jinja2.Environment(loader=templateLoader)
        TEMPLATE_FILE = "Template/MySy_Acces_Espace_Hebergement_Partner_tpl.html"
        template = templateEnv.get_template(TEMPLATE_FILE)
        # This data can come from database query
        body = {
            "params":{"nom": str(nom),
                      "mysy_pack": str(mysy_pack),
                      "nb_formation": str(nb_formation),
                      "lms_url": str(lms_url),
                      "mysy_url": str(mysy_url),
                      "login": str(login),
                      },
        }

        sourceHtml = template.render(params=body["params"])

        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] : Vos identifiants de connexion à la plateforme d'hébergement. "
        msg['To'] = str(my_partner['email'])

        smtpserver.ehlo()
        smtpserver.starttls()
        smtpserver.login(MYSY_GV.O365_SMTP_COUNT_user, MYSY_GV.O365_SMTP_COUNT_password)
        val = smtpserver.send_message(msg)
        smtpserver.close()
        print(" Email envoyé " + str(val))
        return True, " Les identifiants de connexion à la plateforme d'hébergement a été correctement envoyé "


    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 d'envoyer les identifiants de connexion à la plateforme d'hébergement par email "


"""
Cette fonction envoie un email avec les informations
sur la prochaine facturation du client.
Cette fonction est utilisée : 
1 - En cas de changement d'abonnement
2 - eventuellement connaitre le montant de la prochaine facture du client
"""
import json
def Strip_Get_Customer_Upcoming_Invoice(diction):
    try:
        diction = mycommon.strip_dictionary(diction)

        """
        Verification des input acceptés
        """
        field_list = ['recid', ]
        incom_keys = diction.keys()
        for val in incom_keys:
            if val not in field_list  and val.startswith('my_') is False:
                mycommon.myprint(str(
                    inspect.stack()[0][3]) + "  Le champ  '" + val + "' n'existe pas")
                return False, " Les informations fournies sont incorrectes",

        """
        Verification des champs obligatoires
        """
        field_list_obligatoire = ['recid',]
        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
        """
        recid = ""
        if ("recid" in diction.keys()):
            if diction['recid']:
                recid = diction['recid']


        # Recuperation des données du partenaire
        local_status, my_partner = mycommon.get_partner_data_from_recid(recid)
        if (local_status is False):
            mycommon.myprint(
                str(inspect.stack()[0][3]) + " - impossible de récupérer les données de l'utilisateur ")
            return False, str(inspect.stack()[0][3]) + "  - impossible de récupérer les données de l'utilisateur. "

        data = {}
        data['recid'] = my_partner['recid']
        local_status, local_retval = strype_payement.Strip_Get_Customer_Abonnement_Data(data)

        if (local_status is False):
            mycommon.myprint(
                str(inspect.stack()[0][3]) + " - impossible de récupérer les données de facturation ")
            return False, str(inspect.stack()[0][3]) + "  - impossible de récupérer les données de facturation. "

        print(" ### local_retval[0] = ", local_retval[0])

        local_retval_JSON = json.loads(str(local_retval[0]))
        local_retval_JSON['user_name'] = my_partner['nom']



        # On verifie que les informations retournées contiennent tous les champs
        local_champs_obligatoire = ['recid', 'period_start', 'period_end', 'total', 'main_description', 'lines', 'user_name']
        for val in local_champs_obligatoire:
            if val not in local_retval_JSON.keys():
                mycommon.myprint(
                    str(inspect.stack()[0][3]) + " - La valeur '" + val + "' n'est pas presente dans liste (2)")
                return False, " Les informations fournies sont incorrectes (2)",

        local_retval_JSON['tva'] = round(mycommon.tryFloat(str(local_retval_JSON["total"])) * 0.2, 2)

        local_retval_JSON['total_ttc'] = round(mycommon.tryFloat(str(local_retval_JSON["total"])) * 1.2, 2)

        smtpserver = smtplib.SMTP(MYSY_GV.O365_SMTP_COUNT_smtpsrv, MYSY_GV.O365_SMTP_COUNT_port)

        # msg = MIMEMultipart("alternative")
        msg = EmailMessage()

        # JINJA2
        templateLoader = jinja2.FileSystemLoader(searchpath="./")
        templateEnv = jinja2.Environment(loader=templateLoader)
        TEMPLATE_FILE = "Template/MySy_Next_Invoice_Info_tpl.html"
        template = templateEnv.get_template(TEMPLATE_FILE)
        # This data can come from database query
        body = {
            "params": local_retval_JSON,
        }

        sourceHtml = template.render(params=body["params"])

        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] : Information Facture à venir. "
        msg['To'] = str(my_partner['email'])

        smtpserver.ehlo()
        smtpserver.starttls()
        smtpserver.login(MYSY_GV.O365_SMTP_COUNT_user, MYSY_GV.O365_SMTP_COUNT_password)
        val = smtpserver.send_message(msg)
        smtpserver.close()
        print(" Email envoyé " + str(val))



        return True, " email envoyé ok"

    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 d'envoyer les informations de la prochaines factures "
