diff --git a/apps/OpenSignServer/cloud/customRoute/autoReminder.js b/apps/OpenSignServer/cloud/customRoute/autoReminder.js
index c43e8ed6f..de8da2cbd 100644
--- a/apps/OpenSignServer/cloud/customRoute/autoReminder.js
+++ b/apps/OpenSignServer/cloud/customRoute/autoReminder.js
@@ -22,7 +22,8 @@ function replaceMailVaribles(subject, body, variables) {
return result;
}
-export default async function autoReminder(request, response) {
+// `sendmail` is used to signing reminder mail to signer
+async function sendMail(doc, signer, mailcount) {
const subject = `{{sender_name}} has requested you to sign "{{document_title}}"`;
const body = `
Hi {{receiver_name}},
We hope this email finds you well. {{sender_name}} has requested you to review and sign "{{document_title}}".
Your signature is crucial to proceed with the next steps as it signifies your agreement and authorization.
{{signing_url}}
If you have any questions or need further clarification regarding the document or the signing process, please contact the sender.
Thanks
Team OpenSign™
`;
const url = `${process.env.SERVER_URL}/functions/sendmailv3`;
@@ -30,15 +31,57 @@ export default async function autoReminder(request, response) {
'Content-Type': 'application/json',
'X-Parse-Application-Id': process.env.APP_ID,
};
- const limit = request.query.limit || 2000;
- const skip = request.query.skip || 0;
+
const baseUrl = new URL(process.env.PUBLIC_URL);
+ const encodeBase64 = btoa(`${doc.objectId}/${signer.Email}/${signer.objectId}`);
+ const expireDate = doc?.ExpiryDate?.iso;
+ const newDate = new Date(expireDate);
+ const localExpireDate = newDate.toLocaleDateString('en-US', {
+ day: 'numeric',
+ month: 'long',
+ year: 'numeric',
+ });
+ const signPdf = `${baseUrl.origin}/login/${encodeBase64}`;
+ const variables = {
+ document_title: doc.Name,
+ sender_name: doc.ExtUserPtr.Name,
+ sender_mail: doc.ExtUserPtr.Email,
+ sender_phone: doc.ExtUserPtr.Phone,
+ receiver_name: signer.Name,
+ receiver_email: signer.Email,
+ receiver_phone: signer.Phone,
+ expiry_date: localExpireDate,
+ company_name: doc?.ExtUserPtr?.Company || '',
+ signing_url: `Sign here`,
+ };
+ const mail = replaceMailVaribles(subject, body, variables);
+ let params = {
+ mailProvider: doc?.ExtUserPtr?.active_mail_adapter,
+ extUserId: doc?.ExtUserPtr?.objectId,
+ recipient: signer.Email,
+ subject: mail.subject,
+ from: doc?.ExtUserPtr?.Email,
+ html: mail.body,
+ };
+ try {
+ // The axios request is used to send a signing reminder email.
+ const res = await axios.post(url, params, { headers: headers });
+ // console.log('res ', res.data.result);
+ if (res.data.result.status === 'success') {
+ mailcount += 1;
+ return { status: 'success', count: mailcount };
+ }
+ } catch (err) {
+ console.log('err in mail of sendreminder api', err);
+ return { status: 'error' };
+ }
+}
+export default async function autoReminder(request, response) {
// The query below is used to find documents where the reminder date is less than or equal to the current date, and which have existing signers and a signed URL.
try {
const docQuery = new Parse.Query('contracts_Document');
- docQuery.limit(limit);
- docQuery.skip(skip);
+ docQuery.limit(2000);
docQuery.lessThanOrEqualTo('NextReminderDate', new Date());
docQuery.equalTo('AutomaticReminders', true);
docQuery.exists('NextReminderDate');
@@ -46,10 +89,16 @@ export default async function autoReminder(request, response) {
docQuery.exists('SignedUrl');
docQuery.descending('createdAt');
docQuery.include('Signers,AuditTrail.UserPtr,ExtUserPtr');
+ docQuery.notEqualTo('IsCompleted', true);
+ docQuery.notEqualTo('IsDeclined', true);
+ docQuery.notEqualTo('IsArchive', true);
+ docQuery.greaterThanOrEqualTo('ExpiryDate', new Date());
+
const docsArr = await docQuery.find({ useMasterKey: true });
if (docsArr && docsArr.length > 0) {
const _docsArr = JSON.parse(JSON.stringify(docsArr));
+ let mailCount = 0;
for (const doc of _docsArr) {
// The reminderDate variable is used to calculate the next reminder date.
const RemindOnceInEvery = doc?.RemindOnceInEvery || 5;
@@ -63,51 +112,19 @@ export default async function autoReminder(request, response) {
const count = auditTrail?.length || 0;
const signer = doc?.Signers?.[count];
if (signer) {
- const encodeBase64 = btoa(`${doc.objectId}/${signer.Email}/${signer.objectId}`);
- const expireDate = doc?.ExpiryDate?.iso;
- const newDate = new Date(expireDate);
- const localExpireDate = newDate.toLocaleDateString('en-US', {
- day: 'numeric',
- month: 'long',
- year: 'numeric',
- });
- const signPdf = `${baseUrl.origin}/login/${encodeBase64}`;
- const variables = {
- document_title: doc.Name,
- sender_name: doc.ExtUserPtr.Name,
- sender_mail: doc.ExtUserPtr.Email,
- sender_phone: doc.ExtUserPtr.Phone,
- receiver_name: signer.Name,
- receiver_email: signer.Email,
- receiver_phone: signer.Phone,
- expiry_date: localExpireDate,
- company_name: doc?.ExtUserPtr?.Company || '',
- signing_url: `Sign here`,
- };
- const mail = replaceMailVaribles(subject, body, variables);
-
- let params = {
- mailProvider: doc?.ExtUserPtr?.active_mail_adapter,
- extUserId: doc?.ExtUserPtr?.objectId,
- recipient: signer.Email,
- subject: mail.subject,
- from: doc?.ExtUserPtr?.Email,
- html: mail.body,
- };
+ const mailRes = await sendMail(doc, signer, mailCount);
+ if (mailRes && mailRes.status === 'success') {
+ mailCount += mailRes.count;
+ }
try {
- // The axios request is used to send a signing reminder email.
- const res = await axios.post(url, params, { headers: headers });
- // console.log('res ', res.data.result);
- if (res.data.result.status === 'success') {
- // The code below is used to update the next reminder date of the document based on the "remind once every X days" setting.
- const updateDoc = new Parse.Object('contracts_Document');
- updateDoc.id = doc.objectId;
- updateDoc.set('NextReminderDate', ReminderDate);
- const updateRes = await updateDoc.save(null, { useMasterKey: true });
- // console.log('updateRes ', updateRes);
- }
+ // The code below is used to update the next reminder date of the document based on the "remind once every X days" setting.
+ const updateDoc = new Parse.Object('contracts_Document');
+ updateDoc.id = doc.objectId;
+ updateDoc.set('NextReminderDate', ReminderDate);
+ const updateRes = await updateDoc.save(null, { useMasterKey: true });
+ // console.log('updateRes ', updateRes);
} catch (err) {
- console.log('err in sendmail', err);
+ console.log('err in update document', err);
}
}
} else {
@@ -124,41 +141,9 @@ export default async function autoReminder(request, response) {
if (signers?.length > 0) {
// The for...of loop below is used to send a signing reminder to every signer who hasn't signed the document yet.
for (const signer of signers) {
- const encodeBase64 = btoa(`${doc.objectId}/${signer.Email}/${signer.objectId}`);
- const expireDate = doc?.ExpiryDate?.iso;
- const newDate = new Date(expireDate);
- const localExpireDate = newDate.toLocaleDateString('en-US', {
- day: 'numeric',
- month: 'long',
- year: 'numeric',
- });
- const signPdf = `${baseUrl.origin}/login/${encodeBase64}`;
- const variables = {
- document_title: doc.Name,
- sender_name: doc.ExtUserPtr.Name,
- sender_mail: doc.ExtUserPtr.Email,
- sender_phone: doc.ExtUserPtr.Phone,
- receiver_name: signer.Name,
- receiver_email: signer.Email,
- receiver_phone: signer.Phone,
- expiry_date: localExpireDate,
- company_name: doc?.ExtUserPtr?.Company || '',
- signing_url: `Sign here`,
- };
- const mail = replaceMailVaribles(subject, body, variables);
- let params = {
- mailProvider: doc?.ExtUserPtr?.active_mail_adapter,
- extUserId: doc?.ExtUserPtr?.objectId,
- recipient: signer.Email,
- subject: mail.subject,
- from: doc?.ExtUserPtr?.Email,
- html: mail.body,
- };
- try {
- const res = await axios.post(url, params, { headers: headers });
- // console.log('res ', res.data.result);
- } catch (err) {
- console.log('err in sendmail', err);
+ const mailRes = await sendMail(doc, signer, mailCount);
+ if (mailRes && mailRes.status === 'success') {
+ mailCount += mailRes.count;
}
}
}
@@ -167,41 +152,9 @@ export default async function autoReminder(request, response) {
const signers = doc?.Signers;
if (signers?.length > 0) {
for (const signer of signers) {
- const encodeBase64 = btoa(`${doc.objectId}/${signer.Email}/${signer.objectId}`);
- const expireDate = doc?.ExpiryDate?.iso;
- const newDate = new Date(expireDate);
- const localExpireDate = newDate.toLocaleDateString('en-US', {
- day: 'numeric',
- month: 'long',
- year: 'numeric',
- });
- const signPdf = `${baseUrl.origin}/login/${encodeBase64}`;
- const variables = {
- document_title: doc.Name,
- sender_name: doc.ExtUserPtr.Name,
- sender_mail: doc.ExtUserPtr.Email,
- sender_phone: doc.ExtUserPtr.Phone,
- receiver_name: signer.Name,
- receiver_email: signer.Email,
- receiver_phone: signer.Phone,
- expiry_date: localExpireDate,
- company_name: doc?.ExtUserPtr?.Company || '',
- signing_url: `Sign here`,
- };
- const mail = replaceMailVaribles(subject, body, variables);
- let params = {
- mailProvider: doc?.ExtUserPtr?.active_mail_adapter,
- extUserId: doc?.ExtUserPtr?.objectId,
- recipient: signer.Email,
- subject: mail.subject,
- from: doc?.ExtUserPtr?.Email,
- html: mail.body,
- };
- try {
- const res = await axios.post(url, params, { headers: headers });
- // console.log('res ', res.data.result);
- } catch (err) {
- console.log('err in sendmail', err);
+ const mailRes = await sendMail(doc, signer, mailCount);
+ if (mailRes && mailRes.status === 'success') {
+ mailCount += mailRes.count;
}
}
}
@@ -218,7 +171,7 @@ export default async function autoReminder(request, response) {
}
}
}
- response.json({ status: 'success' });
+ response.json({ status: 'success', document_count: docsArr.length, mail_count: mailCount });
} else {
response.json({ status: 'no record found' });
}
diff --git a/apps/OpenSignServer/cloud/customRoute/customApp.js b/apps/OpenSignServer/cloud/customRoute/customApp.js
index 354621c0b..f9fdefaea 100644
--- a/apps/OpenSignServer/cloud/customRoute/customApp.js
+++ b/apps/OpenSignServer/cloud/customRoute/customApp.js
@@ -21,4 +21,4 @@ app.post('/savesubscription', saveSubscription);
app.post('/saveinvoice', saveInvoice);
app.post('/savepayment', savePayments);
app.post('/googleauth', gooogleauth);
-app.post('/autoreminder', autoReminder);
+app.post('/sendreminder', autoReminder);