From d2853f7beaf0aecb5c5efaadf091a30da82a5f7a Mon Sep 17 00:00:00 2001 From: Frank Schubert Date: Fri, 18 Nov 2022 16:31:06 +0100 Subject: [PATCH] Preordercampaigns can use city or district as city --- Layout/default/Preorder/Form.php | 2 +- .../ADBOrtschaft/ADBOrtschaftModel.php | 28 ++++++++++++++- application/AddressDB/AddressDBController.php | 24 +++++++++++-- application/Api/v1/AddressdbApicontroller.php | 35 ++++++++++++++----- application/Api/v1/PreorderApicontroller.php | 23 ++++++++++-- .../Preordercampaign/Preordercampaign.php | 2 +- 6 files changed, 98 insertions(+), 16 deletions(-) diff --git a/Layout/default/Preorder/Form.php b/Layout/default/Preorder/Form.php index 2d5ca6fd7..dd196cb49 100644 --- a/Layout/default/Preorder/Form.php +++ b/Layout/default/Preorder/Form.php @@ -363,7 +363,7 @@ $('#adb_hausnummer_id').select2({ ajax: { - url: ' "findAddress"])?>', + url: ' "findAddress", "campaign_id" => $campaign->id])?>', delay: 250, dataType: 'json' }, diff --git a/application/ADBOrtschaft/ADBOrtschaftModel.php b/application/ADBOrtschaft/ADBOrtschaftModel.php index 65b9544ff..865573435 100644 --- a/application/ADBOrtschaft/ADBOrtschaftModel.php +++ b/application/ADBOrtschaft/ADBOrtschaftModel.php @@ -93,10 +93,13 @@ class ADBOrtschaftModel { $where = self::getSqlFilter($filter); $sql = "SELECT Ortschaft.* FROM Ortschaft LEFT JOIN Gemeinde ON (Ortschaft.gemeinde_id = Gemeinde.id) + LEFT JOIN Plz ON (Plz.gemeinde_id = Gemeinde.id) + LEFT JOIN GemeindeNetzgebiet ON (GemeindeNetzgebiet.gemeinde_id = Gemeinde.id) + LEFT JOIN Netzgebiet ON (GemeindeNetzgebiet.netzgebiet_id = Netzgebiet.id) WHERE $where ORDER BY gemeinde_id,Ortschaft.name,Ortschaft.kennziffer"; - //mfLoghandler::singleton()->debug($sql); + mfLoghandler::singleton()->debug($sql); if(is_array($limit) && count($limit)) { if(is_numeric($limit['start']) && is_numeric($limit['count'])) { $sql .= " LIMIT ".$limit['start'].", ".$limit['count']; @@ -117,6 +120,15 @@ class ADBOrtschaftModel { private static function getSqlFilter($filter) { $where = "1=1 "; + if(array_key_exists("netzgebiet_id", $filter)) { + $netzgebiet_id = $filter['netzgebiet_id']; + if(is_numeric($netzgebiet_id)) { + $where .= " AND Netzgebiet.id=$netzgebiet_id"; + } elseif(is_array($netzgebiet_id) && count($netzgebiet_id)) { + $where .= " AND Netzgebiet.id IN (". implode(",", $netzgebiet_id).")"; + } + } + if(array_key_exists("gemeinde_id", $filter)) { $gemeinde_id = $filter['gemeinde_id']; if(is_numeric($gemeinde_id)) { @@ -154,6 +166,20 @@ class ADBOrtschaftModel { } } + if(array_key_exists("plz", $filter)) { + $plz = FronkDB::singleton()->escape($filter['plz']); + if($plz) { + $where .= " AND Plz.plzstring = '$plz'"; + } + } + + if(array_key_exists("plz%", $filter)) { + $plz = FronkDB::singleton()->escape($filter['plz%']); + if($plz) { + $where .= " AND Plz.plzstring like '$plz%'"; + } + } + //var_dump($filter, $where);exit; return $where; } diff --git a/application/AddressDB/AddressDBController.php b/application/AddressDB/AddressDBController.php index 051f054f5..61a6b2878 100644 --- a/application/AddressDB/AddressDBController.php +++ b/application/AddressDB/AddressDBController.php @@ -55,6 +55,20 @@ class AddressDBController extends mfBaseController { 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); @@ -70,11 +84,17 @@ class AddressDBController extends mfBaseController { $hausnummer_search[] = "hausnummer like '%$p%'"; } - $sql = "SELECT * FROM view_hausnummer WHERE (".implode(" OR ", $ort_search).") OR (".implode(" OR ", $strasse_search).") OR (".implode(" OR ", $plz_search).") OR (".implode(" OR ", $hausnummer_search).")"; - //echo $sql;exit; + $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"); diff --git a/application/Api/v1/AddressdbApicontroller.php b/application/Api/v1/AddressdbApicontroller.php index 2a76e0515..8fdda3822 100644 --- a/application/Api/v1/AddressdbApicontroller.php +++ b/application/Api/v1/AddressdbApicontroller.php @@ -4,8 +4,8 @@ class AddressdbApicontroller extends mfBaseApicontroller { private $campaigns = []; private $filter_salescluster_ids = []; private $campaigns_by_scluster = []; - private $allowed_preordertypes = []; + private $district_is_city = false; protected function init() { $db = $this->db(ADDRESSDB_DBHOST, ADDRESSDB_DBUSER, ADDRESSDB_DBPASS, ADDRESSDB_DBNAME); @@ -46,6 +46,10 @@ class AddressdbApicontroller extends mfBaseApicontroller { $this->allowed_preordertypes[] = $type->type; } } + + if($campaign->district_is_city == 1) { + $this->district_is_city = true; + } } foreach(PreordercampaignOriginhostnameModel::search(['preordercampaign_id' => $campaign->id]) as $origin) { @@ -90,7 +94,11 @@ class AddressdbApicontroller extends mfBaseApicontroller { $city_search['netzgebiet_id'] = $this->filter_salescluster_ids; } - $results = ADBGemeindeModel::search($city_search); + if($this->district_is_city) { + $results = ADBOrtschaftModel::search($city_search); + } else { + $results = ADBGemeindeModel::search($city_search); + } $cities = []; @@ -214,7 +222,6 @@ class AddressdbApicontroller extends mfBaseApicontroller { $search = trim($get['search']); $street = trim($get['street']); $city = trim($get['city']); - $district = trim($get['district']); $zip = trim($get['zip']); if(!$search && !$street && !$city && !$zip) { @@ -227,10 +234,18 @@ class AddressdbApicontroller extends mfBaseApicontroller { $where = "1=1"; $street_search = ["name%" => $street]; + $street = $this->db()->escape($street); + $where .= " AND strasse like '$street%'"; if($city) { - $street_search['gemeinde%'] = $city; - $city = $this->db()->escape($city); - $where .= " AND gemeinde like '$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; @@ -293,7 +308,11 @@ class AddressdbApicontroller extends mfBaseApicontroller { $where .= " AND ortschaft like '$search_district%'"; } if($search_city && $search_city != "%") { - $where .= " AND gemeinde like '$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%'"; @@ -329,7 +348,7 @@ class AddressdbApicontroller extends mfBaseApicontroller { $addresses[] = [ 'zip' => $data->plz, - 'city' => $data->gemeinde, + 'city' => ($this->district_is_city) ? $data->ortschaft : $data->gemeinde, 'district' => $data->ortschaft, 'street' => $data->strasse, 'housenumber' => $data->hausnummer, diff --git a/application/Api/v1/PreorderApicontroller.php b/application/Api/v1/PreorderApicontroller.php index 79e90576e..9e6048b0d 100644 --- a/application/Api/v1/PreorderApicontroller.php +++ b/application/Api/v1/PreorderApicontroller.php @@ -10,7 +10,7 @@ class PreorderApicontroller extends mfBaseApicontroller { private $campaigns_by_scluster = []; private $allowed_preordertypes = []; - + private $district_is_city = false; protected function init() { $db = $this->db(ADDRESSDB_DBHOST, ADDRESSDB_DBUSER, ADDRESSDB_DBPASS, ADDRESSDB_DBNAME); @@ -42,7 +42,13 @@ class PreorderApicontroller extends mfBaseApicontroller { $this->allowed_preordertypes[] = $type->type; } } + + if($campaign->district_is_city == 1) { + $this->district_is_city = true; + } } + + foreach(PreordercampaignOriginhostnameModel::search(['preordercampaign_id' => $campaign->id]) as $origin) { $this->addAllowedOrigin($origin->hostname); @@ -107,7 +113,18 @@ class PreorderApicontroller extends mfBaseApicontroller { } $address_search = []; - foreach(['street' => 'strasse','housenumber' => "hausnummer",'zip' => "plz",'city' => "gemeinde", 'district' => "ortschaft"] as $key => $field_name) { + $address_search_fields = [ + 'street' => 'strasse', + 'housenumber' => "hausnummer", + 'zip' => "plz" + ]; + if($this->district_is_city) { + $address_search_fields['city'] = "ortschaft"; + } else { + $address_search_fields['city'] = "gemeinde"; + } + + foreach($address_search_fields as $key => $field_name) { if(property_exists($this->post['address'], $key)) { $address_search[$field_name] = $this->db()->escape(trim($this->post['address']->$key)); } @@ -148,9 +165,9 @@ class PreorderApicontroller extends mfBaseApicontroller { } $sql = "SELECT * FROM view_hausnummer WHERE $where"; + $this->log->debug($sql); $res = $this->db()->query($sql); if(!$this->db()->num_rows($res)) { - //var_dump($this->db()->num_rows($res), $this->db()->fetch_object($res)); return mfResponse::NotFound(['message' => "Adresse nicht gefunden"]); } diff --git a/application/Preordercampaign/Preordercampaign.php b/application/Preordercampaign/Preordercampaign.php index 0dba43ab3..af3dbc792 100644 --- a/application/Preordercampaign/Preordercampaign.php +++ b/application/Preordercampaign/Preordercampaign.php @@ -139,7 +139,7 @@ class Preordercampaign extends mfBaseModel { if($name == "salesclusters") { $items = PreordercampaignSalesclusterModel::search(["preordercampaign_id" => $this->id]); foreach($items as $pog) { - $this->salesclusters[$pog->salescluster_id] = $pog; + $this->salesclusters[$pog->salescluster_id] = new ADBNetzgebiet($pog->salescluster_id); } return $this->salesclusters; }