/** * Fires the rule against the given entity, using the callback that produces the new status * for the milestone. * * @param Connection $conn * @param Entity $entity * @param callback $callback */ public function fireRule(Connection $conn, Entity $entity, $callback) { if ($this->milestone->isBeforeDeadline()) { $result = $callback(); if (!$result instanceof NewMilestoneStatus) { throw new LogicException('Cannot fire the milestone rule \'' . $this->activator + '\': the callback did not return a NewMilestoneStatus instance!'); } if ($result->isChanged()) { if ($this->milestone->getType() == Milestone::TYPE_BINARY) { if ($result->isCompleted()) { $this->milestone->complete($conn, $entity); } else { $this->milestone->cancel($conn, $entity); } } else { $this->milestone->updateProgress($conn, $entity, $result->getProgress()); } } } }
public function cancelMilestone(Entity $entity, Milestone $milestone, MembershipEntityInterface $who) { $this->transaction->requestTransaction(); try { $result = $milestone->cancel($this->conn, $entity, Milestone::RETURN_SUMMARY, $this->timeFormatter); if (false === $result) { throw new ModelException('This milestone is not completed yet!'); } return $result; } catch (Exception $exception) { $this->transaction->requestRollback(); throw $exception; } }