mirror of
https://github.com/rgrgogu/new_starr.git
synced 2026-09-27 00:12:54 +08:00
@@ -13,7 +13,6 @@
|
||||
***********************************************************************************************************************************************************************/
|
||||
const mdl_TierCategories = require('../../models/tiers/tier_categories.mdl');
|
||||
const mdl_TierPlans = require('../../models/tiers/tier_plans.mdl');
|
||||
const mdl_PlanPrices = require('../../models/tiers/plan_prices.mdl');
|
||||
const mdl_UserTiers = require('../../models/tiers/user_tiers.mdl');
|
||||
const mdl_Payments = require('../../models/tiers/payments.mdl');
|
||||
const mdl_SystemBadges = require('../../models/system_badges/system_badges.mdl');
|
||||
@@ -53,8 +52,9 @@ exports.getMyTier = async (req, res) => {
|
||||
UserNotification.create({
|
||||
user_id: req.user.user_id,
|
||||
...NOTIFICATION_REGISTRY.tier_expired.build({
|
||||
tier: tier.tier,
|
||||
label: tier.plan?.label ?? null,
|
||||
tier: tier.tier,
|
||||
label: tier.plan?.label ?? null,
|
||||
planId: tier.plan?.plan_id ?? null,
|
||||
}),
|
||||
}).catch(() => {});
|
||||
return R.success(res, 'Active tier retrieved.', {
|
||||
@@ -114,11 +114,6 @@ exports.getPlans = async (req, res) => {
|
||||
attributes: ['course_id', 'uuid', 'title', 'course_code', 'level', 'duration_seconds'],
|
||||
through: { attributes: [] },
|
||||
},
|
||||
{
|
||||
model: mdl_PlanPrices,
|
||||
as: 'prices',
|
||||
attributes: ['currency', 'price'],
|
||||
},
|
||||
],
|
||||
});
|
||||
|
||||
@@ -139,21 +134,14 @@ exports.getPlans = async (req, res) => {
|
||||
|
||||
exports.validatePromo = async (req, res) => {
|
||||
try {
|
||||
const { plan_id, code, currency } = req.body;
|
||||
const { plan_id, code } = req.body;
|
||||
if (!plan_id || !code) return R.error(res, 'plan_id and code are required.', 400);
|
||||
|
||||
const plan = await mdl_TierPlans.findOne({ where: { plan_id, is_active: true } });
|
||||
if (!plan) return R.error(res, 'Plan not found or inactive.', 404);
|
||||
|
||||
// Resolve localized price if a preferred currency was sent
|
||||
let effectivePrice = null;
|
||||
if (currency && currency !== plan.currency) {
|
||||
const priceEntry = await mdl_PlanPrices.findOne({ where: { plan_id, currency } });
|
||||
if (priceEntry) effectivePrice = priceEntry.price;
|
||||
}
|
||||
|
||||
const policy = await paymentSvc.getPolicyForPlan(plan_id);
|
||||
const result = await paymentSvc.evaluatePromo(policy, plan, code, effectivePrice);
|
||||
const result = await paymentSvc.evaluatePromo(policy, plan, code, null);
|
||||
|
||||
return R.success(res, result.valid ? 'Promo code is valid.' : result.reason, result);
|
||||
} catch (err) {
|
||||
@@ -166,22 +154,14 @@ exports.validatePromo = async (req, res) => {
|
||||
|
||||
exports.createOrder = async (req, res) => {
|
||||
try {
|
||||
const { plan_id, promo_code, currency: requestedCurrency } = req.body;
|
||||
const { plan_id, promo_code } = req.body;
|
||||
if (!plan_id) return R.error(res, 'plan_id is required.', 400);
|
||||
|
||||
const plan = await mdl_TierPlans.findOne({ where: { plan_id, is_active: true } });
|
||||
if (!plan) return R.error(res, 'Plan not found or inactive.', 404);
|
||||
|
||||
// Resolve localized price — falls back to plan base price when no override exists
|
||||
let effectivePrice = Number(plan.price);
|
||||
let effectiveCurrency = plan.currency;
|
||||
if (requestedCurrency && requestedCurrency !== plan.currency) {
|
||||
const priceEntry = await mdl_PlanPrices.findOne({ where: { plan_id, currency: requestedCurrency } });
|
||||
if (priceEntry) {
|
||||
effectivePrice = Number(priceEntry.price);
|
||||
effectiveCurrency = priceEntry.currency;
|
||||
}
|
||||
}
|
||||
const effectivePrice = Number(plan.price);
|
||||
const effectiveCurrency = plan.currency;
|
||||
|
||||
const policy = await paymentSvc.getPolicyForPlan(plan_id);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user