+ {Object.keys(actLoader)?.length > 0 && (
+
)}
- {tourData && ReportName === "Templates" && (
-
- )}
-
-
-
- {ReportName}{" "}
- {report_help && (
-
-
-
+
+ {isAlert && (
+
+ {isErr
+ ? "Something went wrong, Please try again later!"
+ : "Record deleted successfully!"}
+
+ )}
+
+
+ {ReportName}{" "}
+ {report_help && (
+
+
+
+ )}
+
+ {ReportName === "Templates" && (
+
navigate("/form/template")}
+ className="fa-solid fa-square-plus text-sky-400 text-[25px]"
+ >
+ )}
+ {form && (
+
handleContactFormModal()}
+ >
+
+
)}
- {ReportName === "Templates" && (
-
navigate("/form/template")}
- className="fa-solid fa-square-plus text-sky-400 text-[25px]"
- >
- )}
- {form && (
-
handleContactFormModal()}
- >
-
-
- )}
-
-
-
-
-
- {heading?.map((item, index) => (
-
- | {item} |
-
- ))}
- {actions?.length > 0 && (
- Action |
- )}
-
-
-
- {List?.length > 0 ? (
- <>
- {currentLists.map((item, index) =>
- ReportName === "Contactbook" ? (
-
- {heading.includes("Sr.No") && (
- | {startIndex + index + 1} |
- )}
- {item?.Name} |
- {item?.Email || "-"} |
- {item?.Phone || "-"} |
-
- {actions?.length > 0 &&
- actions.map((act, index) => (
-
- ))}
- {isDeleteModal[item.objectId] && (
-
-
-
- Are you sure you want to delete this contact?
-
-
-
-
-
-
-
-
+
+
+
+ {heading?.map((item, index) => (
+
+ | {item} |
+
+ ))}
+ {actions?.length > 0 && (
+ Action |
+ )}
+
+
+
+ {List?.length > 0 && (
+ <>
+ {currentLists.map((item, index) =>
+ ReportName === "Contactbook" ? (
+
+ {heading.includes("Sr.No") && (
+ | {startIndex + index + 1} |
)}
-
-
- ) : (
-
- {heading.includes("Sr.No") && (
- | {startIndex + index + 1} |
- )}
-
- {item?.Name}{" "}
- |
- {heading.includes("Note") && (
- {item?.Note || "-"} |
- )}
- {heading.includes("Folder") && (
-
- {item?.Folder?.Name || "OpenSign™ Drive"}
+ | {item?.Name} |
+ {item?.Email || "-"} |
+ {item?.Phone || "-"} |
+
+ {actions?.length > 0 &&
+ actions.map((act, index) => (
+
+ ))}
+ {isDeleteModal[item.objectId] && (
+
+
+
+ Are you sure you want to delete this contact?
+
+
+
+
+
+
+
+
+ )}
+ |
+
+ ) : (
+
+ {heading.includes("Sr.No") && (
+ | {startIndex + index + 1} |
+ )}
+
+ {item?.Name}{" "}
+ |
+ {heading.includes("Note") && (
+ {item?.Note || "-"} |
+ )}
+ {heading.includes("Folder") && (
+
+ {item?.Folder?.Name || "OpenSign™ Drive"}
+ |
+ )}
+
+
+ {item?.URL ? "Download" : "-"}
+
|
- )}
-
-
- {item?.URL ? "Download" : "-"}
-
- |
- {formatRow(item?.ExtUserPtr)} |
-
- {item?.Signers ? formatRow(item?.Signers) : "-"}
- |
-
- {actions?.length > 0 &&
- actions.map((act, index) => (
- |
- )
+
+ {shareUrls.map((share, i) => (
+
+
+ {share.email}
+
+
+
+
+ {" "}
+
+
+ copytoclipboard(share)}
+ >
+ {" "}
+ {copied[share.email] ? "Copied" : "Copy"}
+
+
+
+ ))}
+
+
+ )}
+
+
+ )
+ )}
+ >
+ )}
+
+
+
+ {List.length > docPerPage && (
+ <>
+ {currentPage > 1 && (
+ paginateBack()}
+ className="bg-blue-400 text-white rounded px-3 py-2 focus:outline-none"
+ >
+ Prev
+
)}
>
- ) : (
- <>>
)}
- |
-
-
- {List.length > docPerPage && (
- <>
- {currentPage > 1 && (
- paginateBack()}
- className="bg-blue-400 text-white rounded px-3 py-2 focus:outline-none"
- >
- Prev
-
- )}
- >
- )}
- {pageNumbers.map((x) => (
- setCurrentPage(x)}
- className=" bg-sky-400 text-white rounded px-3 py-2 focus:outline-none"
- >
- {x}
-
- ))}
- {isMoreDocs && (
- ...
- )}
- {List.length > docPerPage && (
- <>
- {pageNumbers.includes(currentPage + 1) && (
- paginateFront()}
- className="bg-blue-400 text-white rounded px-3 py-2 focus:outline-none"
- >
- Next
-
- )}
- >
- )}
-
- {List?.length <= 0 && (
-
-
-

+ {pageNumbers.map((x) => (
+
setCurrentPage(x)}
+ className=" bg-sky-400 text-white rounded px-3 py-2 focus:outline-none"
+ >
+ {x}
+
+ ))}
+ {isMoreDocs && (
+
...
+ )}
+ {List.length > docPerPage && (
+ <>
+ {pageNumbers.includes(currentPage + 1) && (
+
paginateFront()}
+ className="bg-blue-400 text-white rounded px-3 py-2 focus:outline-none"
+ >
+ Next
+
+ )}
+ >
+ )}
+
+ {List?.length <= 0 && (
+
+
+

+
+
No Data Available
-
No Data Available
-
- )}
-
-
-
-
setIsDocErr(false)}
- >
-
-
Please add receipent in template!
-
-
+ )}
+
+
+
+
setIsDocErr(false)}
+ >
+
+
Please add receipent in template!
+
+
+
);
};
diff --git a/apps/OpenSignServer/Utils.js b/apps/OpenSignServer/Utils.js
index d94b46118..18d90138b 100644
--- a/apps/OpenSignServer/Utils.js
+++ b/apps/OpenSignServer/Utils.js
@@ -150,3 +150,96 @@ export const updateMailCount = async extUserId => {
console.log('Error updating EmailCount in contracts_users: ' + error.message);
}
};
+
+export function formatWidgetOptions(type, options) {
+ const status = options?.required === true ? 'required' : 'optional' || 'required';
+ const defaultValue = options?.default || '';
+ const values = options?.values || [];
+ switch (type) {
+ case 'signature':
+ return { name: 'signature', status: 'required' };
+ case 'stamp':
+ return { status: status, name: 'stamp' };
+ case 'initials':
+ return { status: status, name: options.name || 'initials' };
+ case 'image':
+ return { status: status, name: options.name || 'image' };
+ case 'email':
+ return { status: status, name: options.name || 'email', validation: { type: 'email' } };
+ case 'name':
+ return { status: status, name: options.name || 'name' };
+ case 'job title':
+ return { status: status, name: options.name || 'job title' };
+ case 'company':
+ return { status: status, name: options.name || 'company' };
+ case 'date': {
+ let today = new Date();
+ let dd = String(today.getDate()).padStart(2, '0');
+ let mm = String(today.getMonth() + 1).padStart(2, '0'); // January is 0!
+ let yyyy = today.getFullYear();
+ today = dd + '-' + mm + '-' + yyyy;
+ let dateFormat = options?.format;
+ dateFormat = dateFormat.replace(/m/g, 'M');
+ return {
+ status: status,
+ name: options.name || 'date',
+ response: defaultValue || today,
+ validation: { format: dateFormat || 'dd-MM-yyyy', type: 'date-format' },
+ };
+ }
+ case 'textbox':
+ return {
+ status: status,
+ name: 'textbox',
+ defaultValue: defaultValue,
+ hint: options.hint,
+ validation: { type: 'regex', pattern: options?.regularexpression || '/^[a-zA-Z0-9s]+$/' },
+ };
+ case 'checkbox': {
+ const arr = options?.values;
+ let selectedvalues = [];
+ for (const obj of options.selectedvalues) {
+ const index = arr.indexOf(obj);
+ selectedvalues.push(index);
+ }
+ return {
+ status: status,
+ name: options.name || 'checkbox',
+ values: values,
+ isReadOnly: options?.readonly || false,
+ isHideLabel: options?.hidelabel || false,
+ validation: {
+ minRequiredCount: options?.validation?.minselections || 0,
+ maxRequiredCount: options?.validation?.maxselections || 0,
+ },
+ defaultValue: selectedvalues || [],
+ };
+ }
+ case 'radio button': {
+ return {
+ status: status,
+ name: options.name || 'radio',
+ values: values,
+ isReadOnly: options?.readonly || false,
+ isHideLabel: options?.hidelabel || false,
+ defaultValue: defaultValue,
+ };
+ }
+ case 'dropdown':
+ return {
+ status: status,
+ name: options.name || 'dropdown',
+ values: values,
+ defaultValue: defaultValue,
+ };
+ default:
+ break;
+ }
+}
+
+export function sanitizeFileName(fileName) {
+ // Remove spaces and invalid characters
+ const file = fileName.replace(/[^a-zA-Z0-9._-]/g, '');
+ const removedot = file.replace(/\.(?=.*\.)/g, '');
+ return removedot.replace(/[^a-zA-Z0-9._-]/g, '');
+}
diff --git a/apps/OpenSignServer/cloud/customRoute/saveInvoice.js b/apps/OpenSignServer/cloud/customRoute/saveInvoice.js
index 615d3b301..63e914c5f 100644
--- a/apps/OpenSignServer/cloud/customRoute/saveInvoice.js
+++ b/apps/OpenSignServer/cloud/customRoute/saveInvoice.js
@@ -31,6 +31,13 @@ export default async function saveInvoice(request, response) {
className: '_User',
objectId: extUser.get('UserId').id,
});
+ if (extUser?.get('TenantId')?.id) {
+ createInvoice.set('TenantId', {
+ __type: 'Pointer',
+ className: 'partners_Tenant',
+ objectId: extUser.get('TenantId').id,
+ });
+ }
await createInvoice.save(null, { useMasterKey: true });
return response.status(200).json({ status: 'create invoice!' });
}
diff --git a/apps/OpenSignServer/cloud/customRoute/savePayments.js b/apps/OpenSignServer/cloud/customRoute/savePayments.js
index f032cdbc2..30ac4eee4 100644
--- a/apps/OpenSignServer/cloud/customRoute/savePayments.js
+++ b/apps/OpenSignServer/cloud/customRoute/savePayments.js
@@ -30,6 +30,13 @@ export default async function savePayments(request, response) {
className: '_User',
objectId: extUser.get('UserId').id,
});
+ if (extUser?.get('TenantId')?.id) {
+ createPayment.set('TenantId', {
+ __type: 'Pointer',
+ className: 'partners_Tenant',
+ objectId: extUser.get('TenantId').id,
+ });
+ }
await createPayment.save(null, { useMasterKey: true });
return response.status(200).json({ status: 'create payments!' });
}
diff --git a/apps/OpenSignServer/cloud/customRoute/saveSubscription.js b/apps/OpenSignServer/cloud/customRoute/saveSubscription.js
index b7203be10..ecf07c4a6 100644
--- a/apps/OpenSignServer/cloud/customRoute/saveSubscription.js
+++ b/apps/OpenSignServer/cloud/customRoute/saveSubscription.js
@@ -2,19 +2,26 @@ export default async function saveSubscription(request, response) {
const SubscriptionId = request.body.data.subscription.subscription_id;
const body = request.body;
const Email = request.body.data.subscription.customer.email;
-
+ const Next_billing_date = request.body.data.subscription.next_billing_at;
+ const planName = request.body.data.subscription.plan.name;
try {
const extUserCls = new Parse.Query('contracts_Users');
extUserCls.equalTo('Email', Email);
const extUser = await extUserCls.first({ useMasterKey: true });
if (extUser) {
const subcriptionCls = new Parse.Query('contracts_Subscriptions');
- subcriptionCls.equalTo('SubscriptionId', SubscriptionId);
+ subcriptionCls.equalTo('TenantId', {
+ __type: 'Pointer',
+ className: 'partners_Tenant',
+ objectId: extUser.get('TenantId').id,
+ });
const subscription = await subcriptionCls.first({ useMasterKey: true });
if (subscription) {
const updateSubscription = new Parse.Object('contracts_Subscriptions');
updateSubscription.id = subscription.id;
updateSubscription.set('SubscriptionDetails', body);
+ updateSubscription.set('Next_billing_date', new Date(Next_billing_date));
+ updateSubscription.set('PlanName', planName);
await updateSubscription.save(null, { useMasterKey: true });
return response.status(200).json({ status: 'update subscription!' });
} else {
@@ -31,6 +38,13 @@ export default async function saveSubscription(request, response) {
className: '_User',
objectId: extUser.get('UserId').id,
});
+ createSubscription.set('TenantId', {
+ __type: 'Pointer',
+ className: 'partners_Tenant',
+ objectId: extUser.get('TenantId').id,
+ });
+ createSubscription.set('Next_billing_date', new Date(Next_billing_date));
+ createSubscription.set('PlanName', planName);
await createSubscription.save(null, { useMasterKey: true });
return response.status(200).json({ status: 'create subscription!' });
}
diff --git a/apps/OpenSignServer/cloud/customRoute/v1/routes/createDocumentwithCoordinate.js b/apps/OpenSignServer/cloud/customRoute/v1/routes/createDocumentwithCoordinate.js
index d3d31b2e4..f6656f6fb 100644
--- a/apps/OpenSignServer/cloud/customRoute/v1/routes/createDocumentwithCoordinate.js
+++ b/apps/OpenSignServer/cloud/customRoute/v1/routes/createDocumentwithCoordinate.js
@@ -1,5 +1,12 @@
import axios from 'axios';
-import { color, customAPIurl, replaceMailVaribles, saveFileUsage } from '../../../../Utils.js';
+import {
+ color,
+ customAPIurl,
+ replaceMailVaribles,
+ saveFileUsage,
+ formatWidgetOptions,
+ sanitizeFileName,
+} from '../../../../Utils.js';
// `sendDoctoWebhook` is used to send res data of document on webhook
async function sendDoctoWebhook(doc, WebhookUrl, userId) {
@@ -92,9 +99,8 @@ export default async function createDocumentwithCoordinate(request, response) {
const buffer = Buffer.from(base64, 'base64');
saveFileUsage(buffer.length, fileUrl, parseUser.userId.objectId);
} else {
- const file = new Parse.File(`${name}.pdf`, {
- base64: base64File,
- });
+ const filename = sanitizeFileName(`${name}.pdf`);
+ const file = new Parse.File(filename, { base64: base64File }, 'application/pdf');
await file.save({ useMasterKey: true });
fileUrl = file.url();
const buffer = Buffer.from(base64File, 'base64');
@@ -177,17 +183,17 @@ export default async function createDocumentwithCoordinate(request, response) {
for (const widget of signer.widgets) {
const pageNumber = widget.page;
+ const options = formatWidgetOptions(widget.type, widget.options);
const page = placeHolder.find(page => page.pageNumber === pageNumber);
- const signOpt = { name: 'signature', status: 'required' };
const widgetData = {
- isStamp: widget.type === 'stamp'|| widget.type === 'image',
+ isStamp: widget.type === 'stamp' || widget.type === 'image',
key: randomId(),
isDrag: false,
scale: 1,
isMobile: false,
zIndex: 1,
- type: widget.type,
- options: widget.type === 'signature' ? signOpt : widget.options,
+ type: widget.type === 'textbox' ? 'text input' : widget.type,
+ options: options,
Width: widget.w,
Height: widget.h,
xPosition: widget.x,
diff --git a/apps/OpenSignServer/cloud/customRoute/v1/routes/createTemplatewithCoordinate.js b/apps/OpenSignServer/cloud/customRoute/v1/routes/createTemplatewithCoordinate.js
index 4a0d3ed59..6bff19bc2 100644
--- a/apps/OpenSignServer/cloud/customRoute/v1/routes/createTemplatewithCoordinate.js
+++ b/apps/OpenSignServer/cloud/customRoute/v1/routes/createTemplatewithCoordinate.js
@@ -1,5 +1,11 @@
import axios from 'axios';
-import { color, customAPIurl, saveFileUsage } from '../../../../Utils.js';
+import {
+ color,
+ customAPIurl,
+ saveFileUsage,
+ formatWidgetOptions,
+ sanitizeFileName,
+} from '../../../../Utils.js';
const randomId = () => Math.floor(1000 + Math.random() * 9000);
export default async function createTemplatewithCoordinate(request, response) {
@@ -43,9 +49,8 @@ export default async function createTemplatewithCoordinate(request, response) {
const buffer = Buffer.from(base64, 'base64');
saveFileUsage(buffer.length, fileUrl, parseUser.userId.objectId);
} else {
- const file = new Parse.File(`${name}.pdf`, {
- base64: base64File,
- });
+ const filename = sanitizeFileName(`${name}.pdf`);
+ const file = new Parse.File(filename, { base64: base64File }, 'application/pdf');
await file.save({ useMasterKey: true });
fileUrl = file.url();
const buffer = Buffer.from(base64File, 'base64');
@@ -134,16 +139,16 @@ export default async function createTemplatewithCoordinate(request, response) {
for (const widget of signer.widgets) {
const pageNumber = widget.page;
const page = placeHolder.find(page => page.pageNumber === pageNumber);
- const signOpt = { name: 'signature', status: 'required' };
+ const options = formatWidgetOptions(widget.type, widget.options);
const widgetData = {
- isStamp: widget.type === 'stamp'|| widget.type === 'image',
+ isStamp: widget.type === 'stamp' || widget.type === 'image',
key: randomId(),
isDrag: false,
scale: 1,
isMobile: false,
zIndex: 1,
- type: widget.type,
- options: widget.type === 'signature' ? signOpt : widget.options,
+ type: widget.type === 'textbox' ? 'text input' : widget.type,
+ options: options,
Width: widget.w,
Height: widget.h,
xPosition: widget.x,
diff --git a/apps/OpenSignServer/cloud/parsefunction/SubscribeFree.js b/apps/OpenSignServer/cloud/parsefunction/SubscribeFree.js
index 03c4fb95f..a51f40ebb 100644
--- a/apps/OpenSignServer/cloud/parsefunction/SubscribeFree.js
+++ b/apps/OpenSignServer/cloud/parsefunction/SubscribeFree.js
@@ -6,27 +6,51 @@ export default async function SubscribeFree(request) {
extQuery.equalTo('UserId', userPtr);
const extUser = await extQuery.first({ useMasterKey: true });
if (extUser) {
- if (extUser?.get('Plan')?.plan_code === 'freeplan') {
+ const subscriptionCls = new Parse.Query('contracts_Subscriptions');
+ subscriptionCls.equalTo('TenantId', {
+ __type: 'Pointer',
+ className: 'partners_Tenant',
+ objectId: extUser.get('TenantId').id,
+ });
+ subscriptionCls.descending('createdAt');
+ const subcripitions = await subscriptionCls.first({ useMasterKey: true });
+ if (subcripitions?.get('PlanName') === 'freeplan') {
return { status: 'success', result: 'already subscribed!' };
- } else if (extUser?.get('Next_billing_date') < new Date()) {
+ } else if (subcripitions?.get('Next_billing_date') < new Date()) {
try {
- const extUpdate = new Parse.Object('contracts_Users');
- extUpdate.id = extUser.id;
- extUpdate.set('Plan', { plan_code: 'freeplan' });
- await extUpdate.save(null, { useMasterKey: true });
+ const updateSubscription = new Parse.Object('contracts_Subscriptions');
+ updateSubscription.id = subcripitions.id;
+ updateSubscription.set('PlanName', 'freeplan');
+ await updateSubscription.save(null, { useMasterKey: true });
return { status: 'success', result: 'subscribed!' };
} catch (err) {
console.log('err ', err);
return { status: 'error', result: err.message };
}
- } else if (extUser?.get('Next_billing_date') > new Date()) {
+ } else if (subcripitions?.get('Next_billing_date') > new Date()) {
return { status: 'success', result: 'already subscribed!' };
} else {
try {
- const extUpdate = new Parse.Object('contracts_Users');
- extUpdate.id = extUser.id;
- extUpdate.set('Plan', { plan_code: 'freeplan' });
- await extUpdate.save(null, { useMasterKey: true });
+ const createSubscription = new Parse.Object('contracts_Subscriptions');
+ createSubscription.set('PlanName', 'freeplan');
+ createSubscription.set('ExtUserPtr', {
+ __type: 'Pointer',
+ className: 'contracts_Users',
+ objectId: extUser.id,
+ });
+ createSubscription.set('CreatedBy', {
+ __type: 'Pointer',
+ className: '_User',
+ objectId: extUser.get('UserId').id,
+ });
+ if (extUser?.get('TenantId')) {
+ createSubscription.set('TenantId', {
+ __type: 'Pointer',
+ className: 'partners_Tenant',
+ objectId: extUser.get('TenantId').id,
+ });
+ }
+ await createSubscription.save(null, { useMasterKey: true });
return { status: 'success', result: 'subscribed!' };
} catch (err) {
console.log('err ', err);
diff --git a/apps/OpenSignServer/cloud/parsefunction/getSubscriptions.js b/apps/OpenSignServer/cloud/parsefunction/getSubscriptions.js
index b7b2b7ada..f094143ba 100644
--- a/apps/OpenSignServer/cloud/parsefunction/getSubscriptions.js
+++ b/apps/OpenSignServer/cloud/parsefunction/getSubscriptions.js
@@ -12,19 +12,25 @@ export default async function getSubscription(request) {
});
const userId = userRes.data && userRes.data.objectId;
if (userId) {
- const subscriptionCls = new Parse.Query('contracts_Subscriptions');
- subscriptionCls.equalTo('ExtUserPtr', {
- __type: 'Pointer',
- className: 'contracts_Users',
- objectId: extUserId,
- });
- subscriptionCls.descending('createdAt');
- const subcripitions = await subscriptionCls.first({ useMasterKey: true });
- if (subcripitions) {
- const _subcripitions = JSON.parse(JSON.stringify(subcripitions));
- return { status: 'success', result: _subcripitions };
+ const subcriptionCls = new Parse.Query('contracts_Users');
+ const exUser = await subcriptionCls.get(extUserId, { useMasterKey: true });
+ if (exUser) {
+ const subscriptionCls = new Parse.Query('contracts_Subscriptions');
+ subscriptionCls.equalTo('TenantId', {
+ __type: 'Pointer',
+ className: 'partners_Tenant',
+ objectId: exUser.get('TenantId').id,
+ });
+ subscriptionCls.descending('createdAt');
+ const subcripitions = await subscriptionCls.first({ useMasterKey: true });
+ if (subcripitions) {
+ const _subcripitions = JSON.parse(JSON.stringify(subcripitions));
+ return { status: 'success', result: _subcripitions };
+ } else {
+ return { status: 'success', result: {} };
+ }
} else {
- return { status: 'success', result: {} };
+ return { status: 'error', result: 'User not found!' };
}
} else {
return { status: 'error', result: 'Invalid session token!' };