Created
December 20, 2013 10:40
-
-
Save lenybernard/8053112 to your computer and use it in GitHub Desktop.
description
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| <?php | |
| namespace Dav\AppBundle\Controller; | |
| use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; | |
| use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template; | |
| use Symfony\Component\HttpFoundation\Request; | |
| use JMS\SecurityExtraBundle\Annotation\PreAuthorize; | |
| use JMS\SecurityExtraBundle\Annotation\Secure; | |
| use Dav\AppBundle\Entity\Preference; | |
| use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter; | |
| use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method; | |
| use Dav\AppBundle\Form\Type\SpreadsheetType; | |
| use Dav\AppBundle\Entity\Mission\Mission; | |
| use Symfony\Component\HttpFoundation\Response; | |
| use Symfony\Component\HttpFoundation\JsonResponse; | |
| use JMS\Serializer\SerializationContext; | |
| /** | |
| * Spreadsheet controller | |
| * | |
| * @Route("/spreadsheet") | |
| * @PreAuthorize("isFullyAuthenticated()") | |
| */ | |
| class SpreadsheetController extends BaseController | |
| { | |
| protected $filterColumns = array( | |
| 'entity.name', | |
| 'entity.status', | |
| 'entity.startDate', | |
| 'entity.endDate', | |
| 'worker.firstname', | |
| 'worker.lastname', | |
| 'worker.status', | |
| 'client.name', | |
| 'signedBy.name', | |
| 'chargedBy.name', | |
| ); | |
| /** | |
| * PreExecute | |
| * @Secure(roles="ROLE_MGR, ROLE_ADV") | |
| */ | |
| public function preExecute() | |
| { | |
| parent::preExecute(); | |
| if ($this->breadcrumb->getChild('spreadsheet')) { | |
| $this->breadcrumb->addChild('spreadsheet', array( | |
| 'label' => $this->get('translator')->trans('menu.front.breadcrumb.spreadsheet'), | |
| 'route' => 'Spreadsheet_Index', | |
| )); | |
| } | |
| } | |
| /** | |
| * Index | |
| * | |
| * @Route("/", name="Spreadsheet_Index") | |
| * @Template() | |
| */ | |
| public function indexAction(Request $request, $_scope) | |
| { | |
| $params = array(); | |
| $filters = $this->get('request')->query->get('spreadsheet_filter_row', array()); | |
| $missions = $this->searchMissions($filters, $_scope); | |
| $this->filterRow($_scope, $params); | |
| $this->filterColumn($request, $params); | |
| $em = $this->getDoctrine()->getManager(); | |
| $missionForms = array(); | |
| $segment = 1; | |
| if ($this->get('request')->query->has('page')) { | |
| $segment = intval($this->get('request')->query->get('page')); | |
| } | |
| $i = 0; | |
| //Build mission form only for displayed missions | |
| foreach ($missions as $mission) { | |
| $i++; | |
| if ( ($segment * 20) - 20 <= $i && $i <= $segment * 20) { | |
| $missionForms[] = $this->createForm(new SpreadsheetType($em), $mission)->createView(); | |
| } else { | |
| $missionForms[] = true; | |
| } | |
| } | |
| $options = array( | |
| 'filters' => $params['preference_columns'], | |
| 'max_per_page' => 20 | |
| ); | |
| $params['list'] = $this->container->get('av_list')->getList($missionForms, 'DavAppBundle:Spreadsheet:list.html.twig', $options); | |
| if ($this->get('request')->isXMLHttpRequest()) { | |
| return $this->render('DavAppBundle:Spreadsheet:list.html.twig', $params); | |
| } | |
| return $params; | |
| } | |
| /** | |
| * List | |
| * | |
| * @Route("/save/{slug}", name="Spreadsheet_Save_Mission") | |
| * @Template() | |
| * @Method("POST") | |
| * @ParamConverter("mission", class="DavAppBundle:Mission\Mission") | |
| */ | |
| public function saveMissionAction(Request $request, Mission $mission) | |
| { | |
| $em = $this->getDoctrine()->getManager(); | |
| $form = $this->createForm(new SpreadsheetType($em), $mission); | |
| $form->submit($request); | |
| if ($form->isValid()) { | |
| $atomicService = $this->get('atomic_service'); | |
| $atomicService->releaseEntity($mission); | |
| $em->persist($mission); | |
| $em->flush(); | |
| } | |
| return new Response(); | |
| } | |
| /** | |
| * Filter row. | |
| * | |
| * @param string $scope | |
| * @param array &$param | |
| */ | |
| private function filterRow($scope, &$params) | |
| { | |
| $filterRowForm = $this->createForm('spreadsheet_filter_row', null, array('scope' => $scope)); | |
| $filterRowForm->submit($this->get('request')); | |
| $params['filter_row_form'] = $filterRowForm->createView(); | |
| } | |
| /** | |
| * Filter column. | |
| * | |
| * @param Request $request | |
| * @param array &$param | |
| */ | |
| private function filterColumn(Request $request, &$params) | |
| { | |
| $em = $this->getDoctrine()->getManager(); | |
| $preferenceSpreadsheetColumns = $em->getRepository('DavAppBundle:Preference') | |
| ->findByUserAndType($this->getUser(), Preference::TYPE_SPREADSHEET_FILTER_COLUMN); | |
| if (!$preferenceSpreadsheetColumns) { | |
| $preferenceSpreadsheetColumns = new Preference(); | |
| $preferenceSpreadsheetColumns->setUser($this->getUser()) | |
| ->setType(Preference::TYPE_SPREADSHEET_FILTER_COLUMN) | |
| ->setValue($this->filterColumns); | |
| } | |
| // Form process | |
| $form = $this->createForm('spreadsheet_filter_column', $preferenceSpreadsheetColumns); | |
| if ($request->isMethod('POST')) { | |
| $form->submit($request); | |
| $em->persist($preferenceSpreadsheetColumns); | |
| $em->flush(); | |
| } | |
| // Parameters | |
| $params['default_columns'] = array_diff($this->filterColumns, $preferenceSpreadsheetColumns->getValue()); | |
| $params['preference_columns'] = $preferenceSpreadsheetColumns->getValue(); | |
| $params['filter_column_form'] = $form->createView(); | |
| } | |
| /** | |
| * Return a branch. | |
| * | |
| * @param Request $request An HTTP request. | |
| * @param integer $id Branch id. | |
| * @return Response | |
| * | |
| * @Route("/ajax/search/{id}", name="Branch_Ajax_Search", defaults={"id" = null}) | |
| * @Method("GET") | |
| */ | |
| public function ajaxSearchAction(Request $request, $id = null) | |
| { | |
| $em = $this->getDoctrine()->getManager(); | |
| $params = $request->query->all(); | |
| if ($id) { | |
| $branchs = array($em->getRepository('DavAppBundle:Branch') | |
| ->findOneById($id)); | |
| } elseif (isset($params['q'])) { | |
| $fieldValue = $params['q']; | |
| $branchs = $em->getRepository('DavAppBundle:Branch') | |
| ->getByFullName($fieldValue); | |
| } else { | |
| $branchs = array(); | |
| } | |
| $serializer = $this->container->get('jms_serializer'); | |
| $data = $serializer->serialize( | |
| $branchs, | |
| 'json', | |
| SerializationContext::create()->setGroups(array('branch_search')) | |
| ); | |
| return new JsonResponse(json_decode($data)); | |
| } | |
| private function searchMissions(array $filters, $_scope = "perso") | |
| { | |
| $em = $this->getDoctrine()->getManager(); | |
| $metadatas['joins']['client'] = 'entity.client'; | |
| $metadatas['leftjoins']['signedBy'] = 'entity.signedBy'; | |
| $metadatas['leftjoins']['chargedBy'] = 'entity.chargedBy'; | |
| $metadatas['leftjoins']['worker'] = 'entity.worker'; | |
| $metadatas['leftjoins']['manager'] = 'entity.manager'; | |
| $metadatas['leftjoins']['adv'] = 'entity.adv'; | |
| $metadatas['operandes'] = array(); | |
| // Get missions | |
| //If admin mode | |
| if ($this->get('security.context')->isGranted('ROLE_ADMIN') && "admin" === $_scope) { | |
| $managers = $em->getRepository('DavAppBundle:User\User')->findAll(); | |
| } else { | |
| $managers = ($_scope == 'macro') ? $em->getRepository('DavAppBundle:User\User')->findByBoss($this->getUser(), $_scope) : array(); | |
| } | |
| $managers[] = $this->getUser(); | |
| $metadatas['manager']['type'] = 'customRelation'; | |
| $metadatas['adv']['type'] = 'customRelation'; | |
| $metadatas['manager']['options'] = array( | |
| array( | |
| 'entity' => 'entity', | |
| 'field' => 'manager' | |
| ) | |
| ); | |
| $metadatas['adv']['options'] = array( | |
| array( | |
| 'entity' => 'entity', | |
| 'field' => 'manager' | |
| ) | |
| ); | |
| $params['manager'] = $managers; | |
| $params['adv'] = $managers; | |
| $metadatas['operandes'] = array_merge($metadatas['operandes'], array('manager' => 'IN')); | |
| $metadatas['operandes'] = array_merge($metadatas['operandes'], array('adv' => 'IN')); | |
| foreach ($filters as $on => $value) { | |
| if ($value) { | |
| $field = explode('_', $on); | |
| if ('client' === $on || 'manager' === $on || 'chargedBy' === $on || 'signedBy' === $on) { | |
| $metadatas[$on]['type'] = 'customRelation'; | |
| $metadatas[$on]['options'] = array( | |
| array( | |
| 'entity' => 'entity', | |
| 'field' => $on, | |
| ) | |
| ); | |
| $params[$on] = $value; | |
| $metadatas['operandes'] = array_merge($metadatas['operandes'], array($on => 'IN')); | |
| } elseif ('entity_name' === $on) { | |
| $metadatas[$on]['type'] = 'field'; | |
| $params[$field[1]] = $value; | |
| $metadatas['operandes'] = array_merge($metadatas['operandes'], array($field[1] => 'LIKE')); | |
| } else { | |
| $metadatas[$on]['type'] = 'choice'; | |
| $params[$field[1]] = $value; | |
| $metadatas['operandes'] = array_merge($metadatas['operandes'], array($field[1] => '=')); | |
| } | |
| } | |
| } | |
| $metadatas['entity_deleted']['type'] = 'customRelation'; | |
| $metadatas['entity_deleted']['options'] = array( | |
| array( | |
| 'entity' => 'entity', | |
| 'field' => 'deleted' | |
| ) | |
| ); | |
| $params['entity_deleted'] = '0'; | |
| $metadatas['operandes'] = array_merge($metadatas['operandes'], array('entity_deleted' => '=')); | |
| $params['entity'] = 'DavAppBundle:Mission\Mission'; | |
| $params['metadatas'] = json_encode($metadatas); | |
| $qr = $this->get('search_engine.query') | |
| ->searchQuery($params); | |
| return $qr->execute(); | |
| } | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment