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)
{
$success = false;
$collectionHasOrderAdmins = new ArrayCollection();
$toRemove = [];
$records = RecordsRequest::fromRequest($this->app, $request, true, ['cancmd']);
$hasOneAdmin = [];
if (!$records->isEmpty()) {
$order = new OrderEntity();
$order->setUser($this->getAuthenticatedUser());
$order->setDeadline((null !== $deadLine = $request->request->get('deadline')) ? new \DateTime($deadLine) : $deadLine);
$order->setOrderUsage($request->request->get('use', ''));
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()])) {
$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()]);
if (!$hasOneAdmin[$record->get_base_id()]) {
$toRemove[] = $key;
} else {
$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');
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->setUser($this->getAuthenticatedUser());
$order->setDeadline($deadLine);
$order->setOrderUsage($orderUsage);
$this->fillOrderFromRequest($records, $order);
$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');
$msg = $this->app->trans('The records have been properly ordered');
} catch (OrderControllerException $exception) {
$success = false;
$msg = $exception->getMessage();
}
if ('json' === $request->getRequestFormat()) {
@@ -322,4 +280,46 @@ class OrderController extends Controller
{
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;
$records = $this->toArray();
array_walk($records, function ($record) use (&$i) {
array_walk($records, function (\record_adapter $record) use (&$i) {
$record->setNumber($i++);
});
}
@@ -103,8 +103,8 @@ class RecordsRequest extends ArrayCollection
/** @var \record_adapter $record */
foreach ($this as $record) {
if (false === array_key_exists($record->get_base_id(), $this->collections)) {
$this->collections[$record->get_base_id()] = $record->get_collection();
if (! isset($this->collections[$record->getBaseId()])) {
$this->collections[$record->getBaseId()] = $record->get_collection();
}
}