Файл: Проектирование реализации операций бизнес-процесса. Планирование закупок и размещение заказов поставщикам.pdf

ВУЗ: Не указан

Категория: Курсовая работа

Дисциплина: Не указана

Добавлен: 31.03.2023

Просмотров: 59

Скачиваний: 1

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

Исходный код всех программных модулей с комментариями представлен в приложении.

2.8. Контрольный пример реализации проекта и его описание

После перехода на адрес ИС открывается страница авторизации (Рисунок 17).

Рисунок 17. Страница авторизации в ИС

После прохождения авторизации открывается страница просмотра уведомлений (Рисунок 18).

Рисунок 18. Страница просмотра уведомлений

Все уведомления сортируются по дате их отправки пользователю. Не просмотренные уведомления выделяются с помощью зажирнения. Также в панели навигации, расположенной слева, отображается количество не просмотренных уведомлений напротив соответствующего пункта меню. Переход между разделами ИС осуществляется с помощью этой панели навигации (Рисунок 19).

Рисунок 19. Панель навигации

Стоит отметить, что пункты меню «Отчеты» и «Пользователи» доступны только Администратору (руководителю отдела закупок).

При переходе в раздел заказы отображается список всех заказов, а также форма для поиска нужного заказа и их фильтрации (Рисунок 20).

Рисунок 20. Страница со списком заказов

Для добавления нового заказа необходимо нажать на кнопку «Добавить заказ», откроется форма добавления нового заказа (Рисунок 21).

Рисунок 21. Форма добавления нового заказа

После создания нового заказа он получает статус «Черновик», и он виден в списке только Администратору. С данным заказом может работать только Администратор. Работа заключается в добавлении в заказ товаров, которые необходимо заказать. Товары добавляются на отдельной вкладке с помощью специальной формы (Рисунок 22).

Рисунок 22. Вкладка добавления товаров в заказ

После добавления всех товаров нужно отправить его в работу выбранному менеджеру по закупкам, для этого необходим нажать кнопку «Отправить в работу», статус заказа меняется на «Новый» (Рисунок 23).

Рисунок 23. Кнопка «Отправить в работу»

При отправке заказа в работу менеджеру, назначенному на заказ, приходит уведомление (Рисунок 24).

Рисунок 24. Уведомление менеджеру о назначении его на заказ


Менеджеру необходимо подтвердить принятие заказа в работу, перейдя в него. Для этого на первой вкладке страницы работы с заказами имеется специальная кнопка «Подтвердить принятие в работу», она отображается только тому пользователю, который был назначен на заказ (Рисунок 25).

Рисунок 25. Кнопка «Подтвердить принятие в работу»

После подтверждения принятия заказа в работу его статус меняется на «В работе».

Для того, чтобы автоматически сформировать список потенциальных поставщиков для заказа необходимо перейти на вкладку «Список поставщиков» и нажать на кнопку «Получить список поставщиков» (Рисунок 26).

Рисунок 26. Вкладка «Список поставщиков»

Системой будет сформировать список потенциальных поставщиков для данного заказа на основании списков товаров, которые поставщики могут поставлять. Подбираются поставщики по совпадениям не только по товару, но и по категориям товаров (например, если нужна определенная модель планшета, то в список потенциальных поставщиков попадут также поставщики, которые имеют хоть один товар из категории «Планшеты»). Список поставщиков сортируется по рейтингу (Рисунок 27).

Рисунок 27. Вкладка «Список поставщиков» с сформированным списком

Для просмотра более подробных данных и добавления комментария необходимо нажать на ссылку «Подробнее» напротив нужного поставщика в списке. Откроется форма работы с поставщиком (Рисунок 28).

Рисунок 28. Форма работы с поставщиком для заказа

На данной форме помимо общей информации по поставщику отображается также и информация по каждому продукту из заказа: цена продукта, размер предоплаты, срок поступления и количество выполненных заказом данным поставщиком с данным товаром. Также имеется возможность отправить комментарий именно к данному поставщику в данном заказе.

В нижней части страницы расположены кнопки, с помощью которых можно выбрать поставщика, или скрыть его из списка. Скрытые поставщики опускаются вниз списка и помещаются зачеркиванием. Выбранный поставщик поднимается, наоборот, в верх списка и выделяется зеленым цветом (Рисунок 29).

Рисунок 29. Выбранный и скрытый поставщик в списке

После того, как в заказе выбран поставщик, кнопки скрытия и выбора поставщиков больше не отображаются, а заказ переходит в статус «Ждет подтверждения». Администратору приходит соответствующее уведомление, он должен перейти в заказ и подтвердить выбор менеджера.


После подтверждения выбора заказ переходит в статус «Поставщик выбран, ждет поставки». Менеджер должен зайти в заказ и сформировать его в виде документа Word.

После того, как по данному заказу товары поступят на предприятие, менеджер должен поставить оценку действия поставщика и оставить комментарий с общим впечатлением о работе с поставщиком. На основании оценки будет пересчитан рейтинг поставщика, а комментарий будет отображаться в истории заказов поставщика.

Естественно, чтобы система корректно формировала список потенциальных поставщиков и выбор нужно поставщика был точным и верным, необходимо ввести данные по поставщикам: как общие первичные данные, так и данные по товарам, которые поставщики могут поставлять. Эти данные вводятся в разделе «Поставщики». При переходе в данный раздел открывается форма со списком поставщиков (Рисунок 39).

Рисунок 39. Список поставщиков

Добавление нового поставщика выполняется с помощью формы, вызываемой нажатием на кнопку «Добавить поставщика». Для открытия формы редактирования данных необходимо нажать на имя поставщика в списке, откроется страница, состоящая из нескольких вкладок: общие данные, список товаров, история заказов (Рисунок 40).

Рисунок 40. Страница работы с данными поставщика

На второй вкладке отображается список товаров поставщика (Рисунок 41).

Рисунок 41. Вкладка «Список товаров»

На третьей вкладке – «Список заказов», выполненных данным поставщиком (Рисунок 42).

Рисунок 42. Вкладка «Список заказов»

Список товаров заполняется на основе данных справочников «Товары», «Категории товаров» и «Единицы измерения». Работа с этими справочниками выполняется в соответствующих разделах. При переходе в раздел открывается форма со списком записей справочника, добавление и редактирование товара выполняется с помощью соответствующей формы. На рисунке 43 приведен пример формы редактирования данных товара.

Рисунок 43. Форма работы с данными товара

Раздел формирования отчетов доступен только Администратору. При переходе в него открывается форма ввода интервала, за который необходимо сформировать отчет (Рисунок 44).

Рисунок 44. Форма для ввода интервала формирования отчета


После ввода интервала и нажатия на кнопку «Получить данные» под формой отображается таблица с результатами построения отчета (Рисунок 45).

Рисунок 45. Результат формирования отчета

ЗАКЛЮЧЕНИЕ

В ходе проделанной работы были решены следующие задачи:

  • была проанализирована текущая организация бизнес-процесса планирования закупок и размещения заказов поставщикам в компании ООО «АвтоХаус», были выделены основные этапы выполнения бизнес-процесса, изучен возникающий документооборот;
  • были выбран проектные решения по информационному обеспечению и программному, в качестве языка программирования был выбран php, а в качестве СУБД – Mysql;
  • была составлена информационная модель информационной системы, которая отражает пути преобразования входной информации в выходную;
  • была разработана база данных и программные модули, реализующие работу ИС.
  • был описан контрольный пример реализации проекта.

Таким образом, все задачи, поставленные перед данным курсовым проектом выполнены, а значит и основная цель достигнута.

СПИСОК ИСПОЛЬЗОВАННОЙ ЛИТЕРАТУРЫ

1. ГОСТ 2.105 – 95. Общие требования к текстовым документам.

2. ГОСТ 7.32 – 2001. Отчет по научно-исследовательской работе. Структура и правила оформления.

3. ГОСТ 7.82-2001. Библиографическое описание электронных ресурсов.

4. ГОСТ 24.702-85 Эффективность автоматизированных систем управления.

5. ГОСТ Р 7.0.5-2008. Библиографическая запись. Библиографическое описание.

6. Алистер Коберн, Современные методы описания функциональных требований к системам, М.: издательство "Лори", 2017. – 288 с

9. Дунаев В. HTML, скрипты и стили / В. Дунаев. – Спб. : БХВ-Петербург, 2015. – 816 с.

10. Жадеев А. PHP для начинающих / А. Жадеев. – Спб.: «Питер», 2014. – 592 c.

11. Колисниченко Д. PHP и MySQL. Разработка WEB-приложений / Д. Колисниченков – Спб: БХВ-Петербург, 2013. – 560 с.

12. Конналли Т. Базы данных. Проектирование, реализация и сопровождение. Теория и практика / Т. Коналли, К. Бегг. – М.: Издательский дом «Вильямс», 2013. – 1093 c.

13. Лобова Г. Моделирование и анализ бизнес-процессов SADT. – М.: LAP Lambert Academic Publishing, 2014. – 352 c.

14. Макдональд, М. Созданиец Web-сайта. Недостающее руководство / М. Макдональд. – Спб. : БХВ-Петербург, 2013. – 624 с.


17. Маклаков С.В. BPwin и Erwin. CASE-средства разработки информационных систем / С.В. Маклаков. – М. : ДИАЛОГ–МИФИ, 2014. – 369 c.

18. Тельнов, Ю.Ф. Информационные системы и технологии. Information System and Technologies: науч. издание под ред. Тельнова Ю. Ф. – М: Юнити-Дана, 2012 – 303 с.

19. Флэнаган, Д. Javascript. Подробное руководство / Д. Флэнаган : пер с англ. – М. : Символ-Плюс, 2013. – 1080 с.

ПРИЛОЖЕНИЯ

<?php

namespace
AppBundle\Controller;
use AppBundle\Entity\Notification;
use AppBundle\Entity\Order;
use AppBundle\Entity\OrderComment;
use AppBundle\Entity\OrderProduct;
use AppBundle\Entity\OrderProvider;
use AppBundle\Entity\OrderProviderComment;
use AppBundle\Entity\OrderStatus;
use AppBundle\Entity\ProviderProduct;
use AppBundle\Entity\User;
use AppBundle\Form\Type\OrderCommentFormType;
use AppBundle\Form\Type\OrderEndFormType;
use AppBundle\Form\Type\OrderFilterFormType;
use AppBundle\Form\Type\OrderFormType;
use AppBundle\Form\Type\OrderProductFormType;
use AppBundle\Form\Type\OrderProviderCommentFormType;
use Doctrine\ORM\Query;
use Sensio\Bundle\FrameworkExtraBundle\Configuration as Config;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Response;

class OrderController extends InitializableController
{
/**
*
@return RedirectResponse|Response
*
@Config\Route("/orders/index/{pagenum}", name = "site_orders_index", defaults={ "pagenum": "1"})
*/

public function indexAction($pagenum=1)
{
$form=$this->createForm(new OrderFilterFormType());
$caption = null;
$form->handleRequest($this->request);

$ordersquery = $this->getRepository('Order')->createQueryBuilder('o')
->leftJoin('o.specs', 's')
->where('o.deleted = 0')
->orderBy('o.vip', 'DESC')
->addOrderBy('o.status', 'ASC')
->addOrderBy('o.plandate', 'ASC');

$ordersquerycount = $this->getRepository('Order')->createQueryBuilder('o')
->select('COUNT(DISTINCT o.id)')
->leftJoin('o.specs', 's')
->where('o.deleted = 0')
->orderBy('o.plandate', 'DESC');

if ($form->isSubmitted() && $form->isValid()) {
$id = $form->get('id')->getData();
$status=$form->get('status')->getData();
$spec=$form->get('spec')->getData();
}

if (!empty($id)) {
$ordersquery->andWhere('o.id = :id')->setParameter('id', $id);
$ordersquerycount->andWhere('o.id = :id')->setParameter('id', $id);
}

if (!empty($status)) {
$ordersquery->andWhere('o.status = :status')->setParameter('status', $status);
$ordersquerycount->andWhere('o.status = :status')->setParameter('status', $status);
}

if (!empty($spec)) {
$ordersquery->andWhere('s.id = :spec')->setParameter('spec', $spec);
$ordersquerycount->andWhere('s.id = :spec')->setParameter('spec', $spec);
}

$count=$ordersquerycount->getQuery()->getSingleScalarResult();

$pages = floor($count / 20) + ($count % 20 > 0 ? 1 : 0);
if ($pages < 1) $pages = 1;
if ($pagenum > $pages) $pagenum = $pages;
$orders = $ordersquery->setFirstResult(($pagenum - 1) * 20)
->setMaxResults(20)
->getQuery()->getResult();

$this->view['orders'] = $orders;
$this->view['form'] = $form->createView();
$this->view['page']=$pagenum;
$this->view['pages']=$pages;
$this->navigation = array('active' => 'orders');
return $this->render('AppBundle:Orders:index.html.twig');
}

/**
*
@return RedirectResponse|Response
*
@Config\Route("/orders/add", name = "site_orders_add")
*/

public function addAction()
{
$order = new Order();
$form = $this->createForm(new OrderFormType(), $order);
$form->handleRequest($this->request);

if ($form->isSubmitted() && $form->isValid()) {

/** @var OrderStatus $newstatus**/
$newstatus = $this->getRepository('OrderStatus')->findOneBy(array('id'=>1));
$order->setStatus($newstatus);
foreach ($order->getSpecs() as $spec) {
$spec->getOrders()->add($order);
}
$this->manager->persist($order);
$this->manager->flush();

$this->addNotice('success',
'orders.html.twig',
array('notice' => 'order_added', 'caption' => $order->getId())
);

return $this->redirectToRoute('site_orders_edit',array('order' => $order->getId(), 'step' => 1));
}

$this->view['order'] = null;
$this->forms['order'] = $form->createView();
$this->navigation = array('active' => 'orders');
return $this->render('AppBundle:Orders:order1.html.twig');
}

/**
*
@param Order $order
*
@return RedirectResponse|Response
*
@Config\Route("/orders/{order}/edit/{step}", name = "site_orders_edit")
*
@Config\ParamConverter("order", options = {"mapping": {"order": "id"}})
*/

public function editAction(Order $order, $step)
{
if ($step > 4) {
$step = 4;
}

switch ($step) {
//общие данные
case 1:
$form = $this->createForm(new OrderFormType(), $order);
$specs=array();
foreach ($order->getSpecs() as $spec) {
array_push($specs, $spec);
}

$form2 = $this->createForm(new OrderEndFormType());
if ($this->request->isMethod('POST')) {
$form->handleRequest($this->request);
if ($form->isSubmitted() && $form->isValid()) {

//проверяем был ли добавлен новый специалист и если был - отправляем ему уведомление
foreach ($order->getSpecs() as $spec) {
if (!(in_array($spec,$specs ))) {
$this->addNotification($spec,"Вам назначен заказ №".$order->getId().". <a href='".$this->generateUrl('site_orders_edit', array('order'=>$order->getId(), 'step'=>1))."'>Подробнее</a>" );
$spec->getOrders()->add($order);
}
}
$specsnew=array();
foreach ($order->getSpecs() as $spec) {
array_push($specsnew, $spec);
}
//проверяем, был ли удален пользователь с заказа, если был - отправляем ему уведомление
foreach ($specs as $spec) {
if (!(in_array($spec,$specsnew ))) {
$this->addNotification($spec,"С Вас было снято назначение на заказ №".$order->getId().". <a href='".$this->generateUrl('site_orders_edit', array('order'=>$order->getId(), 'step'=>1))."'>Подробнее</a>" );
$spec->getOrders()->removeElement($order);
}
}

$this->manager->persist($order);
$this->manager->flush();
$this->addNotice('success',
'orders.html.twig',
array('notice' => 'order_changed', 'caption' => $order->getId())
);

return $this->redirectToRoute(
'site_orders_edit',
array('order' => $order->getId(), 'step' => 1)
);
}
$form2->handleRequest($this->request);
if ($form2->isSubmitted() && $form2->isValid()) {
//ставим дату
$order->setFactdate($form2->get('factdate')->getData());
//ставим статус
/**
@var OrderStatus $newstatus**/
$newstatus = $this->getRepository('OrderStatus')->findOneBy(array('id'=>7));
$order->setStatus($newstatus);
//ищем выбранного поставщика
/**
@var OrderProvider $orderprovider */
$orderprovider=$this->getRepository('OrderProvider')->createQueryBuilder('op')
->where('op.order = :order')
->andWhere('op.selected = true')
->setParameters(array('order'=>$order))->getQuery()->getOneOrNullResult();

if ($orderprovider) {
//добавляем коммент
$comment= new OrderProviderComment();
$comment->setUser($this->getUser());
$comment->setOrderprovider($orderprovider);
$comment->setDescription($form2->get('comment')->getData());
$this->manager->persist($comment);
$this->manager->flush();

//обновляем рейтинг
$orderprovider->setBall($form2->get('ball')->getData());
$this->manager->persist($orderprovider);
$newrate=$this->getRepository('OrderProvider')->createQueryBuilder('op')
->select('AVG (op.ball)')
->where('op.provider = :provider')
->andWhere('op.selected = true')
->setParameters(array('provider'=>$orderprovider->getProvider()))
->getQuery()->getSingleScalarResult();

$provider= $orderprovider->getProvider();
$provider->setRate($newrate);
$this->manager->persist($provider);
}

$this->manager->persist($order);
$this->manager->flush();
$this->addNotice('success',
'orders.html.twig',
array('notice' => 'order_ended', 'caption' => $order->getId())
);

//отправляем уведомление админу
/**
@var user $adminuser**/
$adminuser = $this->getRepository('User')->findOneBy(array('username'=>'admin'));
$this->addNotification($adminuser,"Пользователь ".$this->getUser()->getUserfio()." завершил заказ №".$order->getId().". <a href='".$this->generateUrl('site_orders_edit', array('order'=>$order->getId(), 'step'=>1))."'>Подробнее</a>" );

return $this->redirectToRoute('site_orders_index');
}
}
$this->view['order'] = $order;
$this->forms['order'] = $form->createView();
$this->forms['endorder'] = $form2->createView();
$this->navigation = array('active' => 'orders');
return $this->render('AppBundle:Orders:order1.html.twig');
break;
//список товаров
case 2:
$form = $this->createForm(new OrderProductFormType());
$products=$this->getRepository('OrderProduct')->createQueryBuilder('op')
->leftJoin('op.product','p')
->where('p.deleted <> 1')
->andWhere('op.order = :order')
->setParameters(array('order'=>$order))
->orderBy('p.category')->getQuery()->getResult();
if ($this->request->isXmlHttpRequest() && $this->request->isMethod('POST')) {
return $this->handleProductsAjaxRequest();
}

if ($this->request->isMethod('POST')) {
$form->handleRequest($this->request);
if ($form->isSubmitted() && $form->isValid()) {
$orderproduct = $form->getData();
$orderproduct->setOrder($order);

$this->manager->persist($orderproduct);
$this->manager->flush();
return $this->redirectToRoute(
'site_orders_edit',
array('order' => $order->getId(), 'step' => 2)
);
}
}
$this->view['order'] = $order;
$this->view['products'] = $products;
$this->forms['orderproduct'] = $form->createView();
$this->navigation = array('active' => 'orders');
return $this->render('AppBundle:Orders:order2.html.twig');
break;
//список поставщиков
case 3:
$orderproviders=$this->getRepository('OrderProvider')->createQueryBuilder('op')
->leftJoin('op.provider','pr')
->where('op.order = :order')
->orderBy('op.selected', 'DESC')
->addOrderBy('op.active', 'DESC')
->addOrderBy('pr.rate', 'DESC')
->setParameters(array('order'=>$order))
->getQuery()->getResult();
$this->view['order'] = $order;
$this->view['orderproviders'] = $orderproviders;
$this->navigation = array('active' => 'orders');
return $this->render('AppBundle:Orders:order3.html.twig');
break;
//комментарии
case 4:
$ordercomments=$this->getRepository('OrderComment')->createQueryBuilder('oc')
->where('oc.order = :order')
->orderBy('oc.id')
->setParameters(array('order'=>$order))
->getQuery()->getResult();
$ordercomment=new OrderComment();
$form=$this->createForm(new OrderCommentFormType(),$ordercomment );
$form->handleRequest($this->request);
if ($form->isSubmitted() && $form->isValid()) {
$ordercomment->setOrder($order);
$ordercomment->setUser($this->getUser());

$this->manager->persist($ordercomment);
$this->manager->flush();
return $this->redirectToRoute(
'site_orders_edit',
array('order' => $order->getId(), 'step' => 4)
);
}

$this->view['order'] = $order;
$this->view['ordercomments'] = $ordercomments;
$this->forms['ordercomment']=$form->createView();
$this->navigation = array('active' => 'orders');
return $this->render('AppBundle:Orders:order4.html.twig');
break;
}
return $this->redirect('site_orders_index');
}

protected function handleProductsAjaxRequest()
{
$category = $this->request->get('category', null);
if (is_null($category)) return new JsonResponse();
$products=$this->getRepository('Product')->createQueryBuilder('p')
->select('p.id as id')
->where('p.category = :category')
->andWhere('p.deleted=0')
->setParameters(array('category'=> $category))
->getQuery()->getResult(Query::HYDRATE_ARRAY);
return new JsonResponse($products);
}


/**
*
@param Order $order
*
@return Response
*
@Config\Route("/orders/{order}/remove", name = "site_orders_remove")
*
@Config\ParamConverter("order", options = {"mapping": {"order": "id"}})
*/

public function removeAction(Order $order)
{
$order->setDeleted(true);
$this->manager->persist($order);
$this->manager->flush();
return $this->redirectToRoute('site_orders_index');
}

//добавление поставщиков к заказу
/**
*
@param Order $order
*
@return Response
*
@Config\Route("/orders/{order}/providersadd", name = "site_orders_providers_add")
*
@Config\ParamConverter("order", options = {"mapping": {"order": "id"}})
*/

public function providersaddAction(Order $order)
{
//Формируем массив поставшиков с нужными товарами

$products=$this->getRepository('Product')->createQueryBuilder('p')
->innerJoin('p.orderproducts','op')
->where('op.order = :order')
->setParameters(array('order'=>$order))
->getQuery()
->getResult();

$providersp=$this->getRepository('Provider')->createQueryBuilder('p')
->leftJoin('p.providerproducts','pp')
->where('pp.product IN (:products)')
->setParameters(array('products'=>$products))
->getQuery()
->getResult();

//Формируем поставщиков с нужными категориями товаров

$categories=$this->getRepository('ProductCategory')->createQueryBuilder('pc')
->innerJoin('pc.products', 'p')
->innerJoin('p.orderproducts','op')
->where('op.order = :order')
->setParameters(array('order'=>$order))
->getQuery()
->getResult();

$providersc=$this->getRepository('Provider')->createQueryBuilder('p')
->leftJoin('p.providerproducts','pp')
->leftJoin('pp.product', 'pr')
->where('pr.category IN (:categories)')
->setParameters(array('categories'=>$categories))
->getQuery()
->getResult();

//склеиваем массивы

$providers=array_merge($providersp,$providersc);

//убирем повторения

$providers=array_unique($providers, SORT_REGULAR );

$countpr=0;
$countc=0;
// в цикле добавляем поставщиков к заказам
/**
@var User $usersystem**/
$usersystem = $this->getRepository('User')->findOneBy(array('username'=>'system'));
foreach ($providers as $provider){
$orderProvider=new OrderProvider();
$orderProvider->setProvider($provider);
$orderProvider->setOrder($order);
//и добавляем к каждому комментарий
$orderProviderComment = new OrderProviderComment();
if ( in_array($provider,$providersp)) {
$orderProviderComment->setDescription('Совпадение по товарам');
$countpr++;
}
else {
$orderProviderComment->setDescription('Совпадение по категориям');
$countc++;
}

$orderProviderComment->setOrderprovider($orderProvider);
$orderProviderComment->setUser($usersystem);
$this->manager->persist($orderProvider);
$this->manager->persist($orderProviderComment);
$this->manager->flush();
}

//Добавляем коммент о сформированном списке поставщиков

$ordercomment = new OrderComment();
$ordercomment->setUser($usersystem);
$ordercomment->setOrder($order);
$ordercomment->setDescription('Автоматически сформирован список потенциальных поставщиков. Всего: '.count($providers).'. Совпадений по товарам:'.$countpr.'. Совпадений по категориям: '.$countc);
$this->manager->persist($ordercomment);
$this->manager->flush();
return $this->redirectToRoute(
'site_orders_edit',
array('order' => $order->getId(), 'step' => 3)
);
}

/**
*
@param Order $order
*
@return Response
*
@Config\Route("/orders/{order}/changestatus/{status}", name = "site_orders_changestatus")
*
@Config\ParamConverter("order", options = {"mapping": {"order": "id"}})
*/

public function changestatusAction(Order $order, $status)
{
$oldstatus=$order->getStatus()->getId();
/** @var OrderStatus $newstatus**/
$newstatus = $this->getRepository('OrderStatus')->findOneBy(array('id'=>$status));
$order->setStatus($newstatus);
//отправляем уведомление пользователю
$descriptiontext='';
$notifusers=$order->getSpecs();
switch ($status) {
case 2:
$descriptiontext="Вам был назначен новый заказ № ".$order->getId().". Не забудьте подтвердить принятие в работу. <a href='".$this->generateUrl('site_orders_edit', array('order'=>$order->getId(), 'step'=>1))."'>Подробнее</a> ";
break;
case 3:
//если перед этим был статус "Ждет подтверждения"
if ($oldstatus==4) {
$descriptiontext="Заказ № ".$order->getId()." был вернут в работу. <a href='".$this->generateUrl('site_orders_edit', array('order'=>$order->getId(), 'step'=>1))."'>Подробнее</a> ";
//отменяем выбор поставщика
foreach ($order->getOrderproviders() as $orderprovider) {
$orderprovider->setSelected(false);
$this->manager->persist($orderprovider);
$this->manager->flush();
}
}
//иначе увеомление админу
else {
$descriptiontext="Пользователь ".$this->getUser()->getUserfio()." принял заказ № ".$order->getId()." в работу. <a href='".$this->generateUrl('site_orders_edit', array('order'=>$order->getId(), 'step'=>1))."'>Подробнее</a> ";
$notifusers=array();
/** @var User $notifuser**/
$notifuser = $this->getRepository('User')->findOneBy(array('username'=>'admin'));
array_push($notifusers,$notifuser );
}
break;
case 5: $descriptiontext="Выбор поставщика в заказе №".$order->getId()." был утвержден. <a href='".$this->generateUrl('site_orders_edit', array('order'=>$order->getId(), 'step'=>1))."'>Подробнее</a>";
break;
case 6: $descriptiontext="Заказ №".$order->getId()." был отменен. <a href='".$this->generateUrl('site_orders_edit', array('order'=>$order->getId(), 'step'=>1))."'>Подробнее</a>";
break;
}
foreach ( $notifusers as $notifuser) {
$this->addNotification($notifuser,$descriptiontext);
}
$this->manager->persist($order);

$this->manager->flush();
$this->addNotice('success',
'orders.html.twig',
array('notice' => 'order_changestatus', 'caption' => $order->getId())
);
return $this->redirectToRoute('site_orders_edit', array('order' => $order->getId(), 'step' => 1));
}

/**
*
@param OrderProduct $orderproduct
*
@param Order $order
*
@return Response
*
@Config\Route("/orders/{order}/orderproducts/{orderproduct}/remove", name = "site_orderproducts_remove")
*
@Config\ParamConverter("orderproduct", options = {"mapping": {"orderproduct": "id"}})
*
@Config\ParamConverter("order", options = {"mapping": {"order": "id"}})
*/

public function removeproductAction(OrderProduct $orderproduct, Order $order)
{

$this->manager->remove($orderproduct);
$this->manager->flush();
return $this->redirectToRoute('site_orders_edit', array('order'=>$order->getId(), 'step'=>2));
}


/**
*
@param OrderProvider $orderprovider
*
@param Order $order
*
@return Response
*
@Config\Route("/orders/{order}/orderproviders/{orderprovider}/edit", name = "site_orderprovider_edit")
*
@Config\ParamConverter("orderprovider", options = {"mapping": {"orderprovider": "id"}})
*
@Config\ParamConverter("order", options = {"mapping": {"order": "id"}})
*/

public function orderproviderAction(OrderProvider $orderprovider, Order $order)
{

//Инфа по продуктам
//в цикле перебираем продукты

$products=array();
$orderproducts=$this->getRepository('OrderProduct')->createQueryBuilder('op')
->leftJoin('op.product', 'p')
->where('op.order = :order')
->andWhere('p.deleted = false')
->setParameters(array('order'=>$order))
->getQuery()->getResult();
foreach ($orderproducts as $orderproduct) {
//собираем в массив данные по каждому
$product=array();
$product['product']=$orderproduct->getProduct();
//запрашиваем цену, предоплату и срок поступления
/**
@var ProviderProduct $providerproduct**/
$providerproduct=$this->getRepository('ProviderProduct')->createQueryBuilder('pp')
->where('pp.product = :product')
->andWhere('pp.provider = :provider')
->setParameters(array('product'=>$orderproduct->getProduct(), 'provider'=>$orderprovider->getProvider() ))
->getQuery()->getOneOrNullResult();
//если есть - пихаем в массив
if ($providerproduct) {
$product['price']=$providerproduct->getPrice();
$product['prepay']=$providerproduct->getPrepay();
$product['delivarytime']=$providerproduct->getDelivarytime();
}
else {
$product['price']=null;
$product['prepay']=null;
$product['delivarytime']=null;
}
//запрашиваем сколько заказов было выполнено поставщиком с таким товаром
$countorders = $this->getRepository('Order')->createQueryBuilder('o')
->leftJoin('o.orderproviders','op')
->leftJoin('o.orderproducts', 'opr')
->where('op.provider = :provider')
->andWhere('opr.product = :product')
->andWhere('op.selected =1')
->setParameters(array('provider'=>$orderprovider->getProvider(), 'product'=>$orderproduct->getProduct()))
->getQuery()->getArrayResult();
$countorders=count($countorders);
//если есть - пихаем в массив
$product['countorders']=$countorders;
array_push($products, $product);
}

//Комментарии
$orderprovidercomments = $this->getRepository('OrderProviderComment')->createQueryBuilder('opc')
->where('opc.orderprovider = :orderprovider')
->orderBy('opc.id')
->setParameters(array('orderprovider'=>$orderprovider))
->getQuery()->getResult();
$orderprovidercomment=new OrderProviderComment();
$form=$this->createForm(new OrderProviderCommentFormType(),$orderprovidercomment );
$form->handleRequest($this->request);
if ($form->isSubmitted() && $form->isValid()) {
$orderprovidercomment->setOrderprovider($orderprovider);
$orderprovidercomment->setUser($this->getUser());
$this->manager->persist($orderprovidercomment);
$this->manager->flush();
return $this->redirectToRoute(
'site_orderprovider_edit',
array('order' => $order->getId(), 'orderprovider' => $orderprovider->getId())
);
}
$this->view['order'] = $order;
$this->view['orderprovider'] = $orderprovider;
$this->view['products']=$products;
$this->view['orderprovidercomments'] = $orderprovidercomments;
$this->forms['orderprovidercomment']=$form->createView();
$this->navigation = array('active' => 'orders');
return $this->render('AppBundle:Orders:orderprovider.html.twig');
}

//скрытие заказа
/**
*
@param OrderProvider $orderprovider
*
@param Order $order
*
@return Response
*
@Config\Route("/orders/{order}/orderproviders/{orderprovider}/disabled", name = "site_orderprovider_disabled")
*
@Config\ParamConverter("orderprovider", options = {"mapping": {"orderprovider": "id"}})
*
@Config\ParamConverter("order", options = {"mapping": {"order": "id"}})
*/

public function orderproviderdisapledAction(OrderProvider $orderprovider, Order $order)
{
$orderprovider->setActive(false);
$this->manager->persist($orderprovider);
$this->manager->flush();
return $this->redirectToRoute(
'site_orderprovider_edit',
array('order' => $order->getId(), 'orderprovider' => $orderprovider->getId())
);
}

//Открытие заказа
/**
*
@param OrderProvider $orderprovider
*
@param Order $order
*
@return Response
*
@Config\Route("/orders/{order}/orderproviders/{orderprovider}/enabled", name = "site_orderprovider_enabled")
*
@Config\ParamConverter("orderprovider", options = {"mapping": {"orderprovider": "id"}})
*
@Config\ParamConverter("order", options = {"mapping": {"order": "id"}})
*/

public function orderproviderenapledAction(OrderProvider $orderprovider, Order $order)
{
$orderprovider->setActive(true);
$this->manager->persist($orderprovider);
$this->manager->flush();
return $this->redirectToRoute(
'site_orderprovider_edit',
array('order' => $order->getId(), 'orderprovider' => $orderprovider->getId())
);
}


//выбор заказа
/**
*
@param OrderProvider $orderprovider
*
@param Order $order
*
@return Response
*
@Config\Route("/orders/{order}/orderproviders/{orderprovider}/selected", name = "site_orderprovider_selected")
*
@Config\ParamConverter("orderprovider", options = {"mapping": {"orderprovider": "id"}})
*
@Config\ParamConverter("order", options = {"mapping": {"order": "id"}})
*/

public function orderproviderselectedAction(OrderProvider $orderprovider, Order $order)
{

$orderprovider->setSelected(true);

/** @var OrderStatus $newstatus**/
$newstatus = $this->getRepository('OrderStatus')->findOneBy(array('id'=>4));
$order->setStatus($newstatus);
/** @var user $adminuser**/
$adminuser = $this->getRepository('User')->findOneBy(array('username'=>'admin'));
//отправляем уведомление пользователю
$notificationtext="Пользователь".$this->getUser()->getUserfio()." выбрал поставщика для заказа № ".$order->getId().". Необходимо подтвердит результат. <a href='".$this->generateUrl('site_orders_edit', array('order'=>$order->getId(), 'step'=>3))."'>Подробнее</a> ";
$this->addNotification($adminuser, $notificationtext);
$this->manager->persist($order);
$this->manager->flush();
return $this->redirectToRoute(
'site_orders_edit',
array('order' => $order->getId(), 'step' => 3)
);
}

public function addNotification (User $user, $description) {
$notification = new Notification();
$notification->setUser($user);
$notification->setDescription($description);
$this->manager->persist($notification);
$this->manager->flush();
}

}