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