Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Added more reminders, fixed bug, still TODOs in the code #1

Open
wants to merge 1 commit into
base: develop
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
136 changes: 77 additions & 59 deletions Code.gs
Original file line number Diff line number Diff line change
@@ -1,43 +1,45 @@
/**
* This function retrieves all payments from the payment spreadsheet and returns them as an array of the rows.
* Gets payment information from the MemberList spreadsheet, returns an array of all the rows.
* @returns: payment data from the payments spreadsheet as a list of rows
* Source: https://developers.google.com/sheets/api/quickstart/apps-script
*/
function getPaymentData() {

var LOGGING_PREFIX = '[getPaymentData] ';
var LOGGING_PREFIX = '[getPaymentData] \t';

Logger.log(LOGGING_PREFIX + 'started');

/*
get all payments from the spreadsheet app
Source: https://developers.google.com/sheets/api/quickstart/apps-script
*/
// var paymentSpreadSheetId = '1ZwZXK1KcAVIeOh-FgFZKPEOEFwUTaJzDExaWD1ZIQmc'; // new spreadsheet with payments
var paymentSpreadSheetId = '13YSSxKWzS8khlm_oMfDNcDCsW6SgVtjNJlA1q8zpoTI'; // original membership spreadsheet
var dataRange = 'List of members!A2:W'; // <SHEET_NAME>!<RANGE_START>:<RANGE_END>
//Url of the Membership spreadsheet (in future if spreedsheep changes, update only the url)
let url = "https://docs.google.com/spreadsheets/d/13YSSxKWzS8khlm_oMfDNcDCsW6SgVtjNJlA1q8zpoTI/edit#gid=0";
//retrieve the id of the spreadsheet from the url
const paymentSpreadSheetId = url.match("/spreadsheets/d/([a-zA-Z0-9-_]+)")[1];
var dataRange = "'List of members'!A2:Y";; // <SHEET_NAME>!<RANGE_START>:<RANGE_END>
var payments = Sheets.Spreadsheets.Values.get(paymentSpreadSheetId, dataRange).values;

if (!payments) {
Logger.log(LOGGING_PREFIX + 'no payment data found in spreadsheet.') // TODO: error
Logger.log(LOGGING_PREFIX + 'no payment data found in spreadsheet.')
}

Logger.log(LOGGING_PREFIX + 'payment data retrieved from spreadsheet.');

return payments;
}

/**
* This method returns the last validity date (column N) from the payments spreadsheet for a given user.
* This method selects the Membership end date (column N or O for stripe) from the payments spreadsheet for a given user.
* @param user: user object from the google admin directory
* @param payments: payment data from the payments spreadsheet as a list of rows
* @returns: date up to which the account is valid
*/
function getAccountValidityEndDate(user, payments) {

var LOGGING_PREFIX = '[getAccountValidityEndDate] ';

// Logger.log(LOGGING_PREFIX + 'started');

if (!payments) {
Logger.log(LOGGING_PREFIX + 'No payment data given!');
return
}

var validityEndDate = null;

try {
Expand All @@ -46,30 +48,24 @@ function getAccountValidityEndDate(user, payments) {
Logger.log(LOGGING_PREFIX + 'Cannot get ID from user: ' + JSON.stringify(user));
return;
}

if (!payments) {
Logger.log(LOGGING_PREFIX + 'No payment data given!');
} else {

for (var row = 0; row < payments.length; row++) {
if (payments[row][0] == userId) {
if (validityEndDate === null || validityEndDate < payments[row][13]) { // 'N' i.e. 'End of Membership' is column 13
validityEndDate = payments[row][13];
// Logger.log(LOGGING_PREFIX + 'Updated validity end date for user ' + user.name.fullName + ' [' + userId + '] to ' + payments[row][12]); // todo: remove after tesing
}
}
}
}

if (validityEndDate === null) {
var stripe = false;
let row = payments.find((row) => row[0] == userId); //Match user with payment info

if(row) validityEndDate = row[13]; //get membership end date

if (validityEndDate === 'Stripe') {
validityEndDate = row[14];
stripe = true;
}
if (!validityEndDate) {
Logger.log(LOGGING_PREFIX + 'No validity end date found for user ' + user.name.fullName + ' [' + userId + '].');
}

return validityEndDate;
}


return{validityEndDate, stripe};
}

/**
/*
* This functions changes the format of a date string from 18.09.2013 to 2013-09-18
*/
function reformatDateString(dateStr) {
Expand All @@ -88,7 +84,7 @@ function reformatDateString(dateStr) {
}

/**
* If the number of e-mails that can be send by the script drops below 20 (there is a maximum email quota set by google script), the admins will be informed.
* If the number of e-mails that can be send by the script drops below 20, the admins will be informed.
*/
function checkDailyEMailQuota() {

Expand All @@ -105,11 +101,11 @@ function checkDailyEMailQuota() {
}

/**
* This function sends out an e-mail if a users account is about to expire.
* This function sends ount an e-mail if a users account is about to expire.
* @param user: user object from the google admin directory
* @param validityEndDate: Date Object
*/
function sendMembershipRenewalEMail(user, validityEndDate) {
function sendMembershipRenewalEMail(user, validityEndDate, stripe=false) {

var LOGGING_PREFIX = 'sendMembershipRenewalEMail';

Expand All @@ -119,17 +115,18 @@ function sendMembershipRenewalEMail(user, validityEndDate) {

// checking the users secondary e-mail address
var secondaryEmailAddress = user.recoveryEmail;
if (secondaryEmailAddress == '') {
for (var i = 0; i < user.emails.length; i++) {
if ((user.emails[i].address != user.primaryEmail) && !user.emails[i].address.includes('@bestalumni.net')){
secondaryEmailAddress = user.emails[i].address;
if (!secondaryEmailAddress) {
for (var email of user.emails) {
if ((email.address != user.primaryEmail) && !email.address.includes('bestalumni.net')){
secondaryEmailAddress = email.address;
}
}
}

var recipient = user.primaryEmail;
var subject = 'BEST Alumni Network - Renew your membership !';
var content = makeRenewalEMailContent(user.name.fullName, validityEndString);
//Send differendt mails for stripe users
var content = stripe? makeStripeRenewalEMailContent(user.name.fullName, validityEndString): makeRenewalEMailContent(user.name.fullName, validityEndString);
var options = {
'cc': secondaryEmailAddress,
'bcc': 'admin@bestalumni.net',
Expand All @@ -140,6 +137,7 @@ function sendMembershipRenewalEMail(user, validityEndDate) {

}


/**
* This functions sends a summary to admin@bestalumni.net at the end of this scripts execution
* @param error_accounts
Expand All @@ -150,7 +148,7 @@ function sendSummaryEMail(error_accounts, expired_accounts, reminded_accounts) {

checkDailyEMailQuota();

var recipient = 'admin@bestalumni.net,filip.schlembach@bestalumni.net';
var recipient = 'miriam.mazzeo@bestalumni.net';
var subject = 'Membership renewal summary';
var content = makeSummaryEMailContent(error_accounts, expired_accounts, reminded_accounts);

Expand All @@ -162,7 +160,7 @@ function sendSummaryEMail(error_accounts, expired_accounts, reminded_accounts) {
* This function checks which BAN member's accounts expire in one month
* It is run periodically by a trigger.
*/
function main() {
function mainfunc() {

var LOGGING_PREFIX = '[main] ';

Expand Down Expand Up @@ -190,15 +188,22 @@ function main() {
orderBy: 'email'
};


var response = AdminDirectory.Users.list(optionalArgs);
var users = response.users;

// check for every user if his account expires in the next month.
var today = new Date();
//let [month, date, year] = today.toLocaleDateString("en-US").split("/"); // To get Date, Month and Year or Time
var oneMonthFromNow = new Date();
oneMonthFromNow.setMonth(oneMonthFromNow.getMonth() + 1);

var oneDayFromNow = new Date();
oneDayFromNow.setDate(oneDayFromNow.getDate()+1);

var oneWeekFromNow = new Date();
oneWeekFromNow.setDate(oneWeekFromNow.getDate()+7);


var error_accounts = []; // List of accounts that can not be evaluated by the script for one reason or another
var expired_accounts = []; // List of Users who's accounts have expired
var reminded_accounts = []; // List of Users that have been reminded of their upcoming membership renewal
Expand All @@ -208,42 +213,55 @@ function main() {

if (users && users.length > 0) {
Logger.log(LOGGING_PREFIX + users.length + ' users found.');
for (i = 0; i < users.length; i++) {
var user = users[i];
for (let user of users) {

// Get the date until when the account is valid accourding to the payment spreadsheet.
var validityEndDateStr = getAccountValidityEndDate(user, payments);
// Get the membership expiry date accoeding to the payment spreadsheet
let {validityEndDateStr, stripe} = getAccountValidityEndDate(user, payments);
if (!validityEndDateStr) {
Logger.log(LOGGING_PREFIX + 'Could not detemine date of validity for ' + user.primaryEmail + '.');
error_accounts.push(user.primaryEmail.toString());
continue;
}
var validityEndDate = new Date(reformatDateString(validityEndDateStr));

// Logger.log(LOGGING_PREFIX + user.primaryEmail + '´s account expiration date: ' + Utilities.formatDate(validityEndDate, 'CET', 'yyyy-MM-dd')); // TODO: remove after testing.
let validityEndDate = new Date(reformatDateString(validityEndDateStr));
let formatedValidityDate1 = Utilities.formatDate(validityEndDate, 'CET', 'dd.MM.yyyy');
let formatedValidityDate2 = Utilities.formatDate(validityEndDate, 'CET', 'yyyy.MM.dd');

// deactivate the account if the validity end date is in the past
if (validityEndDate.getTime() < today.getTime()) {
Logger.log(LOGGING_PREFIX + user.primaryEmail + '´s account is already expired: ' + Utilities.formatDate(validityEndDate, 'CET', 'yyyy-MM-dd')); // TODO: remove after testing.
expired_accounts.push(user.primaryEmail.toString() + ' ' + Utilities.formatDate(validityEndDate, 'CET', 'dd.MM.yyyy'));
// TODO: deactivate account if that has not already happened?
// TODO: add one week of buffer to process payments,...

Logger.log(LOGGING_PREFIX + user.primaryEmail + '´s account is already expired: ' + formatedValidityDate2);
//Do we have to add notifications of accounts that we already know off ?????
expired_accounts.push(user.primaryEmail.toString() + ' ' + formatedValidityDate1);
// send a reminder E-Mail if the account expires today in one month.
} else if (Utilities.formatDate(validityEndDate, 'CET', 'yyyy-MM-dd') == Utilities.formatDate(oneMonthFromNow, 'CET', 'yyyy-MM-dd')) {
Logger.log(LOGGING_PREFIX + user.primaryEmail + '´s account will expire today in one month: ' + Utilities.formatDate(validityEndDate, 'CET', 'yyyy-MM-dd')); // TODO: remove after testing.
} else if (formatedValidityDate2 == Utilities.formatDate(oneMonthFromNow, 'CET', 'yyyy-MM-dd' && !stripe)) {
Logger.log(LOGGING_PREFIX + user.primaryEmail + '´s account will expire one month from now: ' + formatedValidityDate2); // TODO: remove after testing.

// send an e-mail to the user if his / her account will expire in one month
sendMembershipRenewalEMail(user, validityEndDate);
reminded_accounts.push(user.primaryEmail.toString() + ' ' + Utilities.formatDate(validityEndDate, 'CET', 'dd.MM.yyyy'));
reminded_accounts.push(user.primaryEmail.toString() + ' ' + formatedValidityDate1);

// send a reminder E-Mail if the account expires tomorrow.
} else if (formatedValidityDate2 == Utilities.formatDate(oneDayFromNow, 'CET', 'yyyy-MM-dd' && !stripe )) {
Logger.log(LOGGING_PREFIX + user.primaryEmail + '´s account will expire tomorrow: ' + formatedValidityDate2); // TODO: remove after testing.
// send an e-mail to the user if his / her account will expire in one month
sendMembershipRenewalEMail(user, validityEndDate);
reminded_accounts.push(user.primaryEmail.toString() + ' ' + formatedValidityDate1);
// send a reminder E-Mail if the account expires tomorrow.
} else if (formatedValidityDate2 == Utilities.formatDate(oneWeekFromNow, 'CET', 'yyyy-MM-dd' && stripe )) {
Logger.log(LOGGING_PREFIX + user.primaryEmail + '´s account will expire in one week: ' + formatedValidityDate2); // TODO: remove after testing.

// send an e-mail to stripe subcription 1 week before expiry.
sendMembershipRenewalEMail(user, validityEndDate, true);
reminded_accounts.push(user.primaryEmail.toString() + ' STRIPE ' + Utilities.formatDate(validityEndDate, 'CET', 'dd.MM.yyyy'));

}

}
} else {
// logToSlack('No users found.', LOGGING_SOURCE_NAME);
Logger.log("[MAIN]--- No users found");
}

sendSummaryEMail(error_accounts, expired_accounts, reminded_accounts);

}