diff --git a/config/instance-example.js b/config/instance-example.js index d44233a..a8bad82 100644 --- a/config/instance-example.js +++ b/config/instance-example.js @@ -26,7 +26,7 @@ module.exports = tokenLoginChangingTimeInHours: "1h",// for email & password changing tokenDeleteUserTimeInHours: "1h", tokenUnsubscribeLinkTimeInDays: "7 days", // token send with subscription's emails - freeAccountTimingInDays: 15, + freeAccountTimingInDays: 15,// if 0 = unlimited freeAccountExpirationNotificationInDays: 3, accountExpirationFirstNotificationInDays: 10, accountExpirationSecondNotificationInDays: 3, diff --git a/controllers/subscription.js b/controllers/subscription.js index fc2c129..f4cea0d 100644 --- a/controllers/subscription.js +++ b/controllers/subscription.js @@ -95,6 +95,7 @@ exports.getQuestionnairesForUser = async(req, res, next) => // CRONS // 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) => { 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. +// À ne pas appeler si abonnement non limité dans le temps exports.notifyExpirationAccount= async(req, res, next) => { try @@ -238,17 +240,17 @@ exports.addNewQuestionnaireUsers = async(req, res, next) => { 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"); // 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. - 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) res.status(200).json({ message: txt.allSubscriptionProcessed }); else { 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) { // 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 : const token=jwt.sign({ userId: subscriptionsOk[i].UserId }, config.tokenPrivateKey, { expiresIn: config.tokenUnsubscribeLinkTimeInDays }); - - elementToSend=""; if(!tool.isEmpty(elementToSend)) { 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); } } - 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 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); } - // 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 }); } res.status(200).json(subscriptionsOk);