diff --git a/Layout/default/Preorder/Form.php b/Layout/default/Preorder/Form.php index 462be6a11..4b097c47b 100644 --- a/Layout/default/Preorder/Form.php +++ b/Layout/default/Preorder/Form.php @@ -47,18 +47,109 @@
- +
+ +
+ -
- + + + +
+
+
- +
- +
- +
-
- +
+
-
- +
+
@@ -296,22 +387,22 @@
- +
- +
- +
- +
@@ -387,7 +478,25 @@ $("#setup_product_id").val($("#setup-activation input.value").val()); } - + + $('#new_address_street').autoComplete({minLength: 2}).keydown(preventEnter).change(updateCustomerAddressFromNewAddress).on("autocomplete.select", updateCustomerAddressFromNewAddress); + $('#new_address_zip').autoComplete({minLength: 1}).keydown(preventEnter).change(updateCustomerAddressFromNewAddress).on("autocomplete.select", updateCustomerAddressFromNewAddress); + $('#new_address_city').autoComplete({minLength: 2}).keydown(preventEnter).change(updateCustomerAddressFromNewAddress).on("autocomplete.select", updateCustomerAddressFromNewAddress); + $('#new_address_district').autoComplete({minLength: 2}).keydown(preventEnter); + $('#new_address_housenumber').keydown(preventEnter).change(updateCustomerAddressFromNewAddress).on("autocomplete.select", updateCustomerAddressFromNewAddress); + $('#new_address_block').keydown(preventEnter); + $('#new_address_stiege').keydown(preventEnter); + $('#new_address_stock').keydown(preventEnter); + $('#new_address_tuer').keydown(preventEnter); + + + function preventEnter() { + if(event.keyCode == 13) { + event.preventDefault(); + return false; + } + } + $("#product_id").select2({ allowClear: true, @@ -421,7 +530,15 @@ dataType: 'json' }, minimumInputLength: 3, - placeholder: "Suche nach Straße, Hausnummer, Ort" + placeholder: "Suche nach Straße, Hausnummer, Ort", + allowClear: true + }); + + $('#adb_hausnummer_id').on('select2:close', function(e) { + if(!$('#adb_hausnummer_id').val()) { + $('#new-address-toggle').show(); + } + }); @@ -429,6 +546,28 @@ var hausnummer_id = $('#adb_hausnummer_id').val(); if(!hausnummer_id) return; + $('#new-address-toggle').hide(); + $('#new-address').hide(); + + $.get('', + { + do: "getAddressByHousenumber", + hausnummer_id: hausnummer_id + }, + function(success) { + if(success.status != "OK") { + return; + } + var address = success.result; + console.log(address); + $('#new_address_street').val(address.strasse); + $('#new_address_housenumber').val(address.hausnummer); + $('#new_address_zip').val(address.plz); + $('#new_address_city').val(address.ort); + $('#new_address_district').val(address.ortschaft); + }, + 'json'); + $.get('', { @@ -487,6 +626,14 @@ "json"); }); + function updateCustomerAddressFromNewAddress() { + $('input[name=street]').val($('#new_address_street').val()); + $('input[name=housenumber]').val($('#new_address_housenumber').val()); + $('input[name=zip]').val($('#new_address_zip').val()); + $('input[name=city]').val($('#new_address_city').val()); + } + + $('#adb_wohneinheit_id').change(function() { val = $('#adb_wohneinheit_id').val(); @@ -611,6 +758,12 @@ 'json'); } + + function toggleNewAddress() { + $('#new-address').toggle(); + $('#wohneinheit_row').toggle(); + event.preventDefault(); + } \ No newline at end of file diff --git a/application/ADBGemeinde/ADBGemeindeModel.php b/application/ADBGemeinde/ADBGemeindeModel.php index cccdc428b..a5a518228 100644 --- a/application/ADBGemeinde/ADBGemeindeModel.php +++ b/application/ADBGemeinde/ADBGemeindeModel.php @@ -40,7 +40,16 @@ class ADBGemeindeModel { $db = FronkDB::singleton(ADDRESSDB_DBHOST, ADDRESSDB_DBUSER, ADDRESSDB_DBPASS, ADDRESSDB_DBNAME); $where = self::getSqlFilter($filter); - $res = $db->select("Gemeinde", "*", "$where ORDER BY name,code,kennziffer LIMIT 1"); + $sql = "SELECT Gemeinde.* FROM Gemeinde + 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) + LEFT JOIN Ortschaft ON (Ortschaft.gemeinde_id = Gemeinde.id) + WHERE $where + GROUP BY Gemeinde.id + ORDER BY name,code,kennziffer + LIMIT 1"; + $res = $db->query($sql); if($db->num_rows($res)) { $data = $db->fetch_object($res); $item = new ADBGemeinde($data); diff --git a/application/ADBHausnummer/ADBHausnummerModel.php b/application/ADBHausnummer/ADBHausnummerModel.php index e7c5dbcd9..0b13876e0 100644 --- a/application/ADBHausnummer/ADBHausnummerModel.php +++ b/application/ADBHausnummer/ADBHausnummerModel.php @@ -1,6 +1,7 @@ select("Ortschaft", "*", "$where ORDER BY name,kennziffer LIMIT 1"); + $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 + LIMIT 1"; + + $res = $db->query($sql); if($db->num_rows($res)) { $data = $db->fetch_object($res); $item = new ADBOrtschaft($data); diff --git a/application/ADBPlz/ADBPlzModel.php b/application/ADBPlz/ADBPlzModel.php index b4fe7526b..219432934 100644 --- a/application/ADBPlz/ADBPlzModel.php +++ b/application/ADBPlz/ADBPlzModel.php @@ -40,7 +40,16 @@ class ADBPlzModel { $db = FronkDB::singleton(ADDRESSDB_DBHOST, ADDRESSDB_DBUSER, ADDRESSDB_DBPASS, ADDRESSDB_DBNAME); $where = self::getSqlFilter($filter); - $res = $db->select("Plz", "*", "$where ORDER BY plz LIMIT 1"); + $sql = "SELECT Plz.* FROM Plz + LEFT JOIN Gemeinde ON (Gemeinde.id = Plz.gemeinde_id) + LEFT JOIN GemeindeNetzgebiet ON (GemeindeNetzgebiet.gemeinde_id = Plz.gemeinde_id) + LEFT JOIN Netzgebiet ON (GemeindeNetzgebiet.netzgebiet_id = Netzgebiet.id) + WHERE $where + GROUP BY Plz.id + ORDER BY plz + LIMIT 1"; + mfLoghandler::singleton()->debug($sql); + $res = $db->query($sql); if($db->num_rows($res)) { $data = $db->fetch_object($res); $item = new ADBPlz($data); diff --git a/application/ADBStrasse/ADBStrasseModel.php b/application/ADBStrasse/ADBStrasseModel.php index 9b33eac79..4a51a0fde 100644 --- a/application/ADBStrasse/ADBStrasseModel.php +++ b/application/ADBStrasse/ADBStrasseModel.php @@ -41,7 +41,17 @@ class ADBStrasseModel { $db = FronkDB::singleton(ADDRESSDB_DBHOST, ADDRESSDB_DBUSER, ADDRESSDB_DBPASS, ADDRESSDB_DBNAME); $where = self::getSqlFilter($filter); - $res = $db->select("Strasse", "*", "$where ORDER BY gemeinde_id,kennziffer,name LIMIT 1"); + $sql = "SELECT Strasse.* FROM Strasse + LEFT JOIN Hausnummer ON (Hausnummer.strasse_id = Strasse.id) + LEFT JOIN Plz ON (Plz.id = Hausnummer.plz_id) + LEFT JOIN Gemeinde ON (Gemeinde.id = Strasse.gemeinde_id) + LEFT JOIN GemeindeNetzgebiet ON (GemeindeNetzgebiet.gemeinde_id = Strasse.gemeinde_id) + LEFT JOIN Netzgebiet ON (GemeindeNetzgebiet.netzgebiet_id = Netzgebiet.id) + WHERE $where + GROUP BY Strasse.id + ORDER BY gemeinde_id,name,kennziffer + LIMIT 1"; + $res = $db->query($sql); if($db->num_rows($res)) { $data = $db->fetch_object($res); $item = new ADBStrasse($data); diff --git a/application/AddressDB/AddressDBController.php b/application/AddressDB/AddressDBController.php index e269a9517..73bd24149 100644 --- a/application/AddressDB/AddressDBController.php +++ b/application/AddressDB/AddressDBController.php @@ -28,12 +28,24 @@ class AddressDBController extends mfBaseController { 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; @@ -189,15 +201,109 @@ class AddressDBController extends mfBaseController { return ['units' => $results]; } - private function findCitiesApi() { - $cities = []; - $search = $this->request->search; + private function getAddressByHousenumberApi() { + $zips = []; + $hausnummer_id = trim($this->request->hausnummer_id); - $ort_ids = []; + 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 plz like '%$search%' GROUP BY ortschaft_id"; + $sql = "SELECT ortschaft_id from view_wohneinheit WHERE ortschaft like '%$search%' GROUP BY ortschaft_id"; $res = $adb->query($sql); if($adb->num_rows($res)) { @@ -215,9 +321,18 @@ class AddressDBController extends mfBaseController { $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; @@ -226,8 +341,43 @@ class AddressDBController extends mfBaseController { $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); - return ['cities' => $cities]; } private function getFilteredBuildingsApi() { diff --git a/application/Preorder/Preorder.php b/application/Preorder/Preorder.php index 6e1d42085..0cd6d6548 100644 --- a/application/Preorder/Preorder.php +++ b/application/Preorder/Preorder.php @@ -34,7 +34,7 @@ class Preorder extends mfBaseModel { } return $ucode; } - + public function getApiArray() { if(!$this->id) { return false; diff --git a/application/Preorder/PreorderController.php b/application/Preorder/PreorderController.php index 505ac361d..aec93e37b 100644 --- a/application/Preorder/PreorderController.php +++ b/application/Preorder/PreorderController.php @@ -182,7 +182,7 @@ class PreorderController extends mfBaseController { protected function saveAction() { $r = $this->request; - //var_dump($r); + //var_dump($r);exit; /* * add or edit @@ -301,16 +301,173 @@ class PreorderController extends mfBaseController { } else { $preorder->update($data); } - - /* - * validation - */ $campaign = new Preordercampaign($preorder->preordercampaign_id); if(!$campaign->id) { $this->layout()->setFlash("Keine Kampagne ausgewählt!", "error"); $this->redirect("Preordercampaign"); } + //var_dump($preorder, $r);exit; + // handle new address creation + if(!$preorder->adb_hausnummer_id) { + // check if new address was submitted + $this->log->debug("check if new address was submitted"); + if($r->new_address_street && $r->new_address_housenumber && $r->new_address_zip && $r->new_address_city && $r->new_address_district) { + $city_search = trim($r->new_address_city); + $district_search = trim($r->new_address_district); + $zip_search = trim($r->new_address_zip); + $street_search = trim($r->new_address_street); + $housenumber_search = trim($r->new_address_housenumber); + + $block = trim($r->new_address_block); + $stiege = trim($r->new_address_stiege); + $stock = trim($r->new_address_stock); + $tuer = trim($r->new_address_tuer); + + $preorder->new_address_city = $city_search; + $preorder->new_address_district = $district_search; + $preorder->new_address_zip = $zip_search; + $preorder->new_address_street = $street_search; + $preorder->new_address_housenumber = $housenumber_search; + + + $netzgebiet_ids = []; + foreach($campaign->salesclusters as $scluster) { + $netzgebiet_ids[] = $scluster->id; + } + $netzgebiet_id = $netzgebiet_ids[0]; + if(!$netzgebiet_id) { + $this->layout()->setFlash("Kann Adresse nicht updaten: Kampagne hat kein Netzgebiet", "error"); + $this->layout()->set("preorder", $preorder); + $this->layout()->set("campaign", $campaign); + return $this->addAction(); + } + $netzgebiet = new ADBNetzgebiet($netzgebiet_id); + if(!$netzgebiet->id) { + $this->layout()->setFlash("Neztgebiet nicht gefunden", "error"); + $this->layout()->set("preorder", $preorder); + $this->layout()->set("campaign", $campaign); + return $this->addAction(); + } + + $city = ADBGemeindeModel::getFirst(['name' => $city_search, 'netzgebiet_id' => $netzgebiet_id]); + if(!$city) { + $this->layout()->setFlash("Gemeinde nicht Adress-DB gefunden", "error"); + $this->layout()->set("preorder", $preorder); + $this->layout()->set("campaign", $campaign); + return $this->addAction(); + } + + $district = ADBOrtschaftModel::getFirst(['name' => $district_search, 'netzgebiet_id' => $netzgebiet_id]); + if(!$district) { + $this->layout()->setFlash("Ortsteil nicht Adress-DB gefunden", "error"); + $this->layout()->set("preorder", $preorder); + $this->layout()->set("campaign", $campaign); + return $this->addAction(); + } + + $zip = ADBPlzModel::getFirst(['plz' => $zip_search, 'gemeinde_id' => $city->id]); + if(!$zip) { + $this->layout()->setFlash("PLZ nicht Adress-DB gefunden", "error"); + $this->layout()->set("preorder", $preorder); + $this->layout()->set("campaign", $campaign); + return $this->addAction(); + } + + $street = ADBStrasseModel::getFirst(['name' => $street_search, 'ortschaft_id' => $district->id, 'gemeinde_id' => $city->id]); + if(!$street) { + $this->log->debug("create street"); + $street = ADBStrasseModel::create([ + 'ortschaft_id' => $district->id, + 'gemeinde_id' => $city->id, + 'name' => $street_search + ]); + + if(!$street->save()) { + $this->layout()->setFlash("Fehler beim Speichern der neuen Straße", "error"); + $this->layout()->set("preorder", $preorder); + $this->layout()->set("campaign", $campaign); + return $this->addAction(); + } + } + + + $this->log->debug("search hausnummer"); + $hausnummer = ADBHausnummerModel::getFirst(['netzgebiet_id' => $netzgebiet_ids, 'ortschaft_id' => $district_search, 'gemeinde_id' => $city->id, 'plz_id' => $zip->id, 'strasse_id' => $street->id, 'hausnummer' => $housenumber_search]); + if($hausnummer) { + // hausnummer gibts scho! + $this->layout()->setFlash("Adresse war schon vorhanden!", "warn"); + $preorder->adb_hausnummer_id = $hausnummer->id; + } else { + // try with empty netzgebiet + $this->log->debug("search hausnummer mit empty netzgebiet"); + $hausnummer = ADBHausnummerModel::getFirst(['netzgebiet_id' => null, 'ortschaft_id' => $district_search, 'gemeinde_id' => $city->id, 'plz_id' => $zip->id, 'strasse_id' => $street->id, 'hausnummer' => $housenumber_search]); + if($hausnummer) { + // Hausnummer ohne Netzgebiet gefunden -> update netzgebiet_id + $this->log->debug("hausnummer id: updated netzgebiet from NULL to ".$netzgebiet_ids); + $hausnummer->netzgebiet_id = $netzgebiet_id; + $hausnummer->save(); + $preorder->adb_hausnummer_id = $hausnummer->id; + } else { + // try with any netzgebiet + $this->log->debug("search hausnummer with ohne netzgebiet"); + $hausnummer = ADBHausnummerModel::getFirst(['ortschaft_id' => $district_search, 'gemeinde_id' => $city->id, 'plz_id' => $zip->id, 'strasse_id' => $street->id, 'hausnummer' => $housenumber_search]); + if($hausnummer) { + $this->log->debug("Hausnummer ".$hausnummer->id." in Netzgebiet (".implode(",", $netzgebiet_ids)." gesucht, aber in ".$hausnummer->netzgebiet_id)." gefunden"; + $this->layout()->setFlash("Neue Adresse ist bereits im Netzgebiet ".$hausnummer->netzgebiet->name." vorhanden", "error"); + $this->layout()->set("preorder", $preorder); + $this->layout()->set("campaign", $campaign); + return $this->addAction(); + } else { + // hausnummer anlegen + $hausnummer = ADBHausnummerModel::create([ + 'netzgebiet_id' => $netzgebiet_id, + 'ortschaft_id' => $district->id, + 'plz_id' => $zip->id, + 'strasse_id' => $street->id, + 'hausnummer' => $housenumber_search, + 'freigabe' => $netzgebiet->freigabe, + 'manual_add' => date('U'), + 'manual_add_by' => $this->me->id, + 'manual_add_info' => "thetool user ".$this->me->username + ]); + + if(!$hausnummer->save()) { + $this->layout()->setFlash("Fehler beim Speichern der neuen Adresse", "error"); + $this->layout()->set("preorder", $preorder); + $this->layout()->set("campaign", $campaign); + return $this->addAction(); + } + $preorder->adb_hausnummer_id = $hausnummer->id; + $preorder->address_created = date('U'); + $preorder->address_created_by = $this->me->id; + $preorder->adb_wohneinheit_id = null; + + // create wohneinheit + $wohneinheit = ADBWohneinheitModel::create([ + 'hausnummer_id' => $hausnummer->id, + 'num' => 1, + 'block' => ($block) ? $block : null, + 'stiege' => ($stiege) ? $stiege : null, + 'stock' => ($stock) ? $stock : null, + 'tuer' => ($tuer) ? $tuer : null + ]); + if($wohneinheit->save()) { + $preorder->adb_wohneinheit_id = $wohneinheit->id; + } else { + $this->layout()->setFlash("Konnte Wohneinheit nicht speichern", "warn"); + } + + } + } + } + + } + } + + /* + * validation + */ if(!array_key_exists($data['type'], $campaign->types)) { $this->layout()->setFlash("Bitte Vorbestelltyp auswählen!", "error"); @@ -362,6 +519,12 @@ class PreorderController extends mfBaseController { //var_dump($preorder);exit; + // unset temporary properties + unset($preorder->new_address_city); + unset($preorder->new_address_district); + unset($preorder->new_address_zip); + unset($preorder->new_address_street); + unset($preorder->new_address_housenumber); /* * generate ucode and save @@ -375,7 +538,7 @@ class PreorderController extends mfBaseController { } - $qs = ['filter' => ['campaign_id' => $preorder->preordercampaign_id]]; + $qs = ['filter' => ['preordercampaign_id' => $preorder->preordercampaign_id, 'ucode' => $preorder->ucode]]; $qs = http_build_query($qs); $this->layout()->setFlash("Vorbestellung erfolgreich gespeichert!", "success");