AppStateESS/homestead

View on GitHub
class/Command/CreateRoommateGroupCommand.php

Summary

Maintainability
A
4 hrs
Test Coverage
<?php

namespace Homestead\Command;

use \Homestead\StudentFactory;
use \Homestead\HMS_Roommate;
use \Homestead\HMS_Activity_Log;
use \Homestead\Term;
use \Homestead\UserStatus;
use \Homestead\CommandFactory;
use \Homestead\NotificationView;
use \Homestead\Exception\PermissionException;
use \Homestead\Exception\StudentNotFoundException;

/**
 * Handles administrately creating roommate groups
 */

class CreateRoommateGroupCommand extends Command {

    public function getRequestVars()
    {
        return array('action'=>'CreateRoommateGroup');
    }

    public function execute(CommandContext $context){

        if(!UserStatus::isAdmin() || !\Current_User::allow('hms', 'roommate_maintenance')){
            throw new PermissionException('You do not have permission to create/edit roommate groups.');
        }

        $term = Term::getSelectedTerm();

        # Check for reasonable input
        $roommate1 = trim($context->get('roommate1'));
        $roommate2 = trim($context->get('roommate2'));

        $viewCmd = CommandFactory::getCommand('CreateRoommateGroupView');
        $viewCmd->setRoommate1($roommate1);
        $viewCmd->setRoommate2($roommate2);

        if(is_null($roommate1) || empty($roommate1) || is_null($roommate2) || empty($roommate2)){
            \NQ::simple('hms', NotificationView::ERROR, 'Invalid user names.');
            $viewCmd->redirect();
        }

        try{
            $student1 = StudentFactory::getStudentByUsername($roommate1, $term);
            $student2 = StudentFactory::getStudentByUsername($roommate2, $term);
        } catch (StudentNotFoundException $e) {
            \NQ::simple('hms', NotificationView::ERROR, $e->getMessage());
            $viewCmd->redirect();
        }


        try{
            # Check if these two can live together
            $roomate = new HMS_Roommate();
            $roomate->canLiveTogetherAdmin($student1, $student2, $term);
        }catch(\Exception $e){
            \NQ::simple('hms', NotificationView::ERROR, 'Could not create roommate group: ' . $e->getMessage());
            $viewCmd->redirect();
        }

        # Check for pending requests for either roommate and break them
        if(HMS_Roommate::countPendingRequests($roommate1, $term) > 0){
            \NQ::simple('hms', NotificationView::WARNING, "Warning: Pending roommate requests for $roommate1 were deleted.");
        }
        $result = HMS_Roommate::removeOutstandingRequests($roommate1, $term);
        if(!$result){
            \NQ::simple('hms', NotificationView::ERROR, "Error removing pending requests for $roommate1, roommate group was not created.");
            $viewCmd->redirect();
        }

        if(HMS_Roommate::countPendingRequests($roommate2, $term) > 0){
            \NQ::simple('hms', NotificationView::WARNING, "Warning: Pending roommate requests for $roommate2 were deleted.");
        }
        $result = HMS_Roommate::removeOutstandingRequests($roommate2, $term);
        if(!$result){
            \NQ::simple('hms', NotificationView::ERROR, "Error removing pending requests for $roommate2, roommate group was not created.");
            $viewCmd->redirect();
        }

        # Create the roommate group and save it
        $roommate_group                 = new HMS_Roommate();
        $roommate_group->term           = $term;
        $roommate_group->requestor      = $roommate1;
        $roommate_group->requestee      = $roommate2;
        $roommate_group->confirmed      = 1;
        $roommate_group->requested_on   = time();
        $roommate_group->confirmed_on   = time();

        $result = $roommate_group->save();

        if(!$result){
            \NQ::simple('hms', NotificationView::ERROR, 'Error saving roommate group.');
            $viewCmd->redirect();
        }else{
            HMS_Activity_Log::log_activity($roommate1, ACTIVITY_ADMIN_ASSIGNED_ROOMMATE, UserStatus::getUsername(), $roommate2);
            HMS_Activity_Log::log_activity($roommate2, ACTIVITY_ADMIN_ASSIGNED_ROOMMATE, UserStatus::getUsername(), $roommate1);

            \NQ::simple('hms', NotificationView::SUCCESS, 'Roommate group created successfully.');
            $viewCmd->redirect();
        }
    }
}