Refactor OrderController

This commit is contained in:
Benoît Burnichon
2016-02-25 19:40:46 +01:00
parent 2b5557ac7c
commit cb87d7c0f1
3 changed files with 80 additions and 64 deletions

View File

@@ -46,73 +46,31 @@ class OrderController extends Controller
*/ */
public function createOrder(Request $request) public function createOrder(Request $request)
{ {
$success = false;
$collectionHasOrderAdmins = new ArrayCollection();
$toRemove = [];
$records = RecordsRequest::fromRequest($this->app, $request, true, ['cancmd']); $records = RecordsRequest::fromRequest($this->app, $request, true, ['cancmd']);
$hasOneAdmin = [];
if (!$records->isEmpty()) { try {
if ($records->isEmpty()) {
throw new OrderControllerException($this->app->trans('There is no record eligible for an order'));
}
if (null !== $deadLine = $request->request->get('deadline')) {
$deadLine = new \DateTime($deadLine);
}
$orderUsage = $request->request->get('use', '');
$order = new OrderEntity(); $order = new OrderEntity();
$order->setUser($this->getAuthenticatedUser()); $order->setUser($this->getAuthenticatedUser());
$order->setDeadline((null !== $deadLine = $request->request->get('deadline')) ? new \DateTime($deadLine) : $deadLine); $order->setDeadline($deadLine);
$order->setOrderUsage($request->request->get('use', '')); $order->setOrderUsage($orderUsage);
foreach ($records as $key => $record) {
if ($collectionHasOrderAdmins->containsKey($record->get_base_id())) {
if (!$collectionHasOrderAdmins->get($record->get_base_id())) {
$records->remove($key);
}
}
if (!isset($hasOneAdmin[$record->get_base_id()])) { $this->fillOrderFromRequest($records, $order);
$query = $this->createUserQuery();
$hasOneAdmin[$record->get_base_id()] = (Boolean) count($query->on_base_ids([$record->get_base_id()])
->who_have_right(['order_master'])
->execute()->get_results());
}
$collectionHasOrderAdmins->set($record->get_base_id(), $hasOneAdmin[$record->get_base_id()]); $success = true;
$msg = $this->app->trans('The records have been properly ordered');
if (!$hasOneAdmin[$record->get_base_id()]) { } catch (OrderControllerException $exception) {
$toRemove[] = $key; $success = false;
} else { $msg = $exception->getMessage();
$orderElement = new OrderElement();
$order->addElement($orderElement);
$orderElement->setOrder($order);
$orderElement->setBaseId($record->get_base_id());
$orderElement->setRecordId($record->get_record_id());
$this->getEntityManager()->persist($orderElement);
}
}
foreach ($toRemove as $key) {
if ($records->containsKey($key)) {
$records->remove($key);
}
}
$noAdmins = $collectionHasOrderAdmins->forAll(function ($key, $hasAdmin) {
return false === $hasAdmin;
});
if ($noAdmins) {
$msg = $this->app->trans('There is no one to validate orders, please contact an administrator');
} else {
$order->setTodo($order->getElements()->count());
try {
$this->dispatch(PhraseaEvents::ORDER_CREATE, new OrderEvent($order));
$this->getEntityManager()->persist($order);
$this->getEntityManager()->flush();
$msg = $this->app->trans('The records have been properly ordered');
$success = true;
} catch (\Exception $e) {
$msg = $this->app->trans('An error occured');
}
}
} else {
$msg = $this->app->trans('There is no record eligible for an order');
} }
if ('json' === $request->getRequestFormat()) { if ('json' === $request->getRequestFormat()) {
@@ -322,4 +280,46 @@ class OrderController extends Controller
{ {
return $this->app['repo.orders']; return $this->app['repo.orders'];
} }
private function fillOrderFromRequest(RecordsRequest $records, Order $order)
{
$collectionIds = [];
foreach ($records->collections() as $collection) {
$collectionIds[] = $collection->get_base_id();
}
$hasOneAdmin = [];
foreach ($this->app['repo.collection-references']->findHavingOrderMaster($collectionIds) as $reference) {
$hasOneAdmin[$reference->getBaseId()] = $reference;
}
if (!empty(array_diff($collectionIds, array_keys($hasOneAdmin)))) {
throw new OrderControllerException($this->app->trans('There is no one to validate orders, please contact an administrator'));
}
$entityManager = $this->getEntityManager();
foreach ($records as $key => $record) {
$orderElement = new OrderElement();
$order->addElement($orderElement);
$orderElement->setOrder($order);
$orderElement->setBaseId($record->get_base_id());
$orderElement->setRecordId($record->get_record_id());
$entityManager->persist($orderElement);
}
$order->setTodo($order->getElements()->count());
$entityManager->persist($order);
try {
$entityManager->flush();
$this->dispatch(PhraseaEvents::ORDER_CREATE, new OrderEvent($order));
} catch (\Exception $e) {
throw new OrderControllerException($this->app->trans('An error occurred'), 0, $e);
}
}
} }

View File

@@ -0,0 +1,16 @@
<?php
/**
* This file is part of Phraseanet
*
* (c) 2005-2016 Alchemy
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Alchemy\Phrasea\Controller\Prod;
class OrderControllerException extends \RuntimeException
{
}

View File

@@ -64,7 +64,7 @@ class RecordsRequest extends ArrayCollection
$i = 0; $i = 0;
$records = $this->toArray(); $records = $this->toArray();
array_walk($records, function ($record) use (&$i) { array_walk($records, function (\record_adapter $record) use (&$i) {
$record->setNumber($i++); $record->setNumber($i++);
}); });
} }
@@ -103,8 +103,8 @@ class RecordsRequest extends ArrayCollection
/** @var \record_adapter $record */ /** @var \record_adapter $record */
foreach ($this as $record) { foreach ($this as $record) {
if (false === array_key_exists($record->get_base_id(), $this->collections)) { if (! isset($this->collections[$record->getBaseId()])) {
$this->collections[$record->get_base_id()] = $record->get_collection(); $this->collections[$record->getBaseId()] = $record->get_collection();
} }
} }