src/EventListener/AssignmentFinishedListener.php line 94

Open in your IDE?
  1. <?php
  2. namespace App\EventListener;
  3. use App\Entity\Assignment;
  4. use App\Entity\AttachmentAssignment;
  5. use App\Entity\Branch;
  6. use App\Entity\Notification;
  7. use App\Entity\Order;
  8. use App\Entity\OrderNumber;
  9. use App\Entity\OrderTimeLine;
  10. use App\Entity\Procedure;
  11. use App\Entity\Task;
  12. use App\Enum\DeadlineType;
  13. use App\Enum\OrderEnum;
  14. use App\Enum\TaskEnum;
  15. use App\Event\AssignmentFinishedEvent;
  16. use App\Manager\TotalDeadlineAssignment;
  17. use App\Message\FinishDesignSendTelegram;
  18. use App\Message\FinishProductOnProductionMessage;
  19. use App\Message\FinishReceiveSendDocumentTelegram;
  20. use App\Message\FinishReceiveSendTelegram;
  21. use App\Message\MessageNotification;
  22. use App\Message\TelegramMessage;
  23. use App\Message\UpdateRelationOrderProductMessage;
  24. use App\Order\ChangeStatusOrderDelivery;
  25. use App\Order\HandleOrderBranch;
  26. use App\Repository\AssignmentRepository;
  27. use App\Repository\AttachmentAssignmentRepository;
  28. use App\Repository\DeadlineGuideRepository;
  29. use App\Repository\OrderRepository;
  30. use App\Repository\TaskRepository;
  31. use App\WareHouse\AutoCreateReceipt;
  32. use Carbon\CarbonImmutable;
  33. use DateTimeImmutable;
  34. use Doctrine\ORM\EntityManagerInterface;
  35. use Symfony\Component\Messenger\MessageBusInterface;
  36. class  AssignmentFinishedListener
  37. {
  38.     const STEP_PRIORITY 1;
  39.     const STEP_HALF_PART 0.5;
  40.     private $totalDeadlineAssignment;
  41.     /**
  42.      * @var TaskRepository
  43.      */
  44.     private $taskRepository;
  45.     /**
  46.      * @var DeadlineGuideRepository
  47.      */
  48.     private $deadlineGuideRepository;
  49.     /**
  50.      * @var AssignmentRepository
  51.      */
  52.     private $assignmentRepository;
  53.     /**
  54.      * @var OrderRepository
  55.      */
  56.     private $orderRepository;
  57.     /**
  58.      * @var MessageBusInterface
  59.      */
  60.     private $messageBus;
  61.     /**
  62.      * @var AttachmentAssignmentRepository
  63.      */
  64.     private $attachmentAssignmentRepository;
  65.     /**
  66.      * @var EntityManagerInterface
  67.      */
  68.     private $entityManager;
  69.     public function __construct(TotalDeadlineAssignment $totalDeadlineAssignment,
  70.                                 TaskRepository $taskRepository,
  71.                                 AssignmentRepository $assignmentRepository,
  72.                                 DeadlineGuideRepository $deadlineGuideRepository,
  73.                                 OrderRepository $orderRepository,
  74.                                 MessageBusInterface $messageBus,
  75.                                 AttachmentAssignmentRepository $attachmentAssignmentRepository,
  76.                                 EntityManagerInterface $entityManagerInterface
  77.     ) {
  78.         $this->totalDeadlineAssignment $totalDeadlineAssignment;
  79.         $this->taskRepository $taskRepository;
  80.         $this->deadlineGuideRepository $deadlineGuideRepository;
  81.         $this->assignmentRepository $assignmentRepository;
  82.         $this->orderRepository $orderRepository;
  83.         $this->messageBus $messageBus;
  84.         $this->attachmentAssignmentRepository $attachmentAssignmentRepository;
  85.         $this->entityManager$entityManagerInterface;
  86.     }
  87.     public function __invoke(AssignmentFinishedEvent $event)
  88.     {
  89.         $assignment $event->getAssignment();
  90.         /** @var Order $order */
  91.         $order $assignment->getOrder();
  92.         if ($this->checkTaskParallelFinished($order)) {
  93.             $this->deActiveAssignment($order);
  94.             $taskReplacement $assignment->getTask()->getTaskReplacement()->last();
  95.             $mainTask $this->getMainTask($assignment);
  96.             if ($mainTask) {
  97.                 $this->addLoopTask($assignment$mainTask);
  98.             } elseif ($taskReplacement) {
  99.                 if ($this->isApproval($event)) {
  100.                     $this->skipTask($assignment);
  101.                 } else {
  102.                     $this->addReason($event);
  103.                     $this->addLoopTask($assignment$taskReplacement);
  104.                 }
  105.             } else {
  106.                 $this->addTaskNormal($assignment);
  107.             }
  108.         }
  109.     }
  110.     private function addReason(AssignmentFinishedEvent $event)
  111.     {
  112.         $assignment $event->getAssignment();
  113.         $approve $event->getOptions()['approve'];
  114.         if (\count($approve) > && !\in_array('1'$approvetrue)) {
  115.             $reason '';
  116.             foreach ($approve as $key => $item) {
  117.                 $item = (int) $item;
  118.                 if ($key 0) {
  119.                     $reason .= ',';
  120.                 }
  121.                 if (Assignment::REASON_BY_SALE === $item) {
  122.                     $reason .= 'Do sale';
  123.                 } elseif (Assignment::REASON_BY_CUSTOMER === $item) {
  124.                     $reason .= 'Do khách hàng';
  125.                 } elseif (Assignment::REASON_BY_DESIGN === $item) {
  126.                     $reason .= 'Do thiết kế';
  127.                 }
  128.             }
  129.             $assignment->setReasonReject($reason);
  130.         }
  131.     }
  132.     private function getMainTask(Assignment $assignment)
  133.     {
  134.         return $assignment->getTask()->getMainTask()->last();
  135.     }
  136.     private function isApproval(AssignmentFinishedEvent $event)
  137.     {
  138.         return \in_array('1'$event->getOptions()['approve'], true);
  139.     }
  140.     private function addTaskNormal(Assignment $assignment)
  141.     {
  142.         /** @var Order $order */
  143.         $order $assignment->getOrder();
  144.         /** @var Procedure $procedure */
  145.         $procedure $order->getProcedure();
  146.         /** @var Assignment $lastAssigment */
  147.         $codes $this->findCodeWithNextTask($assignment);
  148.         if (\in_array($assignment->getTask()->getCode(), ['thu_coc''thu_coc_cus'true], true)) {
  149.             /** @var Order $lastOrder */
  150.             $orderNumber = (new OrderNumber())->setOrderMain($order)->setPriority(0);
  151.             $this->entityManager->persist($orderNumber);
  152.             $this->entityManager->flush();
  153.             $order->setSort($orderNumber->getId());
  154.             (new HandleOrderBranch($this->entityManager,$this->messageBus))->setBranch($assignment);
  155.             $attachmentAssignmentDesign $this
  156.                 ->attachmentAssignmentRepository
  157.                 ->findLastFileDesign($assignment->getOrder()->getId());
  158.             $attachmentAssignmentReviews $this
  159.                         ->attachmentAssignmentRepository
  160.                         ->findLastFileDesignPreview($assignment->getOrder()->getId());
  161.             if (\count($attachmentAssignmentReviews) > 0) {
  162.                 $attachmentFileNames $attachmentPreviews = [];
  163.                 /** @var AttachmentAssignment $attachmentAssignment */
  164.                 foreach ($attachmentAssignmentReviews as $attachmentAssignment) {
  165.                     $attachmentPreviews[$attachmentAssignment->getAssignment()->getId()->toString()][] = $attachmentAssignment;
  166.                 }
  167.                 foreach (array_values($attachmentPreviews)[0] as $attachmentAssignment) {
  168.                     $attachmentFileNames[] = $attachmentAssignment->getAttachment()->getFileName();
  169.                 }
  170.                 $this->messageBus->dispatch(new FinishReceiveSendTelegram(
  171.                     $assignment->getOrder()->getId(),
  172.                     $assignment->getId()->toString(),
  173.                     $attachmentFileNames
  174.                 ));
  175.             }
  176.             if (\count($attachmentAssignmentDesign) > 0) {
  177.                 $this->messageBus->dispatch(new FinishReceiveSendDocumentTelegram(
  178.                     $assignment->getOrder()->getId(),
  179.                     $assignment->getId()->toString(),
  180.                     $attachmentAssignmentDesign[0]->getAttachment()->getFileName()
  181.                 ));
  182.             }
  183.             
  184.             
  185.         }
  186.         $beforeFinishReceive = [
  187.             Task::START_DESIGN,
  188.             Task::START_CUSTOMER_DESIGN_APPROVAL_CODE,
  189.             Task::FIX_DESIGN,
  190.         ];
  191.         $beforeFinishReceiveCus = [
  192.             Task::START_DESIGN_CUS,
  193.             Task::CUS_START_CUSTOMER_DESIGN_APPROVAL_CODE,
  194.             Task::FIX_DESIGN_CUS,
  195.         ];
  196.         if (=== \count($codes) && \in_array($assignment->getTask()->getCode(), $beforeFinishReceivetrue)) {
  197.             $codes[] = Task::FINISH_RECEIVE;
  198.         } elseif (=== \count($codes) && \in_array($assignment->getTask()->getCode(), $beforeFinishReceiveCustrue)) {
  199.             $codes[] = Task::CUS_FINISH_RECEIVE;
  200.         }
  201.         foreach ($codes as $code) {
  202.             $previousTaskCode $procedure->getTasks()[$code];
  203.             $nextTask $this->taskRepository->findOneBy(['code' => $code]);
  204.             $this->addTask($assignment$nextTask$previousTaskCode);
  205.         }
  206.     }
  207.     private function findCodeWithNextTask(Assignment $assignment)
  208.     {
  209.         $code $assignment->getTask()->getCode();
  210.         /** @var Procedure $procedure */
  211.         $procedure $assignment->getOrder()->getProcedure();
  212.         $codeTasks = [];
  213.         foreach ($procedure->getTasks() as $taskCode => $previousTaskCode) {
  214.             if (\in_array($code$previousTaskCodetrue)) {
  215.                 $codeTasks[] = $taskCode;
  216.             }
  217.         }
  218.         return $codeTasks;
  219.     }
  220.     private function checkTaskParallelFinished(Order $order)
  221.     {
  222.         /** @var Assignment $assignment */
  223.         foreach ($order->getAssignments() as $assignment) {
  224.             if ($assignment->isActive() && !$assignment->isFinished()) {
  225.                 return false;
  226.             }
  227.         }
  228.         return true;
  229.     }
  230.     private function deActiveAssignment(Order $order)
  231.     {
  232.         /** @var Assignment $assignment */
  233.         foreach ($order->getAssignments() as $assignment) {
  234.             $assignment->setActive(false);
  235.         }
  236.     }
  237.     private function skipTask(Assignment $assignment)
  238.     {
  239.         $code $this->findNextTask($assignment);
  240.         $nextTask $this->taskRepository->findOneBy(['code' => $code]);
  241.         $previousTaskCode = [$assignment->getTask()->getCode()];
  242.         $this->addTask($assignment$nextTask$previousTaskCode);
  243.     }
  244.     private function findNextTask(Assignment $assignment)
  245.     {
  246.         /** @var Procedure $procedure */
  247.         $procedure $assignment->getOrder()->getProcedure();
  248.         $taskList array_keys($procedure->getTasks());
  249.         $index array_search($assignment->getTask()->getCode(), $taskListtrue);
  250.         $index += 2;
  251.         return $taskList[$index];
  252.     }
  253.     private function addTask(Assignment $assignmentTask $nextTask, array $previousTaskCode)
  254.     {
  255.         try {
  256.             $this->addEventFinish($assignment);
  257.             /** @var Order $order */
  258.             $order $assignment->getOrder();
  259.             $assignment = new Assignment($order$nextTask);
  260.             $assignment->setActive(true)
  261.             ->setState(0);
  262.             $this->sortAssignment($assignment$assignment->getTask()->getCode());
  263.             /** @var Assignment $assignmentPrevious */
  264.             $assignmentPrevious $order->getAssignments()->last();
  265.             $deadLinePrevious $assignmentPrevious->getWorkedAt();
  266.             if (null === $deadLinePrevious) {
  267.                 $deadLinePrevious = new \DateTimeImmutable();
  268.             }
  269.             $deadlineGuide $this->deadlineGuideRepository->findOneBy(['task' => $assignment->getTask(), 'type' => $order->getType()]);
  270.             $deadLineTime null === $deadlineGuide 600 $deadlineGuide->getTime();
  271.             $deadLine $this->totalDeadlineAssignment->total(
  272.                 new DateTimeImmutable(), $deadLineTime);
  273.             $assignment->setDeadline($deadLine);
  274.             if ($previousTaskCode) {
  275.                 $predecessors $order->getAssignments()->filter(function ($assignment) use ($previousTaskCode) {
  276.                     /* @var Assignment $assignment */
  277.                     return \in_array($assignment->getTask()->getCode(), $previousTaskCodetrue);
  278.                 });
  279.                 foreach ($predecessors as $predecessor) {
  280.                     $assignment->addPredecessor($predecessor);
  281.                 }
  282.             }
  283.             if (Task::FINISH_TASK === $assignment->getTask()->getCode()) {
  284.                 $assignment->setState(Assignment::STATE_FINISHED);
  285.                 $assignment->setDeadline(new \DateTimeImmutable());
  286.                 $assignment->setWaitingAt(new \DateTimeImmutable());
  287.                 $assignment->deactivate();
  288.                 $assignment->setFinishedAt(new \DateTimeImmutable());
  289.                 $order->finish();
  290.             }
  291.             
  292.             #TODO ASSIGNEE DESIGN
  293.             if (Task::FIX_DESIGN === $assignment->getTask()->getCode()) {
  294.                 $order $assignment->getOrder();
  295.                 
  296.                 $lastAssignment null;
  297.                 foreach ($order->getAssignments() as $oldAssignment) {
  298.                     $task $oldAssignment->getTask()->getCode();
  299.                     if(Task::START_DESIGN === $task){
  300.                         $lastAssignment $oldAssignment;
  301.                     }
  302.                     if (Task::FIX_DESIGN === $task) {
  303.                         $finishedAt $oldAssignment->getFinishedAt();
  304.                         if ($finishedAt !== null  && $finishedAt $lastAssignment->getFinishedAt()) {
  305.                                 $lastAssignment $oldAssignment;
  306.                         }
  307.                     }
  308.                     
  309.                 }
  310.                 
  311.                 if ($lastAssignment !== null) {
  312.                     $assignment->assignTo($lastAssignment->getAssignee());
  313.                 }
  314.             }
  315.             if (Task::FIX_DESIGN_CUS === $assignment->getTask()->getCode()) {
  316.                 $order $assignment->getOrder();
  317.                 foreach ($order->getAssignments() as $oldAssignment) {
  318.                     $task $oldAssignment->getTask()->getCode();
  319.                     if (Task::START_DESIGN_CUS === $task) {
  320.                         $assignment->assignTo($oldAssignment->getAssignee());
  321.                     }
  322.                 }
  323.             }
  324.             $order->addAssignment($assignment);
  325.         } catch (\Exception $e) {
  326.         }
  327.     }
  328.     private function addLoopTask(Assignment $assignmentTask $taskReplacement)
  329.     {
  330.         $previousTaskCode = [$assignment->getTask()->getCode()];
  331.         $this->addTask($assignment$taskReplacement$previousTaskCode);
  332.     }
  333.     private function sortAssignment(Assignment $assignment$taskCode)
  334.     {
  335.         /** @var array $assignmentLast */
  336.         $assignmentLast $this->assignmentRepository->findLastPriority($taskCode);
  337.         $sort 0;
  338.         if ($assignment->getOrder()->getIsNow()) {
  339.             $assignments $this->assignmentRepository->assignmentFindNowTask([$taskCode]);
  340.             if (\count($assignments) > 0) {
  341.                 $sort += $assignments[0]->getSort() ?? 0;
  342.                 if (\count($assignmentLast) > && $assignmentLast[0]->getSort() === $assignments[0]->getSort()) {
  343.                     $sort += self::STEP_HALF_PART;
  344.                 } else {
  345.                     $sort += self::STEP_PRIORITY;
  346.                 }
  347.             } else {
  348.                 $assignments $this->assignmentRepository->assignmentAssignedByTask([$taskCode]);
  349.                 $sort = \count($assignments) > ? ($assignments[0]->getSort() ?? 1) : self::STEP_HALF_PART;
  350.             }
  351.         } else {
  352.             $lastPriority = \count($assignmentLast) > ? ($assignmentLast[0]->getSort() ?? 1) : 1;
  353.             if ($lastPriority && $lastPriority floor($lastPriority) > 1) {
  354.                 $sort ceil($lastPriority);
  355.             } else {
  356.                 $sort $lastPriority self::STEP_PRIORITY;
  357.             }
  358.         }
  359.         $assignment->setSort($sort);
  360.     }
  361.     private function addEventFinish(Assignment $assignment)
  362.     {
  363.         $taskDesign = [Task::START_DESIGN,
  364.                         Task::START_DESIGN_CUS,
  365.                         Task::FIX_DESIGN,
  366.                         Task::FIX_DESIGN_CUS,
  367.             ];
  368.             $orderTimeLine $assignment->getOrder()->getOrderTimeLine();
  369.             if($orderTimeLine === null){
  370.                 $orderTimeLine  = new OrderTimeLine();
  371.             }
  372.             $assignment->getOrder()->setOrderTimeLine($orderTimeLine);
  373.             
  374.         if (\in_array($assignment->getTask()->getCode(), $taskDesigntrue)) {
  375.             if(\in_array($assignment->getTask()->getCode(), [Task::START_DESIGN,Task::START_DESIGN_CUS], true)){
  376.                 $orderTimeLine->setStartDesign(new DateTimeImmutable());
  377.             }
  378.             $this->messageBus->dispatch(new FinishDesignSendTelegram($assignment));
  379.             $notification 
  380.             (new Notification())
  381.             ->setData([
  382.                 'content' => 'Đơn hàng đã hoàn tất '.$assignment->getTask()->getName(),
  383.                 'deep_link' => 'https://amac.ctasolution.com/assignment?search='.$assignment->getOrder()->getId()
  384.             ])
  385.             ->setName('Cập nhật công việc đơn hàng '.$assignment->getOrder()->getId())
  386.             ->setType('maket')
  387.             ->setUser($assignment->getOrder()->getCreator())
  388.             ;
  389.             $this->entityManager->persist($notification);
  390.             $this->entityManager->flush();
  391.             $this->messageBus->dispatch(new MessageNotification($notification));
  392.            
  393.         }
  394.         else if(\in_array($assignment->getTask()->getCode(), ['thu_coc','thu_coc_cus'], true)){
  395.             $orderTimeLine->setDepositCompletionTime(new DateTimeImmutable());
  396.         }
  397.         else if (\in_array($assignment->getTask()->getCode(), ['kiem_thanh_pham'], true)) {
  398.             $orderTimeLine->setQualityAssuranceCompleteAt(new DateTimeImmutable());
  399.             $notification 
  400.             (new Notification())
  401.             ->setData([
  402.                 'content' => 'Đơn hàng đã hoàn tất '.$assignment->getTask()->getName(),
  403.                 'deep_link' => 'https://amac.ctasolution.com/assignment?search='.$assignment->getOrder()->getId()
  404.             ])
  405.             ->setName('Cập nhật công việc đơn hàng '.$assignment->getOrder()->getId())
  406.             ->setType('kiem_thanh_pham')
  407.             ->setUser($assignment->getOrder()->getCreator())
  408.             ;
  409.             
  410.             $changeStatusOrderDelivery = new ChangeStatusOrderDelivery($this->entityManager);
  411.             $changeStatusOrderDelivery->change($assignment->getOrder());
  412.             
  413.             // $autoCreateReceipt = new AutoCreateReceipt($this->entityManager);
  414.             // $autoCreateReceipt->addReceipt($assignment->getOrder());
  415.             $this->entityManager->persist($notification);
  416.             $this->entityManager->flush();
  417.             $this->messageBus->dispatch(new MessageNotification($notification));
  418.             $this->messageBus->dispatch(new UpdateRelationOrderProductMessage($assignment->getOrder()->getId()));
  419.             $this->messageBus->dispatch(new FinishProductOnProductionMessage($assignment->getOrder()->getId()));
  420.            
  421.         }else if(\in_array($assignment->getTask()->getCode(), ['hoan_tat'], true)){
  422.             $orderTimeLine->setFinishedOrderAt(new DateTimeImmutable());
  423.             $this->entityManager->flush();
  424.         }
  425.     }
  426. }