public function testGetAccountForBuySubclassTraditionalIRA()
 {
     /** @var Subclass $subclass */
     $subclass = $this->getMock('Model\\WealthbotRebalancer\\Subclass', null);
     $subclass->setAccountType(Subclass::ACCOUNT_TYPE_TRADITIONAL_IRA);
     $security = $this->getMock('Model\\WealthbotRebalancer\\Security', null);
     $security->setId(2);
     $subclass->setSecurity($security);
     $account = $this->collection->getAccountForBuySubclass($subclass);
     $this->assertEquals(4, $account->getId());
 }
 public function getAccountsByRebalancerAction(RebalancerAction $rebalancerAction)
 {
     $client = $rebalancerAction->getClient();
     if ($client->isHouseholdLevelRebalancer()) {
         $collection = $this->findClientAccounts($client);
     } else {
         $account = $this->findAccountById($rebalancerAction->getAccountId());
         $account->setClient($client);
         $collection = new AccountCollection();
         $collection->add($account);
     }
     return $collection;
 }
 public function testBuyRequiredCash()
 {
     $securityCollection1 = new SecurityCollection();
     $securityCollection2 = new SecurityCollection();
     $subclass1 = $this->getMockSubclass(array('id' => 1, 'current_allocation' => 5, 'target_allocation' => 20));
     $security1 = $this->getMockSecurity(array('id' => 1, 'amount' => 1000, 'qty' => 100, 'name' => 'Security1', 'symbol' => 'Sec1'));
     $subclass2 = $this->getMockSubclass(array('id' => 2, 'current_allocation' => 25, 'target_allocation' => 45));
     $security2 = $this->getMockSecurity(array('id' => 2, 'amount' => 5000, 'qty' => 10, 'name' => 'Security2', 'symbol' => 'Sec2'));
     $subclass3 = $this->getMockSubclass(array('id' => 3, 'current_allocation' => 70, 'target_allocation' => 35));
     $security3 = $this->getMockSecurity(array('id' => 5, 'amount' => 14000, 'qty' => 20, 'name' => 'Security3', 'symbol' => 'Sec3'));
     $security1->setSubclass($subclass1);
     $subclass1->setSecurity($security1);
     $security2->setSubclass($subclass2);
     $subclass2->setSecurity($security2);
     $security3->setSubclass($subclass3);
     $subclass3->setSecurity($security3);
     $securityCollection1->add($security1);
     $securityCollection1->add($security2);
     $securityCollection2->add($security3);
     $lotsData = array(array('id' => 1, 'is_muni' => false, 'quantity' => 100, 'amount' => 1000, 'status' => Lot::LOT_IS_OPEN, 'security' => $security1, 'date' => '2012-01-01', 'initial' => array('id' => 1, 'date' => '2012-01-01')), array('id' => 2, 'is_muni' => false, 'quantity' => 10, 'amount' => 5000, 'status' => Lot::LOT_IS_OPEN, 'security' => $security2, 'date' => '2012-01-01', 'initial' => array('id' => 1, 'date' => '2012-01-01')), array('id' => 3, 'is_muni' => false, 'quantity' => 20, 'amount' => 14000, 'status' => Lot::LOT_IS_OPEN, 'security' => $security3, 'date' => '2012-01-01', 'initial' => array('id' => 1, 'date' => '2012-01-01')));
     $lots = [];
     foreach ($lotsData as $key => $data) {
         /** @var Lot $lot */
         $lot = $this->getMock('Model\\WealthbotRebalancer\\Lot', null);
         $lot->loadFromArray($data);
         $lots[$key + 1] = $lot;
     }
     $accountsData = array(array('id' => 1, 'is_ready_to_rebalance' => true, 'total_cash' => 100000, 'cash_buffer' => 2000, 'sas_cash' => 1000, 'billing_cash' => 500, 'scheduled_distribution' => 2300, 'one_time_distribution' => 0, 'client' => array('portfolio' => array('id' => 1), 'ria' => array('ria_company_information' => array('use_transaction_fees' => true, 'transaction_min_amount' => 400, 'transaction_min_amount_percent' => 1.5)))), array('id' => 2, 'is_ready_to_rebalance' => true, 'total_cash' => 150000, 'cash_buffer' => 1000, 'sas_cash' => 300, 'billing_cash' => 100, 'scheduled_distribution' => 0, 'one_time_distribution' => 2400, 'client' => array('portfolio' => array('id' => 1), 'ria' => array('ria_company_information' => array('use_transaction_fees' => true, 'transaction_min_amount' => 400, 'transaction_min_amount_percent' => 1.5)))));
     $accountCollection = new AccountCollection();
     foreach ($accountsData as $key => $data) {
         /** @var Account $account */
         $account = $this->getMock('Model\\WealthbotRebalancer\\Account', null);
         $account->loadFromArray($data);
         $securityCollectionVar = 'securityCollection' . ($key + 1);
         $account->setSecurities(${$securityCollectionVar});
         $accountCollection->add($account);
     }
     $client = $this->getMockClient(array('portfolio' => array('id' => 1)));
     $client->setAccounts($accountCollection);
     $lotRepository = $this->getMockLotRepository(array('findOrderedLots'));
     $lotRepository->expects($this->any())->method('findOrderedLots')->will($this->returnCallback(function (Security $security) use($lots) {
         $lotCollection = new LotCollection();
         $lotCollection->add($lots[$security->getSubclass()->getId()]);
         return $lotCollection;
     }));
     $securityTransactionRepository = $this->getMockSecurityTransactionRepository(array('findOneByPortfolioAndSecurity'));
     /** @var WealthbotRebalancer $rebalancer */
     $rebalancer = $this->getMockWealthbotRebalancer(array('getRepository', 'getJob', 'getClient', 'checkShortTermRedemption', 'checkTransaction', 'getRebalancerAction'), false);
     $rebalancer->expects($this->any())->method('getRepository')->will($this->returnCallback(function ($repositoryName) use($lotRepository, $securityTransactionRepository) {
         if ($repositoryName === 'Lot') {
             return $lotRepository;
         } elseif ($repositoryName === 'SecurityTransaction') {
             return $securityTransactionRepository;
         }
         return null;
     }));
     $rebalancer->expects($this->any())->method('getJob')->will($this->returnValue($this->getMockJob(array('id' => 1))));
     $rebalancer->expects($this->any())->method('getClient')->will($this->returnValue($client));
     $rebalancer->expects($this->any())->method('checkShortTermRedemption')->will($this->returnValue(true));
     $rebalancer->expects($this->any())->method('getRebalancerAction')->will($this->returnValue($this->getMockRebalancerAction(array('id' => 2))));
     $rebalancer->buyRequiredCash();
     $queue = $rebalancer->getRebalancerQueue();
     $this->assertCount(3, $queue);
     $item1 = $queue[0];
     $this->assertEquals('Sec1', $item1->getSecurity()->getSymbol());
     $this->assertEquals(100, $item1->getQuantity());
     $this->assertEquals(0, $item1->getSecurity()->getQty());
     $item2 = $queue[1];
     $this->assertEquals('Sec2', $item2->getSecurity()->getSymbol());
     $this->assertEquals(8, $item2->getQuantity());
     $this->assertEquals(2, $item2->getSecurity()->getQty());
     $item3 = $queue[2];
     $this->assertEquals('Sec3', $item3->getSecurity()->getSymbol());
     $this->assertEquals(4, $item3->getQuantity());
     $this->assertEquals(16, $item3->getSecurity()->getQty());
     $this->assertEquals(6000, $accountCollection->get(1)->getTotalCash());
     $this->assertEquals(4300, $accountCollection->get(2)->getTotalCash());
 }