From 197612de7b89c8f096b1f49216f8dbb7da9af72b Mon Sep 17 00:00:00 2001 From: Mike Ng Date: Thu, 17 Aug 2017 14:42:10 +0400 Subject: [PATCH] implementation back-end for refactoring of orders refactoring layout order-box and order-item --- .../Controller/Prod/RecordController.php | 114 ++- .../ControllerProvider/Prod/Record.php | 5 + lib/Alchemy/Phrasea/Model/Entities/Order.php | 100 +- .../Model/Repositories/OrderRepository.php | 122 ++- .../Order/Controller/ProdOrderController.php | 23 +- .../web/common/index_bootstrap.html.twig | 1 + templates/web/prod/orders/order_box.html.twig | 228 ++++- .../web/prod/orders/order_item.html.twig | 935 ++++++++++++++++-- 8 files changed, 1294 insertions(+), 234 deletions(-) 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 %} -
- - - - - - - - - - - - - - - - - {% for order in orders %} - {% set deadline = app['date-formatter'].getPrettyString(order.getDeadline()) %} - order.getDeadline() ? "style=color:#777": "" }} data-order-id="{{ order.getId() }}"> - - +
- {% trans with {'%page%' : page} %}Page %page%{% endtrans %} -
{{ 'Utilisateur' | trans }}{{ 'Date de demande' | trans }}{{ 'Deadline' | trans }}{{ 'Utilisation prevue' | trans }}{{ 'Statut' | trans }}
{{ order.getUser().getDisplayName() }}{{ app['date-formatter'].getPrettyString(order.getCreatedOn()) }}
+ + - - - {% endfor %} - - + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + +
+ +
+
+ + + {% if orders_todo|length > 0 %} + {% for order in orders_todo %} + {% set deadline = order.getDeadline()|date('d/m/Y') %} + order.getDeadline() ? "style=color:#777": "" }}> + + + + + + + + {% endfor %} + {% else %} + + + + {% endif %} + +
+ + + + + {{ '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() }} +
{{ 'order-manager::order-list: no-result' | trans }}
+
+
+
+
+ + + {% if orders_processed|length > 0 %} + {% for order in orders_processed %} + {% set deadline = order.getDeadline()|date('d/m/Y') %} + order.getDeadline() ? "style=color:#777": "" }}> + + + + + + + + {% endfor %} + {% else %} + + + + {% endif %} + +
+ + + + + {{ '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() }} +
{{ 'order-manager::order-list: no-result' | trans }}
+
+
-
+
+
- {% if nextPage %} - - {% endif %} +
+
    + {% set previousPage = page < 2 ? false : (page - 1) %} + {% set nextPage = page >= (totalProcessed / perPage)|ceil ? false : (page + 1) %} + {% if previousPage %} + + {% endif %} + {% if nextPage %} + + {% 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() %} - -
- {{ 'Selectionnez des documents et' | trans }} - - - - - + +
+ +
+
+ {% include 'common/preview.html.twig' with {'record': order.getElements()[0].getRecord(app)}%} +
+
+ + + + + {{ 'order-manager::order-item: information' | trans }} +
+
+ {% include 'common/caption.html.twig' with {'record': order.getElements()[0].getRecord(app), 'view': 'preview' }%} +
+
+
+
+ 0 +

{{ 'order-manager::order-item: selected-records' | trans }}

+ +
+
+
+ + + + +
+
+
+
+ + \ No newline at end of file