Пример #1
0
 public function getInvitee($username)
 {
     $lender = LenderQuery::create()->useUserQuery()->filterByUsername($username)->endUse()->findOne();
     $lenderInviteVisit = InviteVisitQuery::create()->findOneById(Session::get('lenderInviteVisitId'));
     if (!$lender) {
         return Redirect::route('/');
     }
     $ycAccountCredit = TransactionQuery::create()->filterByUserId(Setting::get('site.YCAccountId'))->getTotalBalance();
     if ($ycAccountCredit->getAmount() < 5000) {
         return View::make('lender.invite-inactive');
     }
     if (!Auth::check()) {
         $lenderInvite = $shareType = null;
         if (Request::query('h')) {
             $lenderInvite = InviteQuery::create()->filterByLender($lender)->findOneByHash(Request::query('h'));
             $shareType = $lenderInvite ? 1 : null;
         } else {
             $shareType = Request::query('s') ?: 0;
         }
         $isNewVisit = !$lenderInviteVisit || $lenderInviteVisit->getLenderId() != $lender->getId();
         if ($isNewVisit && $shareType !== null) {
             $lenderInviteVisit = $this->lenderService->addLenderInviteVisit($lender, $shareType, $lenderInvite);
             Session::put('lenderInviteVisitId', $lenderInviteVisit->getId());
             return Redirect::route('lender:invitee', ['username' => $lender->getUser()->getUsername()]);
         }
     }
     return View::make('lender.invitee', compact('lender'));
 }
Пример #2
0
 public function getCurrentBalance()
 {
     if ($this->currentBalance === null) {
         if (!\Auth::check()) {
             $this->currentBalance = Money::create(0);
         } else {
             $this->currentBalance = TransactionQuery::create()->filterByUserId(\Auth::user()->getId())->getTotalAmount();
         }
     }
     return $this->currentBalance;
 }
Пример #3
0
 public function disburseLoan(Loan $loan, \DateTime $disbursedDate, Money $nativeAmount)
 {
     $isDisbursed = TransactionQuery::create()->filterByLoan($loan)->filterDisbursement()->count();
     if ($isDisbursed) {
         // TODO
         return;
     }
     PropelDB::transaction(function ($con) use($loan, $disbursedDate, $nativeAmount) {
         $this->transactionService->addDisbursementTransaction($con, $nativeAmount, $loan);
         $loans = LoanQuery::create()->filterByBorrower($loan->getBorrower())->count();
         if ($loans == 1) {
             $this->transactionService->addFeeTransaction($con, $nativeAmount, $loan);
         }
         //TODO service fee rate
         $loan->setStatus(Loan::ACTIVE)->setNativeDisbursedAmount($nativeAmount)->setDisbursedDate($disbursedDate)->calculateExtraDays($disbursedDate)->setServiceFeeRate(2.5);
         $loan->save($con);
         $this->changeLoanStage($con, $loan, Loan::FUNDED, Loan::ACTIVE);
         $installments = $this->generateLoanInstallments($loan);
         foreach ($installments as $installment) {
             $installment->save($con);
         }
     });
     //TODO Add repayment schedule
     //TODO Send email / sift sience event
 }
Пример #4
0
 /**
  * @param Loan $loan
  * @param Money $amount
  * @return RepaymentCalculator
  */
 public function getRepaymentCalculator(Loan $loan, Money $amount)
 {
     $paidServiceFee = TransactionQuery::create()->filterByLoan($loan)->filterServiceFee()->getNativeTotalAmount($loan->getCurrency());
     $forgivenAmount = ForgivenLoanQuery::create()->filterByLoan($loan)->getNativeTotalAmount($loan);
     $amounts = InstallmentQuery::create()->filterByLoan($loan)->getNativeAmounts($loan->getCurrency());
     $calculator = new RepaymentCalculator($loan);
     $calculator->setPaidAmount($amounts['paidAmount'])->setTotalAmount($amounts['totalAmount'])->setRepaymentAmount($amount)->setPaidServiceFee($paidServiceFee)->setForgivenAmount($forgivenAmount);
     return $calculator;
 }
Пример #5
0
 public function testRefundLenders(UnitTester $I)
 {
     $method = new ReflectionMethod($this->loanService, 'refundLenders');
     $method->setAccessible(true);
     $con = Propel::getWriteConnection(TransactionTableMap::DATABASE_NAME);
     $con->beginTransaction();
     $loan = \Zidisha\Loan\LoanQuery::create()->findOneById(5);
     $lender1 = \Zidisha\Lender\LenderQuery::create()->findOneById(203);
     $lender2 = \Zidisha\Lender\LenderQuery::create()->findOneById(204);
     $lender3 = \Zidisha\Lender\LenderQuery::create()->findOneById(205);
     try {
         $this->transactionService->addPlaceBidTransaction($con, Money::create(50), $loan, $lender1);
         $this->transactionService->addPlaceBidTransaction($con, Money::create(30), $loan, $lender2);
         $this->transactionService->addPlaceBidTransaction($con, Money::create(40), $loan, $lender3);
         $this->transactionService->addOutBidTransaction($con, Money::create(20), $loan, $lender1);
         $this->transactionService->addUpdateBidTransaction($con, Money::create(10), $loan, $lender2);
         $this->transactionService->addOutBidTransaction($con, Money::create(10), $loan, $lender1);
         $refunds = $method->invoke($this->loanService, $con, $loan, Loan::EXPIRED);
         verify($refunds[$lender1->getId()]['refundAmount'])->equals(Money::create(20));
         verify($refunds[$lender2->getId()]['refundAmount'])->equals(Money::create(40));
         verify($refunds[$lender3->getId()]['refundAmount'])->equals(Money::create(40));
         $lender1VerifyRefund = \Zidisha\Balance\TransactionQuery::create()->filterByUserId($lender1->getId())->filterByType(Transaction::LOAN_OUTBID)->filterBySubType(Transaction::LOAN_BID_EXPIRED)->count();
         $lender2VerifyRefund = \Zidisha\Balance\TransactionQuery::create()->filterByUserId($lender2->getId())->filterByType(Transaction::LOAN_OUTBID)->filterBySubType(Transaction::LOAN_BID_EXPIRED)->count();
         $lender3VerifyRefund = \Zidisha\Balance\TransactionQuery::create()->filterByUserId($lender1->getId())->filterByType(Transaction::LOAN_OUTBID)->filterBySubType(Transaction::LOAN_BID_EXPIRED)->count();
         verify($lender1VerifyRefund)->equals(1);
         verify($lender2VerifyRefund)->equals(1);
         verify($lender3VerifyRefund)->equals(1);
         $con->rollBack();
     } catch (\Exception $e) {
         $con->rollBack();
         throw $e;
     }
 }
Пример #6
0
 public function deactivateLender(Lender $lender)
 {
     if (!$lender->isActive()) {
         return false;
     }
     $currentBalance = TransactionQuery::create()->filterByUser($lender->getUser())->getTotalAmount();
     if ($currentBalance->isPositive()) {
         PropelDB::transaction(function ($con) use($lender, $currentBalance) {
             $this->transactionService->addConvertToDonationTransaction($con, $lender, $currentBalance);
             $lender->setAdminDonate(true)->setActive(false);
             $lender->save($con);
         });
     }
     return true;
 }