needlogin=true; $me = new User(); $me->loadMe(); $this->me = $me; $this->layout()->set("me",$me); if(!$me->is(["Admin", "netowner", "pipeplanner"])) { $this->redirect("Dashboard"); } } protected function apiAction() { if(!$this->me->is(["Admin","netowner"])) { $this->redirect("Dashboard"); } $do = $this->request->do; $data = []; switch($do) { case "findAddress": $return = $this->findAddressApi(); break; case "getFilteredBuildings": $return = $this->getFilteredBuildingsApi(); break; case "getAddressByHousenumber": $return = $this->getAddressByHousenumberApi(); break; case "getUnits": $return = $this->getUnitsApi(); break; case "findStreets": $return = $this->findStreetsApi(); break; case "findDistricts": $return = $this->findDistrictsApi(); break; case "findCities": $return = $this->findCitiesApi(); break; case "findZips": $return = $this->findZipsApi(); break; case 'findBuildings': $return = $this->findBuildingsApi(); break; case "findUnit": break; default: $return = false; } if(!is_array($return) || !count($return)) { $data = ["status" => "error"]; $this->returnJson($data); } $data['status'] = "OK"; $data['result'] = $return; $this->returnJson($data); } private function findAddressApi() { $addresses = []; $search = trim($this->request->q); $campagin_id = ($this->request->campaign_id); $campaign = new Preordercampaign($campagin_id); if(!$campaign->id) { header("Content-Type: application/json"); echo json_encode(["results" => []]); exit; } $scluster_ids = []; foreach($campaign->salesclusters as $scluster) { $scluster_ids[] = $scluster->id; } $results = []; $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; $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($scluster_ids)) { $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).")) ORDER BY strasse, LENGTH(hausnummer), hausnummer"; $this->log->debug($sql); $adb = FronkDB::singleton(ADDRESSDB_DBHOST, ADDRESSDB_DBUSER, ADDRESSDB_DBPASS, ADDRESSDB_DBNAME); $res = $adb->query($sql); $this->log->debug("done"); if(!$adb->num_rows($res)) { header("Content-Type: application/json"); echo json_encode(["results" => []]); exit; } 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 $key => $address) { $includes_int = false; $count = 0; foreach($search_parts as $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] = []; } $sort[$count][] = $address; } ksort($sort, SORT_NUMERIC); $sort = array_reverse($sort, true); //var_dump($sort);exit; foreach($sort as $res) { foreach($res as $a) { $results[] = $a; } } header("Content-Type: application/json"); echo json_encode(["results" => $results]); exit; } private function getUnitsApi() { $results = []; $hausnummer_id = intval($this->request->hausnummer_id); if(!$hausnummer_id) { return ['results' => []]; } $units = ADBWohneinheitModel::search(['hausnummer_id' => $hausnummer_id]); foreach($units as $unit) { $u = []; $u['id'] = $unit->id; $u['zip'] = $unit->hausnummer->plz->plzstring; $u['city'] = $unit->hausnummer->ortschaft->name; $u['street'] = $unit->hausnummer->strasse->name; $u['housenumber'] = $unit->hausnummer->hausnummer; $u['block'] = $unit->block; $u['stiege'] = $unit->stiege; $u['stock'] = $unit->stock; $u['tuer'] = $unit->tuer; $u['extra'] = (string)$unit; $u['zusatz'] = $unit->zusatz; $u['usage'] = $unit->nutzung; $results[] = $u; } return ['units' => $results]; } private function getAddressByHousenumberApi() { $zips = []; $hausnummer_id = trim($this->request->hausnummer_id); if(!is_numeric($hausnummer_id) || $hausnummer_id < 1) { return false; } $hausnummer = new ADBHausnummer($hausnummer_id); $result = [ 'hausnummer_id' => $hausnummer->id, 'strasse' => $hausnummer->strasse->name, 'hausnummer' => $hausnummer->hausnummer, 'plz' => $hausnummer->plz->plz, 'ort' => $hausnummer->strasse->gemeinde->name, 'ortschaft' => $hausnummer->ortschaft->name ]; return $result; } private function findStreetsApi() { $streets = []; $search = trim($this->request->q); foreach(ADBStrasseModel::search(['name%' => $search]) as $street) { if(!in_array($street->name, $streets)) { $streets[] = $street->name; } } $this->returnJson($streets); } private function findZipsApi() { $zips = []; $search = trim($this->request->q); $campaign_id = trim($this->request->campaign_id); $plz_search = []; if($campaign_id) { $campaign = new Preordercampaign($campaign_id); if(!$campaign->id) { header("Content-Type: application/json"); echo json_encode(["results" => []]); exit; } $scluster_ids = []; foreach($campaign->salesclusters as $scluster) { $scluster_ids[] = $scluster->id; } $plz_search['netzgebiet_id'] = $scluster_ids; } $plz_search['plzstring%'] = $search; foreach(ADBPlzModel::search($plz_search) as $zip) { if(!in_array($zip->plz, $zips)) { $zips[] = $zip->plz; } } $this->returnJson($zips); } private function findDistrictsApi() { $districts = []; $search = trim($this->request->q); $autocomplete = $this->request->autocomplete; $campaign_id = trim($this->request->campaign_id); $district_search = []; if($campaign_id) { $campaign = new Preordercampaign($campaign_id); if(!$campaign->id) { header("Content-Type: application/json"); echo json_encode(["results" => []]); exit; } $scluster_ids = []; foreach($campaign->salesclusters as $scluster) { $scluster_ids[] = $scluster->id; } $district_search['netzgebiet_id'] = $scluster_ids; } $district_search['name%'] = "%".$search; foreach(ADBOrtschaftModel::search($district_search) as $district) { if(!in_array($district->name, $districts)) { $districts[] = $district->name; } } /* if(is_numeric($search)) { $adb = FronkDB::singleton(ADDRESSDB_DBHOST, ADDRESSDB_DBUSER, ADDRESSDB_DBPASS, ADDRESSDB_DBNAME); $sql = "SELECT ortschaft_id from view_wohneinheit WHERE ortschaft like '%$search%' GROUP BY ortschaft_id"; $res = $adb->query($sql); if($adb->num_rows($res)) { while($data = $adb->fetch_object($res)) { $ort_ids[] = $data->ortschaft_id; } } } if($ort_ids) { foreach($ort_ids as $oid) { $results[] = new ADBOrtschaft($oid); } } else { $results = ADBOrtschaftModel::search(['name%' => $search]); } if($autocomplete) { foreach($results as $city) { if(!in_array($city->name, $cities)) { $cities[] = $city->name; } } $this->returnJson($cities); } foreach($results as $city) { $gemeinde = new ADBGemeinde($city->gemeinde_id); $data = []; $data['id'] = $city->id; $data['gemeinde_id'] = $city->gemeinde_id; $data['gemeinde'] = $gemeinde->name; $data['kennziffer'] = $city->kennziffer; $data['name'] = $city->name; $cities[] = $data; } */ $this->returnJson($districts); //return ['cities' => $cities]; } private function findCitiesApi() { $cities = []; $search = $this->request->q; //$autocomplete = $this->request->autocomplete; $campaign_id = trim($this->request->campaign_id); $city_search = []; if($campaign_id) { $campaign = new Preordercampaign($campaign_id); if(!$campaign->id) { header("Content-Type: application/json"); echo json_encode(["results" => []]); exit; } $scluster_ids = []; foreach($campaign->salesclusters as $scluster) { $scluster_ids[] = $scluster->id; } $city_search['netzgebiet_id'] = $scluster_ids; } $city_search['name%'] = "%".$search; foreach(ADBGemeindeModel::search($city_search) as $city) { if(!in_array($city->name, $cities)) { $cities[] = $city->name; } } $this->returnJson($cities); } private function getFilteredBuildingsApi() { $buildings = []; $filter = $this->request->filter; $results = BuildingModel::search($filter); foreach($results as $building) { $data = $building->data; $data->id = $building->id; $buildings[] = $data; } return ["buildings" => $buildings]; } private function findBuildingsApi() { $buildings = []; $search = $this->request->search; $city_id = intval($this->request->city_id); $sql = "SELECT * FROM view_hausnummer WHERE (ortschaft like '%$search%' OR strasse like '%$search%' OR plz like '%$search%' OR hausnummer like '%$search%')"; if($city_id) { $sql .= " AND ortschaft_id=$city_id"; } $adb = FronkDB::singleton(ADDRESSDB_DBHOST, ADDRESSDB_DBUSER, ADDRESSDB_DBPASS, ADDRESSDB_DBNAME); $res = $adb->query($sql); if(!$adb->num_rows($res)) { return ["count" => 0, "buildings" => []]; } while($data = $adb->fetch_object($res)) { $buildings[$data->hausnummer_id] = $data; } $unsorted = []; foreach($buildings as $building) { $u = []; $u['id'] = $building->hausnummer_id; $u['street'] = $building->strasse . " ".$building->hausnummer; $u['zip'] = $building->plz; $u['city'] = $building->ortschaft; $u['oan_id'] = ($building->oan_id) ? $building->oan_id : ""; $u['code'] = ($building->code) ? $building->code : ""; $u['units'] = ($building->units) ? $building->units : 1; //$u['units_used'] = $building->getUsedTerminationCount(true); $u['units_used'] = 1; //$u['status'] = $building->status->name; $u['status'] = ""; $unsorted[$building->strasse."-".$building->hausnummer_id] = $u; } ksort($unsorted); $results = []; foreach($unsorted as $r) { $results[] = $r; /*if(count($results) >= 20) { break; }*/ } return ["count" => count($buildings), "buildings" => $results]; } }