public function beneficiariesAction(Request $request) { /** @var $em EntityManager */ /** @var $repo ClientAccountRepository */ $em = $this->get('doctrine.orm.entity_manager'); $repo = $em->getRepository('WealthbotClientBundle:ClientAccount'); /** @var $client User */ $client = $this->getUser(); $profile = $client->getProfile(); /** @var $account ClientAccount */ $account = $repo->findOneBy(array('id' => $request->get('account_id'), 'client_id' => $client->getId())); if (!$account) { $this->createNotFoundException('You have not account with id: ' . $request->get('account_id') . '.'); } $this->denyAccessForCurrentRetirementAccount($account); $beneficiaries = $account->getBeneficiaries(); if (!$beneficiaries->count()) { if ($profile->getMaritalStatus() == Profile::CLIENT_MARITAL_STATUS_MARRIED) { $stepActionsKeys = array_flip(array_keys(ClientAccount::getStepActionChoices())); if ($stepActionsKeys[$account->getStepAction()] < $stepActionsKeys[ClientAccount::STEP_ACTION_BENEFICIARIES]) { $beneficiary = $this->buildBeneficiaryByClient($client); } } if (!isset($beneficiary)) { $beneficiary = new Beneficiary(); } $beneficiary->setAccount($account); $beneficiaries->add($beneficiary); } $isPreSaved = $request->isXmlHttpRequest(); $form = $this->createForm(new BeneficiariesCollectionFormType($isPreSaved)); $form->get('beneficiaries')->setData($beneficiaries); $originalBeneficiaries = array(); foreach ($beneficiaries as $item) { $originalBeneficiaries[] = $item; } if ($request->isMethod('post')) { $form->bind($request); if ($form->isValid()) { $beneficiaries = $form['beneficiaries']->getData(); foreach ($beneficiaries as $beneficiary) { $beneficiary->setAccount($account); $em->persist($beneficiary); foreach ($originalBeneficiaries as $key => $toDel) { if ($beneficiary->getId() === $toDel->getId()) { unset($originalBeneficiaries[$key]); } } } foreach ($originalBeneficiaries as $beneficiary) { $account->removeBeneficiarie($beneficiary); $em->remove($beneficiary); } $em->flush(); $em->clear(); $account->setStepAction(ClientAccount::STEP_ACTION_BENEFICIARIES); $account->setIsPreSaved($isPreSaved); $em->persist($account); $em->flush(); $redirectUrl = $this->getRedirectUrl($account, ClientAccount::STEP_ACTION_BENEFICIARIES); if ($isPreSaved) { return $this->getJsonResponse(array('status' => 'success', 'redirect_url' => $redirectUrl)); } return $this->redirect($redirectUrl); } else { if ($isPreSaved) { return $this->getJsonResponse(array('status' => 'error')); } } } return $this->render($this->getTemplate('beneficiaries.html.twig'), array('client' => $client, 'account' => $account, 'form' => $form->createView())); }