diff --git a/Code.gs b/Code.gs index 1d0e0a5..e9ca7b6 100644 --- a/Code.gs +++ b/Code.gs @@ -1,33 +1,31 @@ /** - * 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'; // !: + //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";; // !: 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 @@ -35,9 +33,13 @@ function getPaymentData() { 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 { @@ -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) { @@ -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() { @@ -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'; @@ -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', @@ -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 @@ -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); @@ -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] '; @@ -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 @@ -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); } +