state = $state; $this->freeEntries = $free_entries; } /** * Combine this state with another state from the same shift. * * @param ShiftSignupState $shiftSignupState The other state to combine */ public function combineWith(ShiftSignupState $shiftSignupState) { $this->freeEntries += $shiftSignupState->getFreeEntries(); if ($this->valueForState($shiftSignupState->state) > $this->valueForState($this->state)) { $this->state = $shiftSignupState->state; } } /** * @param string $state * @return int */ private function valueForState($state) { switch ($state) { case ShiftSignupState::NOT_ARRIVED: case ShiftSignupState::NOT_YET: case ShiftSignupState::SHIFT_ENDED: return 100; case ShiftSignupState::SIGNED_UP: return 90; case ShiftSignupState::FREE: return 80; case ShiftSignupState::ANGELTYPE: case ShiftSignupState::COLLIDES: return 70; case ShiftSignupState::OCCUPIED: case ShiftSignupState::ADMIN: return 60; default: return 0; } } /** * Returns true, if signup is allowed * * @return bool */ public function isSignupAllowed() { switch ($this->state) { case ShiftSignupState::FREE: case ShiftSignupState::ADMIN: return true; } return false; } /** * Return the shift signup state * * @return string */ public function getState() { return $this->state; } /** * How many places are free in this shift for the angeltype? * * @return int */ public function getFreeEntries() { return $this->freeEntries; } }