Ajout possibilité abonnements non limités dans le tempst

This commit is contained in:
Fabrice PENHOËT 2020-12-07 12:52:56 +01:00
parent a078795178
commit c63e3b2702
2 changed files with 9 additions and 9 deletions

View File

@ -26,7 +26,7 @@ module.exports =
tokenLoginChangingTimeInHours: "1h",// for email & password changing tokenLoginChangingTimeInHours: "1h",// for email & password changing
tokenDeleteUserTimeInHours: "1h", tokenDeleteUserTimeInHours: "1h",
tokenUnsubscribeLinkTimeInDays: "7 days", // token send with subscription's emails tokenUnsubscribeLinkTimeInDays: "7 days", // token send with subscription's emails
freeAccountTimingInDays: 15, freeAccountTimingInDays: 15,// if 0 = unlimited
freeAccountExpirationNotificationInDays: 3, freeAccountExpirationNotificationInDays: 3,
accountExpirationFirstNotificationInDays: 10, accountExpirationFirstNotificationInDays: 10,
accountExpirationSecondNotificationInDays: 3, accountExpirationSecondNotificationInDays: 3,

View File

@ -95,6 +95,7 @@ exports.getQuestionnairesForUser = async(req, res, next) =>
// CRONS // CRONS
// Envoi des notifications aux abonnés arrivés à quelques jours de la fin de leur période d'abonnement gratuit. // Envoi des notifications aux abonnés arrivés à quelques jours de la fin de leur période d'abonnement gratuit.
// À ne pas appeler si abonnement non limité dans le temps
exports.notifyExpirationFreeAccount= async(req, res, next) => exports.notifyExpirationFreeAccount= async(req, res, next) =>
{ {
try try
@ -156,6 +157,7 @@ exports.notifyExpirationFreeAccount= async(req, res, next) =>
} }
// Envoi des notifications aux abonnés arrivés à quelques jours de la fin de leur période d'abonnement prémium. // Envoi des notifications aux abonnés arrivés à quelques jours de la fin de leur période d'abonnement prémium.
// À ne pas appeler si abonnement non limité dans le temps
exports.notifyExpirationAccount= async(req, res, next) => exports.notifyExpirationAccount= async(req, res, next) =>
{ {
try try
@ -238,17 +240,17 @@ exports.addNewQuestionnaireUsers = async(req, res, next) =>
{ {
try try
{ {
console.log("Je cherche les abonnements à traiter"); console.log("Je cherche les abonnements à traiter");// pour vérifier si cronjob ok
const db = require("../models/index"); const db = require("../models/index");
// Utilisateurs dont l'abonnement est toujours actif et souhaitant recevoir des quizs le jour de la semaine en cours. // Utilisateurs dont l'abonnement est toujours actif et souhaitant recevoir des quizs le jour de la semaine en cours.
// Le tout en heure locale et en ignorant ceux qui ont déjà été traités durant les dernières 24H. // Le tout en heure locale et en ignorant ceux qui ont déjà été traités durant les dernières 24H.
const subscriptionsOk = await db.sequelize.query("SELECT `Subscriptions`.`id` as SubscriptionId, `Subscriptions`.`lastProcessingAt`, `UserId`, `name`, `email`, `smtp`, `language`, `receiptDays`, ADDDATE(UTC_TIMESTAMP, INTERVAL `timeDifference` MINUTE) AS localDate FROM `Subscriptions` INNER JOIN `Users` ON `Subscriptions`.`UserId`=`Users`.`id` WHERE `status`='user' AND ADDDATE(`Subscriptions`.`createdAt`, `numberOfDays`) > UTC_TIMESTAMP HAVING HOUR(localDate) > "+config.hourGiveNewQuestionnaireBegin+" AND HOUR(localDate) < "+config.hourGiveNewQuestionnaireEnd+" AND LOCATE(DAYOFWEEK(localDate),receiptDays)!=0 AND SubscriptionId NOT IN (SELECT DISTINCT `SubscriptionId` FROM `Pauses` WHERE ADDDATE(`startingAt`, INTERVAL `timeDifference` MINUTE) <= localDate AND ADDDATE(`endingAT`, INTERVAL `timeDifference` MINUTE) > localDate) AND DATEDIFF(NOW(),`Subscriptions`.`lastProcessingAt`) >= 1 LIMIT "+config.maxQuestionnaireSendedAtSameTime, { type: QueryTypes.SELECT }); const subscriptionsOk = await db.sequelize.query("SELECT `Subscriptions`.`id` as SubscriptionId, `Subscriptions`.`lastProcessingAt`, `UserId`, `name`, `email`, `smtp`, `language`, `receiptDays`, ADDDATE(UTC_TIMESTAMP, INTERVAL `timeDifference` MINUTE) AS localDate FROM `Subscriptions` INNER JOIN `Users` ON `Subscriptions`.`UserId`=`Users`.`id` WHERE `status`='user' AND ((ADDDATE(`Subscriptions`.`createdAt`, `numberOfDays`) > UTC_TIMESTAMP) OR `numberOfDays`=0) HAVING HOUR(localDate) > "+config.hourGiveNewQuestionnaireBegin+" AND HOUR(localDate) < "+config.hourGiveNewQuestionnaireEnd+" AND LOCATE(DAYOFWEEK(localDate),receiptDays)!=0 AND SubscriptionId NOT IN (SELECT DISTINCT `SubscriptionId` FROM `Pauses` WHERE ADDDATE(`startingAt`, INTERVAL `timeDifference` MINUTE) <= localDate AND ADDDATE(`endingAT`, INTERVAL `timeDifference` MINUTE) > localDate) AND DATEDIFF(NOW(),`Subscriptions`.`lastProcessingAt`) >= 1 LIMIT "+config.maxQuestionnaireSendedAtSameTime, { type: QueryTypes.SELECT });
if(subscriptionsOk.length === 0) if(subscriptionsOk.length === 0)
res.status(200).json({ message: txt.allSubscriptionProcessed }); res.status(200).json({ message: txt.allSubscriptionProcessed });
else else
{ {
const now=new Date(); const now=new Date();
console.log("Je vais traiter "+subscriptionsOk.length+" abonnements - "+now); console.log("Je m'en vais traiter "+subscriptionsOk.length+" abonnements - "+now);
for (let i in subscriptionsOk) for (let i in subscriptionsOk)
{ {
// On commence à chercher le dernier élément envoyé à l'utilisateur pour comparer sa date d'enregistrement à celle du dernier envoi // On commence à chercher le dernier élément envoyé à l'utilisateur pour comparer sa date d'enregistrement à celle du dernier envoi
@ -287,8 +289,6 @@ exports.addNewQuestionnaireUsers = async(req, res, next) =>
} }
// Token du lien de désinscription aux envois : // Token du lien de désinscription aux envois :
const token=jwt.sign({ userId: subscriptionsOk[i].UserId }, config.tokenPrivateKey, { expiresIn: config.tokenUnsubscribeLinkTimeInDays }); const token=jwt.sign({ userId: subscriptionsOk[i].UserId }, config.tokenPrivateKey, { expiresIn: config.tokenUnsubscribeLinkTimeInDays });
elementToSend="";
if(!tool.isEmpty(elementToSend)) if(!tool.isEmpty(elementToSend))
{ {
if(elementToSend.Questionnaire !== undefined)// = Il s'agit de l'élément d'un group if(elementToSend.Questionnaire !== undefined)// = Il s'agit de l'élément d'un group
@ -336,9 +336,9 @@ exports.addNewQuestionnaireUsers = async(req, res, next) =>
toolMail.sendMail(subscriptionsOk[i].smtp, subscriptionsOk[i].email, mailDatas.mailSubject, tool.replaceAll(txt.mailNewQuestionnaireBodyTxt, mapMail), "", mailDatas); toolMail.sendMail(subscriptionsOk[i].smtp, subscriptionsOk[i].email, mailDatas.mailSubject, tool.replaceAll(txt.mailNewQuestionnaireBodyTxt, mapMail), "", mailDatas);
} }
} }
else else if(config.freeAccountTimingInDays !== 0)
{ {
// L'utilisateur a déjà reçu tous les élements publiés. Dans ce cas, on tire au hasard un quiz groupé pour le lui envoyer une nouvelle fois. // Il s'agit d'un abonnement payant et l'utilisateur a déjà reçu tous les élements publiés. Dans ce cas, on tire au hasard un quiz groupé pour le lui envoyer une nouvelle fois.
const getElementToSend = await db.sequelize.query("SELECT `id`, `title`, `slug` FROM `Groups` WHERE `publishingAt` < NOW() AND `language`='"+subscriptionsOk[i].language+"' ORDER BY RAND() LIMIT 1", { type: QueryTypes.SELECT }); const getElementToSend = await db.sequelize.query("SELECT `id`, `title`, `slug` FROM `Groups` WHERE `publishingAt` < NOW() AND `language`='"+subscriptionsOk[i].language+"' ORDER BY RAND() LIMIT 1", { type: QueryTypes.SELECT });
const mapMail = const mapMail =
{ {
@ -359,7 +359,7 @@ exports.addNewQuestionnaireUsers = async(req, res, next) =>
} }
toolMail.sendMail(subscriptionsOk[i].smtp, subscriptionsOk[i].email, mailDatas.mailSubject, tool.replaceAll(txtQuestionnaireAccess.questionnaireRetryInfoTxt, mapMail), "", mailDatas); toolMail.sendMail(subscriptionsOk[i].smtp, subscriptionsOk[i].email, mailDatas.mailSubject, tool.replaceAll(txtQuestionnaireAccess.questionnaireRetryInfoTxt, mapMail), "", mailDatas);
} }
// Dans tout les cas, on enregistre le fait que l'abonnement a été traité : // Dans tous les cas, on enregistre le fait que l'abonnement a été traité :
db["Subscription"].update({ lastProcessingAt: now }, { where: { id : subscriptionsOk[i].SubscriptionId }, limit:1 }); db["Subscription"].update({ lastProcessingAt: now }, { where: { id : subscriptionsOk[i].SubscriptionId }, limit:1 });
} }
res.status(200).json(subscriptionsOk); res.status(200).json(subscriptionsOk);