Files
thetool/application/Api/v1/AddressdbApicontroller.php
2022-11-29 14:14:45 +01:00

386 lines
12 KiB
PHP

<?php
class AddressdbApicontroller extends mfBaseApicontroller {
private $campaigns = [];
private $filter_salescluster_ids = [];
private $campaigns_by_scluster = [];
private $allowed_preordertypes = [];
private $district_is_city = false;
private $hausnummer_add_zusatz = false;
protected function init() {
$db = $this->db(ADDRESSDB_DBHOST, ADDRESSDB_DBUSER, ADDRESSDB_DBPASS, ADDRESSDB_DBNAME);
$this->addRoute("/addressdb/findAddress", "find", "GET");
$this->addRoute("/addressdb/findAddress", "find", "POST");
$this->addRoute("/addressdb/findStreet", "findStreet", "GET");
$this->addRoute("/addressdb/findStreet", "findStreet", "POST");
$this->addRoute("/addressdb/findZip", "findZip", "GET");
$this->addRoute("/addressdb/findZip", "findZip", "POST");
$this->addRoute("/addressdb/findCity", "findCity", "GET");
$this->addRoute("/addressdb/findCity", "findCity", "POST");
$this->addRoute("/addressdb/findDistrict", "findDistrict", "GET");
$this->addRoute("/addressdb/findDistrict", "findDistrict", "POST");
$this->allowMissingOrigin = true;
}
protected function authenticated() {
$campaignApiusers = PreordercampaignApiuserModel::search(["worker_id" => $this->me->id]);
foreach($campaignApiusers as $campaignApiuser) {
$campaign = new Preordercampaign($campaignApiuser->preordercampaign_id);
if($campaign) {
foreach(PreordercampaignSalesclusterModel::search(['preordercampaign_id' => $campaign->id]) as $campain_scluster) {
if(!in_array($campain_scluster->salescluster_id, $this->filter_salescluster_ids)) {
$this->filter_salescluster_ids[] = $campain_scluster->salescluster_id;
}
$this->campaigns_by_scluster[$campain_scluster->salescluster_id] = $campaign->id;
}
$this->campaigns[$campaign->id] = $campaign;
// get allowed preordertypes
if(is_array($campaign->types) && count($campaign->types)) {
foreach($campaign->types as $type) {
$this->allowed_preordertypes[] = $type->type;
}
}
if($campaign->district_is_city == 1) {
$this->district_is_city = true;
}
if($campaign->hausnummer_add_zusatz == 1) {
$this->hausnummer_add_zusatz = true;
}
}
foreach(PreordercampaignOriginhostnameModel::search(['preordercampaign_id' => $campaign->id]) as $origin) {
$this->addAllowedOrigin($origin->hostname);
}
}
$this->allowed_preordertypes = array_unique($this->allowed_preordertypes);
//var_dump($this->allowed_preordertypes);exit;
//var_dump($this->filter_salescluster_ids, $this->campaigns_by_scluster);exit;
//var_dump($this->campaigns, $this->allowed_origins);exit;
}
protected function findCity() {
// unofficially supporting GET and POST in v1
$get = array_merge($this->post, $this->get);
// search parameter is unofficially deprecated but still supported
$search = trim($get['search']);
$city = trim($get['city']);
$district = trim($get['district']);
$zip = trim($get['zip']);
if(!$city) {
$city = $search;
}
if(!$city && !$zip) {
return mfResponse::BadRequest(['message' => "No search parameters"]);
}
$city_search = ['name%' => $city];
if($zip) {
$city_search['plz%'] = $zip;
}
if($district) {
$district_search['ortschaft%'] = $zip;
}
if(count($this->filter_salescluster_ids)) {
$city_search['netzgebiet_id'] = $this->filter_salescluster_ids;
}
if($this->district_is_city) {
$results = ADBOrtschaftModel::search($city_search);
} else {
$results = ADBGemeindeModel::search($city_search);
}
$cities = [];
foreach($results as $result) {
$cities[] = $result->name;
}
$cities = array_unique($cities);
return mfResponse::Ok(['cities' => array_values($cities)]);
}
protected function findDistrict() {
// unofficially supporting GET and POST in v1
$get = array_merge($this->post, $this->get);
// search parameter is unofficially deprecated but still supported
$search = trim($get['search']);
$city = trim($get['city']);
$district = trim($get['district']);
$zip = trim($get['zip']);
if(!$district) {
$district = $search;
}
/*
if(!$city && !$zip && !$district) {
return mfResponse::BadRequest(['message' => "No search parameters"]);
}*/
$where = "1=1";
if($district && $district != "%") {
$city_search = ['ortschaft%' => $district];
$where .= " AND ortschaft like '$district%'";
}
if($city && $city != "%") {
$city_search = ['name%' => $city];
$where .= " AND gemeinde like '$city%'";
}
if($zip && $zip != "%") {
$city_search['plz%'] = $zip;
$where .= " AND plz like '$zip%'";
}
if(count($this->filter_salescluster_ids)) {
$city_search['netzgebiet_id'] = $this->filter_salescluster_ids;
$where .= " AND netzgebiet_id IN (".join(", ", $this->filter_salescluster_ids).")";
}
$cities = [];
$sql = "SELECT gemeinde, ortschaft FROM view_hausnummer WHERE $where GROUP BY gemeinde,ortschaft_id ORDER BY gemeinde, ortschaft";
//echo $sql;exit;
$res = $this->db()->query($sql);
if($this->db()->num_rows($res)) {
while($data = $this->db()->fetch_object($res)) {
if(!array_key_exists($data->gemeinde, $cities)) {
$cities[$data->gemeinde] = [];
}
$cities[$data->gemeinde][] = $data->ortschaft;
}
}
/*foreach(ADBGemeindeModel::search($city_search) as $gem) {
$districts = [];
if($district) {
foreach(ADBOrtschaftModel::search(["gemeinde_id" => $gem->id, "name%" => $district]) as $ort) {
$districts[] = $ort->name;
}
} else {
foreach($gem->ortschaften as $ort) {
$districts[] = $ort->name;
}
}
$cities[$gem->name] = $districts;
}*/
return mfResponse::Ok(['cities' => $cities]);
}
protected function findZip() {
// unofficially supporting GET and POST in v1
$get = array_merge($this->post, $this->get);
// search parameter is unofficially deprecated but still supported
$search = trim($get['search']);
$zip = trim($get['zip']);
if(!$search && !$zip) {
return mfResponse::BadRequest(['message' => "Searchstring cannot be empty!"]);
}
if(!$zip) {
$zip = $search;
}
$zip_search = ['plzstring%' => $zip];
//var_dump($this->filter_salescluster_ids);exit;
if(count($this->filter_salescluster_ids)) {
$zip_search['netzgebiet_id'] = $this->filter_salescluster_ids;
}
//var_dump($zip_search);exit;
$results = ADBPlzModel::search($zip_search);
$zips = [];
foreach($results as $result) {
$zips[] = $result->plz;
}
$zips = array_unique($zips);
return mfResponse::Ok(['zips' => array_values($zips)]);
}
protected function findStreet() {
// unofficially supporting GET and POST in v1
$get = array_merge($this->post, $this->get);
// search parameter is unofficially deprecated but still supported
$search = trim($get['search']);
$street = trim($get['street']);
$city = trim($get['city']);
$zip = trim($get['zip']);
if(!$search && !$street && !$city && !$zip) {
return mfResponse::BadRequest(['message' => "No search parameters"]);
}
if(!$street) {
$street = $search;
}
$where = "1=1";
$street_search = ["name%" => $street];
$street = $this->db()->escape($street);
$where .= " AND strasse like '$street%'";
if($city) {
if($this->district_is_city) {
$street_search['ortschaft%'] = $city;
$city = $this->db()->escape($city);
$where .= " AND ortschaft like '$city%'";
} else {
$street_search['gemeinde%'] = $city;
$city = $this->db()->escape($city);
$where .= " AND gemeinde like '$city%'";
}
}
if($zip) {
$street_search['plz%'] = $zip;
$zip = $this->db()->escape($zip);
$where .= " AND plz like '$zip%'";
}
if(count($this->filter_salescluster_ids)) {
$street_search['netzgebiet_id'] = $this->filter_salescluster_ids;
$where .= " AND netzgebiet_id IN (".join(", ", $this->filter_salescluster_ids).")";
}
$streets = [];
$sql = "SELECT strasse FROM view_hausnummer WHERE $where GROUP BY strasse ORDER BY strasse";
//echo "$sql";exit;
$res = $this->db()->query($sql);
if($this->db()->num_rows($res)) {
while($data = $this->db()->fetch_object($res)) {
$streets[] = $data->strasse;
}
}
/*$results = ADBStrasseModel::search($street_search);
foreach($results as $result) {
$streets[] = $result->name;
}*/
$streets = array_unique($streets);
sort($streets);
return mfResponse::Ok(['streets' => array_values($streets)]);
}
protected function find() {
// unofficially supporting GET and POST in v1
$get = array_merge($this->post, $this->get);
$search_street = $this->db()->escape(trim($get['street']));
$search_zip = $this->db()->escape(trim($get['zip']));
$search_district = $this->db()->escape(trim($get['district']));
$search_city = $this->db()->escape(trim($get['city']));
$search_housenumber = $this->db()->escape(trim($get['housenumber']));
if(!$search_street) {
return mfResponse::BadRequest(['message' => "Searchstring cannot be empty!"]);
}
$addresses = [];
$where = "1=1";
if($search_zip && $search_zip != "%") {
$where .= " AND plz like '$search_zip%'";
}
if($search_district && $search_district != "%") {
$where .= " AND ortschaft like '$search_district%'";
}
if($search_city && $search_city != "%") {
if($this->district_is_city) {
$where .= " AND ortschaft like '$search_city%'";
} else {
$where .= " AND gemeinde like '$search_city%'";
}
}
if($search_street && $search_street != "%") {
$where .= " AND strasse like '$search_street%'";
}
if($search_housenumber && $search_housenumber != "%") {
$where .= " AND hausnummer like '$search_housenumber%'";
}
if(count($this->filter_salescluster_ids)) {
$where .= " AND netzgebiet_id IN (".implode(",", $this->filter_salescluster_ids).")";
}
//echo $where;
//var_dump($this->filter_salescluster_ids);exit;
$sql = "SELECT * FROM view_wohneinheit WHERE $where ORDER BY plz, gemeinde, ortschaft, strasse, LENGTH(hausnummer), hausnummer, block, stiege, stock, LENGTH(tuer), tuer";
$this->log->debug($sql);
$res = $this->db()->query($sql);
if($this->db()->num_rows($res)) {
while($data = $this->db()->fetch_object($res)) {
// 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.")";
}
}
$addresses[] = [
'zip' => $data->plz,
'city' => ($this->district_is_city) ? $data->ortschaft : $data->gemeinde,
'district' => $data->ortschaft,
'street' => $data->strasse,
'housenumber' => $housenumber,
'block' => $data->block,
'stock' => $data->stock,
'stiege' => $data->stiege,
'tuer' => $data->tuer,
'zusatz' => $data->zusatz,
'gps_lat' => $data->gps_lat,
'gps_long' => $data->gps_long,
'rollout_year' => ($data->rollout) ? (int)$data->rollout : null,
'rollout_info' => $data->rollout_info,
'preorderTypes' => $ptypes
];
}
}
return mfResponse::Ok(['addresses' => $addresses]);
}
}