/** * Determine if liquidating account is needed * 1a step from spec * * @param Account $account * @param Ria $ria * @throws \Exception */ public function liquidateAccountIfNeed(Account $account) { if ($this->getJob()->getRia()->getRiaCompanyInformation()->getUseTransactionFees()) { $noPreferredSecurities = $account->findNoPreferredBuySecurities(); if ($noPreferredSecurities->count()) { /** @var Security $noPreferredSecurity */ foreach ($noPreferredSecurities as $noPreferredSecurity) { $qty = $noPreferredSecurity->getQty(); $amount = $noPreferredSecurity->getAmount(); if ($noPreferredSecurity->isCanBeSold($qty, $amount)) { $noPreferredSecurity->sell($qty, $amount); $queueItem = new QueueItem(); $queueItem->setStatus(QueueItem::STATUS_SELL); $queueItem->setRebalancerActionId($this->getRebalancerAction()->getId()); $queueItem->setQuantity($noPreferredSecurity->getQty()); $queueItem->setAmount($noPreferredSecurity->getAmount()); $queueItem->setSecurity($noPreferredSecurity); $queueItem->setAccount($account); $this->getRebalancerQueue()->addItem($queueItem); } } $account->setIsReadyToRebalance(true); } elseif ($account->isAllSecuritiesEqualCash()) { $account->setIsReadyToRebalance(true); } } }