function init_calendar()
 {
     $ctr_start_date_ts = $this->control->get_start_date();
     $ctr_end_date_ts = $this->control->get_end_date();
     $period_start_date_ts = $this->get_start_date_month_ts($this->year, $this->month);
     $period_end_date_ts = $this->get_next_start_date_month_ts($this->year, $this->month);
     $repeat_type = $this->control->get_repeat_type();
     $repeat_interval = $this->control->get_repeat_interval();
     $num_days_in_month = cal_days_in_month(CAL_GREGORIAN, $this->month, $this->year);
     for ($i = 1; $i <= $num_days_in_month; $i++) {
         $this->calendar_array[$i] = null;
     }
     $date_generator = new date_generator($ctr_start_date_ts, $ctr_end_date_ts, $period_start_date_ts, $period_end_date_ts, $repeat_type, $repeat_interval);
     $dates_array = $date_generator->get_dates();
     // Set status for control on each date to NOT DONE or REGISTERED
     foreach ($dates_array as $date_ts) {
         $check_list = new controller_check_list();
         $check_list->set_deadline($date_ts);
         $check_list->set_control_id($this->control->get_id());
         if ($this->type == "component") {
             $check_list->set_component_id($this->component->get_id());
             $check_list->set_location_id($this->component->get_location_id());
             $check_list_status_manager = new check_list_status_manager($check_list, "component");
         } else {
             $check_list->set_location_code($this->location_code);
             $check_list_status_manager = new check_list_status_manager($check_list, "location");
         }
         $check_list_status_info = $check_list_status_manager->get_status_for_check_list();
         $this->calendar_array[date("j", $date_ts)]["status"] = $check_list_status_info->get_status();
         $this->calendar_array[date("j", $date_ts)]["info"] = $check_list_status_info->serialize();
     }
 }
 function init_calendar()
 {
     // Sets null values for twelve months in calendar array
     for ($i = 1; $i <= 12; $i++) {
         $this->calendar_array[$i] = null;
     }
     if ($this->control_relation && !$this->control_relation['serie_enabled']) {
         return;
     }
     $ctr_start_date_ts = $this->control->get_start_date();
     $ctr_end_date_ts = $this->control->get_end_date();
     $period_start_date_ts = $this->get_start_date_year_ts($this->year);
     $period_end_date_ts = $this->get_start_date_year_ts($this->year + 1);
     $repeat_type = $this->control->get_repeat_type();
     $repeat_interval = $this->control->get_repeat_interval();
     // Generates dates for time period with specified interval
     $date_generator = new date_generator($ctr_start_date_ts, $ctr_end_date_ts, $period_start_date_ts, $period_end_date_ts, $repeat_type, $repeat_interval);
     $dates_array = $date_generator->get_dates();
     // Set status for control on each date to NOT DONE or REGISTERED
     foreach ($dates_array as $date_ts) {
         $check_list = new controller_check_list();
         $check_list->set_deadline($date_ts);
         $check_list->set_control_id($this->control->get_id());
         $check_list->set_assigned_to($this->control_relation['assigned_to']);
         if ($this->type == "component") {
             $check_list->set_component_id($this->component->get_id());
             $check_list->set_location_id($this->component->get_location_id());
             $check_list_status_manager = new check_list_status_manager($check_list, "component");
         } else {
             $check_list->set_location_code($this->location_code);
             $check_list_status_manager = new check_list_status_manager($check_list, "location");
         }
         $check_list_status_info = $check_list_status_manager->get_status_for_check_list();
         $month_nr = date("n", $date_ts);
         $this->calendar_array[$month_nr]["status"] = $check_list_status_info->get_status();
         $this->calendar_array[$month_nr]["info"] = $check_list_status_info->serialize();
         if (!$this->calendar_array[$month_nr]["info"]['serie_id']) {
             $this->calendar_array[$month_nr]["info"]['serie_id'] = $this->control_relation['serie_id'];
         }
         $this->calendar_array[$month_nr]["info"]['service_time'] = $this->control_relation['service_time'];
         $this->calendar_array[$month_nr]["info"]['controle_time'] = $this->control_relation['controle_time'];
     }
 }
 function add_check_list($data = array())
 {
     phpgw::import_class('controller.socheck_list');
     include_class('controller', 'check_list', 'inc/model/');
     $control_id = $data['control_id'];
     $type = 'component';
     $comment = '';
     $assigned_to = $data['assigned_to'];
     $billable_hours = phpgw::get_var('billable_hours', 'float');
     $deadline_date_ts = $data['start_date'];
     $planned_date_ts = $deadline_date_ts;
     $completed_date_ts = 0;
     $check_list = new controller_check_list();
     $check_list->set_control_id($control_id);
     $check_list->set_location_code($data['location_code']);
     $check_list->set_location_id($data['location_id']);
     $check_list->set_component_id($data['component_id']);
     $status = controller_check_list::STATUS_NOT_DONE;
     $check_list->set_status($status);
     $check_list->set_comment($comment);
     $check_list->set_deadline($deadline_date_ts);
     $check_list->set_planned_date($planned_date_ts);
     $check_list->set_completed_date($completed_date_ts);
     $check_list->set_assigned_to($assigned_to);
     $check_list->set_billable_hours($billable_hours);
     $socheck_list = CreateObject('controller.socheck_list');
     if ($check_list->validate() && ($check_list_id = $socheck_list->store($check_list))) {
         return $check_list_id;
     } else {
         return false;
     }
 }
 public function query()
 {
     $entity_group_id = phpgw::get_var('entity_group_id', 'int');
     $location_id = phpgw::get_var('location_id', 'int');
     $control_area = phpgw::get_var('control_area', 'int');
     $user_id = phpgw::get_var('user_id', 'int');
     $district_id = phpgw::get_var('district_id', 'int');
     $query = phpgw::get_var('query', 'string');
     $year = phpgw::get_var('year', 'int');
     $all_items = phpgw::get_var('all_items', 'bool');
     $user_only = phpgw::get_var('user_only', 'bool');
     $filter_status = phpgw::get_var('status', 'string');
     $report_type = phpgw::get_var('report_type', 'string');
     if ($filter_component_str = phpgw::get_var('filter_component', 'string')) {
         $filter_component_arr = explode('_', $filter_component_str);
         $location_id = $filter_component_arr[0];
         $filter_component = $filter_component_arr[1];
     }
     if ($org_unit_id = phpgw::get_var('org_unit_id', 'int')) {
         $_subs = execMethod('property.sogeneric.read_tree', array('node_id' => $org_unit_id, 'type' => 'org_unit'));
         $this->org_units[] = $org_unit_id;
         foreach ($_subs as $entry) {
             $this->org_units[] = $entry['id'];
             if (isset($entry['children']) && $entry['children']) {
                 $this->_get_children($entry['children']);
             }
         }
         unset($entry);
         unset($_subs);
     }
     $so_control = CreateObject('controller.socontrol');
     $this->so = CreateObject('controller.socheck_list');
     // Validates year. If year is not set, current year is chosen
     $year = execMethod('controller.uicalendar.validate_year', $year);
     // Gets timestamp of first day in year
     $from_date_ts = execMethod('controller.uicalendar.get_start_date_year_ts', $year);
     // Gets timestamp of first day in next year
     $to_date_ts = execMethod('controller.uicalendar.get_end_date_year_ts', $year);
     $location_filter = $this->get_location_filter();
     foreach ($location_filter as $_location) {
         $location_type_name[$_location['id']] = $_location['name'];
     }
     //			_debug_array($location_type_name);
     $components = array();
     $keep_only_assigned_to = 0;
     //			$lookup_stray_items = false;
     $lookup_stray_items = !!$entity_group_id;
     if ($user_id < 0) {
         $user_id = $user_id * -1;
         $all_items = false;
         $user_only = true;
         //				$keep_only_assigned_to = $user_id;
         //				$assigned_components = $so_control->get_assigned_control_components($from_date_ts, $to_date_ts, $assigned_to = $user_id);
         //				foreach($assigned_components as $_location_id => $component_list)
         //				{
         //					$_components = execMethod('property.soentity.read',array(
         //						'filter_entity_group'		=> $entity_group_id,
         //						'location_id'				=> $_location_id,
         //						'district_id'				=> $district_id,
         //						'allrows'					=> true,
         //						'filter_item'				=> $component_list
         //						)
         //					);
         //					$components = array_merge($components, $_components);
         //				}
     }
     if (!$location_id) {
         //nothing
     } else {
         if ($location_id == -1 && !$entity_group_id) {
             //nothing
         } else {
             if (!$location_id && $entity_group_id) {
                 //still nothing
             } else {
                 $exclude_locations = array();
                 foreach ($location_filter as $_location_filter) {
                     if ($location_id > 0 && $_location_filter['id'] != $location_id) {
                         continue;
                     }
                     $_location_id = (int) $_location_filter['id'];
                     $exclude_locations[] = $_location_id;
                     $_components = execMethod('property.soentity.read', array('filter_entity_group' => $entity_group_id, 'location_id' => $_location_id, 'district_id' => $district_id, 'org_units' => $this->org_units, 'allrows' => true, 'control_registered' => !$all_items, 'check_for_control' => true, 'filter_item' => $filter_component ? array($filter_component) : array()));
                     $components = array_merge($components, $_components);
                 }
                 if ($lookup_stray_items) {
                     $_components = execMethod('property.soentity.read_entity_group', array('entity_group_id' => $entity_group_id, 'exclude_locations' => $exclude_locations, 'location_id' => $_location_id, 'district_id' => $district_id, 'org_units' => $this->org_units, 'allrows' => true, 'control_registered' => !$all_items, 'check_for_control' => true));
                     $components = array_merge($components, $_components);
                 }
             }
         }
     }
     $all_components = array();
     $components_with_calendar_array = array();
     //			_debug_array($components);
     foreach ($components as $_component) {
         $location_id = $_component['location_id'];
         $component_id = $_component['id'];
         $all_components["{$location_id}_{$component_id}"] = $_component;
         $short_description = $_component['short_description'];
         $short_description .= ' [' . $_component['location_name'] . ']';
         if ($all_items && !$_component['has_control']) {
             continue;
         }
         $controls_at_component = $so_control->get_controls_at_component2($_component);
         foreach ($controls_at_component as $component) {
             $_control_relation = $component->get_control_relation();
             if (!$_control_relation['serie_enabled']) {
                 //					continue;
             }
             $control_id = $_control_relation['control_id'];
             $control = $so_control->get_single($control_id);
             $repeat_type = $control->get_repeat_type();
             //FIXME: Not currently supported
             if ($repeat_type <= controller_control::REPEAT_TYPE_WEEK) {
                 $repeat_type = controller_control::REPEAT_TYPE_MONTH;
             }
             // LOCATIONS: Process aggregated values for controls with repeat type day or week
             if ($repeat_type <= controller_control::REPEAT_TYPE_WEEK) {
                 //FIXME: Not currently supported
                 $component->set_xml_short_desc(" {$location_type_name[$location_id]}</br>{$short_description}");
                 $component_with_check_lists = $this->so->get_check_lists_for_control_and_component($control_id, $component->get_location_id(), $component->get_id(), $from_date_ts, $to_date_ts, $repeat_type);
                 $cl_criteria = new controller_check_list();
                 $cl_criteria->set_control_id($control->get_id());
                 $cl_criteria->set_component_id($component->get_id());
                 $cl_criteria->set_location_id($component->get_location_id());
                 $from_month = $this->get_start_month_for_control($control);
                 $to_month = $this->get_end_month_for_control($control);
                 // Loops through controls in controls_for_location_array and populates aggregate open cases pr month array.
                 $agg_open_cases_pr_month_array = $this->build_agg_open_cases_pr_month_array($cl_criteria, $year, $from_month, $to_month);
                 $year_calendar_agg = new year_calendar_agg($control, $year, $location_code, "VIEW_LOCATIONS_FOR_CONTROL");
                 $calendar_array = $year_calendar_agg->build_calendar($agg_open_cases_pr_month_array);
                 $components_with_calendar_array["{$location_id}_{$component_id}"][] = array("component" => $component->toArray(), "calendar_array" => $calendar_array);
             } else {
                 if ($repeat_type > controller_control::REPEAT_TYPE_WEEK) {
                     $component->set_xml_short_desc(" {$location_type_name[$location_id]}</br>{$short_description}");
                     $component_with_check_lists = $this->so->get_check_lists_for_control_and_component($control_id, $component->get_location_id(), $component->get_id(), $from_date_ts, $to_date_ts, $repeat_type);
                     // ,$user_id);
                     $check_lists_array = $component_with_check_lists["check_lists_array"];
                     /*
                      * start override control with data from serie
                      */
                     $control_relation = $component->get_control_relation();
                     if (isset($control_relation['start_date']) && $control_relation['start_date']) {
                         $control->set_start_date($control_relation['start_date']);
                     }
                     if (isset($control_relation['end_date']) && $control_relation['end_date']) {
                         $control->set_end_date($control_relation['end_date']);
                     }
                     if (isset($control_relation['repeat_type']) && $control_relation['repeat_type']) {
                         $control->set_repeat_type($control_relation['repeat_type']);
                     }
                     if (isset($control_relation['repeat_interval']) && $control_relation['repeat_interval']) {
                         $control->set_repeat_interval($control_relation['repeat_interval']);
                     }
                     $year_calendar = new year_calendar($control, $year, $component, null, "component", $control_relation);
                     $calendar_array = $year_calendar->build_calendar($check_lists_array);
                     if ($user_only && $user_id) {
                         $keep_only_assigned_to = $user_id;
                         $found_assigned_to = false;
                         if ($calendar_array) {
                             foreach ($calendar_array as $_month => $_month_info) {
                                 if (isset($_month_info['info']['assigned_to']) && $_month_info['info']['assigned_to'] == $user_id) {
                                     $found_assigned_to = true;
                                     break;
                                 }
                             }
                         }
                         if (!$found_assigned_to) {
                             unset($all_components["{$location_id}_{$component_id}"]);
                             continue;
                         }
                     }
                     $components_with_calendar_array["{$location_id}_{$component_id}"][] = array("component" => $component->toArray(), "calendar_array" => $calendar_array);
                 }
             }
         }
     }
     $total_records = count($all_components);
     //			_debug_array($components_with_calendar_array);
     unset($component_id);
     //			_debug_array($components_with_calendar_array[1]);
     //			_debug_array($components);
     //			_debug_array(array_keys($components_with_calendar_array));
     $repeat_type_array = array("0" => lang('day'), "1" => lang('week'), "2" => lang('month'), "3" => lang('year'));
     $values = array();
     foreach ($components_with_calendar_array as $dummy => $entry) {
         $location_id = $entry[0]['component']['location_id'];
         $component_id = $entry[0]['component']['id'];
         unset($all_components["{$location_id}_{$component_id}"]);
         $data = array();
         $component_link_data = array('menuaction' => 'property.uientity.edit', 'location_id' => $location_id, 'id' => $component_id, 'active_tab' => 'controller');
         $data['component_url'] = '<a href="' . $GLOBALS['phpgw']->link('/index.php', $component_link_data) . "\" target='_blank'>{$component_id}{$entry[0]['component']['xml_short_desc']}</a>";
         $data['component_id'] = $component_id;
         $data['location_id'] = $location_id;
         $max_interval_length = 0;
         //number of months
         $_data = array();
         foreach ($entry as $dataset) {
             $repeat_type = (int) $dataset['component']['control_relation']['repeat_type'];
             $repeat_interval = (int) $dataset['component']['control_relation']['repeat_interval'];
             /*
             						REPEAT_TYPE_DAY = 0;
             						REPEAT_TYPE_WEEK = 1;
             						REPEAT_TYPE_MONTH = 2;
             						REPEAT_TYPE_YEAR = 3;
             */
             switch ($repeat_type) {
                 case controller_control::REPEAT_TYPE_DAY:
                     $interval_length = ceil($repeat_interval / 30);
                     break;
                 case controller_control::REPEAT_TYPE_WEEK:
                     $interval_length = ceil($repeat_interval / 4);
                     break;
                 case controller_control::REPEAT_TYPE_MONTH:
                     $interval_length = $repeat_interval;
                     break;
                 case controller_control::REPEAT_TYPE_YEAR:
                     $interval_length = $repeat_interval * 12;
                     $interval_length = $interval_length > 12 ? 12 : $interval_length;
                     break;
                 default:
                     $interval_length = 0;
                     break;
             }
             $service_time = $dataset['component']['control_relation']['service_time'];
             $controle_time = $dataset['component']['control_relation']['controle_time'];
             if ($interval_length > $max_interval_length) {
                 $max_interval_length = $interval_length;
             }
             foreach ($dataset['calendar_array'] as $month => $calendar) {
                 if ($calendar) {
                     //							$repeat_type = $calendar['info']['repeat_type'] ? (int)$calendar['info']['repeat_type'] : $repeat_type;
                     $calendar['info']['service_time'] = $calendar['info']['service_time'] ? $calendar['info']['service_time'] : $service_time;
                     $calendar['info']['controle_time'] = $calendar['info']['controle_time'] ? $calendar['info']['controle_time'] : $controle_time;
                     $_data[$month][$interval_length] = $calendar;
                     $_data[$month][$interval_length]['repeat_type'] = $repeat_type;
                     $_data[$month][$interval_length]['repeat_interval'] = $repeat_interval;
                 }
             }
         }
         for ($_month = 1; $_month < 13; $_month++) {
             for ($i = $max_interval_length; $i > -1; $i--) {
                 if (isset($_data[$_month][$i])) {
                     $data[$_month] = $_data[$_month][$i];
                     $data[$_month]['repeat_type'] = "{$repeat_type_array[$_data[$_month][$i]['repeat_type']]}/{$_data[$_month][$i]['repeat_interval']}";
                     //FIXME
                     break 1;
                 } else {
                     $data[$_month] = array();
                 }
             }
         }
         $values[] = $data;
     }
     unset($entry);
     unset($component_id);
     unset($component);
     if ($report_type == 'summary') {
         return array('components' => null, 'summary' => $this->get_summary($values, $user_id), 'location_filter' => $location_filter);
     }
     $choose_master = false;
     if ($all_components && count($all_components)) {
         $choose_master = true;
         foreach ($all_components as $dummy => $component) {
             $data = array();
             $location_id = $component['location_id'];
             $component_id = $component['id'];
             $component_link_data = array('menuaction' => 'property.uientity.edit', 'location_id' => $location_id, 'id' => $component_id, 'active_tab' => 'controller');
             $short_description = $component['short_description'];
             $short_description .= "[ {$component['location_name']} ]";
             $data['component_url'] = '<a href="' . $GLOBALS['phpgw']->link('/index.php', $component_link_data) . "\" target='_blank'>{$component_id} {$location_type_name[$location_id]}</br>{$short_description}</a>";
             $data['component_id'] = $component_id;
             $data['location_id'] = $location_id;
             $data['missing_control'] = true;
             $values[] = $data;
         }
     }
     //_debug_array($values);
     $data_set = array();
     $total_time = array();
     foreach ($values as $entry) {
         $row = array();
         $row_sum = array();
         $row_sum_actual = array();
         //billable_hours
         $row['component_url'] = $entry['component_url'];
         $row['year'] = '';
         $row['descr'] = '';
         if (!isset($entry['missing_control'])) {
             if ($filter_component_str) {
                 $row['choose'] = '<input id="selected_component" type="checkbox" name="selected_component" checked = "checked" onclick="deselect_component();">';
             } else {
                 if ($choose_master) {
                     $row['choose'] = "<input id=\"master_component\" type=\"radio\" name=\"master_component\" value = \"{$entry['location_id']}_{$entry['component_id']}\" >";
                 }
             }
             $row['year'] = $year;
             $row['descr'] = "Frekvens<br/>Status<br/>Utførende<br/>Tidsbruk";
         } else {
             if ($choose_master) {
                 $row['choose'] = "<input id=\"selected_components\" class=\"mychecks\" type=\"checkbox\" name=\"selected_components[]\" value = \"{$entry['location_id']}_{$entry['component_id']}\">";
             }
         }
         $found_at_least_one = false;
         for ($_month = 1; $_month < 13; $_month++) {
             $row[$_month] = $this->translate_calendar_info($entry[$_month], $year, $_month, $filter_status, $found_at_least_one, $keep_only_assigned_to);
             if ($row[$_month] && (!$user_id || $entry[$_month]['info']['assigned_to'] == $user_id)) {
                 $row_sum[$_month] = $entry[$_month]['info']['service_time'] + $entry[$_month]['info']['controle_time'];
                 $row_sum_actual[$_month] = +$entry[$_month]['info']['billable_hours'];
             } else {
                 $row_sum[$_month] = 0;
                 $row_sum_actual[$_month] = 0;
             }
         }
         if (!$filter_status || $found_at_least_one) {
             $total_time[] = $row_sum;
             $total_time_actual[] = $row_sum_actual;
             $data_set[] = $row;
         }
     }
     $fields = $this->get_fields($filter_component_str);
     $class = '';
     $tbody = '';
     foreach ($data_set as $row_data) {
         $tbody .= "<tr {$class}>";
         foreach ($fields as $field) {
             $tbody .= '<td>';
             $tbody .= $row_data[$field['key']];
             $tbody .= '</td>';
         }
         $tbody .= '</tr>';
         $class = $class ? '' : 'class="alt"';
     }
     $result = array('tbody' => $tbody);
     unset($_month);
     $sum_year = 0;
     $sum_year_actual = 0;
     if (!$total_time) {
         for ($_month = 1; $_month < 13; $_month++) {
             $result['time_sum'][$_month] = 0;
         }
     } else {
         foreach ($total_time as $_row) {
             for ($_month = 1; $_month < 13; $_month++) {
                 $result['time_sum'][$_month] += $_row[$_month];
                 $sum_year += $_row[$_month];
             }
         }
         unset($_row);
     }
     $result['time_sum'][0] = $sum_year;
     if (!$total_time_actual) {
         for ($_month = 1; $_month < 13; $_month++) {
             $result['time_sum_actual'][$_month] = 0;
         }
     } else {
         foreach ($total_time_actual as $_row) {
             for ($_month = 1; $_month < 13; $_month++) {
                 $result['time_sum_actual'][$_month] += $_row[$_month];
                 $sum_year_actual += $_row[$_month];
             }
         }
     }
     $result['time_sum_actual'][0] = $sum_year_actual;
     $result['total_records'] = $total_records;
     $result['location_filter'] = $location_filter;
     if ($choose_master) {
         $lang_save = lang('add');
         $lang_select = lang('select');
         $result['checkall'] = "<input type=\"button\" value = '{$lang_save}' title = '{$lang_save}' onclick=\"add_from_master('mychecks');\">";
         $result['checkall'] .= '</br>';
         $result['checkall'] .= "<input type=\"checkbox\" title = '{$lang_select}' onclick=\"checkAll('mychecks');\">";
     } else {
         $result['checkall'] = '';
     }
     return array('components' => $result, 'summary' => null, 'location_filter' => $location_filter);
 }
 /**
  * Public function for saving a check list
  * 
  * @param HTTP:: location code, control id, status etc.. (check list details) 
  * @return data array
  */
 function save_check_list()
 {
     $check_list_id = phpgw::get_var('check_list_id');
     if (!$this->add && !$this->edit) {
         phpgwapi_cache::message_set('No access', 'error');
         $this->redirect(array('menuaction' => 'controller.uicheck_list.edit_check_list', 'check_list_id' => $check_list_id));
     }
     $control_id = phpgw::get_var('control_id', 'int');
     $serie_id = phpgw::get_var('serie_id', 'int');
     $status = (int) phpgw::get_var('status');
     $type = phpgw::get_var('type');
     $deadline_date = phpgw::get_var('deadline_date', 'string');
     $planned_date = phpgw::get_var('planned_date', 'string');
     $completed_date = phpgw::get_var('completed_date', 'string');
     $comment = phpgw::get_var('comment', 'string');
     $assigned_to = phpgw::get_var('assigned_to', 'int');
     $billable_hours = phpgw::get_var('billable_hours', 'float');
     $deadline_date_ts = date_converter::date_to_timestamp($deadline_date);
     $error = false;
     if ($planned_date != '') {
         $planned_date_ts = date_converter::date_to_timestamp($planned_date);
     } else {
         $planned_date_ts = $deadline_date_ts;
     }
     if ($completed_date != '') {
         $completed_date_ts = phpgwapi_datetime::date_to_timestamp($completed_date);
         $status = controller_check_list::STATUS_DONE;
     } else {
         $completed_date_ts = 0;
     }
     if ($check_list_id > 0) {
         $check_list = $this->so->get_single($check_list_id);
         if ($status == controller_check_list::STATUS_DONE) {
             if (!$this->_check_for_required($check_list)) {
                 $this->redirect(array('menuaction' => 'controller.uicheck_list.edit_check_list', 'check_list_id' => $check_list_id));
             }
         }
     } else {
         if ($status == controller_check_list::STATUS_DONE) {
             $status = controller_check_list::STATUS_NOT_DONE;
             $completed_date_ts = 0;
             $error_message = "Status kunne ikke settes til utført - prøv igjen";
             $error = true;
             phpgwapi_cache::message_set($error_message, 'error');
         }
         $check_list = new controller_check_list();
         $check_list->set_control_id($control_id);
         $location_code = phpgw::get_var('location_code');
         $check_list->set_location_code($location_code);
         $check_list->set_serie_id($serie_id);
         if ($type == "component") {
             $location_id = phpgw::get_var('location_id');
             $component_id = phpgw::get_var('component_id');
             $check_list->set_location_id($location_id);
             $check_list->set_component_id($component_id);
         }
     }
     $check_list->set_comment($comment);
     $check_list->set_deadline($deadline_date_ts);
     $check_list->set_planned_date($planned_date_ts);
     $check_list->set_completed_date($completed_date_ts);
     $orig_assigned_to = $check_list->get_assigned_to();
     $check_list->set_assigned_to($assigned_to);
     $config = CreateObject('phpgwapi.config', 'controller');
     $config->read();
     $required_actual_hours = isset($config->config_data['required_actual_hours']) && $config->config_data['required_actual_hours'] ? $config->config_data['required_actual_hours'] : false;
     if ($status == controller_check_list::STATUS_DONE && $required_actual_hours && $check_list->get_billable_hours() == 0 && !$billable_hours) {
         phpgwapi_cache::message_set(lang("Please enter billable hours"), 'error');
         $error = true;
     } else {
         $check_list->set_delta_billable_hours($billable_hours);
     }
     if ($status == controller_check_list::STATUS_DONE && $this->_check_for_required($check_list) && !$error) {
         $check_list->set_status($status);
     } else {
         if ($status == controller_check_list::STATUS_CANCELED && !$error) {
             $check_list->set_status($status);
         }
     }
     if (!$error && $check_list->validate()) {
         $check_list_id = $this->so->store($check_list);
         $serie = $this->so_control->get_serie($check_list->get_serie_id());
         /**
          * Add an iCal-event if there is a serie - and the checklist is visited the first time - or assigned is changed
          */
         if (phpgw::get_var('request_ical_event', 'bool') && $check_list_id && $serie) {
             $bocommon = CreateObject('property.bocommon');
             $current_prefs_user = $bocommon->create_preferences('property', $GLOBALS['phpgw_info']['user']['account_id']);
             $from_address = "{$GLOBALS['phpgw_info']['user']['fullname']}<{$current_prefs_user['email']}>";
             $from_name = $GLOBALS['phpgw_info']['user']['fullname'];
             $to_name = $GLOBALS['phpgw']->accounts->id2name($assigned_to);
             $prefs_target = $bocommon->create_preferences('property', $assigned_to);
             $to_address = $prefs_target['email'];
             if (!($start_date = $check_list->get_planned_date())) {
                 $start_date = $check_list->get_deadline();
             }
             $startTime = $start_date + 8 * 3600;
             $endTime = $startTime + (double) $serie['service_time'] * 3600 + (double) $serie['controle_time'] * 3600;
             if ($check_list->get_component_id() > 0) {
                 $component_arr = execMethod('property.soentity.read_single_eav', array('location_id' => $check_list->get_location_id(), 'id' => $check_list->get_component_id()));
                 $location_name = execMethod('property.bolocation.get_location_name', $component_arr['location_code']);
                 $short_desc = $location_name . '::' . execMethod('property.soentity.get_short_description', array('location_id' => $check_list->get_location_id(), 'id' => $check_list->get_component_id()));
                 $location = $location_name;
             }
             $repeat_type_array = array("0" => lang('day'), "1" => lang('week'), "2" => lang('month'), "3" => lang('year'));
             $subject = "{$repeat_type_array[$serie['repeat_type']]}/{$serie['repeat_interval']}";
             $subject .= "::{$serie['title']}::{$short_desc}";
             $link_backend = $GLOBALS['phpgw']->link('/index.php', array('menuaction' => 'controller.uicheck_list.add_check_list', 'control_id' => $check_list->get_control_id(), 'location_id' => $check_list->get_location_id(), 'component_id' => $check_list->get_component_id(), 'serie_id' => $check_list->get_serie_id(), 'type' => 'component', 'assigned_to' => $check_list->get_assigned_to(), 'deadline_current' => true), false, true, true);
             $link_mobilefrontend = $GLOBALS['phpgw']->link('/mobilefrontend/index.php', array('menuaction' => 'controller.uicheck_list.add_check_list', 'control_id' => $check_list->get_control_id(), 'location_id' => $check_list->get_location_id(), 'component_id' => $check_list->get_component_id(), 'serie_id' => $check_list->get_serie_id(), 'type' => 'component', 'assigned_to' => $check_list->get_assigned_to(), 'deadline_current' => true), false, true, true);
             $html_description = "<a href ='{$link_mobilefrontend}'>Serie#" . $check_list->get_serie_id() . '::Mobilefrontend</a><br/><br/>';
             $html_description .= "<a href ='{$link_backend}'>Serie#" . $check_list->get_serie_id() . '::Backend</a>';
             $_serie_id = $check_list->get_serie_id();
             $text_description = str_replace('&amp;', '&', "Serie#{$_serie_id}::Mobilefrontend:\\n{$link_mobilefrontend}\\n\\nSerie#{$_serie_id}::Backend:\\n{$link_backend}");
             if ($from_address && $to_address) {
                 $this->sendIcalEvent($from_name, $from_address, $to_name, $to_address, $startTime, $endTime, $subject, $html_description, $text_description, $location);
             } else {
                 phpgwapi_cache::message_set("Mangler epostadresse til avsender eller addresat - eller begge", 'error');
             }
         }
         if ($check_list_id > 0) {
             $this->redirect(array('menuaction' => 'controller.uicheck_list.edit_check_list', 'check_list_id' => $check_list_id));
         } else {
             $this->edit_check_list($check_list);
         }
     } else {
         if ($check_list->get_id() > 0) {
             $this->edit_check_list($check_list);
         } else {
             $this->redirect(array('menuaction' => 'controller.uicheck_list.add_check_list', 'control_id' => $control_id, 'location_id' => $location_id, 'component_id' => $component_id, 'serie_id' => $serie_id, 'deadline_ts' => $deadline_date_ts, 'type' => $type, 'assigned_to' => $assigned_to, 'status' => $status));
         }
     }
 }
 public function view_calendar_year_for_locations()
 {
     static $_location_name = array();
     $control_id = phpgw::get_var('control_id', 'int');
     $control = $this->so_control->get_single($control_id);
     $year = phpgw::get_var('year', 'int');
     $location_id = phpgw::get_var('location_id', 'int');
     $component_id = phpgw::get_var('component_id', 'int');
     $serie_id = phpgw::get_var('serie_id', 'int');
     $user_id = $GLOBALS['phpgw_info']['user']['account_id'];
     $bookmarks = phpgwapi_cache::user_get('controller', "location_bookmark", $user_id);
     if (is_array($bookmarks)) {
         $bookmark_locations = array_keys($bookmarks);
     }
     if ($location_code = phpgw::get_var('location_code')) {
         $bookmark_locations[] = $location_code;
     }
     $locations_list = array();
     if (is_numeric($control_id) & $control_id > 0) {
         $locations_for_control_array = $this->so_control->get_locations_for_control($control_id);
         $components_for_control_array = $this->so_control->get_components_for_control($control_id, $location_id, $component_id, $serie_id);
         foreach ($locations_for_control_array as $location) {
             $locations_list[] = array('id' => $location['location_code'], 'name' => $location['loc_name'], 'selected' => $location_code == $location['location_code'] ? 1 : 0);
         }
         reset($locations_for_control_array);
         unset($location);
     }
     // Validates year. If year is not set, current year is chosen
     $year = $this->validate_year($year);
     // Gets timestamp of first day in year
     $from_date_ts = $this->get_start_date_year_ts($year);
     // Gets timestamp of first day in next year
     $to_date_ts = $this->get_end_date_year_ts($year);
     $locations_with_calendar_array = array();
     // LOCATIONS: Process aggregated values for controls with repeat type day or week
     if ($control->get_repeat_type() <= controller_control::REPEAT_TYPE_WEEK) {
         foreach ($locations_for_control_array as $location) {
             $curr_location_code = $location['location_code'];
             if (!$bookmark_locations || !in_array($curr_location_code, $bookmark_locations)) {
                 continue;
             }
             $cl_criteria = new controller_check_list();
             $cl_criteria->set_control_id($control->get_id());
             $cl_criteria->set_location_code($curr_location_code);
             $from_month = $this->get_start_month_for_control($control);
             $to_month = $this->get_end_month_for_control($control);
             // Loops through controls in controls_for_location_array and populates aggregate open cases pr month array.
             $agg_open_cases_pr_month_array = $this->build_agg_open_cases_pr_month_array($cl_criteria, $year, $from_month, $to_month);
             $year_calendar_agg = new year_calendar_agg($control, $year, $curr_location_code, "VIEW_LOCATIONS_FOR_CONTROL");
             $calendar_array = $year_calendar_agg->build_calendar($agg_open_cases_pr_month_array);
             $locations_with_calendar_array[] = array('location' => $location, 'calendar_array' => $calendar_array, 'selected' => $bookmarks && isset($bookmarks[$curr_location_code]));
         }
         // COMPONENTS: Process aggregated values for controls with repeat type day or week
         foreach ($components_for_control_array as $component) {
             $short_desc_arr = execMethod('property.soentity.get_short_description', array('location_id' => $component->get_location_id(), 'id' => $component->get_id()));
             if (!isset($_location_name[$component->get_location_code()])) {
                 $_location = execMethod('property.solocation.read_single', $component->get_location_code());
                 $location_arr = explode('-', $component->get_location_code());
                 $i = 1;
                 $name_arr = array();
                 foreach ($location_arr as $_dummy) {
                     $name_arr[] = $_location["loc{$i}_name"];
                     $i++;
                 }
                 $_location_name[$component->get_location_code()] = implode('::', $name_arr);
             }
             $short_desc_arr .= ' [' . $_location_name[$component->get_location_code()] . ']';
             $component->set_xml_short_desc($short_desc_arr);
             $repeat_type = $control->get_repeat_type();
             $component_with_check_lists = $this->so->get_check_lists_for_control_and_component($control_id, $component->get_location_id(), $component->get_id(), $from_date_ts, $to_date_ts, $repeat_type);
             $cl_criteria = new controller_check_list();
             $cl_criteria->set_control_id($control->get_id());
             $cl_criteria->set_component_id($component->get_id());
             $cl_criteria->set_location_id($component->get_location_id());
             $from_month = $this->get_start_month_for_control($control);
             $to_month = $this->get_end_month_for_control($control);
             // Loops through controls in controls_for_location_array and populates aggregate open cases pr month array.
             $agg_open_cases_pr_month_array = $this->build_agg_open_cases_pr_month_array($cl_criteria, $year, $from_month, $to_month);
             $year_calendar_agg = new year_calendar_agg($control, $year, $location_code, "VIEW_LOCATIONS_FOR_CONTROL");
             $calendar_array = $year_calendar_agg->build_calendar($agg_open_cases_pr_month_array);
             $components_with_calendar_array[] = array("component" => $component->toArray(), "calendar_array" => $calendar_array);
         }
     } else {
         if ($control->get_repeat_type() > controller_control::REPEAT_TYPE_WEEK) {
             foreach ($locations_for_control_array as $location) {
                 $curr_location_code = $location['location_code'];
                 if (!$bookmark_locations || !in_array($curr_location_code, $bookmark_locations)) {
                     continue;
                 }
                 $repeat_type = $control->get_repeat_type();
                 $check_lists_array = $this->so->get_check_lists_for_control_and_location($control_id, $curr_location_code, $from_date_ts, $to_date_ts, $repeat_type);
                 $year_calendar = new year_calendar($control, $year, null, $curr_location_code, "location");
                 $calendar_array = $year_calendar->build_calendar($check_lists_array);
                 $locations_with_calendar_array[] = array('location' => $location, 'calendar_array' => $calendar_array, 'selected' => $bookmarks && isset($bookmarks[$curr_location_code]));
             }
             foreach ($components_for_control_array as $component) {
                 $short_desc_arr = execMethod('property.soentity.get_short_description', array('location_id' => $component->get_location_id(), 'id' => $component->get_id()));
                 //FIXME - make generic
                 /* => */
                 if (!isset($_location_name[$component->get_location_code()])) {
                     $_location = execMethod('property.solocation.read_single', $component->get_location_code());
                     $location_arr = explode('-', $component->get_location_code());
                     $i = 1;
                     $name_arr = array();
                     foreach ($location_arr as $_dummy) {
                         $name_arr[] = $_location["loc{$i}_name"];
                         $i++;
                     }
                     $_location_name[$component->get_location_code()] = implode('::', $name_arr);
                 }
                 $short_desc_arr .= ' [' . $_location_name[$component->get_location_code()] . ']';
                 /* <= */
                 $component->set_xml_short_desc($short_desc_arr);
                 $repeat_type = $control->get_repeat_type();
                 $component_with_check_lists = $this->so->get_check_lists_for_control_and_component($control_id, $component->get_location_id(), $component->get_id(), $from_date_ts, $to_date_ts, $repeat_type);
                 $check_lists_array = $component_with_check_lists["check_lists_array"];
                 /*
                  * start override control with data from serie
                  */
                 $control_relation = $component->get_control_relation();
                 if (isset($control_relation['start_date']) && $control_relation['start_date']) {
                     $control->set_start_date($control_relation['start_date']);
                 }
                 if (isset($control_relation['end_date']) && $control_relation['end_date']) {
                     $control->set_end_date($control_relation['end_date']);
                 }
                 if (isset($control_relation['repeat_type']) && $control_relation['repeat_type']) {
                     $control->set_repeat_type($control_relation['repeat_type']);
                 }
                 if (isset($control_relation['repeat_interval']) && $control_relation['repeat_interval']) {
                     $control->set_repeat_interval($control_relation['repeat_interval']);
                 }
                 /*
                  * End override control with data from serie
                  */
                 $year_calendar = new year_calendar($control, $year, $component, null, "component");
                 $calendar_array = $year_calendar->build_calendar($check_lists_array);
                 $components_with_calendar_array[] = array("component" => $component->toArray(), "calendar_array" => $calendar_array);
             }
         }
     }
     // Gets array of locations assigned to current user
     $my_locations = $this->get_my_assigned_locations($location_code);
     $heading_array = year_calendar::get_heading_array();
     $data = array('locations_list' => $locations_list, 'my_locations' => $my_locations, 'control' => $control->toArray(), 'heading_array' => $heading_array, 'locations_with_calendar_array' => $locations_with_calendar_array, 'components_with_calendar_array' => $components_with_calendar_array, 'current_year' => $year, 'location_code' => $location_code, 'serie_id' => $serie_id);
     self::render_template_xsl(array('calendar/view_calendar_year_for_locations', 'calendar/check_list_status_manager', 'calendar/icon_color_map', 'calendar/select_my_locations', 'calendar/nav_calendar_year'), $data);
     phpgwapi_jquery::load_widget('core');
     self::add_javascript('controller', 'controller', 'ajax.js');
 }
 /**
  * Get array with check lists for a control on a component within time period and for a specified repeat type
  *
  * @param $control_id control id
  * @param $location_code location code
  * @param $from_date_ts start time period
  * @param $to_date_ts end time period
  * @param $repeat_type_expr repeat type expression
  * @return array with check list objects
  */
 function get_check_lists_for_control_and_component($control_id, $location_id, $component_id, $from_date_ts, $to_date_ts, $repeat_type = null, $user_id = 0)
 {
     $control_id = (int) $control_id;
     $location_id = (int) $location_id;
     $component_id = (int) $component_id;
     $user_id = (int) $user_id;
     $sql = "SELECT cl.id as cl_id, cl.status as cl_status, cl.comment as cl_comment, deadline, planned_date, completed_date, cl.assigned_to, ";
     $sql .= "cl.component_id as cl_component_id, cl.location_id as cl_location_id," . " cl.location_code as cl_location_code, num_open_cases, num_pending_cases ,cl.serie_id, cl.billable_hours, cs.repeat_type ";
     $sql .= "FROM controller_check_list cl ";
     $sql .= "LEFT JOIN controller_control c on cl.control_id = c.id ";
     $sql .= "LEFT JOIN controller_control_serie cs on cl.serie_id = cs.id ";
     $sql .= "WHERE cl.control_id = {$control_id} ";
     $sql .= "AND cl.component_id = {$component_id} ";
     $sql .= "AND cl.location_id = {$location_id} ";
     if ($repeat_type != null) {
         $sql .= "AND c.repeat_type = {$repeat_type} ";
     }
     //		if($user_id)
     //		{
     //			$sql .= " AND assigned_to = {$user_id} ";
     //		}
     $sql .= "AND deadline BETWEEN {$from_date_ts} AND {$to_date_ts} ";
     //		_debug_array($sql);
     $this->db->query($sql);
     $check_lists_array = array();
     while ($this->db->next_record()) {
         $check_list = new controller_check_list($this->unmarshal($this->db->f('cl_id'), 'int'));
         $check_list->set_status($this->unmarshal($this->db->f('cl_status'), 'int'));
         $check_list->set_comment($this->unmarshal($this->db->f('cl_comment', true), 'string'));
         $check_list->set_deadline($this->unmarshal($this->db->f('deadline'), 'int'));
         $check_list->set_planned_date($this->unmarshal($this->db->f('planned_date'), 'int'));
         $check_list->set_completed_date($this->unmarshal($this->db->f('completed_date'), 'int'));
         $check_list->set_component_id($this->unmarshal($this->db->f('cl_component_id'), 'int'));
         $check_list->set_location_id($this->unmarshal($this->db->f('cl_location_id'), 'int'));
         $check_list->set_location_code($this->unmarshal($this->db->f('cl_location_code', true), 'string'));
         $check_list->set_num_open_cases($this->unmarshal($this->db->f('num_open_cases'), 'int'));
         $check_list->set_num_pending_cases($this->unmarshal($this->db->f('num_pending_cases'), 'int'));
         $check_list->set_assigned_to($this->unmarshal($this->db->f('assigned_to'), 'int'));
         $check_list->set_serie_id($this->db->f('serie_id'));
         $check_list->set_repeat_type($this->db->f('repeat_type'));
         $check_list->set_billable_hours((double) $this->db->f('billable_hours'));
         $check_lists_array[] = $check_list;
     }
     return array("location_code" => $location_code, "check_lists_array" => $check_lists_array);
 }
 /**
  * Get components and populates array of controls that should be carried out on the components on a location within period
  *
  * @param $location_code the locaction code for the location the control should be carried out for   
  * @param $from_date start date for period
  * @param $to_date end date for period
  * @param $repeat_type Dag, Uke, Måned, År 
  * @param $return_type return data as objects or as arrays
  * @param $role_id responsible role for carrying out the control  
  * @return array of components as objects or arrays
  */
 public function get_assigned_check_list_by_component($from_date, $to_date, $repeat_type, $user_id, $completed = null, $return_type = "return_object")
 {
     $repeat_type = $repeat_type;
     $user_id = (int) $user_id;
     $sql = "SELECT DISTINCT controller_check_list.location_code, controller_check_list.control_id, controller_check_list.id AS check_list_id," . " controller_control.description, controller_control.start_date, end_date, deadline,planned_date, completed_date," . " control_area_id,controller_check_list.location_id,title,controller_check_list.component_id" . " FROM controller_check_list" . " {$this->join} controller_control ON controller_check_list.control_id = controller_control.id" . " {$this->join} controller_control_component_list " . " ON (controller_control_component_list.control_id = controller_check_list.control_id" . " AND controller_control_component_list.location_id = controller_check_list.location_id" . " AND controller_control_component_list.component_id = controller_check_list.component_id)" . " WHERE controller_check_list.assigned_to = {$user_id} AND status = 0";
     if ($repeat_type) {
         //				$sql .= "AND controller_control.repeat_type = $repeat_type ";
     }
     //FIXME
     if ($completed) {
         $sql .= " AND ( planned_date < {$to_date} AND controller_check_list.completed_date IS NULL) ";
         //				$sql .= " AND ((deadline <= $to_date AND controller_control.end_date IS NULL) ";
         //				$sql .= " OR (deadline <= $to_date AND deadline > $from_date ))";
         //				$sql .= " AND controller_check_list.completed_date IS NULL ";
     } else {
         $sql .= " AND (planned_date > {$from_date} AND planned_date <= {$to_date} AND controller_control.end_date IS NULL) ";
     }
     $this->db->query($sql);
     $check_list_array = array();
     while ($this->db->next_record()) {
         $check_list = new controller_check_list($this->unmarshal($this->db->f('check_list_id'), 'int'));
         $check_list->set_control_id($this->unmarshal($this->db->f('control_id'), 'int'));
         $check_list->set_location_id($this->unmarshal($this->db->f('location_id'), 'int'));
         $check_list->set_component_id($this->unmarshal($this->db->f('component_id'), 'int'));
         $check_list->set_title($this->unmarshal($this->db->f('title', true), 'string'));
         $check_list->set_description($this->unmarshal($this->db->f('description', true), 'string'));
         $check_list->set_start_date($this->unmarshal($this->db->f('start_date'), 'int'));
         $check_list->set_end_date($this->unmarshal($this->db->f('end_date'), 'int'));
         $check_list->set_deadline($this->unmarshal($this->db->f('deadline'), 'int'));
         $check_list->set_control_area_id($this->unmarshal($this->db->f('control_area_id'), 'int'));
         $check_list->set_assigned_to($this->unmarshal($user_id, 'int'));
         $check_list->set_planned_date($this->unmarshal($this->db->f('planned_date'), 'int'));
         $check_list->set_completed_date($this->unmarshal($this->db->f('completed_date'), 'int'));
         $check_list->set_location_code($this->unmarshal($this->db->f('location_code', true), 'string'));
         if ($return_type == "return_object") {
             $check_list_array[] = $check_list;
         } else {
             $check_list_array[] = $check_list->toArray();
         }
     }
     return $check_list_array;
 }