public function autoStatus($clubId) { $restrictions = []; $club = $this->findById($clubId)->contain(['Advisors.Users', 'Members' => function ($q) { return $q->matching('Users')->matching('Officers', function ($q) { return $q->order(['Officers.status', 'Officers.id'])->where(['Officers.status IN' => ['Active', 'Ineligible'], 'Officers.title' => 'President']); }); }])->first(); if (in_array($club->status, ['Submitted', 'Not Recognized', 'Archived'])) { //No auto-change from these statuses. Admin intervention required return false; } if (!$club->advisor || $club->advisor->status != 'Approved') { //No "Approved" advisor $restrictions[] = 'No Approved Advisor'; } if (empty($club->members[0]->_matchingData['Officers']) || $club->members[0]->_matchingData['Officers']->status != 'Active') { //President is not "Active" $restrictions[] = 'No Active President'; } elseif (empty($club->members[0]->_matchingData['Users']->president_training_expire) || $club->members[0]->_matchingData['Users']->president_training_expire < Time::createFromTime(0, 0, 0)) { //President is not currently trained $restrictions[] = 'Club President training is not up to date'; } if (empty($restrictions)) { $newStatus = 'Recognized'; } else { $newStatus = 'Restricted'; } if ($club->status == $newStatus) { return false; } $club->set('status', $newStatus); if (!$this->save($club)) { return false; } if ($newStatus == 'Restricted') { $this->notifyOfRestriction($club, $restrictions); } return $newStatus; }