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); } }