예제 #1
0
 public function setPacket(ArrangePacket $arrangePacket, $forceOverwrite = false)
 {
     $lockId = ArrangeManager::ID_TYPE . '-' . $arrangePacket->getExternalTypeId() . '-' . $arrangePacket->getExternalId();
     // 1. Is it a unique mode ?
     if ($this->info->getArrangeMode() == ArrangeManager::ARRANGE_MODE_UNIQUE) {
         // 1.1 Lock the action arrange
         $this->createLock($lockId);
         $response = $this->getUseCaseResponse();
         // 1.2 If it could not lock, then exit
         if (in_array(23000, $response->getCodes()) || $response->getStatus() == Response::STATUS_FAIL) {
             $this->lastOperationSuccess = false;
             return;
         }
         // 1.3 Verify if there is another record that has the same type, id
         $response = $this->retrieveTaskResponseByIdAndType($arrangePacket->getExternalId(), $arrangePacket->getExternalTypeId());
         // 1.4 If it does exist, then delete the lock and exit
         if ($response->getStatus() == Response::STATUS_FAIL || $response->getStatus() != Response::STATUS_FAIL && $response->getTotalResultCount() > 0 && !$forceOverwrite) {
             // 1.4.1 Delete the lock and return
             $this->deleteLock($lockId);
             $this->lastOperationSuccess = false;
             return;
         }
         // 1.5 check overwrite
         if ($forceOverwrite) {
             // 1.5.1 Retrieve task first
             $tasks = $this->retrieveResponseByExternalTypeIdAndExternalId($arrangePacket->getExternalTypeId(), $arrangePacket->getExternalId());
             if (isset($tasks[0]) && !empty($tasks[0])) {
                 /** @var Task $task */
                 $task = $tasks[0];
                 $this->updateTask($task->getId(), $arrangePacket);
             } else {
                 $this->createTask($arrangePacket);
             }
         } else {
             // 1.5.2 Create task
             $this->createTask($arrangePacket);
         }
         // 1.6 Delete the lock record
         $this->deleteLock($lockId);
     } else {
         // 2. If the mode is repeatable, then create the task
         $this->createTask($arrangePacket);
     }
 }