Example #1
0
 /**
  * get ids for tags and create non-existing ones
  *
  * @param array        $tags Array of strings
  * @param QueryBuilder $qb   Query builder instance
  * @return array (name => id)
  */
 public function getIdsForTags(array $tags, User $user, QueryBuilder $qb = null)
 {
     if ($qb == null) {
         $qb = $this->builder;
     }
     if (!empty($tags)) {
         $qb->add('select', 't.name, t.id')->andWhere($qb->expr()->andX($qb->expr()->in('t.name', ':tags'), $qb->expr()->eq('t.user', ':user')))->setParameters(array('tags' => $tags, 'user' => $user->getId()));
         $existingTags = $qb->getQuery()->getResult();
         $ids = array();
         foreach ($existingTags as $tag) {
             $ids[$tag['name']] = $tag['id'];
         }
         $missingTags = array_diff($tags, array_keys($ids));
         if (0 < count($missingTags)) {
             foreach ($missingTags as $tagName) {
                 $newTag = new Tag();
                 $newTag->setName($tagName);
                 $newTag->setUser($user);
                 $this->getEntityManager()->persist($newTag);
             }
             $this->getEntityManager()->flush();
             $ids = array_merge($ids, $this->getIdsForTags(array_values($missingTags), $user, $qb));
         }
         return array_values($ids);
     } else {
         return array();
     }
 }
Example #2
0
 /**
  * loads fixtures to database
  *
  * @param ObjectManager $manager
  * @return LoadTags
  */
 public function load(ObjectManager $manager)
 {
     $baseTag = new Tag();
     $baseTag->setUser($manager->merge($this->getReference('default-user')));
     foreach ($this->data as $key => $data) {
         $tag = clone $baseTag;
         $tag->setName($data['name']);
         $manager->persist($tag);
         $this->addReference($key, $tag);
     }
     $manager->flush();
 }
Example #3
0
 /**
  * Called on bind
  *
  * @param mixed $value
  * @return mixed|void
  */
 public function reverseTransform($value)
 {
     $result = array();
     if (null == $value) {
         return $result;
     }
     if (is_string($value)) {
         $value = explode(' ', $value);
     }
     $tagNames = array();
     $tagIds = array();
     foreach ($value as $tag) {
         if (is_numeric($tag)) {
             $tagIds[] = $tag;
         } else {
             $tagNames[] = $tag;
         }
     }
     $repository = $this->em->getRepository('DimeTimetrackerBundle:Tag');
     if (!empty($tagIds)) {
         $qb = $repository->createQueryBuilder('t');
         $qb->andWhere($qb->expr()->andX($qb->expr()->in('t.id', ':ids'), $qb->expr()->eq('t.user', ':user')));
         $qb->setParameters(array('ids' => $tagIds, 'user' => $this->user->getId()));
         $dbResults = $qb->getQuery()->getResult();
         foreach ($dbResults as $tag) {
             $result[] = $tag;
         }
     }
     if (!empty($tagNames)) {
         $qb = $repository->createQueryBuilder('t');
         $qb->andWhere($qb->expr()->andX($qb->expr()->in('t.name', ':tags'), $qb->expr()->eq('t.user', ':user')));
         $qb->setParameters(array('tags' => $tagNames, 'user' => $this->user->getId()));
         $existingTags = array();
         $dbResults = $qb->getQuery()->getResult();
         foreach ($dbResults as $tag) {
             $result[] = $tag;
             $existingTags[] = $tag->getName();
         }
         $missingTags = array_diff($tagNames, $existingTags);
         if (count($missingTags) > 0) {
             foreach ($missingTags as $name) {
                 $name = trim($name);
                 if (!empty($name)) {
                     $newTag = new Tag();
                     $newTag->setName($name);
                     $newTag->setUser($this->user);
                     $result[] = $newTag;
                 }
             }
         }
     }
     return $result;
 }
 /**
  * create a new activity
  *
  * [POST] /activities
  *
  * @return View
  */
 public function postActivitiesAction()
 {
     // create new activity entity
     $activity = new Activity();
     // convert json to assoc array from request content
     $data = json_decode($this->getRequest()->getContent(), true);
     if (isset($data['parse'])) {
         // Run parser
         $result = $this->parse($data['parse']);
         if (isset($data['date'])) {
             $date = new \DateTime($data['date']);
         } else {
             $date = new \DateTime();
         }
         // create new activity and timeslice entity
         $activity = new Activity();
         $activity->setUser($this->getCurrentUser());
         if (isset($result['customer'])) {
             try {
                 $customer = $this->getCustomerRepository()->createCurrentQueryBuilder('c')->scopeByField('user', $this->getCurrentUser()->getId())->scopeByField('alias', $result['customer'])->getCurrentQueryBuilder()->setMaxResults(1)->getQuery()->getSingleResult();
                 $activity->setCustomer($customer);
             } catch (NoResultException $e) {
             }
         }
         if (isset($result['project'])) {
             try {
                 $project = $this->getProjectRepository()->createCurrentQueryBuilder('p')->scopeByField('user', $this->getCurrentUser()->getId())->scopeByField('alias', $result['project'])->getCurrentQueryBuilder()->setMaxResults(1)->getQuery()->getSingleResult();
                 $activity->setProject($project);
                 // Auto set customer because of direct relation to project
                 if ($activity->getCustomer() == null) {
                     $activity->setCustomer($project->getCustomer());
                 }
             } catch (NoResultException $e) {
             }
         }
         if (isset($result['service'])) {
             try {
                 $service = $this->getServiceRepository()->createCurrentQueryBuilder('p')->scopeByField('user', $this->getCurrentUser()->getId())->scopeByField('alias', $result['service'])->getCurrentQueryBuilder()->setMaxResults(1)->getQuery()->getSingleResult();
                 $activity->setService($service);
             } catch (NoResultException $e) {
             }
         }
         if (isset($result['tags']) && !empty($result['tags'])) {
             foreach ($result['tags'] as $tagname) {
                 try {
                     $tag = $this->getTagRepository()->createCurrentQueryBuilder('t')->scopeByField('user', $this->getCurrentUser()->getId())->scopeByField('name', $tagname)->getCurrentQueryBuilder()->setMaxResults(1)->getQuery()->getSingleResult();
                 } catch (NoResultException $e) {
                     $tag = null;
                 }
                 if ($tag == null) {
                     $tag = new Tag();
                     $tag->setName($tagname);
                     $tag->setUser($this->getCurrentUser());
                 }
                 $activity->addTag($tag);
             }
         }
         if (isset($result['description'])) {
             $activity->setDescription($result['description']);
         }
         // create timeslice
         $timeslice = new Timeslice();
         $timeslice->setActivity($activity);
         $timeslice->setUser($this->getCurrentUser());
         $activity->addTimeslice($timeslice);
         if (isset($result['range']) || isset($result['duration'])) {
             // process time range
             if (isset($result['range'])) {
                 $range = $result['range'];
                 if (empty($range['stop'])) {
                     $start = new \DateTime($range['start']);
                     $stop = new \DateTime('now');
                 } elseif (empty($range['start'])) {
                     $start = new \DateTime('now');
                     $stop = new \DateTime($range['stop']);
                 } elseif (!empty($range['start']) && !empty($range['stop'])) {
                     $start = new \DateTime($range['start']);
                     $stop = new \DateTime($range['stop']);
                 }
                 $start->setDate($date->format('Y'), $date->format('m'), $date->format('d'));
                 $stop->setDate($date->format('Y'), $date->format('m'), $date->format('d'));
                 $timeslice->setStartedAt($start);
                 $timeslice->setStoppedAt($stop);
             } else {
                 // track date for duration
                 $date->setTime(0, 0, 0);
                 $timeslice->setStartedAt($date);
                 $timeslice->setStoppedAt($date);
             }
             // process duration
             if (isset($result['duration'])) {
                 if (empty($result['duration']['sign'])) {
                     $timeslice->setDuration($result['duration']['number']);
                 } else {
                     if ($result['duration']['sign'] == '-') {
                         $timeslice->setDuration($timeslice->getCurrentDuration() - $result['duration']['number']);
                     } else {
                         $timeslice->setDuration($timeslice->getCurrentDuration() + $result['duration']['number']);
                     }
                 }
             }
         } else {
             // start a new timeslice with date 'now'
             $timeslice->setStartedAt(new \DateTime('now'));
         }
         // save change to database
         $em = $this->getDoctrine()->getManager();
         $em->persist($activity);
         $em->flush();
         $em->refresh($activity);
         $view = $this->createView($activity);
     } else {
         // create activity form
         $form = $this->createForm(new ActivityType($this->getDoctrine()->getManager(), $this->getCurrentUser()), $activity);
         $view = $this->saveForm($form, $data);
     }
     return $view;
 }