Files
thetool/application/AddressDB/AddressDBController.php
2022-11-24 14:28:18 +01:00

282 lines
7.8 KiB
PHP

<?php
class AddressDBController extends mfBaseController {
protected function init() {
$this->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 "getUnits":
$return = $this->getUnitsApi();
break;
case "findCities":
$return = $this->findCitiesApi();
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 = 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)."))";
$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;
$address = [];
$address['id'] = $data->hausnummer_id;
$address["text"] = $address_string;
$addresses[] = $address;
}
// sort results by most occurences of search strings
$sort = [];
foreach($addresses as $address) {
$count = 0;
foreach($search_parts as $p) {
$count += substr_count(strtolower($address['text']), strtolower($p));
}
//echo $address['text']." $p $count<br />\n";
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 findCitiesApi() {
$cities = [];
$search = $this->request->search;
$ort_ids = [];
if(is_numeric($search)) {
$adb = FronkDB::singleton(ADDRESSDB_DBHOST, ADDRESSDB_DBUSER, ADDRESSDB_DBPASS, ADDRESSDB_DBNAME);
$sql = "SELECT ortschaft_id from view_wohneinheit WHERE plz 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]);
}
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;
}
return ['cities' => $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];
}
}