/** * Distribute provisions for member signup. * * ATTENTION: This method does NOT save changes to $advertisedMember. The * caller is required to save this object! * * @param Member $advertisedMember * @param PropelPDO $con */ public function payAdvertisingFor(\Member $referrer, \Tbmt\MemberFee $memberFee, \Member $advertisedMember, $currency, $when, \PropelPDO $con) { $advertisedMemberId = $advertisedMember->getId(); $transfer = $referrer->getCurrentTransferBundle($currency, $con); if ($referrer->getFundsLevel() === \Member::FUNDS_LEVEL1) { // @see resources/snowball.txt - processes - P1 $transaction = $transfer->createTransactionForReason($referrer, \Transaction::REASON_ADVERTISED_LVL1, $advertisedMemberId, $when, $con); $memberFee->subtract($transaction->getAmount(), \Transaction::REASON_ADVERTISED_LVL1); $parent = $referrer->getMemberRelatedByParentId($con); if ($parent) { $parentTransfer = $parent->getCurrentTransferBundle($currency, $con); $parentTransaction = $parentTransfer->createTransactionForReason($parent, \Transaction::REASON_ADVERTISED_INDIRECT, $advertisedMemberId, $when, $con); $memberFee->subtract($parentTransaction->getAmount(), \Transaction::REASON_ADVERTISED_INDIRECT); $parentTransfer->save($con); $parent->save($con); } } else { // if ( $this->getFundsLevel() >= Member::FUNDS_LEVEL2 ) { // @see resources/snowball.txt - processes - P3 $transaction = $transfer->createTransactionForReason($referrer, \Transaction::REASON_ADVERTISED_LVL2, $advertisedMemberId, $when, $con); $memberFee->subtract($transaction->getAmount(), \Transaction::REASON_ADVERTISED_LVL2); } $transfer->save($con); \MemberBonusIds::payBonuses($memberFee, $advertisedMember, $currency, $when, $con); }
public function testMemberGetBonusLevelIdGetsApplied() { $marketingLeader = DbEntityHelper::createMember(null, ['type' => Member::TYPE_MARKETINGLEADER, 'LastName' => 'vl']); $marketingLeader->reload(self::$propelCon); /* $m1 gets bonus level applied after recruiting several members ---------------------------------------------*/ $m1 = DbEntityHelper::createSignupMember($marketingLeader, true, ['lastName' => 'm1']); $m1_1 = DbEntityHelper::createSignupMember($m1, true, ['lastName' => 'm1_1']); $m1_2 = DbEntityHelper::createSignupMember($m1, true, ['lastName' => 'm1_2']); $m1_2_1 = DbEntityHelper::createSignupMember($m1_2, true, ['lastName' => 'm1_2_1']); $m1_2_2 = DbEntityHelper::createSignupMember($m1_2, true, ['lastName' => 'm1_2_2']); $m1_3_1 = DbEntityHelper::createSignupMember($m1_2, true, ['lastName' => 'm1_3_1']); /* $m1 gets bonus level 3 now ---------------------------------------------*/ $m1->activity_setBonusLevel(3, self::$propelCon); /* further recruiting requires the bonus of the member applied ---------------------------------------------*/ $m1_3 = DbEntityHelper::createSignupMember($m1, true, ['lastName' => 'm1_3']); $m1_2_3 = DbEntityHelper::createSignupMember($m1_2_1, true, ['lastName' => 'm1_2_3']); $m1_3_1_1 = DbEntityHelper::createSignupMember($m1_3_1, true, ['lastName' => 'm1_3_1_1']); $bonusId = $m1->getId(); $bonusIdsApplyed = [$m1_1, $m1_2, $m1_2_1, $m1_2_2, $m1_3_1, $m1_3, $m1_2_3, $m1_3_1_1]; foreach ($bonusIdsApplyed as $m) { $m->reload(); $ids = \MemberBonusIds::toArray($m->getBonusIds()); $this->assertTrue(is_array($ids), 'Invalid bonus ids "' . json_encode($ids) . '" for member: ' . $m->getlastName()); $this->assertArrayHasKey($bonusId, $ids, 'Invalid bonus ids for member: ' . $m->getlastName()); } }
/** * Distribute provisions for member signup. * * ATTENTION: This method does NOT save changes to $advertisedMember. The * caller is required to save this object! * * @param Member $advertisedMember * @param PropelPDO $con */ public function payAdvertisingFor(\Member $referrer, \Tbmt\MemberFee $memberFee, \Member $advertisedMember, $currency, $when, $freeFromInvitation, \PropelPDO $con) { $advertisedMemberId = $advertisedMember->getId(); $transfer = $referrer->getCurrentTransferBundle($currency, $con); $transaction = $transfer->createTransactionForReason($referrer, \Transaction::REASON_ADVERTISED_LVL1, $advertisedMemberId, $when, $con); $memberFee->subtract($transaction->getAmount(), \Transaction::REASON_ADVERTISED_LVL1); $transfer->save($con); \MemberBonusIds::payBonuses($memberFee, $advertisedMember, $currency, $when, $con); }
public static function setUpBonusMembers($doReset = true, $options = false) { if (!\MemberQuery::create()->findOneByNum(SystemStats::ACCOUNT_NUM_SYSTEM)) { \Tbmt\SystemSetup::setCon(self::$con); \Tbmt\SystemSetup::doSetup(); } $options = array_merge(['IT' => true, 'VL' => true, 'OL' => true, 'PM' => true, 'VS2' => true, 'VS1' => true], $options ? $options : []); $currentParent = null; $currentBonusIds = '[]'; /* it specialists ---------------------------------------------*/ $IT_t = 0; $IT = null; if ($options['IT']) { if ($doReset === true || self::$it_member === null) { $IT_t = 0; $IT = self::$it_member = DbEntityHelper::createMember($currentParent, ['Type' => Member::TYPE_ITSPECIALIST, 'FundsLevel' => Member::FUNDS_LEVEL2]); } else { $IT = self::$it_member; $IT_t = self::$it_member->getOutstandingTotal()[DbEntityHelper::$currency]; } $currentBonusIds = MemberBonusIds::populate($IT, '[]'); } /* marketing leader ---------------------------------------------*/ $VL_t = 0; $VL = null; if ($options['VL']) { $VL = DbEntityHelper::createMember($currentParent, ['Type' => Member::TYPE_MARKETINGLEADER, 'FundsLevel' => Member::FUNDS_LEVEL2, 'BonusIds' => $currentBonusIds]); $currentBonusIds = MemberBonusIds::populate($VL, $VL->getBonusIds()); $currentParent = $VL; } /* org leader ---------------------------------------------*/ $OL_t = 0; $OL = null; if ($options['OL']) { $OL = DbEntityHelper::createMember($currentParent, ['Type' => Member::TYPE_ORGLEADER, 'FundsLevel' => Member::FUNDS_LEVEL2, 'BonusIds' => $currentBonusIds]); $currentBonusIds = MemberBonusIds::populate($OL, $OL->getBonusIds()); $currentParent = $OL; } /* promoter ---------------------------------------------*/ $PM_t = 0; $PM = null; if ($options['PM']) { $IT_t += Transaction::getAmountForReason(Transaction::REASON_IT_BONUS); $VL_t += Transaction::getAmountForReason(Transaction::REASON_VL_BONUS); if (!$OL) { $OL_t =& $VL_t; } $OL_t += Transaction::getAmountForReason(Transaction::REASON_ADVERTISED_LVL2) + Transaction::getAmountForReason(Transaction::REASON_OL_BONUS) + Transaction::getAmountForReason(Transaction::REASON_PM_BONUS); // TODO question: // kriegt der ol in diesem fall 22 oder 21 euro ? // 22 weil der ja den bonus der promoters kriegt wenn er jemand // wirbt ohne das ein promoter dazwischen ist? if ($currentParent) { $PM = DbEntityHelper::createSignupMember($currentParent); } else { $PM = DbEntityHelper::createMember($currentParent, ['BonusIds' => $currentBonusIds]); $IT_t -= Transaction::getAmountForReason(Transaction::REASON_IT_BONUS); $VL_t -= Transaction::getAmountForReason(Transaction::REASON_VL_BONUS); $OL_t -= Transaction::getAmountForReason(Transaction::REASON_ADVERTISED_LVL2) + Transaction::getAmountForReason(Transaction::REASON_OL_BONUS) + Transaction::getAmountForReason(Transaction::REASON_PM_BONUS); } $PM->setType(Member::TYPE_PROMOTER)->setFundsLevel(Member::FUNDS_LEVEL2)->save(self::$con); $currentParent = $PM; } /* funds level 2 ---------------------------------------------*/ $VS2_t = 0; $VS2 = null; if ($options['VS2']) { $IT_t += Transaction::getAmountForReason(Transaction::REASON_IT_BONUS) * 3; $VL_t += Transaction::getAmountForReason(Transaction::REASON_VL_BONUS) * 3; if (!$OL) { $OL_t =& $VL_t; } $OL_t += Transaction::getAmountForReason(Transaction::REASON_OL_BONUS) * 3; if (!$PM) { $PM_t =& $OL_t; } $PM_t += Transaction::getAmountForReason(Transaction::REASON_ADVERTISED_LVL2) + Transaction::getAmountForReason(Transaction::REASON_PM_BONUS) + 2 * (Transaction::getAmountForReason(Transaction::REASON_PM_BONUS) + Transaction::getAmountForReason(Transaction::REASON_ADVERTISED_INDIRECT)); $VS2_t += 2 * Transaction::getAmountForReason(Transaction::REASON_ADVERTISED_LVL1); $VS2 = DbEntityHelper::createSignupMember($currentParent); DbEntityHelper::createSignupMember($VS2); DbEntityHelper::createSignupMember($VS2); $currentParent = $VS2; } /* funds level 1 ---------------------------------------------*/ $VS1_t = 0; $VS1 = null; if ($options['VS1']) { $IT_t += Transaction::getAmountForReason(Transaction::REASON_IT_BONUS); $VL_t += Transaction::getAmountForReason(Transaction::REASON_VL_BONUS); if (!$OL) { $OL_t =& $VL_t; } $OL_t += Transaction::getAmountForReason(Transaction::REASON_OL_BONUS); if (!$PM) { $PM_t =& $OL_t; } $PM_t += Transaction::getAmountForReason(Transaction::REASON_PM_BONUS); if (!$VS2) { $VS2_t =& $PM_t; } $VS2_t += Transaction::getAmountForReason(Transaction::REASON_ADVERTISED_LVL2); $VS1 = DbEntityHelper::createSignupMember($currentParent); } return [[$IT, $VL, $OL, $PM, $VS2, $VS1], [$IT_t, $VL_t, $OL_t, $PM_t, $VS2_t, $VS1_t]]; }
/** * Distribute provisions for member signup. * * ATTENTION: This method does NOT save changes to $advertisedMember. The * caller is required to save this object! * * @param Member $advertisedMember * @param PropelPDO $con */ public function payAdvertisingFor(\Tbmt\MemberFee $memberFee, Member $advertisedMember, $currency, $when, PropelPDO $con) { $advertisedMemberId = $advertisedMember->getId(); $transfer = $this->getCurrentTransferBundle($currency, $con); if ($this->getFundsLevel() === Member::FUNDS_LEVEL1) { // @see resources/snowball.txt - processes - P1 $transaction = $transfer->createTransactionForReason($this, Transaction::REASON_ADVERTISED_LVL1, $advertisedMemberId, $when, $con); $memberFee->subtract($transaction->getAmount(), Transaction::REASON_ADVERTISED_LVL1); $parent = $this->getMemberRelatedByParentId($con); if ($parent) { $parentTransfer = $parent->getCurrentTransferBundle($currency, $con); $parentTransaction = $parentTransfer->createTransactionForReason($parent, Transaction::REASON_ADVERTISED_INDIRECT, $advertisedMemberId, $when, $con); $memberFee->subtract($parentTransaction->getAmount(), Transaction::REASON_ADVERTISED_INDIRECT); // As long as i am level 1 i wont receive more from them than just // the 5 euro. All further advertised members etc. will go on to the // account of my referer $advertisedMember->setMemberRelatedByParentId($parent); $parentTransfer->save($con); $parent->save($con); } } else { // if ( $this->getFundsLevel() === Member::FUNDS_LEVEL2 ) { // @see resources/snowball.txt - processes - P3 $advertisedMember->setMemberRelatedByParentId($this); $transaction = $transfer->createTransactionForReason($this, Transaction::REASON_ADVERTISED_LVL2, $advertisedMemberId, $when, $con); $memberFee->subtract($transaction->getAmount(), Transaction::REASON_ADVERTISED_LVL2); } $transfer->save($con); MemberBonusIds::payBonuses($memberFee, $advertisedMember, $currency, $when, $con); }
/** * * @param Member $referrer * @param PropelPDO $con */ public function setReferrerMember(Member $referrer, PropelPDO $con) { $referrerId = $referrer->getId(); $this->setReferrerId($referrerId); $this->setParentId($referrerId); $bonusIds = $referrer->getBonusIds(); $referrerType = $referrer->getType(); if ($referrerType > self::TYPE_MEMBER) { $newBonusIds = MemberBonusIds::populate($referrer, $bonusIds); if ($newBonusIds !== false) { $bonusIds = $newBonusIds; } } if ($bonusIds) { $this->setBonusIds($bonusIds); } $referrer->addOutstandingAdvertisedCount(1); $referrer->save($con); }