/**
  * 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);
 }
Beispiel #4
0
 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]];
 }
Beispiel #5
0
 /**
  * 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);
 }
Beispiel #6
0
 /**
  *
  * @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);
 }