entityManager = $entityManager; $this->knpPaginator = $knpPaginator; $this->openSsl = $openSsl; $this->flashBag = $flashBag; } /** * @return string */ private function getShortBundle() { return strtr('Intaro\DeliveryModuleBundle', ['\\' => '']); } /** * @return string */ private function getNameService() { $bundle = explode('\\', 'Intaro\DeliveryModuleBundle'); return strtr(end($bundle), ['Bundle' => '']); } /** * @return Response */ public function listAction(Request $request) { $clientsQuery = $this->entityManager->createQuery(' SELECT connection FROM ' . $this->getConnectionClass() . ' connection '); $pagination = $this->knpPaginator->paginate( $clientsQuery, $request->query->getInt('page', 1), 20 ); return $this->render( $this->getShortBundle() . ':Connection:list.html.twig', ['pagination' => $pagination, 'route' => $this->getRoute()] ); } /** * @return Response */ public function newAction(Request $request) { $this->denyAccessUnlessGranted('ROLE_DEVELOPER'); $connectionClass = $this->getConnectionClass(); $connection = new $connectionClass(); $connection->setEncoder($this->openSsl); $connectionTypeClass = 'Intaro\DeliveryModuleBundle\Form\ConnectionType'; $form = $this->createForm($connectionTypeClass, $connection, [ 'container' => $this->container, 'is_admin' => true, ]); $form->handleRequest($request); if ($form->isSubmitted() && $form->isValid()) { $connection->generateClientId(); $this->actualizeWebhooks($connection); $this->entityManager->persist($connection); $this->entityManager->flush(); return $this->redirectToRoute($this->getRoute() . '_admin_edit', [ 'connectionId' => $connection->getId(), ]); } return $this->render( $this->getShortBundle() . ':Connection:edit.html.twig', ['route' => $this->getRoute(), 'form' => $form->createView()] ); } /** * @param string $connectionId * * @return Response */ public function editAction(Request $request, $connectionId) { $connection = $this->entityManager ->getRepository($this->getConnectionClass()) ->find($connectionId); if (null === $connection) { throw $this->createNotFoundException(); } $connectionTypeClass = 'Intaro\DeliveryModuleBundle\Form\ConnectionType'; $form = $this->createForm($connectionTypeClass, $connection, [ 'container' => $this->container, 'is_admin' => true, ]); $form->handleRequest($request); if ($form->isSubmitted() && $form->isValid()) { $this->actualizeWebhooks($connection); $this->entityManager->flush(); return $this->redirectToRoute($this->getRoute() . '_admin_edit', [ 'connectionId' => $connection->getId(), ]); } return $this->render( $this->getShortBundle() . ':Connection:edit.html.twig', [ 'route' => $this->getRoute(), 'connection' => $connection, 'form' => $form->createView(), ] ); } /** * @param string $connectionId * * @return Response * * @throws \Exception */ public function updateConfigurationAction(Request $request, $connectionId) { $this->denyAccessUnlessGranted('ROLE_DEVELOPER'); $api = $this->getDeliveryApi(); $connection = $this->entityManager ->getRepository($this->getConnectionClass()) ->find($connectionId); $api->setConnection($connection); $result = $api->updateConfiguration(); if (isset($result['success']) && $result['success']) { $this->flashBag->add('notice', 'ChangesWereSaved'); } else { $this->flashBag->add('error', 'ChangesWereNotSaved'); } return $this->redirectToRoute($this->getRoute() . '_admin_edit', [ 'connectionId' => $connection->getId(), ]); } /** * @return Response */ public function parcelListAction(Request $request) { $parcelsQuery = $this->entityManager->createQuery(' SELECT parcel FROM ' . $this->getParcelClass() . ' parcel '); $pagination = $this->knpPaginator->paginate( $parcelsQuery, $request->query->getInt('page', 1), 20 ); return $this->render( $this->getShortBundle() . ':Parcel:list.html.twig', ['route' => $this->getRoute(), 'pagination' => $pagination] ); } /** * @return Response */ public function parcelNewAction(Request $request) { $this->denyAccessUnlessGranted('ROLE_DEVELOPER'); $parcelClass = $this->getParcelClass(); $parcel = new $parcelClass(); $parcelTypeClass = 'Intaro\DeliveryModuleBundle\Form\ParcelType'; $form = $this->createForm($parcelTypeClass, $parcel, [ 'connection_class' => $this->getConnectionClass(), ]); $form->handleRequest($request); if ($form->isSubmitted() && $form->isValid()) { $this->entityManager->persist($parcel); $this->entityManager->flush(); return $this->redirectToRoute($this->getRoute() . '_admin_parcel_list'); } return $this->render( $this->getShortBundle() . ':Parcel:edit.html.twig', ['form' => $form->createView(), 'parcel' => $parcel] ); } /** * @param string $parcelId * * @return Response */ public function parcelEditAction(Request $request, $parcelId) { $parcel = $this->entityManager ->getRepository($this->getParcelClass()) ->find(['id' => $parcelId]); $parcelTypeClass = 'Intaro\DeliveryModuleBundle\Form\ParcelType'; $form = $this->createForm($parcelTypeClass, $parcel, [ 'connection_class' => $this->getConnectionClass(), ]); $form->handleRequest($request); if ($form->isSubmitted() && $form->isValid()) { $this->entityManager->flush(); return $this->redirectToRoute($this->getRoute() . '_admin_parcel_list'); } return $this->render( $this->getShortBundle() . ':Parcel:edit.html.twig', ['form' => $form->createView(), 'parcel' => $parcel] ); } /** * @return Response * * @throws \Exception */ public function connectAction(Request $request) { $api = $this->getDeliveryApi(); $referer = $request->headers->get('referer'); $account = $request->query->get('account'); $accountUrl = null; if (!empty($account)) { $accountUrl = null === parse_url($account, PHP_URL_HOST) ? null : 'https://' . parse_url($account, PHP_URL_HOST); } if ( !empty($request->request->get('clientId')) || !empty($request->attributes->get('clientId')) ) { if (!empty($request->request->get('clientId'))) { $clientId = $request->request->get('clientId'); } else { $clientId = $request->attributes->get('clientId'); } $connection = $this->entityManager ->getRepository($this->getConnectionClass()) ->findOneBy([ 'clientId' => $clientId, ]); $accountUrl = $connection->getCrmUrl(); } else { $class = $this->getConnectionClass(); $connection = new $class(); $connection ->setLanguage($request->getLocale()) ->setEncoder($this->openSsl); } $connectionTypeClass = 'Intaro\DeliveryModuleBundle\Form\ConnectionType'; $form = $this->createForm($connectionTypeClass, $connection, [ 'container' => $this->container, 'is_admin' => false, ]); $form->handleRequest($request); if ($form->isSubmitted() && $form->isValid()) { $connectionIsCreated = true; if (empty($connection->getClientId())) { $connection->generateClientId(); $connectionIsCreated = false; } $api->setConnection($connection); $this->actualizeWebhooks($connection); $result = $api->updateConfiguration(); if (isset($result['success']) && $result['success']) { if (!$connectionIsCreated) { $this->entityManager->persist($connection); } $this->entityManager->flush(); return $this->redirect($connection->getCrmUrl() . '/admin/integration/list'); } else { $srcLogo = $request->getUriForPath( '/bundles/delivery' . strtolower($this->getNameService()) . '/images/' . strtolower($this->getNameService()) . '.svg' ); return $this->render( 'DeliveryCoreBundle:Connection:configure_error.html.twig', [ 'referer' => $referer, 'errors' => $result, 'title_delivery' => $this->getNameService(), 'src_logo_delivery' => $srcLogo, ] ); } } return $this->render( $this->getShortBundle() . ':Connection:configure.html.twig', [ 'route' => $this->getRoute(), 'form' => $form->createView(), 'account' => $accountUrl, ] ); } /** * Actualize webhooks. */ protected function actualizeWebhooks(Connection $connection) { } }