feat: add manual subscription finalization functionality and support for expired plan notifications

This commit is contained in:
2026-07-19 13:20:33 -03:00
parent 78ee86ac48
commit af6c87acb6
20 changed files with 462 additions and 39 deletions
@@ -8,6 +8,7 @@ import {
SysAdminOrganizationsStatusParams,
SysAdminRecalculatePlanUsageCycleParams,
SysAdminExtendUserSubscriptionParams,
SysAdminFinalizeUserSubscriptionParams,
SysAdminUserSubscriptionDetailsParams,
} from "../models/Users.Model";
@@ -101,4 +102,15 @@ export class UsersController {
res.status(500).json(error?.response?.data || { success: false, message: "Internal Server Error" });
}
};
public finalizeSubscription = async (req: Request, res: Response): Promise<void> => {
try {
const data: SysAdminFinalizeUserSubscriptionParams = req.body;
const result = await usersService.finalizeSubscription(data);
res.json(result);
} catch (error: any) {
console.error("Error finalizing subscription:", error?.response?.data || error);
res.status(500).json(error?.response?.data || { success: false, message: "Internal Server Error" });
}
};
}
+12
View File
@@ -92,6 +92,18 @@ export type SysAdminExtendUserSubscriptionResult = {
transactionId?: string;
};
export type SysAdminFinalizeUserSubscriptionParams = {
userId: string;
reason?: string;
};
export type SysAdminFinalizeUserSubscriptionResult = {
userId: string;
subscriptionId: string;
previousEndDate: string;
newEndDate: string;
};
export type SysAdminUserSubscriptionDetailsResult = {
userId: string;
currentSubscription: {
+1
View File
@@ -11,6 +11,7 @@ router.post("/organizations-status", usersController.organizationsStatus);
router.post("/recalculate-plan-usage-cycle", usersController.recalculatePlanUsageCycle);
router.post("/subscription-details", usersController.subscriptionDetails);
router.post("/extend-subscription", usersController.extendSubscription);
router.post("/finalize-subscription", usersController.finalizeSubscription);
router.post("/delete", usersController.deleteUser);
export default router;
+16
View File
@@ -14,6 +14,8 @@ import {
SysAdminRecalculatePlanUsageCycleResult,
SysAdminExtendUserSubscriptionParams,
SysAdminExtendUserSubscriptionResult,
SysAdminFinalizeUserSubscriptionParams,
SysAdminFinalizeUserSubscriptionResult,
SysAdminUserSubscriptionDetailsParams,
SysAdminUserSubscriptionDetailsResult,
} from "../models/Users.Model";
@@ -120,4 +122,18 @@ export class UsersService {
return response.data;
}
public async finalizeSubscription(
data: SysAdminFinalizeUserSubscriptionParams
): Promise<SysAdminFinalizeUserSubscriptionResult> {
const nonce = await getSysAdminNonce();
const postData = { ...data, ...{ payload: getPayload(nonce) } };
const response = await axios.post(`${getApiHost()}/sysadmin/subscriptions/finalize-user`, postData, {
headers: { "Content-Type": "application/json" },
timeout: 10000,
});
return response.data;
}
}