AppStateESS/homestead

View on GitHub
class/RoomView.php

Summary

Maintainability
C
1 day
Test Coverage
<?php

namespace Homestead;

/**
 * View class responsible for showing the 'Edit Room' interface
 *
 * @author jbooker
 * @package HMS
 */
class RoomView extends View {

    private $hall;
    private $floor;
    private $room;

    private $damageTypes;

    /**
     * Constructor
     *
     * @param ResidenceHall    $hall
     * @param Floor             $floor
     * @param Room              $room
     * @param Array                 $damageTypes
     */
    public function __construct(ResidenceHall $hall, Floor $floor, Room $room, Array $damageTypes){
        $this->hall        = $hall;
        $this->floor    = $floor;
        $this->room        = $room;

        $this->damageTypes = $damageTypes;
    }

    /**
     * @see View::show()
     */
    public function show()
    {
        /*** Header Info ***/
        $tpl = array();
        $tpl['ROOM_PERSISTENT_ID'] = $this->room->getPersistentId();
        $tpl['TERM'] = $this->room->getTerm();
        $tpl['TERM'] = Term::getPrintableSelectedTerm();
        $tpl['HALL_NAME']           = $this->hall->getLink();
        $tpl['FLOOR_NUMBER']        = $this->floor->getLink('Floor');

        /*** Page Title ***/
        $tpl['ROOM'] = $this->room->getRoomNumber();

        /*** Room Attributes Labels ***/
        if($this->room->isOffline()){
            $tpl['OFFLINE_ATTRIB'] = 'Offline';
        }

        if($this->room->isReserved()){
            $tpl['RESERVED_ATTRIB'] = 'Reserved';
        }

        if($this->room->isRa()){
            $tpl['RA_ATTRIB'] = 'RA';
        }

        if($this->room->isPrivate()){
            $tpl['PRIVATE_ATTRIB'] = 'Private';
        }

        if($this->room->isOverflow()){
            $tpl['OVERFLOW_ATTRIB'] = 'Overflow';
        }

        if($this->room->isParlor()){
            $tpl['PARLOR_ATTRIB'] = 'Parlor';
        }

        if($this->room->isADA()){
            $tpl['ADA_ATTRIB'] = 'ADA';
        }

        if($this->room->isHearingImpaired()){
            $tpl['HEARING_ATTRIB'] = 'Hearing Impaired';
        }

        if($this->room->bathEnSuite()){
            $tpl['BATHENSUITE_ATTRIB'] = 'Bath en Suite';
        }

        $number_of_assignees    = $this->room->get_number_of_assignees();

        $tpl['NUMBER_OF_BEDS']      = $this->room->get_number_of_beds();
        $tpl['NUMBER_OF_ASSIGNEES'] = $number_of_assignees;

        $form = new \PHPWS_Form;

        $submitCmd = CommandFactory::getCommand('EditRoom');
        $submitCmd->setRoomId($this->room->id);
        $submitCmd->initForm($form);

        $form->addText('room_number', $this->room->getRoomNumber());
        $form->setLabel('room_number', 'Room Number');
        $form->addCssClass('room_number', 'form-control');

        /*** Room Gender ***/
        if($number_of_assignees == 0){
            // Room is empty, show the drop down so the user can change the gender
            $roomGenders = array(FEMALE => FEMALE_DESC, MALE => MALE_DESC, AUTO=>AUTO_DESC);

            // Check if the user is allowed to set rooms to co-ed, if so add Co-ed to the drop down
            if(\Current_User::allow('hms', 'coed_rooms')){
                $roomGenders[COED] = COED_DESC;
            }

            $form->addDropBox('gender_type', $roomGenders);
            $form->setMatch('gender_type', $this->room->gender_type);
            $form->addCssClass('gender_type', 'form-control');
        }else{
            // Room is not empty so just show the gender (no drop down)
            $tpl['GENDER_MESSAGE'] = HMS_Util::formatGender($this->room->getGender());

            // Add a hidden variable for 'gender_type' so it will be defined upon submission
            $form->addHidden('gender_type', $this->room->gender_type);

            // Show the reason the gender could not be changed.
            if($number_of_assignees != 0){
                $tpl['GENDER_REASON'] = 'Remove occupants to change room gender.';
            }
        }

        //Always show the option to set the default gender
        $form->addDropBox('default_gender', array(FEMALE => FEMALE_DESC, MALE => MALE_DESC, AUTO => AUTO_DESC));
        $form->setLabel('default_gender', 'Default Gender');
        $form->setMatch('default_gender', $this->room->default_gender);
        $form->addCssClass('default_gender', 'form-control');

        $form->addDropBox('rlc_reserved', array("0"=>"Choose RLC") + RlcFactory::getRlcList($this->room->getTerm()));
        $form->setLabel('rlc_reserved', 'Reserved for RLC');
        $form->setMatch('rlc_reserved', $this->room->getReservedRlcId());
        $form->addCssClass('rlc_reserved', 'form-control');

        $form->addCheck('offline', 1);
        $form->setLabel('offline', 'Offline');
        $form->setMatch('offline', $this->room->isOffline());

        $form->addCheck('reserved', 1);
        $form->setLabel('reserved','Reserved');
        $form->setMatch('reserved', $this->room->isReserved());

        $form->addCheck('ra', 1);
        $form->setLabel('ra','Reserved for RA');
        $form->setMatch('ra', $this->room->isRa());

        $form->addCheck('private', 1);
        $form->setLabel('private','Private');
        $form->setMatch('private', $this->room->isPrivate());

        $form->addCheck('overflow', 1);
        $form->setLabel('overflow','Overflow');
        $form->setMatch('overflow', $this->room->isOverflow());

        $form->addCheck('parlor', 1);
        $form->setLabel('parlor','Parlor');
        $form->setMatch('parlor', $this->room->isParlor());

        $form->addCheck('ada', 1);
        $form->setLabel('ada', 'ADA');
        $form->setMatch('ada', $this->room->isAda());

        $form->addCheck('hearing_impaired', 1);
        $form->setLabel('hearing_impaired', 'Hearing Impaired');
        $form->setMatch('hearing_impaired', $this->room->isHearingImpaired());

        $form->addCheck('bath_en_suite', 1);
        $form->setLabel('bath_en_suite', 'Bath en Suite');
        $form->setMatch('bath_en_suite', $this->room->bathEnSuite());

        $form->addSubmit('submit', 'Submit');

        // Assignment pagers
        $tpl['BED_PAGER'] = Bed::bed_pager_by_room($this->room->id);

        // if the user has permission to view the form but not edit it then
        // disable it
        if(    \Current_User::allow('hms', 'room_view')
        && !\Current_User::allow('hms', 'room_attributes')
        && !\Current_User::allow('hms', 'room_structure'))
        {
            $elements = $form->getAllElements();

            foreach($elements as $element => $value){
                $form->setDisabled($element);
            }
        }

        $form->mergeTemplate($tpl);
        $tpl = $form->getTemplate();

        $reasonsList = Room::listReserveReasons();

        $tpl['ATHLETICS_OPTIONS'] =  $reasonsList['Athletics'];
        $tpl['SPECIAL_NEEDS_OPTIONS'] =  $reasonsList['SpecialNeeds'];
        $tpl['SCHOLARS_OPTIONS'] =  $reasonsList['ScholarsOrganizations'];
        $tpl['MISC_OPTIONS'] =  $reasonsList['Miscellaneous'];

        if($this->room->getReservedReason() == "") {
            $tpl['CURRENT_REASON'] = 'none';
        } else {
            $tpl['CURRENT_REASON'] = $this->room->getReservedReason();
        }

        $tpl['RESERVED_NOTES'] = $this->room->getReservedNotes();

        \Layout::addPageTitle("Edit Room");

        $tpl['ROOM_DAMAGE_LIST'] = $this->roomDamagePager();


        if(\Current_User::allow('hms', 'add_room_dmg')){
            $dmgCmd = CommandFactory::getCommand('ShowAddRoomDamage');
            $dmgCmd->setRoom($this->room);
            $tpl['ADD_DAMAGE_URI']  = $dmgCmd->getURI();
        }

        $tpl['vendor_bundle'] = AssetResolver::resolveJsPath('assets.json', 'vendor');
        $tpl['entry_bundle'] = AssetResolver::resolveJsPath('assets.json', 'roomDamages');

        return \PHPWS_Template::process($tpl, 'hms', 'admin/edit_room.tpl');
    }

    private function roomDamagePager()
    {
        $pager = new \DBPager('hms_room_damage', '\Homestead\RoomDamageDb');
        $pager->db->addJoin('LEFT OUTER', 'hms_room_damage', 'hms_damage_type', 'damage_type', 'id');


        $pager->addWhere('hms_room_damage.room_persistent_id', $this->room->getPersistentId());
        $pager->addWhere('hms_room_damage.repaired', 0); // Only non-repaired damages


        $pager->setModule('hms');
        $pager->setTemplate('admin/roomDamagesPager.tpl');
        $pager->setLink('index.php?module=hms');
        $pager->setEmptyMessage("No damages found.");
        $pager->addRowTags('getRowTags');

        return $pager->get();
    }
}