diff --git a/application/AddressDB/AddressDBController.php b/application/AddressDB/AddressDBController.php index f8dbf9400..e269a9517 100644 --- a/application/AddressDB/AddressDBController.php +++ b/application/AddressDB/AddressDBController.php @@ -76,10 +76,10 @@ class AddressDBController extends mfBaseController { $ort_search = $strasse_search = $plz_search = $hausnummer_search = []; foreach($search_parts as $p) { - $p = trim($p); + $p = $this->db->escape(trim($p)); if(!$p) continue; - $ort_search[] = "ortschaft like '%$p%'"; - $strasse_search[] = "strasse like '%$p%'"; + $ort_search[] = "ortschaft like '$p%'"; + $strasse_search[] = "strasse like '$p%'"; $plz_search[] = "plz like '%$p%'"; $hausnummer_search[] = "hausnummer like '%$p%'"; } @@ -89,7 +89,7 @@ class AddressDBController extends mfBaseController { $where .= " AND netzgebiet_id IN (".implode(', ',$scluster_ids).")"; } - $sql = "SELECT * FROM view_hausnummer WHERE $where AND ((".implode(" OR ", $ort_search).") OR (".implode(" OR ", $strasse_search).") OR (".implode(" OR ", $plz_search).") OR (".implode(" OR ", $hausnummer_search)."))"; + $sql = "SELECT * FROM view_hausnummer WHERE $where AND ((".implode(" OR ", $ort_search).") OR (".implode(" OR ", $strasse_search).") OR (".implode(" OR ", $plz_search).") OR (".implode(" OR ", $hausnummer_search).")) ORDER BY strasse, LENGTH(hausnummer), hausnummer"; $this->log->debug($sql); $adb = FronkDB::singleton(ADDRESSDB_DBHOST, ADDRESSDB_DBUSER, ADDRESSDB_DBPASS, ADDRESSDB_DBNAME); @@ -104,22 +104,39 @@ class AddressDBController extends mfBaseController { while($data = $adb->fetch_object($res)) { $address_string = $data->plz." ".$data->ortschaft.", ".$data->strasse." ".$data->hausnummer; + $sort_key = $data->plz." ".$data->ortschaft." ".$data->strasse; $address = []; $address['id'] = $data->hausnummer_id; $address["text"] = $address_string; + $address['sort_key'] = $sort_key; $addresses[] = $address; } // sort results by most occurences of search strings $sort = []; - foreach($addresses as $address) { + foreach($addresses as $key => $address) { + $includes_int = false; $count = 0; foreach($search_parts as $p) { - $count += substr_count(strtolower($address['text']), strtolower($p)); + $p = $this->db->escape(trim($p)); + if(!$p) continue; + if(is_numeric(($p))) { + $includes_int = true; + if(substr_count(strtolower($address['text']), strtolower($p))) { + $count++; + } + } else { + $count += substr_count(strtolower($address['text']), strtolower($p)); + } } + unset($address['sort_key']); //echo $address['text']." $p $count
\n"; + + if($includes_int && (($count + 1) - count($search_parts) ) < 1) { + continue; + } if(!array_key_exists($count, $sort)) { $sort[$count] = []; } diff --git a/application/Api/v1/AddressdbApicontroller.php b/application/Api/v1/AddressdbApicontroller.php index f734a790e..baf21acc9 100644 --- a/application/Api/v1/AddressdbApicontroller.php +++ b/application/Api/v1/AddressdbApicontroller.php @@ -13,6 +13,8 @@ class AddressdbApicontroller extends mfBaseApicontroller { $this->addRoute("/addressdb/findAddress", "find", "GET"); $this->addRoute("/addressdb/findAddress", "find", "POST"); + $this->addRoute("/addressdb/searchAddress", "search", "GET"); + $this->addRoute("/addressdb/searchAddress", "search", "POST"); $this->addRoute("/addressdb/findStreet", "findStreet", "GET"); $this->addRoute("/addressdb/findStreet", "findStreet", "POST"); $this->addRoute("/addressdb/findZip", "findZip", "GET"); @@ -288,6 +290,191 @@ class AddressdbApicontroller extends mfBaseApicontroller { return mfResponse::Ok(['streets' => array_values($streets)]); } + protected function search() { + $get = array_merge($this->post, $this->get); + + $search = $this->db()->escape(trim($get['search'])); + + $format = "flat"; + if($get['format'] == "tree") { + $format = "tree"; + } + + if(!$search) { + return mfResponse::BadRequest(['message' => "Search string cannot be empty"]); + } + if($search == "%") { + return mfResponse::BadRequest(['message' => "Search string cannot be empty"]); + } + + $search_parts = explode(" ", $search); + $ort_search = $strasse_search = $plz_search = $hausnummer_search = []; + + foreach($search_parts as $p) { + $p = $this->db()->escape(trim($p)); + if(!$p) continue; + $gem_search[] = "gemeinde like '$p%'"; + $ort_search[] = "ortschaft like '$p%'"; + $strasse_search[] = "strasse like '$p%'"; + $plz_search[] = "plz like '%$p%'"; + $hausnummer_search[] = "hausnummer like '%$p%'"; + } + + $where = "1=1"; + if(count($this->filter_salescluster_ids)) { + $where .= " AND netzgebiet_id IN (".implode(",", $this->filter_salescluster_ids).")"; + } + + $sql = "SELECT * FROM view_wohneinheit WHERE $where AND ((".implode(" OR ", $ort_search).") OR (".implode(" OR ", $strasse_search).") OR (".implode(" OR ", $plz_search).") OR (".implode(" OR ", $hausnummer_search).")) ORDER BY strasse, LENGTH(hausnummer), hausnummer, LENGTH(tuer),tuer, zusatz, LENGTH(num), num"; + $this->log->debug($sql); + + $res = $this->db()->query($sql); + + + + if($this->db()->num_rows($res)) { + $tmp_addresses = []; + while($data = $this->db()->fetch_object($res)) { + $address_key = $data->hausnummer_id; + if($this->hausnummer_add_zusatz) { + $address_key = $data->hausnummer_id."-".$data->zusatz; + } + $sort_key = $data->plz." ".$data->ortschaft." ".$data->strasse." ".$data->hausnummer." ".$data->zusatz; + if(!array_key_exists($address_key, $tmp_addresses)) { + + // get allowed preorderTypes + $ptypes = []; + if($data->freigabe) { + $freigaben = json_decode($data->freigabe); + if(is_array($freigaben) && count($freigaben)) { + foreach($freigaben as $freigabe) { + if(in_array($freigabe, $this->allowed_preordertypes)) { + $ptypes[] = $freigabe; + } + } + } + } + + $housenumber = $data->hausnummer; + if($this->hausnummer_add_zusatz) { + if($data->zusatz) { + $housenumber .= " (".$data->zusatz.")"; + } + } + + $tmp_addresses[$address_key] = [ + 'sort_key' => $sort_key, + 'oaid' => $data->hausnummer_oaid, + 'zip' => $data->plz, + 'city' => ($this->district_is_city) ? $data->ortschaft : $data->gemeinde, + 'district' => $data->ortschaft, + 'street' => $data->strasse, + 'housenumber' => $housenumber, + 'lot_number' => $data->grund_nr, + 'building_unit_count' => 0, + 'gps_lat' => ($data->gps_lat) ? (float)$data->gps_lat : null, + 'gps_long' => ($data->gps_long) ? (float)$data->gps_long : null, + 'rollout_year' => ($data->rollout) ? (int)$data->rollout : null, + 'rollout_info' => $data->rollout_info, + 'preorderTypes' => $ptypes, + 'units' => [] + ]; + } + + $tmp_addresses[$address_key]['units'][] = [ + 'oaid' => $data->wohneinheit_oaid, + 'num' => (int)$data->num, + 'block' => $data->block, + 'stiege' => $data->stiege, + 'stock' => $data->stock, + 'tuer' => $data->tuer, + 'zusatz' => $data->zusatz, + ]; + $tmp_addresses[$address_key]['building_unit_count']++; + + } + + // sort found addresses by count of found keywords + // if there is an int we don't want to show more than one street + $sorted_addresses = []; + foreach($tmp_addresses as $temp_add) { + $includes_int = false; + $count = 0; + foreach($search_parts as $p) { + $p = $this->db->escape(trim($p)); + if(strlen($p) === 0) continue; + if(is_numeric(($p))) { + $includes_int = true; + if(substr_count(strtolower($temp_add['sort_key']), strtolower($p))) { + $count++; + } + } else { + $count += substr_count(strtolower($temp_add['sort_key']), strtolower($p)); + } + } + unset($temp_add['sort_key']); + //echo $address['text']." $p $count
\n"; + if($includes_int && (($count + 1) - count($search_parts) ) < 1) { + continue; + } + if(!array_key_exists($count, $sorted_addresses)) { + $sorted_addresses[$count] = []; + } + $sorted_addresses[$count][] = $temp_add; + } + + ksort($sorted_addresses, SORT_NUMERIC); + $sorted_addresses = array_reverse($sorted_addresses, true); + + + // sort / format + if($format == "tree") { + foreach($sorted_addresses as $counted_addresses) { + foreach($counted_addresses as $cadd) { + $addresses[] = $cadd; + } + } + //var_dump($addresses);exit; + //$addresses = array_values($sorted_addresses); + + if(!$addresses) $addresses = []; + } else { + foreach($sorted_addresses as $counted_addresses) { + foreach($counted_addresses as $ta) { + foreach($ta['units'] as $u) { + $new_address = []; + $new_address['oaid'] = $u['oaid']; + $new_address['building_oaid'] = $ta['oaid']; + $new_address['street'] = $ta['street']; + $new_address['housenumber'] = $ta['housenumber']; + $new_address['zip'] = $ta['zip']; + $new_address['city'] = $ta['city']; + $new_address['district'] = $ta['district']; + $new_address['lot_number'] = $ta['lot_number']; + $new_address['building_unit_count'] = $ta['building_unit_count']; + $new_address['num'] = $u['num']; + $new_address['block'] = $u['block']; + $new_address['stiege'] = $u['stiege']; + $new_address['stock'] = $u['stock']; + $new_address['tuer'] = $u['tuer']; + $new_address['zusatz'] = $u['zusatz']; + $new_address['gps_lat'] = $ta['gps_lat']; + $new_address['gps_long'] = $ta['gps_long']; + $new_address['rollout_year'] = $ta['rollout_year']; + $new_address['rollout_info'] = $ta['rollout_info']; + $new_address['preorderTypes'] = $ta['preorderTypes']; + + $addresses[] = $new_address; + } + } + } + } + + } + + return mfResponse::Ok(['addresses' => $addresses]); + } + protected function find() { // unofficially supporting GET and POST in v1 $get = array_merge($this->post, $this->get); @@ -343,7 +530,10 @@ class AddressdbApicontroller extends mfBaseApicontroller { if($this->db()->num_rows($res)) { $tmp_addresses = []; while($data = $this->db()->fetch_object($res)) { - $address_key = $data->hausnummer_id."-".$data->zusatz; + $address_key = $data->hausnummer_id; + if($this->hausnummer_add_zusatz) { + $address_key = $data->hausnummer_id."-".$data->zusatz; + } if(!array_key_exists($address_key, $tmp_addresses)) { // get allowed preorderTypes @@ -375,8 +565,8 @@ class AddressdbApicontroller extends mfBaseApicontroller { 'housenumber' => $housenumber, 'lot_number' => $data->grund_nr, 'building_unit_count' => 0, - 'gps_lat' => (float)$data->gps_lat, - 'gps_long' => (float)$data->gps_long, + 'gps_lat' => ($data->gps_lat) ? (float)$data->gps_lat : null, + 'gps_long' => ($data->gps_long) ? (float)$data->gps_long : null, 'rollout_year' => ($data->rollout) ? (int)$data->rollout : null, 'rollout_info' => $data->rollout_info, 'preorderTypes' => $ptypes, @@ -406,7 +596,7 @@ class AddressdbApicontroller extends mfBaseApicontroller { foreach($ta['units'] as $u) { $new_address = []; $new_address['oaid'] = $u['oaid']; - $new_address['buildin_oaid'] = $ta['oaid']; + $new_address['building_oaid'] = $ta['oaid']; $new_address['street'] = $ta['street']; $new_address['housenumber'] = $ta['housenumber']; $new_address['zip'] = $ta['zip']; diff --git a/application/Api/v1/PreorderApicontroller.php b/application/Api/v1/PreorderApicontroller.php index c36bc202f..e6dcb675d 100644 --- a/application/Api/v1/PreorderApicontroller.php +++ b/application/Api/v1/PreorderApicontroller.php @@ -324,6 +324,7 @@ class PreorderApicontroller extends mfBaseApicontroller { if($unit) { $preorder_data['adb_wohneinheit_id'] = $unit->wohneinheit_id; + $preorder_data['oaid'] = $unit->wohneinheit_oaid; } if($address_info) { $preorder_data['address_info'] = $address_info;