/** * Fonction récursive de création des catégories. * * @param array $categoriesContent Le contenu de la catégorie * @param Categorie $categorieParente La catégorie parente */ private function loadCategories($categoriesContent, $categorieParente = null) { foreach ($categoriesContent as $categorieContent) { $categorie = new Categorie(); $categorie->setNom($categorieContent['nom']); $categorie->setCategorieParente($categorieParente); $categorie->setRang($categorieContent['rang']); $this->manager->persist($categorie); if (!empty($categorieContent['subcategories'])) { $subCategoriesContent = $categorieContent['subcategories']; $this->loadCategories($subCategoriesContent, $categorie); } } }
/** * Calcul le montant cumulé des mouvements d'une catégorie, entre deux dates. * * @param Categorie $categorie La catégorie. * @param \DateTime $dateStart Date de début, incluse. * @param \DateTime $dateEnd Date de fin, incluse. * @param string $order 'ASC' (par défaut) ou 'DESC'. * * @return float */ public function getMontantTotalByDate(Categorie $categorie, \DateTime $dateStart, \DateTime $dateEnd, $order = 'ASC') { // Calcul du montant total des mouvements de la catégorie $queryBuilder = $this->getEntityManager()->createQueryBuilder(); $expressionBuilder = $this->getEntityManager()->getExpressionBuilder(); $and = $expressionBuilder->andX(); $and->add($expressionBuilder->in('m.categorie', ':categories')); $and->add($expressionBuilder->gte('m.date', ':date_start')); $and->add($expressionBuilder->lte('m.date', ':date_end')); // La liste des catégories de mouvements $categorieID = $categorie->getId(); $categories = array($categorieID); $categoriesFilles = $categorie->getCategoriesFillesRecursive(); foreach ($categoriesFilles as $categorieFille) { $categories[] = $categorieFille->getId(); } $queryBuilder->select('SUM(m.montant) AS total')->from('ComptesBundle:Mouvement', 'm')->where($and)->setParameter('categories', $categories)->setParameter('date_start', $dateStart)->setParameter('date_end', $dateEnd)->orderBy('m.date', $order); $result = $queryBuilder->getQuery()->getSingleResult(); $montant = $result['total'] !== null ? $result['total'] : 0; return $montant; }
/** * Récupère les mouvements d'une catégorie. * * @param Categorie $categorie La catégorie. * @param string $order 'ASC' (par défaut) ou 'DESC'. * * @return \Doctrine\Common\Collections\ArrayCollection */ public function findByCategorie(Categorie $categorie, $order = 'ASC') { // Récupération des mouvements de la catégorie $queryBuilder = $this->createQueryBuilder('m'); // La liste des catégories de mouvements $categorieID = $categorie->getId(); $categories = array($categorieID); $categoriesFilles = $categorie->getCategoriesFillesRecursive(); foreach ($categoriesFilles as $categorieFille) { $categories[] = $categorieFille->getId(); } $queryBuilder->where('m.categorie in (:categories)')->orderBy('m.date', $order)->setParameter('categories', $categories); $mouvements = $queryBuilder->getQuery()->getResult(); return $mouvements; }
/** * Dissocie toutes les catégories filles. * * @return Categorie */ public function removeCategoriesFilles() { $this->categoriesFilles->clear(); return $this; }