/** * Check for invalid cert status changes. * The following transitions are valid: * <ul> * <li>candidate -> uncertified</li> * <li>candidate -> closed</li> * <li>uncertified -> certified</li> * <li>certified -> suspended</li> * <li>certified -> closed (on site request)</li> * <li>suspended -> uncertified</li> * <li>suspended -> closed</li> * </ul> * The following are forbidden: * <ul> * <li>suspended -> certified</li> * <li>candidate -> something else but uncertified and closed</li> * <li>closed -> anything else</li> * </ul> * https://wiki.egi.eu/wiki/GOCDB/Input_System_User_Documentation#Changing_Site_Certification_Status * @param \Site $site * @param \CertificationStatus $newCertStatus * @throws \Exception if the change is invalid */ public function isChangeValid(\Site $site, \CertificationStatus $newCertStatus) { $oldStatus = $site->getCertificationStatus()->getName(); $newStatus = $newCertStatus->getName(); // This exception is only thrown if the transition is invalid $error = "A Certification Status can't transition from {$oldStatus} to {$newStatus}."; $e = new \Exception($error); if ($oldStatus === 'Suspended' && $newStatus === 'Certified') { throw $e; } if ($oldStatus === 'Closed') { throw $e; } // forbidden: candidate -> any other status except uncertified and closed if ($oldStatus == 'Candidate') { if ($newStatus !== 'Uncertified' && $newStatus !== 'Closed') { throw $e; } } }