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;