-
-
- USD {amount.price}
+ <>
+ {admin?.isAdmin ? (
+
+ ) : (
+
+ {t("unauthorized-modal", {
+ adminName: admin?.name,
+ adminEmail: admin?.email
+ })}
-
-
-
-
+ )}
+ >
)}
>
)}
diff --git a/apps/OpenSign/src/constant/Utils.js b/apps/OpenSign/src/constant/Utils.js
index 71f7aa69d..4ec3c35d0 100644
--- a/apps/OpenSign/src/constant/Utils.js
+++ b/apps/OpenSign/src/constant/Utils.js
@@ -56,7 +56,7 @@ export async function fetchSubscription(
? { contactId: contactObjId }
: { extUserId: extUser };
const tenatRes = await axios.post(url, params, { headers: headers });
- let plan, status, billingDate;
+ let plan, status, billingDate, adminId;
if (isGuestSign) {
plan = tenatRes.data?.result?.result?.plan;
status = tenatRes.data?.result?.result?.isSubscribed;
@@ -64,12 +64,13 @@ export async function fetchSubscription(
plan = tenatRes.data?.result?.result?.PlanCode;
billingDate = tenatRes.data?.result?.result?.Next_billing_date?.iso;
const allowedUsers = tenatRes.data?.result?.result?.AllowedUsers || 0;
+ adminId = tenatRes?.data?.result?.result?.ExtUserPtr?.objectId;
localStorage.setItem("allowedUsers", allowedUsers);
}
- return { plan, billingDate, status };
+ return { plan, billingDate, status, adminId };
} catch (err) {
console.log("Err in fetch subscription", err);
- return { plan: "", billingDate: "" };
+ return { plan: "", billingDate: "", status: "", adminId: "" };
}
}
@@ -122,22 +123,22 @@ export async function checkIsSubscribed() {
try {
const res = await fetchSubscription();
if (res.plan === "freeplan") {
- return { plan: res.plan, isValid: false };
+ return { plan: res.plan, isValid: false, adminId: res?.adminId };
} else if (res.billingDate) {
const plan = validplan[res.plan] || false;
if (plan && new Date(res.billingDate) > new Date()) {
- return { plan: res.plan, isValid: true };
+ return { plan: res.plan, isValid: true, adminId: res?.adminId };
} else if (new Date(res.billingDate) > new Date()) {
- return { plan: res.plan, isValid: true };
+ return { plan: res.plan, isValid: true, adminId: res?.adminId };
} else {
- return { plan: res.plan, isValid: false };
+ return { plan: res.plan, isValid: false, adminId: res?.adminId };
}
} else {
- return { plan: res.plan, isValid: false };
+ return { plan: res.plan, isValid: false, adminId: res?.adminId };
}
} catch (err) {
console.log("Err in fetch subscription", err);
- return { plan: "no-plan", isValid: false };
+ return { plan: "no-plan", isValid: false, adminId: "" };
}
}
diff --git a/apps/OpenSign/src/pages/GenerateToken.js b/apps/OpenSign/src/pages/GenerateToken.js
index d5fa82ac6..757a0f1f8 100644
--- a/apps/OpenSign/src/pages/GenerateToken.js
+++ b/apps/OpenSign/src/pages/GenerateToken.js
@@ -21,9 +21,16 @@ function GenerateToken() {
const [isLoader, setIsLoader] = useState(true);
const [isModal, setIsModal] = useState({
generateapi: false,
- buyapis: false
+ buyapis: false,
+ unauthorized: false
+ });
+ const [isSubscribe, setIsSubscribe] = useState({
+ plan: "",
+ isValid: false,
+ adminId: "",
+ adminName: "",
+ adminEmail: ""
});
- const [isSubscribe, setIsSubscribe] = useState({ plan: "", isValid: false });
const [isAlert, setIsAlert] = useState({ type: "success", msg: "" });
const [isTour, setIsTour] = useState(false);
const [amount, setAmount] = useState({
@@ -139,10 +146,24 @@ function GenerateToken() {
if (isSubscribe?.plan === "freeplan" && isEnableSubscription) {
setIsTour(true);
} else {
- setIsModal((obj) => ({ ...obj, buyapis: !obj.buyapis }));
+ const extUser =
+ localStorage.getItem("Extand_Class") &&
+ JSON.parse(localStorage.getItem("Extand_Class"))?.[0];
+ if (isSubscribe?.adminId && extUser?.objectId === isSubscribe?.adminId) {
+ setIsModal((obj) => ({ ...obj, buyapis: !obj.buyapis }));
+ } else {
+ setIsSubscribe((obj) => ({
+ ...obj,
+ adminName: extUser?.CreatedBy?.name,
+ adminEmail: extUser?.CreatedBy?.email
+ }));
+ setIsModal((obj) => ({ ...obj, unauthorized: !obj.unauthorized }));
+ }
}
};
-
+ const handleCloseModal = () => {
+ setIsModal({ generateapi: false, buyapis: false, unauthorized: false });
+ };
const handlePricePerAPIs = (e) => {
const quantity = e.target?.value;
const price =
@@ -374,7 +395,7 @@ function GenerateToken() {
{isFormLoader && (
@@ -419,6 +440,18 @@ function GenerateToken() {
+
+
+ {t("unauthorized-modal", {
+ adminName: isSubscribe?.adminName,
+ adminEmail: isSubscribe?.adminEmail
+ })}
+
+
{isEnableSubscription && isSubscribe?.plan === "freeplan" && (
diff --git a/apps/OpenSign/src/script/locales/en/translation.json b/apps/OpenSign/src/script/locales/en/translation.json
index af6e2fbed..6564f0233 100644
--- a/apps/OpenSign/src/script/locales/en/translation.json
+++ b/apps/OpenSign/src/script/locales/en/translation.json
@@ -475,7 +475,7 @@
"role-not-found": "Role not found.",
"do-not-access": "You don't have access, please contact the admin.",
"add-admin": "Add admin",
- "opensign-setup": "Opensign Setup",
+ "opensign-setup": "OpenSign Setup",
"join-discord": "Join our discord server",
"admin-already-exist": "Admin already exist.",
"password-update-alert-1": "Password updated successfully.",
@@ -531,7 +531,7 @@
"filed-required-correctly": "Please fill required details correctly.",
"admin-created": "Admin created",
"invalid-masterkey": "Invalid masterkey",
- "opensign-Setup": "Opensign Setup",
+ "opensign-Setup": "OpenSign Setup",
"master-key": " Master key",
"profile-update-alert": "Profile updated successfully.",
"date": "Date",
@@ -631,6 +631,7 @@
"quotamailselfsign": "You've reached your limit of 20 emails for this month. Upgrade now to continue sending emails directly.",
"quotamail": "You've reached your limit of 20 signature request emails for this month. Upgrade now to continue sending emails directly.",
"quotamailTip":"Tip: You can still sign unlimited documents by manually sharing the signing request links below.",
- "quotamailhead":"Quota Reached"
+ "quotamailhead":"Quota Reached",
+ "unauthorized-modal":"You don't have permission to perform this action, please contact {{adminName}}<{{adminEmail}}>."
}
diff --git a/apps/OpenSign/src/script/locales/fr/translation.json b/apps/OpenSign/src/script/locales/fr/translation.json
index 6956bcff1..34d93d349 100644
--- a/apps/OpenSign/src/script/locales/fr/translation.json
+++ b/apps/OpenSign/src/script/locales/fr/translation.json
@@ -474,7 +474,7 @@
"role-not-found": "Rôle introuvable.",
"do-not-access": "Vous n'y avez pas accès, veuillez contacter l'administrateur.",
"add-admin": "Ajouter un administrateur",
- "opensign-setup": "Configuration d'Opensign",
+ "opensign-setup": "Configuration d'OpenSign",
"join-discord": "Rejoignez notre serveur Discord",
"admin-already-exist": "L'administrateur existe déjà.",
"password-update-alert-1": "Mot de passe mis à jour avec succès.",
@@ -530,7 +530,7 @@
"filed-required-correctly": "Veuillez remplir correctement les informations requises.",
"admin-created": "Administrateur créé",
"invalid-masterkey": "Clé principale invalide",
- "opensign-Setup": "Configuration d'Opensign",
+ "opensign-Setup": "Configuration d'OpenSign",
"master-key": "La clef maitresse",
"profile-update-alert": "Mise à jour du profil réussie.",
"date": "Date",
@@ -631,6 +631,7 @@
"quotamailselfsign": "Vous avez atteint votre limite de 20 e-mails pour ce mois. Mettez à niveau maintenant pour continuer à envoyer des e-mails directement.",
"quotamail": "Vous avez atteint votre limite de 20 e-mails de demande de signature pour ce mois. Mettez à niveau maintenant pour continuer à envoyer des e-mails directement.",
"quotamailTip":"Astuce : Vous pouvez toujours signer un nombre illimité de documents en partageant manuellement les liens de demande de signature ci-dessous.",
- "quotamailhead":"Quota atteint"
+ "quotamailhead":"Quota atteint",
+ "unauthorized-modal":"Vous n'êtes pas autorisé à effectuer cette action, veuillez contacter {{adminName}}<{{adminEmail}}>."
}
diff --git a/apps/OpenSignServer/cloud/customRoute/saveSubscription.js b/apps/OpenSignServer/cloud/customRoute/saveSubscription.js
index 31b14503e..d6db217fd 100644
--- a/apps/OpenSignServer/cloud/customRoute/saveSubscription.js
+++ b/apps/OpenSignServer/cloud/customRoute/saveSubscription.js
@@ -7,8 +7,10 @@ export default async function saveSubscription(request, response) {
const Next_billing_date = request.body?.data?.subscription?.next_billing_at;
const planCode = request.body?.data?.subscription?.plan?.plan_code;
const addons = request.body?.data?.subscription?.addons || [];
+ const event = request.body?.data?.event_type || '';
const credits = planCredits?.[planCode] || 0;
- let existAddon = 0;
+ const isTeamPlan = planCode?.includes('team');
+ let newAddons = 0;
if (addons?.length > 0) {
let allowedUsersMonthly = 0;
let allowedUsersYearly = 0;
@@ -22,11 +24,11 @@ export default async function saveSubscription(request, response) {
}
});
if (allowedUsersMonthly > 0 || allowedUsersYearly > 0) {
- existAddon = allowedUsersMonthly + allowedUsersYearly + 1;
+ newAddons = allowedUsersMonthly + allowedUsersYearly + 1;
}
} else {
if (planCode === 'teams-yearly' || planCode === 'teams-monthly' || planCode === 'team-weekly') {
- existAddon = 1;
+ newAddons = 1;
}
}
try {
@@ -42,6 +44,7 @@ export default async function saveSubscription(request, response) {
});
const subscription = await subcriptionCls.first({ useMasterKey: true });
if (subscription) {
+ const _resSub = JSON.parse(JSON.stringify(subscription));
const updateSubscription = new Parse.Object('contracts_Subscriptions');
updateSubscription.id = subscription.id;
updateSubscription.set('SubscriptionId', SubscriptionId);
@@ -52,27 +55,81 @@ export default async function saveSubscription(request, response) {
updateSubscription.unset('Next_billing_date');
}
updateSubscription.set('PlanCode', planCode);
- if (existAddon > 0) {
- updateSubscription.set('AllowedUsers', parseInt(existAddon));
+ if (newAddons > 0) {
+ updateSubscription.set('AllowedUsers', parseInt(newAddons));
+ }
+ let existAddon = 0;
+ let allowedUsersMonthly = 0;
+ let allowedUsersYearly = 0;
+ _resSub.SubscriptionDetails?.data?.subscription?.addons?.forEach(item => {
+ if (item.addon_code === 'extra-teams-users-monthly') {
+ allowedUsersMonthly += item.quantity;
+ } else if (item.addon_code === 'extra-teams-users-yearly') {
+ allowedUsersYearly += item.quantity;
+ } else if (item.addon_code === 'extra-users') {
+ allowedUsersMonthly += item.quantity;
+ }
+ });
+ if (allowedUsersMonthly > 0 || allowedUsersYearly > 0) {
+ existAddon = allowedUsersMonthly + allowedUsersYearly + 1; // + 1 is Admin user
+ } else {
+ if (
+ planCode === 'teams-yearly' ||
+ planCode === 'teams-monthly' ||
+ planCode === 'team-weekly'
+ ) {
+ existAddon = 1; // 1 is Admin user
+ }
}
const isSameAsPrevPlan = subscription?.get('PlanCode') === planCode;
if (isSameAsPrevPlan) {
const planCredits = subscription?.get('PlanCredits');
+ const existAllowedCredits = subscription?.get('AllowedCredits') || 0;
if (planCredits) {
- updateSubscription.set('AllowedCredits', planCredits);
+ const oldAddons = existAddon;
+ const substractedAddon = newAddons - oldAddons;
+ if (isTeamPlan && substractedAddon > 0) {
+ const newCredits = existAllowedCredits + substractedAddon * planCredits;
+ updateSubscription.set('AllowedCredits', newCredits);
+ if (event === 'subscription_created') {
+ updateSubscription.set('PlanCredits', credits);
+ }
+ } else if (isTeamPlan) {
+ const existCredits = existAddon * planCredits;
+ updateSubscription.set('AllowedCredits', existCredits);
+ if (event === 'subscription_created') {
+ updateSubscription.set('PlanCredits', credits);
+ }
+ } else {
+ updateSubscription.set('AllowedCredits', planCredits);
+ if (event === 'subscription_created') {
+ updateSubscription.set('PlanCredits', credits);
+ }
+ }
} else {
if (credits > 0) {
- updateSubscription.set('AllowedCredits', credits);
- updateSubscription.set('PlanCredits', credits);
+ if (isTeamPlan) {
+ const newCredits = newAddons * credits;
+ updateSubscription.set('AllowedCredits', newCredits);
+ updateSubscription.set('PlanCredits', credits);
+ } else {
+ updateSubscription.set('AllowedCredits', credits);
+ updateSubscription.set('PlanCredits', credits);
+ }
}
}
} else {
if (credits > 0) {
- updateSubscription.set('AllowedCredits', credits);
- updateSubscription.set('PlanCredits', credits);
+ if (isTeamPlan) {
+ const newCredits = newAddons * credits;
+ updateSubscription.set('AllowedCredits', newCredits);
+ updateSubscription.set('PlanCredits', credits);
+ } else {
+ updateSubscription.set('AllowedCredits', credits);
+ updateSubscription.set('PlanCredits', credits);
+ }
}
}
-
await updateSubscription.save(null, { useMasterKey: true });
return response.status(200).json({ status: 'update subscription!' });
} else {
@@ -100,11 +157,18 @@ export default async function saveSubscription(request, response) {
createSubscription.unset('Next_billing_date');
}
createSubscription.set('PlanCode', planCode);
- if (existAddon > 0) {
- createSubscription.set('AllowedUsers', parseInt(existAddon));
+ if (newAddons > 0) {
+ createSubscription.set('AllowedUsers', parseInt(newAddons));
}
if (credits > 0) {
- createSubscription.set('AllowedCredits', credits);
+ if (isTeamPlan) {
+ const totalCredits = parseInt(newAddons) * credits;
+ createSubscription.set('AllowedCredits', totalCredits);
+ createSubscription.set('PlanCredits', credits);
+ } else {
+ createSubscription.set('AllowedCredits', credits);
+ createSubscription.set('PlanCredits', credits);
+ }
}
await createSubscription.save(null, { useMasterKey: true });
return response.status(200).json({ status: 'create subscription!' });
diff --git a/apps/OpenSignServer/cloud/parsefunction/BuyAddonUsers.js b/apps/OpenSignServer/cloud/parsefunction/BuyAddonUsers.js
index 3ca147f4a..4281ab9d4 100644
--- a/apps/OpenSignServer/cloud/parsefunction/BuyAddonUsers.js
+++ b/apps/OpenSignServer/cloud/parsefunction/BuyAddonUsers.js
@@ -1,4 +1,5 @@
import axios from 'axios';
+import { planCredits } from '../../Utils.js';
export default async function BuyAddonUsers(request) {
const users = request.params.users;
if (!request?.user) {
@@ -88,10 +89,15 @@ export default async function BuyAddonUsers(request) {
);
const subscriptionInfo = { data: updatedSubscription.data };
const allowedUsers = quantity + 1;
+ const existAllowedCredits = _resSub?.AllowedCredits || 0;
+ const credits = resSub?.PlanCredits || planCredits[plan_code];
+ const newAllowedCredits = users * credits;
+ const totalCredits = existAllowedCredits + newAllowedCredits;
const updateSub = new Parse.Object('contracts_Subscriptions');
updateSub.id = resSub.id;
updateSub.set('SubscriptionDetails', subscriptionInfo);
updateSub.set('AllowedUsers', allowedUsers);
+ updateSub.set('AllowedCredits', totalCredits);
const resupdateSub = await updateSub.save(null, { useMasterKey: true });
return { status: 'success', addon: allowedUsers };
} else {
diff --git a/apps/OpenSignServer/cloud/parsefunction/saveSubscription.js b/apps/OpenSignServer/cloud/parsefunction/saveSubscription.js
index 2c2a0a373..b7e8fcb3a 100644
--- a/apps/OpenSignServer/cloud/parsefunction/saveSubscription.js
+++ b/apps/OpenSignServer/cloud/parsefunction/saveSubscription.js
@@ -8,8 +8,10 @@ export default async function saveSubscription(request) {
const body = subscription;
const Next_billing_date = subscription.data.subscription.next_billing_at;
const planCode = subscription.data.subscription.plan.plan_code;
+ const event = subscription?.data?.event_type || '';
const credits = planCredits?.[planCode] || 0;
- let existAddon = 0;
+ const isTeamPlan = planCode?.includes('team');
+ let newAddons = 0;
try {
const userRes = await axios.get(serverUrl + '/users/me', {
headers: {
@@ -47,7 +49,7 @@ export default async function saveSubscription(request) {
}
});
if (allowedUsersMonthly > 0 || allowedUsersYearly > 0) {
- existAddon = allowedUsersMonthly + allowedUsersYearly + 1;
+ newAddons = allowedUsersMonthly + allowedUsersYearly + 1; // + 1 is Admin user
}
} else {
if (
@@ -55,39 +57,90 @@ export default async function saveSubscription(request) {
planCode === 'teams-monthly' ||
planCode === 'team-weekly'
) {
- existAddon = 1;
+ newAddons = 1; // 1 is Admin user
}
}
-
- // const existAddon = addons.reduce((acc, curr) => acc + curr.quantity, 1);
if (resSubscription) {
+ const _resSub = JSON.parse(JSON.stringify(resSubscription));
const updateSubscription = new Parse.Object('contracts_Subscriptions');
updateSubscription.id = resSubscription.id;
updateSubscription.set('SubscriptionId', SubscriptionId);
updateSubscription.set('SubscriptionDetails', body);
updateSubscription.set('Next_billing_date', new Date(Next_billing_date));
updateSubscription.set('PlanCode', planCode);
- if (existAddon > 0) {
- updateSubscription.set('AllowedUsers', parseInt(existAddon));
+ if (newAddons > 0) {
+ updateSubscription.set('AllowedUsers', parseInt(newAddons));
+ }
+ let existAddon = 0;
+ let allowedUsersMonthly = 0;
+ let allowedUsersYearly = 0;
+ _resSub.SubscriptionDetails?.data?.subscription?.addons?.forEach(item => {
+ if (item.addon_code === 'extra-teams-users-monthly') {
+ allowedUsersMonthly += item.quantity;
+ } else if (item.addon_code === 'extra-teams-users-yearly') {
+ allowedUsersYearly += item.quantity;
+ } else if (item.addon_code === 'extra-users') {
+ allowedUsersMonthly += item.quantity;
+ }
+ });
+ if (allowedUsersMonthly > 0 || allowedUsersYearly > 0) {
+ existAddon = allowedUsersMonthly + allowedUsersYearly + 1; // + 1 is Admin user
+ } else {
+ if (
+ planCode === 'teams-yearly' ||
+ planCode === 'teams-monthly' ||
+ planCode === 'team-weekly'
+ ) {
+ existAddon = 1; // 1 is Admin user
+ }
}
const isSameAsPrevPlan = resSubscription?.get('PlanCode') === planCode;
if (isSameAsPrevPlan) {
const planCredits = resSubscription?.get('PlanCredits');
+ const existAllowedCredits = resSubscription?.get('AllowedCredits') || 0;
if (planCredits) {
- updateSubscription.set('AllowedCredits', planCredits);
+ const oldAddons = existAddon;
+ const substractedAddon = newAddons - oldAddons;
+ if (isTeamPlan && substractedAddon > 0) {
+ const newCredits = existAllowedCredits + substractedAddon * planCredits;
+ updateSubscription.set('AllowedCredits', newCredits);
+ if (event === 'subscription_created') {
+ updateSubscription.set('PlanCredits', credits);
+ }
+ } else if (isTeamPlan) {
+ const existCredits = existAddon * planCredits;
+ updateSubscription.set('AllowedCredits', existCredits);
+ if (event === 'subscription_created') {
+ updateSubscription.set('PlanCredits', credits);
+ }
+ } else {
+ updateSubscription.set('AllowedCredits', planCredits);
+ if (event === 'subscription_created') {
+ updateSubscription.set('PlanCredits', credits);
+ }
+ }
} else {
- if (credits > 0) {
+ if (isTeamPlan) {
+ const newCredits = newAddons * credits;
+ updateSubscription.set('AllowedCredits', newCredits);
+ updateSubscription.set('PlanCredits', credits);
+ } else {
updateSubscription.set('AllowedCredits', credits);
updateSubscription.set('PlanCredits', credits);
}
}
} else {
if (credits > 0) {
- updateSubscription.set('AllowedCredits', credits);
- updateSubscription.set('PlanCredits', credits);
+ if (isTeamPlan) {
+ const newCredits = newAddons * credits;
+ updateSubscription.set('AllowedCredits', newCredits);
+ updateSubscription.set('PlanCredits', credits);
+ } else {
+ updateSubscription.set('AllowedCredits', credits);
+ updateSubscription.set('PlanCredits', credits);
+ }
}
}
-
await updateSubscription.save(null, { useMasterKey: true });
return { status: 'update subscription!' };
} else {
@@ -111,12 +164,18 @@ export default async function saveSubscription(request) {
});
createSubscription.set('Next_billing_date', new Date(Next_billing_date));
createSubscription.set('PlanCode', planCode);
- if (existAddon > 0) {
- createSubscription.set('AllowedUsers', parseInt(existAddon));
+ if (newAddons > 0) {
+ createSubscription.set('AllowedUsers', parseInt(newAddons));
}
if (credits > 0) {
- createSubscription.set('AllowedCredits', credits);
- createSubscription.set('PlanCredits', credits);
+ if (isTeamPlan) {
+ const totalCredits = parseInt(newAddons) * credits;
+ createSubscription.set('AllowedCredits', totalCredits);
+ createSubscription.set('PlanCredits', credits);
+ } else {
+ createSubscription.set('AllowedCredits', credits);
+ createSubscription.set('PlanCredits', credits);
+ }
}
await createSubscription.save(null, { useMasterKey: true });
return { status: 'create subscription!' };