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