diff --git a/lib/Alchemy/Phrasea/Controller/Prod/RecordController.php b/lib/Alchemy/Phrasea/Controller/Prod/RecordController.php
index 5567ff8bc9..20fcbe3db4 100644
--- a/lib/Alchemy/Phrasea/Controller/Prod/RecordController.php
+++ b/lib/Alchemy/Phrasea/Controller/Prod/RecordController.php
@@ -121,6 +121,54 @@ class RecordController extends Controller
]);
}
+ /**
+ * @param \record_preview $recordContainer
+ * @return array
+ */
+ private function getContainerResult(\record_preview $recordContainer)
+ {
+ /* @var $recordPreview \media_subdef */
+ $helpers = new PhraseanetExtension($this->app);
+
+ $recordData = [
+ 'databoxId' => $recordContainer->getBaseId(),
+ 'id' => $recordContainer->getId(),
+ 'isGroup' => $recordContainer->isStory(),
+ 'url' => (string)$helpers->getThumbnailUrl($recordContainer),
+ ];
+ $userHaveAccess = $this->app->getAclForUser($this->getAuthenticatedUser())->has_access_to_subdef($recordContainer, 'preview');
+ if ($userHaveAccess) {
+ $recordPreview = $recordContainer->get_preview();
+ } else {
+ $recordPreview = $recordContainer->get_thumbnail();
+ }
+
+ $recordData['preview'] = [
+ 'width' => $recordPreview->get_width(),
+ 'height' => $recordPreview->get_height(),
+ 'url' => $this->app->url('alchemy_embed_view', [
+ 'url' => (string)($this->getAuthenticatedUser() ? $recordPreview->get_url() : $recordPreview->get_permalink()->get_url()),
+ 'autoplay' => false
+ ])
+ ];
+
+ return $recordData;
+ }
+
+ public function getRecordById($sbasId, $recordId)
+ {
+ $record = new \record_adapter($this->app, $sbasId, $recordId);
+ return $this->app->json([
+ "html_preview" => $this->render('common/preview.html.twig', [
+ 'record' => $record
+ ]),
+ "desc" => $this->render('common/caption.html.twig', [
+ 'record' => $record,
+ 'view' => 'preview'
+ ])
+ ]);
+ }
+
/**
* Delete a record or a list of records
*
@@ -169,6 +217,22 @@ class RecordController extends Controller
return $this->app->json($deleted);
}
+ /**
+ * @return BasketElementRepository
+ */
+ private function getBasketElementRepository()
+ {
+ return $this->app['repo.basket-elements'];
+ }
+
+ /**
+ * @return StoryWZRepository
+ */
+ private function getStoryWorkZoneRepository()
+ {
+ return $this->app['repo.story-wz'];
+ }
+
/**
* Delete a record or a list of records
*
@@ -207,54 +271,4 @@ class RecordController extends Controller
return $this->app->json($renewed);
}
-
- /**
- * @return BasketElementRepository
- */
- private function getBasketElementRepository()
- {
- return $this->app['repo.basket-elements'];
- }
-
- /**
- * @return StoryWZRepository
- */
- private function getStoryWorkZoneRepository()
- {
- return $this->app['repo.story-wz'];
- }
-
- /**
- * @param \record_preview $recordContainer
- * @return array
- */
- private function getContainerResult(\record_preview $recordContainer)
- {
- /* @var $recordPreview \media_subdef */
- $helpers = new PhraseanetExtension($this->app);
-
- $recordData = [
- 'databoxId' => $recordContainer->getBaseId(),
- 'id' => $recordContainer->getId(),
- 'isGroup' => $recordContainer->isStory(),
- 'url' => (string)$helpers->getThumbnailUrl($recordContainer),
- ];
- $userHaveAccess = $this->app->getAclForUser($this->getAuthenticatedUser())->has_access_to_subdef($recordContainer, 'preview');
- if ($userHaveAccess) {
- $recordPreview = $recordContainer->get_preview();
- } else {
- $recordPreview = $recordContainer->get_thumbnail();
- }
-
- $recordData['preview'] = [
- 'width' => $recordPreview->get_width(),
- 'height' => $recordPreview->get_height(),
- 'url' => $this->app->url('alchemy_embed_view', [
- 'url' => (string)($this->getAuthenticatedUser() ? $recordPreview->get_url() : $recordPreview->get_permalink()->get_url()),
- 'autoplay' => false
- ])
- ];
-
- return $recordData;
- }
}
diff --git a/lib/Alchemy/Phrasea/ControllerProvider/Prod/Record.php b/lib/Alchemy/Phrasea/ControllerProvider/Prod/Record.php
index 9bccb396bb..72c718ba5f 100644
--- a/lib/Alchemy/Phrasea/ControllerProvider/Prod/Record.php
+++ b/lib/Alchemy/Phrasea/ControllerProvider/Prod/Record.php
@@ -49,6 +49,11 @@ class Record implements ControllerProviderInterface, ServiceProviderInterface
->bind('record_details')
->method('GET|POST');
+ $controllers->get('/record/{sbasId}/{recordId}/', 'controller.prod.records:getRecordById')
+ ->bind('record_single')
+ ->assert('sbasId', '\d+')
+ ->assert('recordId', '\d+');
+
$controllers->post('/delete/', 'controller.prod.records:doDeleteRecords')
->bind('record_delete');
diff --git a/lib/Alchemy/Phrasea/Model/Entities/Order.php b/lib/Alchemy/Phrasea/Model/Entities/Order.php
index c0d52f8cb6..7d89141381 100644
--- a/lib/Alchemy/Phrasea/Model/Entities/Order.php
+++ b/lib/Alchemy/Phrasea/Model/Entities/Order.php
@@ -25,6 +25,15 @@ class Order
const NOTIFY_WEBHOOK = 'webhook';
+ const STATUS_TODO = 'pending';
+ const STATUS_PROCESSED = 'processed';
+ const STATUS_NO_FILTER = 'no_filter';
+ const STATUS_CURRENT_WEEK = 'current_week';
+ const STATUS_PAST_WEEK = 'past_week';
+ const STATUS_PAST_MONTH = 'past_month';
+ const STATUS_BEFORE = 'before';
+ const STATUS_AFTER = 'after';
+
/**
* @ORM\Column(type="integer")
* @ORM\Id
@@ -96,6 +105,14 @@ class Order
return $this->id;
}
+ /**
+ * @return User
+ */
+ public function getUser()
+ {
+ return $this->user;
+ }
+
/**
* @param User $user
*
@@ -109,11 +126,13 @@ class Order
}
/**
- * @return User
+ * Get deadline
+ *
+ * @return \DateTime
*/
- public function getUser()
+ public function getDeadline()
{
- return $this->user;
+ return $this->deadline;
}
/**
@@ -130,13 +149,13 @@ class Order
}
/**
- * Get deadline
+ * Get created_on
*
* @return \DateTime
*/
- public function getDeadline()
+ public function getCreatedOn()
{
- return $this->deadline;
+ return $this->createdOn;
}
/**
@@ -152,16 +171,6 @@ class Order
return $this;
}
- /**
- * Get created_on
- *
- * @return \DateTime
- */
- public function getCreatedOn()
- {
- return $this->createdOn;
- }
-
/**
* Add elements
*
@@ -197,6 +206,16 @@ class Order
return $this->elements;
}
+ /**
+ * Get todo
+ *
+ * @return integer
+ */
+ public function getTodo()
+ {
+ return $this->todo;
+ }
+
/**
* Set todo
*
@@ -210,16 +229,6 @@ class Order
return $this;
}
- /**
- * Get todo
- *
- * @return integer
- */
- public function getTodo()
- {
- return $this->todo;
- }
-
/**
* @param int $count
*/
@@ -238,6 +247,27 @@ class Order
return count($this->elements);
}
+ public function getTotalTreatedItems()
+ {
+ $count = 0;
+ foreach($this->elements as $element) {
+ if(!is_null($element->getDeny())) {
+ $count++;
+ }
+ }
+ return $count;
+ }
+
+ /**
+ * Get order_usage
+ *
+ * @return string
+ */
+ public function getOrderUsage()
+ {
+ return $this->orderUsage;
+ }
+
/**
* Set order_usage
*
@@ -252,13 +282,13 @@ class Order
}
/**
- * Get order_usage
+ * Get basket
*
- * @return string
+ * @return Basket
*/
- public function getOrderUsage()
+ public function getBasket()
{
- return $this->orderUsage;
+ return $this->basket;
}
/**
@@ -282,16 +312,6 @@ class Order
return $this;
}
- /**
- * Get basket
- *
- * @return Basket
- */
- public function getBasket()
- {
- return $this->basket;
- }
-
/**
* @return string The name of the notification method that will be used to handle this order's status change
* notifications.
diff --git a/lib/Alchemy/Phrasea/Model/Repositories/OrderRepository.php b/lib/Alchemy/Phrasea/Model/Repositories/OrderRepository.php
index 4bfb968aff..2e801b5003 100644
--- a/lib/Alchemy/Phrasea/Model/Repositories/OrderRepository.php
+++ b/lib/Alchemy/Phrasea/Model/Repositories/OrderRepository.php
@@ -31,58 +31,118 @@ class OrderRepository extends EntityRepository
/**
* Returns an array of all the orders, starting at $offsetStart, limited to $perPage
*
- * @param array $baseIds
+ * @param array $baseIds
* @param integer $offsetStart
* @param integer $perPage
- * @param string $sort
- *
+ * @param string $sort
+ * @param ArrayCollection $filters
* @return Order[]
*/
- public function listOrders($baseIds, $offsetStart = 0, $perPage = 20, $sort = "created_on")
+ public function listOrders($baseIds, $offsetStart = 0, $perPage = 20, $sort = "created_on", $filters = [])
{
$qb = $this
->createQueryBuilder('o');
- if (!empty($baseIds)) {
- $qb
- ->innerJoin('o.elements', 'e')
- ->where($qb->expr()->in('e.baseId', $baseIds))
- ->groupBy('o.id');
- }
+ $this->performQuery($qb, $baseIds, $filters);
+ $qb->groupBy('o.id');
- if ($sort === 'user') {
- $qb->orderBy('o.user', 'ASC');
- } elseif ($sort === 'usage') {
- $qb->orderBy('o.orderUsage', 'ASC');
- } else {
- $qb->orderBy('o.createdOn', 'DESC');
- }
+ if ($sort === 'user') {
+ $qb->orderBy('o.user', 'ASC');
+ }
+ elseif ($sort === 'usage') {
+ $qb->orderBy('o.orderUsage', 'ASC');
+ }
+ else {
+ $qb->orderBy('o.createdOn', 'DESC');
+ }
- $qb
- ->setFirstResult((int) $offsetStart)
- ->setMaxResults(max(10, (int) $perPage));
+ $qb
+ ->setFirstResult((int)$offsetStart)
+ ->setMaxResults(max(10, (int)$perPage));
- return $qb->getQuery()->getResult();
+ return $qb->getQuery()->getResult();
+ }
+
+ public function performQuery($qb, $baseIds, $filters)
+ {
+ if (!empty($baseIds)) {
+ $qb
+ ->innerJoin('o.elements', 'e')
+ ->where($qb->expr()->in('e.baseId', $baseIds));
+ if ($filters['todo'] == Order::STATUS_TODO) {
+ $qb
+ ->andWhere('o.todo != 0');
+ }
+ elseif ($filters['todo'] == Order::STATUS_PROCESSED) {
+ $qb
+ ->andWhere('o.todo = 0');
+ }
+
+ $createdOn = '';
+ switch ($filters['created_on']) {
+ case Order::STATUS_CURRENT_WEEK: //this week
+ $time = strtotime(date("Y-m-d 00:00:00"));
+ //check if today is monday
+ if (date('D', $time) == 'Mon') {
+ $weekStartDate = date('Y-m-d', strtotime("Monday", $time));
+ }
+ else {
+ $weekStartDate = date('Y-m-d', strtotime("last Monday", $time));
+ }
+ $createdOn = $weekStartDate;
+ $qb->andWhere("o.createdOn >= '" . $createdOn . "'");
+ break;
+
+ case Order::STATUS_PAST_WEEK: //last week
+ $time = strtotime('last week');
+ $lastWeekStartDate = date('Y-m-d', strtotime("Monday", $time));
+ $createdOn = $lastWeekStartDate;
+ $qb->andWhere("o.createdOn >= '" . $createdOn . "'");
+ break;
+
+ case Order::STATUS_PAST_MONTH: //last month
+ $lastMonthStartDate = date("Y-m-d", strtotime("first day of previous month"));
+ $createdOn = $lastMonthStartDate;
+ $qb->andWhere("o.createdOn >= '" . $createdOn . "'");
+ break;
+
+ case Order::STATUS_BEFORE: //before specific date
+ if (isset($filters['limit']['date'])) {
+ $createdOn = date('Y-m-d', strtotime($filters['limit']['date']));
+ $qb->andWhere("o.createdOn < '" . $createdOn . "'");
+ }
+ break;
+
+ case Order::STATUS_AFTER: //before specific date
+ if (isset($filters['limit']['date'])) {
+ $createdOn = date('Y-m-d', strtotime($filters['limit']['date']));
+ $qb->andWhere("o.createdOn > '" . $createdOn . "'");
+ }
+ break;
+
+ case Order::STATUS_NO_FILTER:
+ //no filtering by date
+ break;
+
+ default:
+ break;
+ }
+ }
}
/**
- * Returns the total number of orders from an array of base_id
+ * Returns the total number of orders from an array of base_id and filters
*
* @param array $baseIds
- *
+ * @param array $filters
* @return int
*/
- public function countTotalOrders(array $baseIds = [])
+ public function countTotalOrders(array $baseIds = [], $filters = [])
{
$builder = $this->createQueryBuilder('o');
$builder->select($builder->expr()->countDistinct('o.id'));
-
- if (!empty($baseIds)) {
- $builder
- ->innerJoin('o.elements', 'e')
- ->where($builder->expr()->in('e.baseId', $baseIds));
- }
+ $this->performQuery($builder, $baseIds, $filters);
return $builder->getQuery()->getSingleScalarResult();
}
-}
+}
\ No newline at end of file
diff --git a/lib/Alchemy/Phrasea/Order/Controller/ProdOrderController.php b/lib/Alchemy/Phrasea/Order/Controller/ProdOrderController.php
index d4372c18b8..b92d57fca0 100644
--- a/lib/Alchemy/Phrasea/Order/Controller/ProdOrderController.php
+++ b/lib/Alchemy/Phrasea/Order/Controller/ProdOrderController.php
@@ -103,6 +103,10 @@ class ProdOrderController extends BaseOrderController
$perPage = (int) $request->query->get('per-page', 10);
$offsetStart = 0;
+ $todo = $request->query->get('todo', Order::STATUS_TODO);
+ $start = $request->query->get('start', Order::STATUS_NO_FILTER);
+ $limit = $request->query->get('limit', []);
+
if ($page > 0) {
$offsetStart = ($page - 1) * $perPage;
}
@@ -111,16 +115,23 @@ class ProdOrderController extends BaseOrderController
$baseIds = array_keys($this->getAclForUser()->get_granted_base([\ACL::ORDER_MASTER]));
- $ordersList = $this->getOrderRepository()->listOrders($baseIds, $offsetStart, $perPage, $sort);
- $total = $this->getOrderRepository()->countTotalOrders($baseIds);
+ $ordersListTodo = $this->getOrderRepository()->listOrders($baseIds, $offsetStart, $perPage, $sort,
+ ['todo' => Order::STATUS_TODO, 'created_on' => $start, 'limit' => $limit]);
+ $ordersListProcessed = $this->getOrderRepository()->listOrders($baseIds, $offsetStart, $perPage, $sort,
+ ['todo' => Order::STATUS_PROCESSED, 'created_on' => $start, 'limit' => $limit]);
+ $totalTodo = $this->getOrderRepository()->countTotalOrders($baseIds, ['todo' => Order::STATUS_TODO, 'created_on' => $start, 'limit' => $limit]);
+ $totalProcessed = $this->getOrderRepository()->countTotalOrders($baseIds, ['todo' => Order::STATUS_PROCESSED, 'created_on' => $start, 'limit' => $limit]);
return $this->render('prod/orders/order_box.html.twig', [
'page' => $page,
'perPage' => $perPage,
- 'total' => $total,
- 'previousPage' => $page < 2 ? false : ($page - 1),
- 'nextPage' => $page >= ceil($total / $perPage) ? false : $page + 1,
- 'orders' => new ArrayCollection($ordersList),
+ 'totalTodo' => $totalTodo,
+ 'totalProcessed' => $totalProcessed,
+ 'orders_todo' => new ArrayCollection($ordersListTodo),
+ 'orders_processed' => new ArrayCollection($ordersListProcessed),
+ 'todo' => $todo,
+ 'start' => $start,
+ 'date' => $limit ? $limit['date']: null
]);
}
diff --git a/templates/web/common/index_bootstrap.html.twig b/templates/web/common/index_bootstrap.html.twig
index 5a70b3351d..f62da0c19f 100644
--- a/templates/web/common/index_bootstrap.html.twig
+++ b/templates/web/common/index_bootstrap.html.twig
@@ -19,6 +19,7 @@
+
{% block rss %}{% endblock %}
{% block javascript %}{% endblock %}
diff --git a/templates/web/prod/orders/order_box.html.twig b/templates/web/prod/orders/order_box.html.twig
index 28675d9c57..f10a755750 100644
--- a/templates/web/prod/orders/order_box.html.twig
+++ b/templates/web/prod/orders/order_box.html.twig
@@ -20,54 +20,200 @@
{% endif %}
-
-
-
-
-
- {% trans with {'%page%' : page} %}Page %page%{% endtrans %}
- |
-
-
-
-
- {{ 'Utilisateur' | trans }} |
- {{ 'Date de demande' | trans }} |
- {{ 'Deadline' | trans }} |
- {{ 'Utilisation prevue' | trans }} |
- {{ 'Statut' | trans }} |
-
-
-
- {% for order in orders %}
- {% set deadline = app['date-formatter'].getPrettyString(order.getDeadline()) %}
- order.getDeadline() ? "style=color:#777": "" }} data-order-id="{{ order.getId() }}">
- {{ order.getUser().getDisplayName() }} |
- {{ app['date-formatter'].getPrettyString(order.getCreatedOn()) }} |
+
+
+
+
+
+
+
+
+
+ {% if orders_todo|length > 0 %}
+ {% for order in orders_todo %}
+ {% set deadline = order.getDeadline()|date('d/m/Y') %}
+ order.getDeadline() ? "style=color:#777": "" }}>
+
+
+
+
+ |
+
+ {{ 'order-manager::order-list: order-id' | trans }}
+ {{ order.getId() }}
+ |
+
+ {{ order.getOrderUsage() | nl2br }}
+ {{ order.getUser().getEmail() }}
+ |
+
+ {{ 'Date de demande' | trans }}
+ {{ order.getCreatedOn()|date('d/m/Y') }}
+ |
+
+ {{ 'Deadline' | trans }}
+
+ {% if deadline != '' %}
+ {{deadline}}
+ {% else %}
+ {{ 'Aucune' | trans }}
+ {% endif %}
+
+ |
+
+ {{ 'order-manager::order-list: treated-documents' | trans }}
+ {{ order.getTotalTreatedItems() }}/{{ order.getTotal() }}
+ |
+
+ {% endfor %}
+ {% else %}
+
+ {{ 'order-manager::order-list: no-result' | trans }} |
+
+ {% endif %}
+
+
+
+
+
+
+
+
+ {% if orders_processed|length > 0 %}
+ {% for order in orders_processed %}
+ {% set deadline = order.getDeadline()|date('d/m/Y') %}
+ order.getDeadline() ? "style=color:#777": "" }}>
+
+
+
+
+ |
+
+ {{ 'order-manager::order-list: order-id' | trans }}
+ {{ order.getId() }}
+ |
+
+ {{ order.getOrderUsage() | nl2br }}
+ {{ order.getUser().getEmail() }}
+ |
+
+ {{ 'Date de demande' | trans }}
+ {{ order.getCreatedOn()|date('d/m/Y') }}
+ |
+
+ {{ 'Deadline' | trans }}
+
+ {% if deadline != '' %}
+ {{deadline}}
+ {% else %}
+ {{ 'Aucune' | trans }}
+ {% endif %}
+
+ |
+
+ {{ 'order-manager::order-list: treated-documents' | trans }}
+ {{ order.getTotalTreatedItems() }}/{{ order.getTotal() }}
+ |
+
+ {% endfor %}
+ {% else %}
+
+ {{ 'order-manager::order-list: no-result' | trans }} |
+
+ {% endif %}
+
+
+
+
-
+
+
diff --git a/templates/web/prod/orders/order_item.html.twig b/templates/web/prod/orders/order_item.html.twig
index 2f2008be8a..f68e054cf5 100644
--- a/templates/web/prod/orders/order_item.html.twig
+++ b/templates/web/prod/orders/order_item.html.twig
@@ -1,21 +1,49 @@
{% import 'common/thumbnail.html.twig' as thumbnail %}
{% set displayName = order.getUser().getDisplayName() %}
-