/**
  * Check account outside fund and create new if does not exist
  *
  * @param ClientAccount $account
  * @param SecurityAssignment $securityAssignment
  * @param bool $isPreferred
  * @return mixed|void
  * @throws \Wealthbot\AdminBundle\Exception\DataAlreadyExistsException
  */
 protected function checkAccountAssociation(ClientAccount $account, SecurityAssignment $securityAssignment, $isPreferred)
 {
     if ($this->existAccountAssociation($account->getId(), $securityAssignment->getId())) {
         throw new DataAlreadyExistsException(sprintf("SecurityAssignment with id: %s already exist for client account with id: %s", $securityAssignment->getId(), $account->getId()));
     }
     $this->createAccountAssociation($account, $securityAssignment, $isPreferred);
 }
 /**
  * Check if account outside fund exist and create new if it does not exist
  *
  * @param ClientAccount $account
  * @param SecurityAssignment $securityAssignment
  * @param $isPreferred
  * @return mixed|null|AccountOutsideFund
  */
 protected function checkAccountAssociation(ClientAccount $account, SecurityAssignment $securityAssignment, $isPreferred)
 {
     $association = $this->existAccountAssociation($account->getId(), $securityAssignment->getId());
     if (!$association) {
         $association = $this->createAccountAssociation($account, $securityAssignment, $isPreferred);
     } else {
         $this->updateAccountAssociation($association, $isPreferred);
     }
     return $association;
 }
 public function setUp()
 {
     $subclassMock1 = $this->getMock('Wealthbot\\AdminBundle\\Entity\\Subclass', array('getId'));
     $subclassMock1->expects($this->any())->method('getId')->will($this->returnValue(1));
     $subclassMock1->setName('Subclass1');
     $subclassMock1->setExpectedPerformance(0.5);
     $subclassMock2 = $this->getMock('Wealthbot\\AdminBundle\\Entity\\Subclass', array('getId'));
     $subclassMock2->expects($this->any())->method('getId')->will($this->returnValue(2));
     $subclassMock2->setName('Subclass2');
     $subclassMock2->setExpectedPerformance(0.7);
     $entity1 = new CeModelEntity();
     $security1 = new Security();
     $security1->setExpenseRatio(0.6);
     $securityAssignment1 = new SecurityAssignment();
     $securityAssignment1->setSecurity($security1);
     $securityAssignment1->setSubclass($subclassMock1);
     $entity1->setSubclass($subclassMock1);
     $entity1->setPercent(40);
     $entity1->setSecurityAssignment($securityAssignment1);
     $entity2 = new CeModelEntity();
     $security2 = new Security();
     $security2->setExpenseRatio(0.3);
     $securityAssignment2 = new SecurityAssignment();
     $securityAssignment2->setSecurity($security2);
     $securityAssignment2->setSubclass($subclassMock2);
     $entity2->setSubclass($subclassMock2);
     $entity2->setPercent(60);
     $entity2->setSecurityAssignment($securityAssignment2);
     $entity3 = new CeModelEntity();
     $security3 = new Security();
     $security3->setExpenseRatio(0.7);
     $securityAssignment3 = new SecurityAssignment();
     $securityAssignment3->setSecurity($security3);
     $securityAssignment3->setSubclass($subclassMock1);
     $entity3->setSubclass($subclassMock1);
     $entity3->setPercent(100);
     $entity3->setSecurityAssignment($securityAssignment3);
     $entity3->setIsQualified(true);
     $model = new CeModel('Model');
     $model->addModelEntity($entity1);
     $model->addModelEntity($entity2);
     $model->addModelEntity($entity3);
     $model->setLowMarketReturn(0.6);
     $model->setGenerousMarketReturn(1.3);
     $model->setForecast(0);
     $this->portfolioInformation = new PortfolioInformation();
     $this->portfolioInformation->setModel($model);
 }
Esempio n. 4
0
 public function modelSecuritiesListAction(Request $request)
 {
     $ria = $this->getUser();
     /** @var \Doctrine\ORM\EntityManager $em */
     $em = $this->get('doctrine.orm.entity_manager');
     /** @var $riaCompanyInformation RiaCompanyInformation */
     $riaCompanyInformation = $ria->getRiaCompanyInformation();
     /** @var CeModel $selectedModel */
     $selectedModel = $riaCompanyInformation->getPortfolioModel();
     $request->request->set('model_id', $selectedModel->getId());
     $securityAssignments = $em->getRepository('WealthbotAdminBundle:SecurityAssignment')->findBy(array('model_id' => $selectedModel->getId()));
     $securityAssignment = new SecurityAssignment();
     $securityAssignment->setModel($selectedModel);
     $form = $this->createForm(new ModelSecurityFormType($selectedModel, $em), $securityAssignment);
     $formHandler = new ModelSecurityFormHandler($form, $request, $em, array('security_assignment' => $securityAssignment));
     if ($request->isMethod('post')) {
         if ($formHandler->process()) {
             return $this->redirect($this->generateUrl('rx_ria_model_securities_list', array('model_id' => $selectedModel->getId())));
         }
     }
     return $this->render('WealthbotRiaBundle:Securities:model_securities_list.html.twig', array('form' => $form->createView(), 'is_show_municipal_bond' => $riaCompanyInformation->getUseMunicipalBond(), 'security_assignments' => $securityAssignments, 'is_show_transaction_edit' => $riaCompanyInformation->isShowTransactionEdit()));
 }
Esempio n. 5
0
 private function loadModelSecurities(ObjectManager $manager)
 {
     $subclassIndex = 1;
     $subclassesCount = 9;
     $maxSecuritiesCount = floor(count($this->securities) / $subclassesCount);
     $i = 1;
     foreach ($this->securities as $item) {
         if ($i > $maxSecuritiesCount * $subclassIndex && $subclassIndex < $subclassesCount) {
             $subclassIndex++;
         }
         /** @var Security $security */
         /** @var Subclass $subclass */
         $security = $this->getReference('security-' . $item['symbol']);
         $subclass = $this->getReference('subclass-' . $subclassIndex);
         $securityAssignment = new SecurityAssignment();
         $securityAssignment->setSecurity($security);
         $securityAssignment->setSubclass($subclass);
         $securityAssignment->setModel($subclass->getAssetClass()->getModel());
         $manager->persist($securityAssignment);
         $this->addReference('model-security-assignment-' . $i, $securityAssignment);
         $i++;
     }
 }
Esempio n. 6
0
 private function createModel(ObjectManager $manager, User $riaUser)
 {
     $categories = $this->createCategories($riaUser);
     $modelManager = new CeModelManager($manager, '\\Wealthbot\\AdminBundle\\Entity\\CeModel');
     $model = $modelManager->createCustomModel($riaUser);
     $model->setCommissionMin($this->strategy['commission_min']);
     $model->setCommissionMax($this->strategy['commission_max']);
     $model->setForecast($this->strategy['forecast_min']);
     $model->setGenerousMarketReturn($this->strategy['generous_market_return']);
     $model->setLowMarketReturn($this->strategy['low_market_return']);
     $model->setIsAssumptionLocked($this->strategy['is_assumption_locked']);
     $securityAssignments = array();
     $isExistSecurityAssignment = function ($arr, $securityIndex) {
         return isset($arr[$securityIndex]);
     };
     foreach ($this->strategy['models'] as $modelItem) {
         $child = $modelManager->createChild($model);
         $child->setName($modelItem['name']);
         $child->setRiskRating($modelItem['risk_rating']);
         $child->setIsAssumptionLocked($modelItem['is_assumption_locked']);
         $model->addChildren($child);
         foreach ($modelItem['entities'] as $entityItem) {
             /** @var AssetClass $assetClass */
             $assetClass = $categories[$entityItem['asset_class_index']];
             $assetClass->setModel($model);
             $subclass = $assetClass->getSubclasses()->get($entityItem['subclass_index']);
             /** @var Security $security */
             $security = $this->getReference('security-' . $entityItem['security']);
             if ($isExistSecurityAssignment($securityAssignments, $entityItem['security'])) {
                 $securityAssignment = $securityAssignments[$entityItem['security']];
             } else {
                 $securityAssignment = new SecurityAssignment();
                 $securityAssignment->setSecurity($security);
                 $securityAssignment->setSubclass($subclass);
                 $securityAssignment->setModel($model);
                 $securityAssignments[$entityItem['security']] = $securityAssignment;
                 $this->addReference('model-security-assignment-asset-index-' . $entityItem['asset_class_index'] . '-subclass-index-' . $entityItem['subclass_index'] . '-security-' . $entityItem['security'], $securityAssignment);
             }
             $entity = new CeModelEntity();
             $entity->setModel($child);
             $entity->setAssetClass($assetClass);
             $entity->setSubclass($subclass);
             $entity->setSecurityAssignment($securityAssignment);
             $entity->setPercent($entityItem['percent']);
             if ($entityItem['muni_substitution_security']) {
                 /** @var Security $muniSubstitutionSecurity */
                 $muniSubstitutionSecurity = $this->getReference('security-' . $entityItem['muni_substitution_security']);
                 if ($isExistSecurityAssignment($securityAssignments, $entityItem['muni_substitution_security'])) {
                     /** @var securityAssignment $muniSubstitutionAssignment */
                     $muniSubstitutionAssignment = $securityAssignments[$entityItem['muni_substitution_security']];
                     $muniSubstitutionAssignment->setMuniSubstitution(true);
                 } else {
                     $muniSubstitutionAssignment = new SecurityAssignment();
                     $muniSubstitutionAssignment->setSecurity($muniSubstitutionSecurity);
                     $muniSubstitutionAssignment->setSubclass($subclass);
                     $muniSubstitutionAssignment->setModel($model);
                     $securityAssignments[$entityItem['muni_substitution_security']] = $muniSubstitutionAssignment;
                 }
                 $entity->setMuniSubstitution($muniSubstitutionAssignment);
             }
             if ($entityItem['tax_loss_harvesting_security']) {
                 /** @var Security $taxLossHarvestingSecurity */
                 $taxLossHarvestingSecurity = $this->getReference('security-' . $entityItem['tax_loss_harvesting_security']);
                 if ($isExistSecurityAssignment($securityAssignments, $entityItem['tax_loss_harvesting_security'])) {
                     /** @var securityAssignment $taxLossHarvestingAssignment */
                     $taxLossHarvestingAssignment = $securityAssignments[$entityItem['tax_loss_harvesting_security']];
                     $taxLossHarvestingAssignment->setMuniSubstitution(true);
                 } else {
                     $taxLossHarvestingAssignment = new SecurityAssignment();
                     $taxLossHarvestingAssignment->setSecurity($taxLossHarvestingSecurity);
                     $taxLossHarvestingAssignment->setSubclass($subclass);
                     $taxLossHarvestingAssignment->setModel($model);
                     $securityAssignments[$entityItem['tax_loss_harvesting_security']] = $taxLossHarvestingAssignment;
                 }
                 $entity->setTaxLossHarvesting($taxLossHarvestingAssignment);
             }
             $child->addModelEntity($entity);
         }
         $this->addReference('cec-ria-model-' . $modelItem['index'], $child);
     }
     return $model;
 }
Esempio n. 7
0
 /**
  * Save Client Subclasses
  * This method is needed for save a snapshot of RIA subclasses.
  *
  * @param User $client
  * @param User $ria
  * @throws EntityNotFoundException
  */
 public function saveClientSubclasses(User $client, User $ria)
 {
     $em = $this->getEntityManager();
     $selectedModel = $ria->getRiaCompanyInformation()->getPortfolioModel();
     //$riaSubClasses = $this->findDefaultsByModelId($selectedModel);
     $riaSubClasses = $this->findRiaSubclasses($ria->getId());
     if (!$riaSubClasses) {
         $riaSubClasses = $this->findDefaultsByModelId($selectedModel);
     }
     // When subclasses for RIA are defined in system ?
     if (!$riaSubClasses) {
         throw new EntityNotFoundException("Ria doesn't have subclasses, logic error please check!");
     }
     foreach ($riaSubClasses as $riaSubClass) {
         $clientSubClass = new Subclass();
         $clientSubClass->setAssetClass($riaSubClass->getAssetClass());
         $clientSubClass->setAccountType($riaSubClass->getAccountType());
         $clientSubClass->setOwner($client);
         $clientSubClass->setSource($riaSubClass);
         $clientSubClass->setName($riaSubClass->getName());
         $clientSubClass->setExpectedPerformance($riaSubClass->getExpectedPerformance());
         /** @var Subclass $riaSubClass */
         foreach ($riaSubClass->getSecurityAssignments() as $securityAssignment) {
             $newSecurityAssignment = new SecurityAssignment();
             $newSecurityAssignment->setIsPreferred($securityAssignment->getIsPreferred());
             $newSecurityAssignment->setModel($clientSubClass->getAssetClass()->getModel());
             $newSecurityAssignment->setMuniSubstitution($securityAssignment->getMuniSubstitution());
             //$newSecurityAssignment->setRia($ria); Deprecated
             $newSecurityAssignment->setSecurity($securityAssignment->getSecurity());
             $newSecurityAssignment->setSecurityTransaction($securityAssignment->getSecurityTransaction());
             $newSecurityAssignment->setSubclass($clientSubClass);
             $em->persist($newSecurityAssignment);
         }
         $em->persist($clientSubClass);
     }
     $em->flush();
 }
Esempio n. 8
0
 /**
  * Copy model with model entities, asset classes and subclasses
  *
  * @param CeModelInterface $model
  * @param User $owner
  * @param array $assetClasses
  * @param array $subclasses
  * @return CeModelInterface
  */
 private function copyModelWithRelationsForOwner(CeModelInterface $model, User $owner, array &$assetClasses, array &$subclasses)
 {
     $clone = $model->getCopy();
     $clone->setOwner($owner);
     if ($owner->hasRole('ROLE_CLIENT')) {
         $commissions = $this->objectManager->getRepository('WealthbotAdminBundle:SecurityAssignment')->findMinAndMaxTransactionFeeForModel($model->getParentId());
         $commissions = array_filter($commissions);
         $clone->setCommissionMin(isset($commissions['minimum']) ? $commissions['minimum'] : 0);
         $clone->setCommissionMax(isset($commissions['maximum']) ? $commissions['maximum'] : 0);
     }
     /** @var $modelEntity CeModelEntityInterface */
     foreach ($model->getModelEntities() as $modelEntity) {
         /** @var $cloneModelEntity CeModelEntityInterface */
         $cloneModelEntity = $modelEntity->getCopy();
         $subclass = $modelEntity->getSubclass();
         if (!isset($subclasses[$subclass->getId()])) {
             $cloneSubclass = $subclass->getCopy();
             $cloneSubclass->setOwner($owner);
             $subclasses[$subclass->getId()] = $cloneSubclass;
             $assetClass = $subclass->getAssetClass();
             if (isset($assetClasses[$assetClass->getId()])) {
                 $cloneAssetClass = $assetClasses[$assetClass->getId()];
             } else {
                 $cloneAssetClass = $assetClass->getCopy();
                 $assetClasses[$assetClass->getId()] = $cloneAssetClass;
             }
             $cloneAssetClass->addSubclasse($cloneSubclass);
             $cloneSubclass->setAssetClass($cloneAssetClass);
         } else {
             $cloneSubclass = $subclasses[$subclass->getId()];
         }
         if ($securityAssignment = $modelEntity->getSecurityAssignment()) {
             $found = null;
             #Searching one SA that has needed subclass and security.
             foreach ($this->clonedSecurityAssignments as $sa) {
                 if ($sa->getSubclass() == $cloneSubclass && $sa->getSecurity() == $securityAssignment->getSecurity()) {
                     $found = $sa;
                     break;
                 }
             }
             if (!$found) {
                 $found = $this->objectManager->getRepository('WealthbotAdminBundle:SecurityAssignment')->findOneBy(array('security' => $securityAssignment->getSecurity(), 'subclass' => $cloneSubclass));
             }
             if (!$found) {
                 $newSecurityAssignment = new SecurityAssignment();
                 //create SecurityAssignment
                 $newSecurityAssignment->setIsPreferred($securityAssignment->getIsPreferred());
                 $newSecurityAssignment->setModel($clone);
                 $newSecurityAssignment->setMuniSubstitution($securityAssignment->getMuniSubstitution());
                 $newSecurityAssignment->setSecurity($securityAssignment->getSecurity());
                 $newSecurityAssignment->setSecurityTransaction($securityAssignment->getSecurityTransaction());
                 $newSecurityAssignment->setSubclass($cloneSubclass);
                 $newSecurityAssignment->setModelId($clone->getId());
                 $newSecurityAssignment->setSecurityId($securityAssignment->getSecurity()->getId());
                 if ($cloneSubclass) {
                     $newSecurityAssignment->setSubclassId($cloneSubclass->getId());
                 }
                 if ($cloneSubclass) {
                     $cloneSubclass->addSecurityAssignment($newSecurityAssignment);
                 }
                 $this->clonedSecurityAssignments[] = $newSecurityAssignment;
                 $found = $newSecurityAssignment;
             }
             if ($found) {
                 $cloneModelEntity->setSecurityAssignment($found);
             }
         }
         $cloneModelEntity->setModel($clone);
         $cloneModelEntity->setSubclass($subclasses[$subclass->getId()]);
         $clone->addModelEntity($cloneModelEntity);
     }
     return $clone;
 }
Esempio n. 9
0
 public function modelSecuritiesListAction(Request $request)
 {
     /** @var \Doctrine\ORM\EntityManager $em */
     /** @var $model CeModel */
     $em = $this->get('doctrine.orm.entity_manager');
     $model = $em->getRepository('WealthbotAdminBundle:CeModel')->find($request->get('model_id'));
     $securityAssignments = $em->getRepository('WealthbotAdminBundle:SecurityAssignment')->findBy(array('model_id' => $model->getId()));
     $securityAssignment = new SecurityAssignment();
     $securityAssignment->setModel($model);
     $form = $this->createForm(new ModelSecurityFormType($model, $em), $securityAssignment);
     if ($request->isMethod('post')) {
         $formHandler = new ModelSecurityFormHandler($form, $request, $em, array('security_assignment' => $securityAssignment));
         if ($formHandler->process()) {
             return $this->redirect($this->generateUrl('rx_admin_model_securities_list', array('model_id' => $model->getId())));
         }
     }
     return $this->render('WealthbotAdminBundle:Securities:model_securities_list.html.twig', array('form' => $form->createView(), 'security_assignments' => $securityAssignments));
 }