diff --git a/application/config/message.php b/application/config/message.php index 8e7249feb..1dc1c67ea 100644 --- a/application/config/message.php +++ b/application/config/message.php @@ -7,8 +7,8 @@ $config['send_immediately'] = false; $config['msg_delivery'] = true; // Default true $config['system_person_id'] = 1; // Dummy sender, used for sending messages from the system -$config['redirect_view_message_url'] = 'index.ci.php/Redirect/redirectByToken/'; // -$config['message_html_view_url'] = 'index.ci.php/ViewMessage/toHTML/'; +$config['redirect_view_message_url'] = site_url('Redirect/redirectByToken/'); // +$config['message_html_view_url'] = site_url('ViewMessage/toHTML/'); $config['message_server'] = 'http://www.fhcomplete.org/'; $config['assistent_function'] = 'ass'; @@ -65,4 +65,4 @@ define('MSG_ERR_INVALID_RECIPIENTS', 105); define('MSG_ERR_INVALID_RECEIVER_ID', 106); define('MSG_ERR_INVALID_OU', 107); define('MSG_ERR_INVALID_TEMPLATE', 108); -define('MSG_ERR_INVALID_TOKEN', 109); \ No newline at end of file +define('MSG_ERR_INVALID_TOKEN', 109); diff --git a/application/config/navigation.php b/application/config/navigation.php index 86dc3bdde..ecdd5d9f7 100644 --- a/application/config/navigation.php +++ b/application/config/navigation.php @@ -1,75 +1,102 @@ array( - 'FH-Complete' => site_url(''), - 'Vilesci' => base_url('/vilesci'), - 'CIS' => CIS_ROOT + 'fhcomplete' => array( + 'link' => site_url(''), + 'icon' => '', + 'description' => 'FH-Complete', + 'sort' => 1 + ), + 'vilesci' => array( + 'link' => base_url('vilesci'), + 'icon' => '', + 'description' => 'Vilesci', + 'sort' => 2 + ), + 'cis' => array( + 'link' => CIS_ROOT, + 'icon' => '', + 'description' => 'CIS', + 'sort' => 3 + ) ) ); +// -------------------------------------------------------------------------------------------------------------------- +// Left side menu + $config['navigation_menu'] = array(); $config['navigation_menu']['Vilesci/index'] = array( - 'Dashboard' => array( + 'dashboard' => array( 'link' => '#', 'description' => 'Dashboard', - 'icon' => 'dashboard' + 'icon' => 'dashboard', + 'sort' => 1 ), - 'Lehre' => array( + 'lehre' => array( 'link' => '#', 'icon' => 'graduation-cap', 'description' => 'Lehre', 'expand' => true, + 'sort' => 2, 'children'=> array( - 'CIS' => array( + 'cis' => array( 'link' => CIS_ROOT, 'icon' => '', 'description' => 'CIS', - 'expand' => true + 'expand' => true, + 'sort' => 1 ), - 'Infocenter' => array( - 'link' => site_url('/system/infocenter/InfoCenter'), + 'infocenter' => array( + 'link' => site_url('system/infocenter/InfoCenter'), 'icon' => 'info', 'description' => 'Infocenter', - 'expand' => true + 'expand' => true, + 'sort' => 2 ), ) ), - 'Administration' => array( + 'administration' => array( 'link' => '#', 'icon' => 'gear', 'description' => 'Administration', 'expand' => false, + 'sort' => 3, 'children'=> array( - 'Vilesci' => array( - 'link' => base_url('vilesci/'), + 'vilesci' => array( + 'link' => base_url('vilesci'), 'icon' => '', 'description' => 'Vilesci', - 'expand' => true + 'expand' => true, + 'sort' => 1 ), - 'Extensions' => array( - 'link' => site_url('/system/extensions/Manager'), + 'extensions' => array( + 'link' => site_url('system/extensions/Manager'), 'icon' => 'cubes', 'description' => 'Extensions Manager', - 'expand' => true + 'expand' => true, + 'sort' => 2 ) ) ) ); - $config['navigation_menu']['system/infocenter/InfoCenter/index'] = array( - 'Freigegeben' => array( - 'link' => base_url('index.ci.php/system/infocenter/InfoCenter/freigegeben'), + 'freigegeben' => array( + 'link' => site_url('system/infocenter/InfoCenter/freigegeben'), 'description' => 'Freigegeben', 'icon' => 'thumbs-up' ) ); $config['navigation_menu']['system/infocenter/InfoCenter/freigegeben'] = array( - 'Zurück' => array( - 'link' => base_url('index.ci.php/system/infocenter/InfoCenter/index'), + 'back' => array( + 'link' => site_url('system/infocenter/InfoCenter/index'), 'description' => 'Home', 'icon' => 'angle-left' ) diff --git a/application/controllers/jobs/AmpelMail.php b/application/controllers/jobs/AmpelMail.php new file mode 100644 index 000000000..f77122735 --- /dev/null +++ b/application/controllers/jobs/AmpelMail.php @@ -0,0 +1,214 @@ +input->is_cli_request()) + { + $cli = true; + } + else + { + $this->output->set_status_header(403, 'Jobs must be run from the CLI'); + echo "Jobs must be run from the CLI"; + exit; + } + + // Load models + $this->load->model('content/Ampel_model', 'AmpelModel'); + $this->load->model('person/Person_model', 'PersonModel'); + + // Load helpers + $this->load->helper('sancho'); + } + + /** + * Main function index as help + * + * @return void + */ + public function index() + { + $result = "The following are the available command line interface commands\n\n"; + $result .= "php index.ci.php jobs/AmpelMail generateAmpelMail"; + + echo $result. PHP_EOL; + } + + /** + * Generates mail content for new and overdue Ampeln, which + * 1. are not confirmed by the user yet and + * 2. are marked to be sent by email + * Ampel is new when inserted within the last 7 days before the cronjob runs (as cronjob runs weekly) + * Ampel is overdue when the cronjob runs after the deadline date. + * @return void + */ + public function generateAmpelMail() + { + // Get all notifications, that are not expired, not before vorlaufzeit AND email is true + $result_active_ampeln = $this->AmpelModel->active(true); + + // Stores users, description, deadline and system-link of notifications + $new_ampel_data_arr = array(); // data of new notifications that are not confirmed + $overdue_ampel_data_arr = array(); // data of overdue notifications that are not confirmed + + if (hasData($result_active_ampeln)) + { + $ampel_arr = $result_active_ampeln->retval; + + // Loop through ampeln + foreach ($ampel_arr as $ampel) + { + $ampel_id = $ampel->ampel_id; + $now = date_create(date('Y-m-d')); + $deadline = date_create($ampel->deadline); + $insert_date = date_create($ampel->insertamum); + $qry_all_ampel_user = $ampel->benutzer_select; // sql select to get all user who get this ampel + $new = false; + $overdue = false; + + // get all user, who get this ampel + $result_ampel_user = $this->AmpelModel->execBenutzerSelect($qry_all_ampel_user); + + if (hasData($result_ampel_user)) + { + $ampel_user_arr = $result_ampel_user->retval; + + // loop through all user, who get this ampel + foreach ($ampel_user_arr as $ampel_user) + { + $uid = $ampel_user->uid; + + // break if ampel was almost confirmed by the user + if($this->AmpelModel->isConfirmed($ampel_id, $uid)) break; + + // check if ampel is new (inserted within last week, as cronjob will run every week) + if ($now->diff($insert_date)->days <= 7) $new = true; + + //check if ampel is overdue + if ($now > $deadline) $overdue = true; + + // if ampel is new + if ($new) + { + $html_text = '

'. strtoupper($ampel->kurzbz). '


'; + + // create template-specific data array of new notifications + // if uid already exists in the array, only the html text will be added to the existing html text + $new_ampel_data_arr = + $this->_getAmpelContentData($uid, $html_text, $new_ampel_data_arr); + } + + // if ampel is overdue + if ($overdue) + { + $html_text = ' +

'. strtoupper($ampel->kurzbz). '
+ + Die Deadline für die Bestätigung war am + '. date_format($deadline, 'Y-m-d'). ' + +


'; + + // create template-specific data array of overdue notifications + // if uid already exists in the array, only the html text will be added to the existing html text + $overdue_ampel_data_arr = + $this->_getAmpelContentData($uid, $html_text, $overdue_ampel_data_arr); + } + } + } + elseif (isError($result_ampel_user)) + { + show_error($result_ampel_user->error); + } + } + } + elseif (isError($result_active_ampeln)) + { + show_error($result_active_ampeln->error); + } + + // Send mails for new ampeln merged by user + foreach ($new_ampel_data_arr as $new_ampel_data) + { + sendMail( + 'Sancho_Content_AmpelNeu', + $new_ampel_data, + $new_ampel_data['uid']. '@'. DOMAIN, + 'Du hast eine neue Ampel!', + 'sancho_header_neue_nachrichten_in_ampelsystem.jpg' + ); + }; + // Send mails for overdue ampeln merged by user + foreach ($overdue_ampel_data_arr as $overdue_ampel_data) + { + sendMail( + 'Sancho_Content_AmpelUeberfaellig', + $overdue_ampel_data, + $overdue_ampel_data['uid']. '@'. DOMAIN, + 'Bestätige bitte Deine Ampel!', + 'sancho_header_ampel_overdue.jpg' + ); + }; + } + + // ------------------------------------------------------------------------ + // Private methods + /** + * Returns associative array with data as needed in the ampel content templates. + * @param string $uid UID, needed to merge user. + * @param string $html_text Specific HTML Content to be set initially for a user or to add if user exists. + * @param array $ampel_data_arr Array with ampeln. + * @return array + */ + private function _getAmpelContentData($uid, $html_text, $ampel_data_arr) + { + $firstName = $this->PersonModel->getByUid($uid)->retval[0]->vorname; + + // check if user already exists in the array + $key_position = array_search($uid, array_column($ampel_data_arr, 'uid')); + + // If user already exists in the array, add only new ampel data to users ampel list + if ($key_position !== false) + { + $ampel_data_arr[$key_position]['ampel_list'] .= $html_text; + } + // If user does not exist, create new user and push all data needed + else + { + $ampel_data_arr[] = array( + 'uid' => $uid, + 'firstName' => $firstName, + 'ampel_list' => $html_text, + 'link' => self::CIS_AMPELVERWALTUNG_URL + ); + } + return $ampel_data_arr; + } +} diff --git a/application/controllers/jobs/Prestudentstatus.php b/application/controllers/jobs/Prestudentstatus.php index 9771acefb..dc5c08512 100644 --- a/application/controllers/jobs/Prestudentstatus.php +++ b/application/controllers/jobs/Prestudentstatus.php @@ -40,7 +40,7 @@ class Prestudentstatus extends Auth_Controller public function index() { $result = "The following are the available command line interface commands\n\n"; - $result .= "php index.ci.php jobs/Prestudentstatus CorrectStudienplan"; + $result .= "php ".$this->config->item('index_page')." jobs/Prestudentstatus CorrectStudienplan"; echo $result.PHP_EOL; } diff --git a/application/controllers/system/infocenter/InfoCenter.php b/application/controllers/system/infocenter/InfoCenter.php index 5119600b9..1f464e09b 100644 --- a/application/controllers/system/infocenter/InfoCenter.php +++ b/application/controllers/system/infocenter/InfoCenter.php @@ -12,12 +12,18 @@ class InfoCenter extends Auth_Controller const APP = 'infocenter'; const TAETIGKEIT = 'bewerbung'; - const URL_PREFIX = '/system/infocenter/InfoCenter'; // URL prefix for this controller + const INFOCENTER_URI = 'system/infocenter/InfoCenter'; // URL prefix for this controller + const INDEX_PAGE = 'index'; + const FREIGEGEBEN_PAGE = 'freigegeben'; + const SHOW_DETAILS_PAGE = 'showDetails'; + + const NAVIGATION_PAGE = 'navigation_page'; + const ORIGIN_PAGE = 'origin_page'; private $_uid; // contains the UID of the logged user // Used to log with PersonLogLib - private $logparams = array( + private $_logparams = array( 'saveformalgep' => array( 'logtype' => 'Action', 'name' => 'Document formally checked', @@ -119,29 +125,33 @@ class InfoCenter extends Auth_Controller // Public methods /** - * Default + * Main page of the InfoCenter tool */ public function index() { - $this->setNavigationMenuIndex(); // define the navigation menu for this page + $this->_setNavigationMenuIndex(); // define the navigation menu for this page $this->load->view('system/infocenter/infocenter.php'); } + /** + * Freigegeben page of the InfoCenter tool + */ public function freigegeben() { - $this->setNavigationMenuFreigegeben(); // define the navigation menu for this page + $this->_setNavigationMenuFreigegeben(); // define the navigation menu for this page $this->load->view('system/infocenter/infocenterFreigegeben.php'); } /** + * Personal details page of the InfoCenter tool * Initialization function, gets person and prestudent data and loads the view with the data * @param $person_id */ public function showDetails() { - $this->setNavigationMenuShowDetails(); + $this->_setNavigationMenuShowDetails(); $person_id = $this->input->get('person_id'); @@ -156,8 +166,8 @@ class InfoCenter extends Auth_Controller if (empty($personexists->retval)) show_error('person does not exist!'); - $origin_page = $this->input->get('origin_page'); - if ($origin_page == 'index') + $origin_page = $this->input->get(self::ORIGIN_PAGE); + if ($origin_page == self::INDEX_PAGE) { // mark person as locked for editing $result = $this->PersonLockModel->lockPerson($person_id, $this->_uid, self::APP); @@ -174,8 +184,8 @@ class InfoCenter extends Auth_Controller $prestudentdata ); - $data['fhc_controller_id'] = $this->getControllerId(); - $data['origin_page'] = $origin_page; + $data[self::FHC_CONTROLLER_ID] = $this->getControllerId(); + $data[self::ORIGIN_PAGE] = $origin_page; $this->load->view('system/infocenter/infocenterDetails.php', $data); } @@ -191,7 +201,7 @@ class InfoCenter extends Auth_Controller if (isError($result)) show_error($result->retval); - redirect(self::URL_PREFIX.'?fhc_controller_id='.$this->getControllerId()); + redirect('/'.self::INFOCENTER_URI.'?'.self::FHC_CONTROLLER_ID.'='.$this->getControllerId()); } /** @@ -230,9 +240,7 @@ class InfoCenter extends Auth_Controller } } - $this->output - ->set_content_type('application/json') - ->set_output(json_encode($json)); + $this->output->set_content_type('application/json')->set_output(json_encode($json)); } /** @@ -243,9 +251,7 @@ class InfoCenter extends Auth_Controller { $prestudent = $this->PrestudentModel->getLastPrestudent($person_id, true); - $this->output - ->set_content_type('application/json') - ->set_output(json_encode($prestudent)); + $this->output->set_content_type('application/json')->set_output(json_encode($prestudent)); } /** @@ -324,9 +330,7 @@ class InfoCenter extends Auth_Controller $this->_log($logdata['person_id'], 'savezgv', array($logdata['studiengang_kurzbz'], $prestudent_id)); } } - $this->output - ->set_content_type('application/json') - ->set_output(json_encode($result)); + $this->output->set_content_type('application/json')->set_output(json_encode($result)); } /** @@ -479,9 +483,7 @@ class InfoCenter extends Auth_Controller $this->_log($person_id, 'savenotiz', array($titel)); } - $this->output - ->set_content_type('application/json') - ->set_output(json_encode($result)); + $this->output->set_content_type('application/json')->set_output(json_encode($result)); } /** @@ -512,9 +514,7 @@ class InfoCenter extends Auth_Controller $this->_log($person_id, 'updatenotiz', array($titel)); } - $this->output - ->set_content_type('application/json') - ->set_output(json_encode($result)); + $this->output->set_content_type('application/json')->set_output(json_encode($result)); } /** @@ -581,9 +581,7 @@ class InfoCenter extends Auth_Controller { $result = $this->personloglib->getParkedDate($person_id); - $this->output - ->set_content_type('application/json') - ->set_output(json_encode($result)); + $this->output->set_content_type('application/json')->set_output(json_encode($result)); } /** @@ -596,9 +594,7 @@ class InfoCenter extends Auth_Controller $result = $this->personloglib->park($person_id, date_format(date_create($date), 'Y-m-d'), self::TAETIGKEIT, self::APP, null, $this->_uid); - $this->output - ->set_content_type('application/json') - ->set_output(json_encode($result)); + $this->output->set_content_type('application/json')->set_output(json_encode($result)); } /** @@ -610,9 +606,7 @@ class InfoCenter extends Auth_Controller $result = $this->personloglib->unPark($person_id); - $this->output - ->set_content_type('application/json') - ->set_output(json_encode($result)); + $this->output->set_content_type('application/json')->set_output(json_encode($result)); } /** @@ -631,9 +625,26 @@ class InfoCenter extends Auth_Controller $json = $result->retval[0]->ende; } - $this->output - ->set_content_type('application/json') - ->set_output(json_encode($json)); + $this->output->set_content_type('application/json')->set_output(json_encode($json)); + } + + /** + * Wrapper for setNavigationMenu, returns JSON message + */ + public function setNavigationMenuArrayJson() + { + $navigation_page = $this->input->get(self::NAVIGATION_PAGE); + + if (strpos($navigation_page, self::INDEX_PAGE) !== false) + { + $this->_setNavigationMenuIndex(); + } + else + { + $this->_setNavigationMenuFreigegeben(); + } + + $this->outputJsonSuccess('success'); } // ----------------------------------------------------------------------------------------------------------------- @@ -652,9 +663,9 @@ class InfoCenter extends Auth_Controller /** * Define the navigation menu for the index page */ - public function setNavigationMenuIndex() + private function _setNavigationMenuIndex() { - $this->load->library('NavigationLib', array('navigation_page' => 'system/infocenter/InfoCenter/index')); + $this->load->library('NavigationLib', array(self::NAVIGATION_PAGE => self::INFOCENTER_URI.'/'.self::INDEX_PAGE)); $listFiltersSent = array(); $listFiltersNotSent = array(); @@ -743,16 +754,16 @@ class InfoCenter extends Auth_Controller /** * Define the navigation menu for the showDetails page */ - public function setNavigationMenuShowDetails() + private function _setNavigationMenuShowDetails() { - $this->load->library('NavigationLib', array('navigation_page' => 'system/infocenter/InfoCenter/showDetails')); + $this->load->library('NavigationLib', array(self::NAVIGATION_PAGE => self::INFOCENTER_URI.'/'.self::SHOW_DETAILS_PAGE)); - $origin_page = $this->input->get('origin_page'); + $origin_page = $this->input->get(self::ORIGIN_PAGE); - $link = base_url('index.ci.php/system/infocenter/InfoCenter/index'); - if ($origin_page == 'freigegeben') + $link = site_url(self::INFOCENTER_URI.'/'.self::INDEX_PAGE); + if ($origin_page == self::FREIGEGEBEN_PAGE) { - $link = base_url('index.ci.php/system/infocenter/InfoCenter/freigegeben'); + $link = site_url(self::INFOCENTER_URI.'/'.self::FREIGEGEBEN_PAGE); } $this->navigationlib->setSessionMenu( @@ -771,9 +782,9 @@ class InfoCenter extends Auth_Controller /** * Define the navigation menu for the freigegeben page */ - public function setNavigationMenuFreigegeben() + private function _setNavigationMenuFreigegeben() { - $this->load->library('NavigationLib', array('navigation_page' => 'system/infocenter/InfoCenter/freigegeben')); + $this->load->library('NavigationLib', array(self::NAVIGATION_PAGE => self::INFOCENTER_URI.'/'.self::FREIGEGEBEN_PAGE)); $listFilters = array(); $listCustomFilters = array(); @@ -832,24 +843,8 @@ class InfoCenter extends Auth_Controller } /** - * Wrapper for setNavigationMenu, returns JSON message + * Utility method used to fill elements of the InfoCenter left menu of the main InfoCenter page */ - public function setNavigationMenuArrayJson() - { - $navigation_page = $this->input->get('navigation_page'); - - if (strpos($navigation_page, 'index') !== false) - { - $this->setNavigationMenuIndex(); - } - else - { - $this->setNavigationMenuFreigegeben(); - } - - $this->outputJsonSuccess('success'); - } - private function _fillFilters($filters, &$tofill) { $toPrint = "%s?%s=%s&%s=%s"; @@ -859,7 +854,7 @@ class InfoCenter extends Auth_Controller $tofill['children'][] = array( 'link' => sprintf( $toPrint, - site_url('system/infocenter/InfoCenter'), 'filter_id', $filterId, + site_url(self::INFOCENTER_URI), 'filter_id', $filterId, FHC_Controller::FHC_CONTROLLER_ID, $this->getControllerId() ), @@ -868,6 +863,9 @@ class InfoCenter extends Auth_Controller } } + /** + * Utility method used to fill elements of the InfoCenter left menu of the freigegeben InfoCenter page + */ private function _fillFiltersFreigegeben($filters, &$tofill) { $toPrint = "%s?%s=%s&%s=%s"; @@ -877,7 +875,7 @@ class InfoCenter extends Auth_Controller $tofill['children'][] = array( 'link' => sprintf( $toPrint, - site_url('system/infocenter/InfoCenter/freigegeben'), 'filter_id', $filterId, + site_url(self::INFOCENTER_URI.'/'.self::FREIGEGEBEN_PAGE), 'filter_id', $filterId, FHC_Controller::FHC_CONTROLLER_ID, $this->getControllerId() ), @@ -886,6 +884,10 @@ class InfoCenter extends Auth_Controller } } + /** + * Utility method used to fill elements of the InfoCenter left menu + * with the list of the custom filter of the authenticated user + */ private function _fillCustomFilters($filters, &$tofill) { $toPrint = "%s?%s=%s&%s=%s"; @@ -895,7 +897,7 @@ class InfoCenter extends Auth_Controller $tofill['children'][] = array( 'link' => sprintf( $toPrint, - site_url('system/infocenter/InfoCenter'), 'filter_id', $filterId, + site_url(self::INFOCENTER_URI), 'filter_id', $filterId, FHC_Controller::FHC_CONTROLLER_ID, $this->getControllerId() ), @@ -1089,7 +1091,18 @@ class InfoCenter extends Auth_Controller $this->PrestudentModel->addSelect('person_id'); $person_id = $this->PrestudentModel->load($prestudent_id)->retval[0]->person_id; - redirect(self::URL_PREFIX.'/showDetails?person_id='.$person_id.'&fhc_controller_id='.$this->getControllerId().'#'.$section); + redirect( + sprintf( + '/%s/%s?%s=%s&%s=%s#%s', + self::INFOCENTER_URI, + self::SHOW_DETAILS_PAGE, + 'person_id', + $person_id, + self::FHC_CONTROLLER_ID, + $this->getControllerId(), + $section + ) + ); } /** @@ -1121,7 +1134,7 @@ class InfoCenter extends Auth_Controller */ private function _log($person_id, $logname, $messageparams) { - $logdata = $this->logparams[$logname]; + $logdata = $this->_logparams[$logname]; $datatolog = array( 'name' => $logdata['name'] diff --git a/application/helpers/message_helper.php b/application/helpers/message_helper.php index 1cba07eec..1197a02ac 100644 --- a/application/helpers/message_helper.php +++ b/application/helpers/message_helper.php @@ -9,7 +9,7 @@ * @license GPLv3 * @since Version 1.0.0 */ - + /** * Message Helper * @@ -35,7 +35,7 @@ function success($retval, $code = null, $msg_indx_prefix = 'fhc_') $success->fhcCode = $code; if (!is_null($code)) $success->msg = lang($msg_indx_prefix . $code); $success->retval = $retval; - + return $success; } @@ -51,7 +51,7 @@ function error($retval = '', $code = null, $msg_indx_prefix = 'fhc_') $error->fhcCode = $code; if (!is_null($code)) $error->msg = lang($msg_indx_prefix . $code); $error->retval = $retval; - + return $error; } @@ -64,7 +64,7 @@ function isSuccess($result) { return true; } - + return false; } @@ -78,15 +78,16 @@ function hasData($result) { return true; } - + return false; } /** * Checks if the result represents an error * Wrapper function of isSuccess, more readable code + * Bob Dylan: ...there's no success like failure. And that failure's no success at all. */ function isError($result) { return !isSuccess($result); -} \ No newline at end of file +} diff --git a/application/helpers/sancho_helper.php b/application/helpers/sancho_helper.php new file mode 100644 index 000000000..210c5115b --- /dev/null +++ b/application/helpers/sancho_helper.php @@ -0,0 +1,93 @@ +load->library('email'); + $ci->load->library('MailLib'); + + $sanchoHeader_img = 'skin/images/sancho/'. $headerImg; + $sanchoFooter_img = 'skin/images/sancho/sancho_footer.jpg'; + + // Embed sancho header and footer image + // reset important to ensure embedding of images when called in a loop + $ci->email->clear(true); // clear vars and attachments + $ci->email->attach($sanchoHeader_img); + $ci->email->attach($sanchoFooter_img); + $cid_header = $ci->email->attachment_cid($sanchoHeader_img); // sets unique content id for embedding + $cid_footer = $ci->email->attachment_cid($sanchoFooter_img); // sets unique content id for embedding + + // Set specific mail content into specific content template + $content = _parseMailContent($vorlage_kurzbz, $vorlage_data); + + // overall main content data array + $layout = array( + 'CID_header' => $cid_header, + 'CID_footer' => $cid_footer, + 'content' => $content + ); + + // Set overall main content into the sancho mail template + $body = _parseMailContent('Sancho_Mail_Template', $layout); + + // Send mail + $ci->maillib->send('sancho@'. DOMAIN, $to, $subject, $body); +} + +/** + * Replace variables in the mail content template with specific mail content data. + * @param string $vorlage_kurzbz Name of the template for specific mail content. + * @param array $vorlage_data Associative array with specific mail content varibales + * to be replaced in the content template. + * @return string + */ +function _parseMailContent($vorlage_kurzbz, $vorlage_data) +{ + $ci =& get_instance(); + $ci->load->library('VorlageLib'); + + $result = $ci->vorlagelib->getVorlagetextByVorlage($vorlage_kurzbz); + + if (isSuccess($result)) + { + // If the text and the subject of the template are not empty + if (is_array($result->retval) && count($result->retval) > 0 && + !empty($result->retval[0]->text)) + { + // Parses template text + $parsedText = $ci->vorlagelib->parseVorlagetext($result->retval[0]->text, $vorlage_data); + + return $parsedText; + } + } +} diff --git a/application/libraries/NavigationLib.php b/application/libraries/NavigationLib.php index 80b2aa5a2..a30c3943a 100644 --- a/application/libraries/NavigationLib.php +++ b/application/libraries/NavigationLib.php @@ -97,6 +97,8 @@ class NavigationLib } } + $this->_sortArray($menuArray); + return $menuArray; } @@ -150,6 +152,8 @@ class NavigationLib } } + $this->_sortArray($headerArray); + return $headerArray; } @@ -158,17 +162,20 @@ class NavigationLib */ public function oneLevel( $description, $link = '#', $children = null, $icon = '', $expand = false, - $subscriptDescription = null, $subscriptLinkClass = null, $subscriptLinkValue = null) + $subscriptDescription = null, $subscriptLinkClass = null, $subscriptLinkValue = null, $target = '', + $sort = null) { return array( 'description' => $description, 'link' => $link, + 'target' => $target, 'children'=> $children, 'icon' => $icon, 'expand' => $expand, 'subscriptDescription' => $subscriptDescription, 'subscriptLinkClass' => $subscriptLinkClass, - 'subscriptLinkValue' => $subscriptLinkValue + 'subscriptLinkValue' => $subscriptLinkValue, + 'sort' => $sort ); } @@ -351,4 +358,34 @@ class NavigationLib return $navigationPage; } + + /** + * Sorts using the sort element present in the array + */ + private function _sortArray(&$array) + { + uasort($array, function($a, $b) { + + // If the element sort is not present then the default value is 999 + $sortA = 999; + if (isset($a['sort'])) $sortA = $a['sort']; + + // If the element sort is not present then the default value is 999 + $sortB = 999; + if (isset($b['sort'])) $sortB = $b['sort']; + + return $sortA - $sortB; // < 0 => lt, == 0 => equal, > 0 => gt + }); + + // Sort also the children + foreach ($array as $key => $value) + { + if (isset($value['children']) && is_array($value['children']) && count($value['children']) > 0) + { + // NOTE: keep this way to give the element by reference, $value has a different reference! + // otherwise the children will not be sorted + $this->_sortArray($array[$key]['children']); // recursive call + } + } + } } diff --git a/application/models/content/Ampel_model.php b/application/models/content/Ampel_model.php index 84109e17b..e569755df 100644 --- a/application/models/content/Ampel_model.php +++ b/application/models/content/Ampel_model.php @@ -1,7 +1,6 @@ dbTable = 'public.tbl_ampel'; $this->pk = 'ampel_id'; } + + /** + * Returns all active Ampeln, that are actually: + * 1. not after the deadline date + * 2. not before the vorlaufszeit + * @param bool $email If true, then only ampeln are retrieved that are marked to be sent by mail. + * @return array Returns array of objects. + */ + public function active($email = false) + { + $parametersArray = null; + $query = ' + SELECT * + FROM public.tbl_ampel + WHERE'; + + if ($email === true) + { + $parametersArray['email'] = $email; + $query .= ' email = ? AND'; + } + + $query .= ' + (NOW()<(deadline+(verfallszeit || \' days\')::interval)::date) + OR (verfallszeit IS NULL AND NOW() < deadline) + AND (NOW()>(deadline-(vorlaufzeit || \' days\')::interval)::date) + OR (vorlaufzeit IS NULL AND NOW() > deadline)'; + + $query .= ' ORDER BY deadline DESC'; + + return $this->execQuery($query, $parametersArray); + } + + /** + * Returns all Ampel-receiver of a specific Ampel. + * @param string $benutzer_select SQL Statement which defines the Ampel-receiver. + * @return array Returns array of objects with property 'uid'. + */ + public function execBenutzerSelect($benutzer_select) + { + if (isset($benutzer_select) && !empty(trim($benutzer_select))) + { + return $this->execQuery($benutzer_select); + } + } + + /** + * Checks if Ampel was confirmed by the user. + * @param int $ampel_id Ampel-ID + * @param string $uid UID + * @return bool + */ + public function isConfirmed($ampel_id, $uid) + { + $result = null; + $query = ' + SELECT 1 + FROM public.tbl_ampel_benutzer_bestaetigt + WHERE ampel_id = ? + AND uid = ?'; + + if (isset($ampel_id, $uid)) + { + $result = $this->execQuery($query, array($ampel_id, $uid)); + } + + if ($result) + { + if (count($result->retval) > 0) + { + return true; + } + else + { + return false; + } + } + else + return $result; //will contain the error-msg from execQuery + } } diff --git a/application/views/crm/statusgrundEdit.php b/application/views/crm/statusgrundEdit.php index d37eafe8f..ddbd1ff0a 100644 --- a/application/views/crm/statusgrundEdit.php +++ b/application/views/crm/statusgrundEdit.php @@ -7,7 +7,7 @@

Statusgrund: status_kurzbz; ?>

-
"> + ">
@@ -104,4 +104,4 @@ } ?> - \ No newline at end of file + diff --git a/application/views/crm/statusgrundNew.php b/application/views/crm/statusgrundNew.php index 9d9a2e9a1..bd2ebe7d7 100644 --- a/application/views/crm/statusgrundNew.php +++ b/application/views/crm/statusgrundNew.php @@ -5,7 +5,7 @@

Neuer Statusgrund

- "> + ">
diff --git a/application/views/organisation/studienjahrEdit.php b/application/views/organisation/studienjahrEdit.php index b8e3817d0..4a23217b1 100644 --- a/application/views/organisation/studienjahrEdit.php +++ b/application/views/organisation/studienjahrEdit.php @@ -7,7 +7,7 @@ $this->load->view('templates/header', array('title' => 'StudienjahrEdit', 'jquer

Studienjahr bearbeiten: studienjahr_kurzbz; ?>

- "> + "> @@ -17,4 +17,4 @@ $this->load->view('templates/header', array('title' => 'StudienjahrEdit', 'jquer - \ No newline at end of file + diff --git a/application/views/organisation/studienjahrNew.php b/application/views/organisation/studienjahrNew.php index 31fe78630..95b5bd897 100644 --- a/application/views/organisation/studienjahrNew.php +++ b/application/views/organisation/studienjahrNew.php @@ -8,7 +8,7 @@ $this->load->view('templates/header', array('title' => 'StudienjahrNew', 'jquery

Neues Studienjahr anlegen

" + action="" id="newStudienjahrForm">
diff --git a/application/views/organisation/studiensemesterEdit.php b/application/views/organisation/studiensemesterEdit.php index 5bb574c23..9f0abc0cb 100644 --- a/application/views/organisation/studiensemesterEdit.php +++ b/application/views/organisation/studiensemesterEdit.php @@ -8,7 +8,7 @@ $this->load->view('templates/header', array('title' => 'StudiensemesterEdit', 'd

Studiensemester bearbeiten: studiensemester_kurzbz; ?>

"> + action="">
diff --git a/application/views/organisation/studiensemesterNew.php b/application/views/organisation/studiensemesterNew.php index 76da57afb..525769bc6 100644 --- a/application/views/organisation/studiensemesterNew.php +++ b/application/views/organisation/studiensemesterNew.php @@ -7,9 +7,7 @@ $this->load->view('templates/header', array('title' => 'StudiensemesterNew', 'jq

Neues Studiensemester anlegen

- " - id="newSemesterForm"> + " id="newSemesterForm">
diff --git a/application/views/system/messageList.php b/application/views/system/messageList.php index 7a28478d8..11f83bc9c 100644 --- a/application/views/system/messageList.php +++ b/application/views/system/messageList.php @@ -84,7 +84,7 @@ $widthColumn = $msgExists === true ? 8 : 12; $.ajax( { dataType: "json", - url: "" + msgid + "/" + recid, + url: "" + msgid + "/" + recid, success: function (data, textStatus, jqXHR) { $("#msgsubject").text(data[0].subject); @@ -97,4 +97,4 @@ $widthColumn = $msgExists === true ? 8 : 12; } ) } - \ No newline at end of file + diff --git a/application/views/system/udf.php b/application/views/system/udf.php index 426c09f24..b2facc38c 100644 --- a/application/views/system/udf.php +++ b/application/views/system/udf.php @@ -47,7 +47,7 @@ } } ?> - +
diff --git a/application/views/templates/FHC-Header.php b/application/views/templates/FHC-Header.php index 0fa0c8478..e63ebff75 100755 --- a/application/views/templates/FHC-Header.php +++ b/application/views/templates/FHC-Header.php @@ -2,8 +2,9 @@ if (! defined('BASEPATH')) exit('No direct script access allowed'); -// Retrives the URL path of the called controller + called controller method +// Retrives the name of the index page, the URL path of the called controller and the called controller // NOTE: placed here because it doesn't work inside functions +$indexPage = $this->config->item('index_page'); $calledPath = $this->router->directory.$this->router->class; $calledMethod = $this->router->method; @@ -67,14 +68,14 @@ function _generateCSSsInclude($CSSs) /** * Generates global JS-Object to pass parms to other javascripts */ -function _generateJSDataStorageObject($calledPath, $calledMethod) +function _generateJSDataStorageObject($indexPage, $calledPath, $calledMethod) { $toPrint = "\n"; $toPrint .= '