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 }