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')); }
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; }
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 }
/** * @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; }
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; } }
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; }