public function query()
 {
     // YUI variables for paging and sorting
     $start_index = phpgw::get_var('startIndex', 'int');
     $num_of_objects = phpgw::get_var('results', 'int', 'GET', 10);
     $sort_field = phpgw::get_var('sort');
     $sort_ascending = phpgw::get_var('dir') == 'desc' ? false : true;
     // Form variables
     $search_for = phpgw::get_var('query');
     $search_type = phpgw::get_var('search_option');
     // Create an empty result set
     $result_objects = array();
     $result_count = 0;
     // TODO: access control
     $composite_id = phpgw::get_var('composite_id');
     $filters = array('composite_id' => $composite_id);
     $result_objects = rental_sounit::get_instance()->get($start_index, $num_of_objects, $sort_field, $sort_ascending, $search_for, $search_type, $filters);
     $result_count = rental_sounit::get_instance()->get_count($search_for, $search_type, $filters);
     $editable = phpgw::get_var('editable') == 'true' ? true : false;
     //Serialize the documents found
     $rows = array();
     foreach ($result_objects as $result) {
         if (isset($result)) {
             if ($result->has_permission(PHPGW_ACL_READ)) {
                 $rows[] = $result->serialize();
             }
         }
     }
     //Add context menu columns (actions and labels)
     array_walk($rows, array($this, 'add_actions'), array($composite_id, $editable));
     //Build a YUI result from the data
     //
     $result_data = array('results' => $rows, 'total_records' => count($rows));
     return $this->yui_results($result_data, 'total_records', 'results');
 }
 /**
  * Get a static reference to the storage object associated with this model object
  * 
  * @return the storage object
  */
 public static function get_instance()
 {
     if (self::$so == null) {
         self::$so = CreateObject('rental.sounit');
     }
     return self::$so;
 }
 protected function import_composites()
 {
     $start_time = time();
     // Storage objects
     $socomposite = rental_socomposite::get_instance();
     $socontract = rental_socontract::get_instance();
     $sounit = rental_sounit::get_instance();
     // Array for mapping the composite ids to the facilit ids
     $composites = array();
     //Read source data
     $datalines = $this->getcsvdata($this->path . "/u_Leieobjekt.csv");
     $this->messages[] = "Read 'u_Leieobjekt.csv' file in " . (time() - $start_time) . " seconds";
     $this->messages[] = "'u_Leieobjekt.csv' contained " . count($datalines) . " lines";
     foreach ($datalines as $data) {
         if (count($data) <= 34) {
             continue;
         }
         //If the composite differs in terms of object number the custom address should be set (default false)
         $set_custom_address = false;
         //Retrieve the title for the responsibility area we are importing (to hande the respoonsibility areas differently)
         $title = $socontract->get_responsibility_title($this->location_id);
         // Variable for the location code (objektnummer)
         $loc1 = null;
         //Three columns for detemining the correct object number
         $object_identifier = trim($this->decode($data[1]));
         //cLeieobjektnr
         $property_identifier = trim($this->decode($data[4]));
         //cInstNr
         $building_identifier = trim($this->decode($data[5]));
         //cByggNr
         if ($title == 'contract_type_internleie') {
             $property_ok = false;
             //Priority 1: The property identifier (most up to date)
             if (isset($property_identifier)) {
                 $correct_length_property = strlen($property_identifier) == 4 ? true : false;
                 $integer_value_property = (int) $property_identifier > 0 ? true : false;
                 if ($correct_length_property && $integer_value_property) {
                     $loc1 = $property_identifier;
                     $property_ok = true;
                 }
             }
             //Priority 2: Use the object identifier
             if (isset($object_identifier)) {
                 $correct_length = strlen($object_identifier) == 6 ? true : false;
                 $integer_value = (int) $object_identifier > 0 ? true : false;
                 if ($correct_length && $integer_value) {
                     if ($property_ok) {
                         // ... add only the building number if the property number is ok
                         $loc1 = $loc1 . "-" . substr($object_identifier, 4, 2);
                     } else {
                         // ... just use the object identifier if not
                         $loc1 = substr_replace($object_identifier, "-", 4, 0);
                     }
                 } else {
                     // Using non-conforming object identifier. Gives a warning.
                     $loc1 = $object_identifier;
                     $set_custom_address = true;
                     $this->warnings[] = "Composite (internal contract) has wrong object-number ({$loc1}). Should consist of 6 numbers. Setting custom address.";
                 }
             } else {
                 if ($property_ok) {
                     //If no object number, only property number
                     $set_custom_address = true;
                     $this->warnings[] = "Composite (internal contract) has no object-number ({$object_identifier}). Using property identifier. Setting custom address.";
                 }
             }
             if (!isset($loc1)) {
                 // No data exist to determine the object number
                 $this->warnings[] = "No data exist to determine the object number. Setting custom address.";
                 $set_custom_address = true;
             }
         } else {
             if ($title == 'contract_type_eksternleie') {
                 // Two forms for object number (xxxx.xxxx) AND (xxxx.xxxxxx.xxxx)
                 $parts = explode('.', $object_identifier);
                 for ($i = 0; $i < count($parts); $i++) {
                     $parts[$i] = trim($parts[$i]);
                 }
                 if (count($parts) == 2) {
                     //Checking parts for correct length
                     $correct_length1 = strlen($parts[0]) == 4 ? true : false;
                     $correct_length2 = strlen($parts[1]) == 4 ? true : false;
                     if ($correct_length1 && $correct_length2) {
                         //If the first part contains any characters from the alphabet
                         if (!is_numeric($parts[0])) {
                             // ... relace the punctuation with an '-'
                             $loc1 = $parts[0] . "-" . $parts[1];
                         }
                     }
                 } else {
                     if (count($parts) == 3) {
                         $correct_length = strlen($parts[1]) == 6 ? true : false;
                         $correct_length_property = strlen($property_identifier) == 4 ? true : false;
                         if ($correct_length && is_numeric($parts[1])) {
                             if (isset($property_identifier) && $correct_length_property) {
                                 // ... add only the building number if the property number is ok
                                 $loc1 = $property_identifier . "-" . substr($parts[1], 4, 2);
                             } else {
                                 // ... insert a '-' at position 4 if not
                                 $loc1 = substr_replace($parts[1], "-", 4, 0);
                             }
                         }
                     }
                 }
                 // If the object identifier is non-conforming
                 // Alernative 1: Try to use the buiding identifier
                 if (!isset($loc1) && isset($building_identifier)) {
                     $correct_length = strlen($building_identifier) == 6 ? true : false;
                     if ($correct_length && is_numeric($building_identifier)) {
                         $loc1 = substr_replace($building_identifier, "-", 4, 0);
                         $set_custom_address = true;
                         $this->warnings[] = "Composite (external) lacks conforming object number ({$object_identifier}). Using building identifier ({$loc1}). Setting custom address.";
                     }
                 }
                 // Alternative 2: Try to use the property identifier
                 if (!isset($loc1) && isset($property_identifier)) {
                     $correct_length = strlen($property_identifier) == 4 ? true : false;
                     if ($correct_length) {
                         //Give a warning
                         $loc1 = $property_identifier;
                         $set_custom_address = true;
                         $this->warnings[] = "Composite (external) lacks conforming object number ({$object_identifier}). Using property identifier ({$loc1}). Setting custom address.";
                     }
                 }
                 // Alternative 3: Use the non-conforming object number
                 if (!isset($loc1)) {
                     $loc1 = $object_identifier;
                     $set_custom_address = true;
                     $this->warnings[] = "Composite (external) lacks data to create an object number. Using non-conforming object number ({$loc1}) Setting custom address.";
                 }
             } else {
                 if ($title == 'contract_type_innleie') {
                     $correct_length = strlen($building_identifier) == 6 ? true : false;
                     $integer_value = (int) $building_identifier > 0 ? true : false;
                     $correct_length_property = strlen($property_identifier) == 4 ? true : false;
                     if ($correct_length && $integer_value) {
                         if (isset($property_identifier) && $correct_length_property) {
                             // ... add only the building number if the property number is ok
                             $loc1 = $property_identifier . "-" . substr($building_identifier, 4, 2);
                         } else {
                             $loc1 = substr_replace($building_identifier, "-", 4, 0);
                         }
                     } else {
                         if (isset($property_identifier) && $correct_length_property) {
                             // ... add only the building number if the property number is ok
                             $loc1 = $property_identifier;
                             $set_custom_address = true;
                             $this->warnings[] = "Composite (innleie) has non-conforming building identifier ({$building_identifier}). Using property identifier instead ({$loc1}). Setting custom address.";
                         }
                     }
                     if (!isset($loc1)) {
                         $loc1 = $object_identifier;
                         $set_custom_address = true;
                         $this->warnings[] = "Composite (innleie) lacks building identifier/property identifier ({$building_identifier}/{$property_identifier}). Using object identifier instead ({$loc1}). Setting custom address.";
                     }
                 } else {
                     $this->errors[] = "The type of import ({$title}) is invalid";
                 }
             }
         }
         $composite = new rental_composite();
         // Use the first address line as name if no name
         $name = $this->decode($data[26]);
         //cLeieobjektnavn
         $address1 = $this->decode($data[6]);
         //cAdresse1
         if (!isset($name)) {
             $name = $address1;
         }
         if ($set_custom_address) {
             // Set address
             $composite->set_custom_address_1($address1);
             $composite->set_custom_address_2($this->decode($data[7]));
             $composite->set_custom_postcode($this->decode($data[8]));
             $composite->set_has_custom_address(true);
         }
         $composite->set_name($name);
         $composite->set_description($this->decode($data[3]));
         //cLeieobjektBeskrivelse
         $composite->set_object_type_id($this->decode($data[25]));
         //nLeieobjektTypeId
         $composite->set_area($this->decode($data[2]));
         //nMengde
         $composite->set_is_active($data[19] == "-1");
         //bTilgjengelig
         // Store composite
         if ($socomposite->store($composite)) {
             // Add composite to collection of composite so we can refer to it later.
             $composites[$data[0]] = $composite->get_id();
             // Add units only if composite stored ok.
             $res = $sounit->store(new rental_unit(null, $composite->get_id(), new rental_property_location($loc1, null)));
             $this->messages[] = "Successfully added composite " . $composite->get_name() . " (" . $composite->get_id() . ")";
             if ($res) {
                 $this->messages[] = "Successfully added unit " . $loc1 . " to composite (" . $composite->get_id() . ")";
             }
         } else {
             $this->errors[] = "Failed to store composite " . $composite->get_name();
         }
     }
     $this->messages[] = "Successfully imported " . count($composites) . " composites (" . (time() - $start_time) . " seconds)";
     return $composites;
 }
 /**
  * Public method. Called when user wants to remove a unit to a composite
  * @param HTTP::id	the composite ID
  * @param HTTP::location_id
  */
 function remove_unit()
 {
     if (!($this->isExecutiveOfficer() || $this->isAdministrator())) {
         $this->render('permission_denied.php', array('message' => lang('permission_denied')));
         return;
     }
     $unit_id = (int) phpgw::get_var('id');
     if (isset($unit_id) && $unit_id > 0) {
         rental_sounit::get_instance()->delete($unit_id);
     }
 }