async subscribeUserToPlan(planId: string, userId: string) {
const plan = await this.planService.findOne(planId);
const user = await this.findOne(userId);
await this.userRepository
.createQueryBuilder('user')
.update(User)
.set({
plan: plan,
isHibaActive: true,
balance: () => `balance + ${plan.bv}`,
shopping_wallet: () => `shopping_wallet + ${plan.coupon}`,
})
.where('id = :id', { id: userId })
.execute();
await this.mlmService.bonus(userId);
await this.mlmService.binaryBonus(user.sponsor.id, user.position);
await this.mlmService.matchingBonus(user.referrer.id);
await this.mlmService.groupSalesBonus(user);
}
the following are the referenced methods: bonus binaryBonus matchingBonus groupSalesBonus
async bonus(id: string) {
const user = await this.findOne(id);
if (user.referrer) {
const referral_comission = this.getComission(
user.plan.bv,
user.referrer.plan.referralBonus,
);
if (user.referrer.plan.price < user.plan.price) {
const higher_ref_comission = this.getComission(
referral_comission,
user.referrer.plan.higherReferralBonus,
);
await this.referralBonus(
id,
user,
higher_ref_comission,
'higher_ref_bonus',
);
const upgrade_comission = this.getComission(
referral_comission,
100 - user.referrer.plan.higherReferralBonus,
);
await this.upgradeWalletBonus(id, user, upgrade_comission);
// console.log('namee', referral_comission, upgrade_comission);
} else {
await this.referralBonus(
id,
user,
referral_comission,
'referral_bonus',
);
}
}
}
async binaryBonus(id: string, position: string) {
const user = await this.findOne(id);
const userTree = await this.getUserTree(id);
console.log('innnn..');
if (userTree[1] && userTree[2] && userTree[0].binary_bonus == 0) {
console.log('2innnn..');
const amount = 4;
// pre-transaction
const pre_transaction = await this.transactionService.create({
user: user,
preBalance: user.balance,
});
// award bonus
this.usersRepository
.createQueryBuilder('user')
.update(User)
.set({
balance: () => `balance + ${amount}`,
total_bonus: () => `total_bonus + ${amount}`,
binary_bonus: () => `binary_bonus + ${amount}`,
})
.where('id = :id', { id: user.id })
.execute();
// post-transaction
await this.transactionService.update(pre_transaction.id, {
charge: 0,
postBalance: Number((await this.findOne(user.id)).balance) + amount,
amount,
trx: generateTrx(),
trxType: '+',
details: 'binary_bonus',
});
// add bv log
await this.bvLogService.create({
user,
amount,
position,
details: 'binary_bonus',
});
}
return;
}
async matchingBonus(id: string) {
const user = await this.findOne(id);
const userTree = await this.getUserTree(id);
if (
userTree[1] &&
userTree[2] &&
userTree[3] &&
userTree[4] &&
userTree[5] &&
userTree[6] &&
user.matching_bonus == 0
) {
let amount: number, position: string;
if (userTree[2].total_bonus > userTree[1]?.total_bonus) {
amount = userTree[1]?.total_bonus * 0.15;
position = userTree[1]?.position;
} else {
amount = userTree[2]?.total_bonus * 0.15;
position = userTree[2]?.position;
}
// pre-transaction
const pre_transaction = await this.transactionService.create({
user: user,
preBalance: user.balance,
});
// award bonus
this.usersRepository
.createQueryBuilder('user')
.update(User)
.set({
// total_referral_bonus: 9,
balance: () => `balance + ${amount}`,
total_bonus: () => `total_bonus + ${amount}`,
matching_bonus: () => `matching_bonus + ${amount}`,
})
.where('id = :id', { id: user.id })
.execute();
// post-transaction
await this.transactionService.update(pre_transaction.id, {
charge: 0,
postBalance: Number((await this.findOne(user.id)).balance) + amount,
amount,
trx: generateTrx(),
trxType: '+',
details: 'matching_bonus',
});
// add bv log
await this.bvLogService.create({
user,
amount,
position,
details: 'matching_bonus',
});
}
return;
}
async groupSalesBonus(user: User) {
if (user.referrer) {
// check new user's position on referrer's tree to determine reward
const referrerTree = await this.getUserTree(user.referrer.id);
const treeIds = [];
for (const u of referrerTree) {
treeIds.push(u?.id);
}
const userPositionOnReferrerTree = treeIds.indexOf(user.id);
let value: number, reward: number;
if (user.referrer.total_bv_left > user.referrer.total_bv_right) {
value = user.referrer.total_bv_right;
} else {
value = user.referrer.total_bv_left;
}
function between(x: number, min: number, max: number) {
return x >= min && x <= max;
}
// 6th - 8th
if (between(userPositionOnReferrerTree, 63, 510)) {
reward = this.getComission(value, 5);
}
console.log('final', reward);
// 9th - 12th
if (between(userPositionOnReferrerTree, 63, 510)) {
reward = this.getComission(value, 3);
}
// 13th - 16th
if (between(userPositionOnReferrerTree, 63, 510)) {
reward = this.getComission(value, 2);
}
// 17th - 20th
if (between(userPositionOnReferrerTree, 63, 510)) {
reward = this.getComission(value, 1);
}
// 21th - 25th
if (between(userPositionOnReferrerTree, 63, 510)) {
reward = this.getComission(value, 0.5);
}
reward = 6
if (reward) {
// pre-transaction
const pre_transaction = await this.transactionService.create({
user: user.referrer,
preBalance: user.referrer.balance,
});
this.usersRepository
.createQueryBuilder()
.update(User)
.set({
balance: () => `balance + ${reward}`,
total_bonus: () => `total_bonus + ${reward}`,
})
.where('id = :id', { id: user.referrer.id })
.execute();
// post-transaction
await this.transactionService.update(pre_transaction.id, {
charge: 0,
postBalance: Number((await this.findOne(user.referrer.id)).balance) + reward,
amount: reward,
trx: generateTrx(),
trxType: '+',
details: 'group_sales_bonus',
});
// add bv log
await this.bvLogService.create({
user: user.referrer,
amount: reward,
position: user.position,
details: 'group_sales_bonus',
});
}
}
}
when the subscribUserToPlan method runs, the query builder operation in it works fine but other querybuilder operations in bonus binaryBonus matchingBonus groupSalesBonus methods don’t work but the create and update transaction operations in all of them succeed.