From cefd66ec7547b5f9aa4306aceacfef375c2eff92 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20H=C3=BCbner?= Date: Mon, 24 Apr 2017 11:38:10 +0200 Subject: [PATCH] Add SetService --- app/config/service/service.yml | 4 + src/AppBundle/Controller/ModelController.php | 23 ++++- .../Controller/Rebrickable/SetController.php | 39 +++++++-- .../Rebrickable/Inventory_PartRepository.php | 27 ++++-- src/AppBundle/Service/SetService.php | 84 +++++++++++++++++++ 5 files changed, 165 insertions(+), 12 deletions(-) create mode 100644 src/AppBundle/Service/SetService.php diff --git a/app/config/service/service.yml b/app/config/service/service.yml index 4691703..7ff2c69 100644 --- a/app/config/service/service.yml +++ b/app/config/service/service.yml @@ -10,3 +10,7 @@ services: service.ldview: class: AppBundle\Service\LDViewService arguments: ['%ldview_bin%', '@oneup_flysystem.media_filesystem'] + + service.set: + class: AppBundle\Service\SetService + arguments: ['@repository.rebrickable.inventorypart'] \ No newline at end of file diff --git a/src/AppBundle/Controller/ModelController.php b/src/AppBundle/Controller/ModelController.php index 329cd68..3d03397 100644 --- a/src/AppBundle/Controller/ModelController.php +++ b/src/AppBundle/Controller/ModelController.php @@ -6,10 +6,12 @@ use AppBundle\Entity\LDraw\Model; use AppBundle\Entity\Rebrickable\Part; use AppBundle\Entity\Rebrickable\Set; use AppBundle\Form\Filter\Model\ModelFilterType; +use Doctrine\ORM\Query\AST\ConditionalTerm; use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method; use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; use Symfony\Bundle\FrameworkBundle\Controller\Controller; use Symfony\Component\HttpFoundation\Request; +use Symfony\Component\HttpFoundation\Response; /** * Part controller. @@ -52,7 +54,7 @@ class ModelController extends Controller } /** - * Finds and displays a part entity. + * Finds and displays a model entity. * * @Route("/{number}", name="model_detail") * @Method("GET") @@ -61,6 +63,7 @@ class ModelController extends Controller { $em = $this->getDoctrine()->getManager(); + /** @var Model $model */ if ($model = $this->get('repository.ldraw.model')->findOneByNumber($number)) { try { $rbParts = $model != null ? $em->getRepository(Part::class)->findAllByModel($model) : null; @@ -81,4 +84,22 @@ class ModelController extends Controller return $this->render('error/error.html.twig'); } + + /** + * @Route("/{number}/download", name="model_download") + * @Method("GET") + */ + public function downloadAction(Model $model) + { + $zip = $this->get('service.zip')->create($model); + + dump($zip); + + $response = new Response(file_get_contents($zip)); + $response->headers->set('Content-Type', 'application/zip'); + $response->headers->set('Content-Disposition', 'attachment;filename="' . basename($zip) . '"'); + $response->headers->set('Content-length', filesize($zip)); + + return $response; + } } diff --git a/src/AppBundle/Controller/Rebrickable/SetController.php b/src/AppBundle/Controller/Rebrickable/SetController.php index 2b9d3c5..63eb591 100644 --- a/src/AppBundle/Controller/Rebrickable/SetController.php +++ b/src/AppBundle/Controller/Rebrickable/SetController.php @@ -2,6 +2,7 @@ namespace AppBundle\Controller\Rebrickable; +use AppBundle\Entity\LDraw\Model; use AppBundle\Entity\Color; use AppBundle\Entity\Rebrickable\Inventory_Part; use AppBundle\Entity\Rebrickable\Inventory_Set; @@ -28,17 +29,45 @@ class SetController extends Controller $regularParts = $em->getRepository(Inventory_Part::class)->findAllRegularBySetNumber($set->getNumber()); $spareParts = $em->getRepository(Inventory_Part::class)->findAllSpareBySetNumber($set->getNumber()); + $models = $em->getRepository(Model::class)->findAllBySetNumber($set->getNumber()); - $template = $this->render('rebrickable/set/parts.html.twig', [ + $template = $this->render('rebrickable/set/inventory.html.twig', [ 'regularParts' => $regularParts, 'spareParts' => $spareParts, + 'models' => $models, ]); - $json = json_encode($template->getContent()); - $response = new Response($json, 200); - $response->headers->set('Content-Type', 'application/json'); +// $json = json_encode($template->getContent()); +// $response = new Response($json, 200); +// $response->headers->set('Content-Type', 'application/json'); +// +// return $response; - return $response; + return $template; + } + + /** + * @Route("/{number}/models", name="rebrickable_set_models") + */ + public function modelsAction(Set $set) + { + $models = null; + + try { + $this->get('repository.ldraw.model')->findAllBySetNumber($set->getNumber()); + $models = $this->get('service.set')->getModels($set); + $spareModels = $this->get('service.set')->getSpareModels($set); + +// $models = $this->get('repository.ldraw.model')->findAllRegularBySetNumber($set->getNumber()); + } catch (\Exception $e) { + $this->addFlash('error', $e->getMessage()); + } + + return $this->render('rebrickable/set/models.html.twig', [ + 'set' => $set, + 'models' => $models, + 'spareModels' => $spareModels + ]); } /** diff --git a/src/AppBundle/Repository/Rebrickable/Inventory_PartRepository.php b/src/AppBundle/Repository/Rebrickable/Inventory_PartRepository.php index ef63d02..95b07f0 100644 --- a/src/AppBundle/Repository/Rebrickable/Inventory_PartRepository.php +++ b/src/AppBundle/Repository/Rebrickable/Inventory_PartRepository.php @@ -16,11 +16,10 @@ class Inventory_PartRepository extends BaseRepository $inventory = $this->getEntityManager()->getRepository(Inventory::class)->findNewestInventoryBySetNumber($number); $queryBuilder = $this->createQueryBuilder('inventory_part') - ->join(Inventory::class, 'inventory', JOIN::WITH, 'inventory_part.inventory = inventory') + ->join(Inventory::class, 'inventory', JOIN::WITH, 'inventory_part.inventory = :inventory') ->join(Part::class, 'part', JOIN::WITH, 'inventory_part.part = part.number') ->where('part.category != 17') - ->andWhere('inventory.id = :inventoryId') - ->setParameter('inventoryId', $inventory->getId()) + ->setParameter('inventory', $inventory) ->andWhere('inventory_part.spare = FALSE') ->distinct(true); @@ -32,14 +31,30 @@ class Inventory_PartRepository extends BaseRepository $inventory = $this->getEntityManager()->getRepository(Inventory::class)->findNewestInventoryBySetNumber($number); $queryBuilder = $this->createQueryBuilder('inventory_part') - ->join(Inventory::class, 'inventory', JOIN::WITH, 'inventory_part.inventory = inventory') + ->join(Inventory::class, 'inventory', JOIN::WITH, 'inventory_part.inventory = :inventory') ->join(Part::class, 'part', JOIN::WITH, 'inventory_part.part = part.number') ->where('part.category != 17') - ->andWhere('inventory.id = :inventoryId') - ->setParameter('inventoryId', $inventory->getId()) + ->setParameter('inventory', $inventory) ->andWhere('inventory_part.spare = TRUE') ->distinct(true); return $queryBuilder->getQuery()->getResult(); } + + public function findAllBySetNumberAndColor($number, $color) + { + $inventory = $this->getEntityManager()->getRepository(Inventory::class)->findNewestInventoryBySetNumber($number); + + $queryBuilder = $this->createQueryBuilder('inventory_part') + ->join(Inventory::class, 'inventory', JOIN::WITH, 'inventory_part.inventory = inventory') + ->join(Part::class, 'part', JOIN::WITH, 'inventory_part.part = part.number') + ->where('part.category != 17') + ->andWhere('inventory.id = :inventoryId') + ->setParameter('inventoryId', $inventory->getId()) + ->andWhere('inventory_part.color = :color') + ->setParameter('color', $color) + ->distinct(true); + + return $queryBuilder->getQuery()->getResult(); + } } diff --git a/src/AppBundle/Service/SetService.php b/src/AppBundle/Service/SetService.php new file mode 100644 index 0000000..52cc9ce --- /dev/null +++ b/src/AppBundle/Service/SetService.php @@ -0,0 +1,84 @@ +inventoryPartRepository = $inventoryPartRepository; + } + + + public function getUniqueModelCount(Set $set) { + + } + + public function getModels(Set $set) + { + $models = []; + + $inventoryParts = $this->inventoryPartRepository->findAllRegularBySetNumber($set->getNumber()); + + /** @var Inventory_Part $inventoryPart */ + foreach ($inventoryParts as $inventoryPart) { + $model = $inventoryPart->getPart()->getModel(); + $color = $inventoryPart->getColor(); + if($model) { + $models[$model->getNumber()]['model'] = $model; + + $quantity = 0; + if(isset($models[$model->getNumber()]['colors'][$color->getId()]['quantity'])) { + $quantity = $models[$model->getNumber()]['colors'][$color->getId()]['quantity']; + } + + $models[$model->getNumber()]['colors'][$color->getId()] = [ + 'color' => $color, + 'quantity' => $quantity+$inventoryPart->getQuantity() + ]; + } + } + + return $models; + } + + public function getSpareModels(Set $set) + { + $models = []; + + $inventoryParts = $this->inventoryPartRepository->findAllSpareBySetNumber($set->getNumber()); + + /** @var Inventory_Part $inventoryPart */ + foreach ($inventoryParts as $inventoryPart) { + $model = $inventoryPart->getPart()->getModel(); + $color = $inventoryPart->getColor(); + if($model) { + $models[$model->getNumber()]['model'] = $model; + + $quantity = 0; + if(isset($models[$model->getNumber()]['colors'][$color->getId()]['quantity'])) { + $quantity = $models[$model->getNumber()]['colors'][$color->getId()]['quantity']; + } + + $models[$model->getNumber()]['colors'][$color->getId()] = [ + 'color' => $color, + 'quantity' => $quantity+$inventoryPart->getQuantity() + ]; + } + } + + return $models; + } + } \ No newline at end of file