Services_SMSService.js

const path = require("path");
const config = require("../config");
const JsonResponse = require("../Controllers/JsonResponse");

const conf = require("../config");
const {Vonage} = require('@vonage/server-sdk')

/**
 * @memberof Myintranet.Services
 * @inheritDoc
 */
class SMSService {


    constructor(db) {
        this.db = db;
        this.vonage = new Vonage(conf.sms)
    }


    async saisiePrevFromLink(request) {
        let {id} = request.body;
        let {db} = this;
        let {linkId, nbJours} = request.body;
        const t = await db.sequelize.transaction();
        try {
            let link = await db.SecuredLink.findOne({where: {id: linkId}});
            if (!link) {
                throw new Error("Link non trouvee " + linkId)
            }
            let activite = await db.PrevHistory.findOne({where: {id: link.activiteId}});
            if (!activite) {
                throw new Error("Activite non trouvee " + link.activiteId)
            }
            let mission = await db.Mission.findOne({
                where: {id: activite.MissionId},
                include: [{model: db.Consultant, include: db.User}, {model: db.Client}]
            })
            if (!mission) {
                throw new Error("mission non trouvee " + activite.MissionId)
            }
            activite.nbJours = nbJours;
            let connected = mission.Consultant.Utilisateur;
            activite.updatedBy = connected.id;
            await db.Action.create({
                UtilisateurId: connected.id,
                MissionId: mission.id,
                PrevId: activite.id,
                meta: JSON.stringify(activite),
                type: "mise a jour",
                text: `<b>${connected.firstname} ${connected.lastname}</b> a saisie son Prev : <b>${activite.nbJours}</b> le : ${(new Date(Date.now())).toLocaleString("fr-FR")}`
            }, {transaction: t});
            await activite.save({transaction: t})
            await link.destroy({force: true, transaction: t});
            await t.commit();
            return activite;
        } catch (e) {
            await t.rollback();
            throw e;
        }

    }

    async saisiePrevFromWebsite(request) {
        let {db} = this;
        let {id, nbJours} = request.body;
        let connected = request.user;
        const t = await db.sequelize.transaction();
        try {
            let activite = await db.PrevHistory.findOne({where: {id}});
            activite.nbJours = nbJours;
            let mission = await db.Mission.findOne({
                where: {id: activite.MissionId},
                include: [{model: db.Consultant, include: db.User}, {model: db.Client}]
            })
            if (!mission) {
                throw new Error("mission non trouvee " + activite.MissionId)
            }
            await db.Action.create({
                UtilisateurId: connected.id,
                MissionId: mission.id,
                PrevId: activite.id,
                meta: JSON.stringify(activite),
                type: "mise a jour",
                text: `<b>${connected.firstname} ${connected.lastname}</b> a saisie Le Prev : <b>${activite.nbJours}</b> le : ${(new Date(Date.now())).toLocaleString("fr-FR")}`
            }, {transaction: t});
            await activite.save({transaction: t})
            await t.commit();
            return activite;
        } catch (e) {
            await t.rollback();
            throw e;
        }
    }

    async getSmsForConsultants(request) {
        let {db} = this;
        let {id} = request.params;
        let consultant = await db.Consultant.findOne({where: {id}, include: [db.User]})
        return  await db.SMSHisto.findAll({
            where: {
                [db.Sequelize.Op.or]: {
                    msisdn: consultant.Utilisateur.phone?.replace(/^\+/, "").replace(/^0/, "33"),
                    to: consultant.Utilisateur.phone?.replace(/^\+/, "").replace(/^0/, "33")
                }
            },
            order: [
                ["createdAt", "ASC"],
            ]
        })

    }

    async sendSms(request) {
        let {db} = this;
        let     getNormalizedPhoneNumber = (phone) =>{
            if(phone.indexOf("00")===0){
                return phone.replace(/^00/, "");
            }else if(phone.indexOf("+")===0){
                return phone.substring(1);
            }else if(phone.indexOf("0")===0){
                return phone.replace(/^0/, '33');
            }else{
                return phone;
            }
        }

        let {id} = request.params;
        let connected = request.user;
        const t = await db.sequelize.transaction();
        try {
            let consultant = await db.Consultant.findOne({where: {id}, include: [db.User]})
            // let comsultant = request.body;
            // console.log(consultant)
            // consultant.Utilisateur.phone
            // const from = "MY-INTRANET"
            const to = getNormalizedPhoneNumber(consultant.Utilisateur.phone);
            const text = request.body.text;
            await this.PromiseTosendSms(config.phoneNumber, to, text);
            // return this.vonage.message.sendSms("33644637511", to, text, async (err, responseData) => {
            //     if (err) {
            //         throw err;
            //     } else {
            //         if (responseData.messages[0]['status'] === "0") {
            //Ajouter dans la table smshitory
            await db.Action.create({
                UtilisateurId: connected.id,
                meta: JSON.stringify(request.body),
                type: "mise a jour",
                text: `<b>${connected.firstname} ${connected.lastname}</b> a envoyer un sms a : <b>${to}</b> le : ${(new Date(Date.now())).toLocaleString("fr-FR")}`
            }, {transaction: t});

            let sms = await db.SMSHisto.create({
                msisdn: config.phoneNumber,
                text,
                to,
                type: "from My intranet",
                UtilisateurId: consultant.Utilisateur.id,
                orphan: false
            }, {transaction: t})

            console.log("SMS SEND TO : " + to);
            //console.log(sms)
            await t.commit();
            return sms;
            //     } else {
            //         console.log(responseData.messages[0])
            //         console.log(`Message failed with error: ${responseData.messages[0]['error-text']}`);
            //         throw new Error(`Message failed with error: ${responseData.messages[0]['error-text']}`);
            //         await t.rollback();
            //     }
            // }
            // })
        } catch (e) {
            await t.rollback();
            throw e;
        }


    }

    PromiseTosendSms(from, to, text) {
        return new Promise((resolve, reject) => {
console.log(from, to, text)
            this.vonage.sms.send({from, to, text}).then(resp => {
                if (resp.messages[0]['status'] === "0") {
                    resolve(resp.messages[0])
                } else {
                    reject(new Error(`Message failed with error: ${resp.messages[0]['error-text']}`));
                }
            }).catch(err => {
                console.log(err)
                reject(err);
            });
        })
    }

    async saisieCraFromWebSite(request) {
        let {db} = this;
        let {id} = request.body;
        let connected = request.user;
        const t = await db.sequelize.transaction();
        try {
            let activite = await db.CraHistory.findOne({where: {id}});
            if (!activite) {
                throw new Error("Activite non trouvee " + id)
            }
            let mission = await db.Mission.findOne({
                where: {id: activite.MissionId},
                include: [{model: db.Consultant, include: db.User}, {model: db.Client}]
            })
            if (!mission) {
                throw new Error("mission non trouvee " + activite.MissionId)
            }
            activite.updatedBy = request.user.id;
            activite.craFilename = "CRA_" + activite.mounth + activite.year + "_" + mission.Consultant.Utilisateur.firstname + "_" + mission.Consultant.Utilisateur.lastname + "." + request.files.cra.name.split('.').pop();
            await db.Action.create({
                UtilisateurId: connected.id,
                MissionId: mission.id,
                CraId: activite.id,
                meta: JSON.stringify(activite),
                type: "mise a jour",
                text: `<b>${connected.firstname} ${connected.lastname}</b> a uploader son CRA : <b>${activite.craFilename}</b> le : ${(new Date(Date.now())).toLocaleString("fr-FR")}`
            }, {transaction: t});
            let slug = mission.Consultant.id + "-" + mission.Consultant.Utilisateur.firstname + "-" + mission.Consultant.Utilisateur.lastname
            let slugMiision = mission.id + "-" + mission.title
            await activite.save({transaction: t});
            let activityDir = path.join(config.storageLocation, slug, slugMiision, "CRA", activite.mounth + "-" + activite.year)
            //console.log(activityDir);
            await request.files.cra.mv(path.join(activityDir, activite.craFilename));
            await t.commit();
            return activite;
        } catch (e) {
            await t.rollback();
            throw e;
        }

        //
        // let activite = await db.CraHistory.findOne({where: {id}});
        // let mission = await db.Consultant2Client.findOne({
        //     where: {id: activite.MissionId},
        //     include: [{model: db.Consultant, include: db.User}, {model: db.Client}]
        // })
        // let slug = Mission.Consultant.id + "-" + Mission.Consultant.Utilisateur.firstname + "-" + Mission.Consultant.Utilisateur.lastname
        // let slugMiision = Mission.id + "-" + Mission.title
        // activite.updatedBy = request.user.id;
        // activite.craFilename = "CRA_" + activite.mounth + activite.year + "_" + Mission.Consultant.Utilisateur.firstname + "_" + Mission.Consultant.Utilisateur.lastname + "." + request.files.cra.name.split('.').filter(Boolean).slice(1)[0];
        // await db.Action.create({
        //     UtilisateurId: connected.id,
        //     MissionId: mission.id,
        //     meta: JSON.stringify(activite),
        //     type: "mise a jour",
        //     text: `<b>${connected.firstname} ${connected.lastname}</b> a uploader son CRA : <b>${activite.craFilename}</b> le : ${(new Date(Date.now())).toLocaleString("fr-FR")}`
        // });
        // await activite.save();
        // let activityDir = path.join(config.storageLocation, slug, slugMiision, "CRA", activite.mounth + "-" + activite.year)
        // console.log(activityDir);
        // await request.files.cra.mv(path.join(activityDir, activite.craFilename))
        // return activite;
    }


}

module.exports = SMSService