WIP 2024-12-16 ConstructionConsent

This commit is contained in:
Frank Schubert
2024-12-17 14:23:14 +01:00
parent 4b5b1e01f5
commit 8d692db5b1
6 changed files with 314 additions and 31 deletions

View File

@@ -32,25 +32,30 @@
<div class="card-body">
<div class="form-group row">
<label class="col-lg-2 col-form-label" for="object_type">Objekttyp *</label>
<label class="col-lg-2 col-form-label" for="constructionconsentproject_id">Projekt *</label>
<div class="col-lg-10">
<select class="form-control" name="object_type" id="object_type">
<option value="building" <?=($item->object_type == "building" ? "selected='selected'" : "")?>>Gebäude</option>
<option value="street" <?=($item->object_type == "street" ? "selected='selected'" : "")?>>Straße</option>
<select class="form-control" name="constructionconsentproject_id" id="constructionconsentproject_id">
<?php foreach(ConstructionConsentProject::getAll() as $project): ?>
<option value="street" <?=($item->constructionconsentproject_id == $project->id ? "selected='selected'" : "")?>><?=$project->name?></option>
<?php endforeach; ?>
</select>
</div>
</div>
<div id="building-search">
<div class="form-group row">
<label class="col-lg-2 col-form-label" for="adb_hausnummer_id">Adresse/GST *</label>
<div class="col-lg-10">
<select class="form-control" name="adb_hausnummer_id" id="adb_hausnummer_id">
<?php if($item->adb_hausnummer_id): ?>
<option value="<?=$item->adb_hausnummer_id?>" selected="selected"><?=$item->adb_hausnummer->plz->plz?> <?=$item->adb_hausnummer->strasse->ortschaft->name?>, <?=$item->adb_hausnummer->strasse->name?> <?=$item->adb_hausnummer->hausnummer?></option>
<?php endif; ?>
</select>
</div>
<div class="form-group row">
<label class="col-lg-2 col-form-label" for="object_type">Objekttyp *</label>
<div class="col-lg-10">
<select class="form-control" name="object_type" id="object_type">
<option value="building" <?=($item->object_type == "building" ? "selected='selected'" : "")?>>Gebäude</option>
<option value="street" <?=($item->object_type == "street" ? "selected='selected'" : "")?>>Straße/Grunstück</option>
</select>
</div>
</div>
<div class="form-group row">
<label class="col-lg-2 col-form-label" for="name">Name</label>
<div class="col-lg-10">
<input type="text" class="form-control" name="name" id="name" value="<?=$item->name?>" placeholder="z.B. Straße oder Adresse" />
</div>
</div>
@@ -100,7 +105,7 @@
</div>
<script>
$('#adb_hausnummer_id').select2({
/*$('#adb_hausnummer_id').select2({
ajax: {
url: '<?=self::getUrl("AddressDB", "api", ["do" => "findAddress", "include_gst" => 1])?>',
delay: 250,
@@ -117,6 +122,22 @@
}
});
*/
$('#adb_strasse_id').select2({
ajax: {
url: '<?=self::getUrl("ConstructionConsent", "api", ["do" => "findStreet", "project_id" => $project->id])?>',
delay: 250,
dataType: 'json'
},
minimumInputLength: 2,
placeholder: "Suche nach Straße",
allowClear: true
});
$('#adb_strasse_id').on('select2:close', function(e) {
if(!$('#adb_strasse_id').val()) {
$('#new-address-toggle').show();
}
});
</script>
<?php include(realpath(dirname(__FILE__) . "/../../$mfLayoutPackage") . "/footer.php"); ?>

View File

@@ -1,4 +1,5 @@
<?php include(realpath(dirname(__FILE__) . "/../../$mfLayoutPackage") . "/header.php"); ?>
<?php //var_dump($project);exit; ?>
<!-- start page title -->
<div class="row">
<div class="col-12">
@@ -31,6 +32,7 @@
<div class="card">
<div class="card-body">
<h4>Projekt</h4>
<div class="form-group row">
<label class="col-lg-2 col-form-label" for="name">Projektname *</label>
<div class="col-lg-10">
@@ -38,6 +40,20 @@
</div>
</div>
<div class="form-group row">
<label class="col-lg-2 col-form-label" for="email">Emailadresse *</label>
<div class="col-lg-10">
<input type="text" class="form-control" name="email" id="email" value="<?=$project->email?>" />
</div>
</div>
<div class="form-group row">
<label class="col-lg-2 col-form-label" for="phone">Telefonnummer *</label>
<div class="col-lg-10">
<input type="text" class="form-control" name="phone" id="phone" value="<?=$project->phone?>" />
</div>
</div>
<div class="form-group row">
<label class="col-lg-2 col-form-label" for="adb_network_id">Netzgebiete *</label>
<div class="col-lg-10">
@@ -49,7 +65,32 @@
</div>
</div>
<div class="form-group row mt-3">
<h4 class="mt-3">Emailversand</h4>
<div class="form-group row">
<label class="col-lg-2 col-form-label" for="sender_name">Absendername *</label>
<div class="col-lg-10">
<input type="text" class="form-control" name="sender_name" id="sender_name" value="<?=$project->sender_name?>" />
</div>
</div>
<div class="form-group row">
<label class="col-lg-2 col-form-label" for="sender_email">Absender Emailadresse *</label>
<div class="col-lg-10">
<input type="text" class="form-control" name="sender_email" id="sender_email" value="<?=$project->sender_email?>" />
</div>
</div>
<div class="form-group row">
<label class="col-lg-2 col-form-label" for="sender_reply_to">Antworten an (Reply To)</label>
<div class="col-lg-10">
<input type="text" class="form-control" name="sender_reply_to" id="sender_reply_toender_email" value="<?=$project->sender_reply_to?>" />
</div>
</div>
<hr class="mt-3 mb-3" />
<div class="form-group row">
<label class="col-lg-2 col-form-label" for="note">Interne Notiz</label>
<div class="col-lg-10">
<textarea id="note" class="form-control" name="note" rows="5"><?=$project->note?></textarea>

View File

@@ -78,6 +78,9 @@ $pagination_entity_name = "Zustimmungserklärungsprojekte";
<tr>
<th>Projektname</th>
<th>Netzgebiete</th>
<th>Kontakt</th>
<th>Email Absender</th>
<th>Antwort an</th>
<th></th>
</tr>
<?php foreach($projects as $project): ?>
@@ -92,6 +95,12 @@ $pagination_entity_name = "Zustimmungserklärungsprojekte";
</ul>
<?php endif; ?>
</td>
<td>
<?=$project->email?><br />
<?=$project->phone?>
</td>
<td><?=$project->sender_name?> &lt;<?=$project->sender_email?>&gt;</td>
<td><?=$project->sender_reply_to?></td>
<td style="text-align: left; letter-spacing: 4px; font-size: 1.1em;">
<a href="<?=self::getUrl("ConstructionConsentProject", "edit", ["id" => $project->id])?>"><i class="far fa-edit" title="Bearbeiten"></i></a>
</td>

View File

@@ -88,4 +88,160 @@ class ConstructionConsentController extends mfBaseController {
$this->addAction();
}
protected function apiAction() {
if(!$this->me->is(["Admin","netowner"]) && !$this->me->can("Preorder")) {
$this->redirect("Dashboard");
}
$do = $this->request->do;
$data = [];
switch($do) {
case "findStreet":
$return = $this->findStreetApi();
break;
default:
$this->log->warn(__METHOD__ . ": Called API function '$do' does not exist");
$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 findStreetApi() {
$addresses = [];
$search = trim($this->request->q);
$project_id = $this->request->project_id;
$scluster_ids = [];
if($project_id) {
$project = new ConstructionConsentProject($project_id);
if(!$project->id) {
header("Content-Type: application/json");
echo json_encode(["results" => []]);
exit;
}
foreach($project->adb_networks as $network) {
$scluster_ids[] = $network->id;
}
} else {
// get all salesclusters
foreach(ADBNetzgebietModel::getAll() as $network) {
$scluster_ids[] = $network->id;
}
}
$results = [];
$search_parts = explode(" ", $search);
$ort_search = $strasse_search = $plz_search = $hausnummer_search = $gst_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%'";
$gst_search[] = "grund_nr like '%$p%'";
}
$where = "1=1";
if(count($scluster_ids)) {
$where .= " AND netzgebiet_id IN (".implode(', ',$scluster_ids).")";
}
/*if($include_gst) {
$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).") OR (".implode(" OR ", $gst_search).") ) ORDER BY strasse, LENGTH(hausnummer), hausnummer";
} else {
$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";
}*/
$sql = "SELECT strasse_id,plz,ortschaft,strasse 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)."))
GROUP BY plz,ortschaft,strasse,strasse_id
ORDER BY strasse
";
$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_string = $data->plz." ".$data->ortschaft.", ".$data->strasse;
/*if($include_gst) {
$address_string .= " | GST: ".$data->grund_nr;
}*/
$sort_key = $data->plz." ".$data->ortschaft." ".$data->strasse;
$address = [];
$address['id'] = $data->strasse_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<br />\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;
}
}

View File

@@ -35,7 +35,7 @@ class ConstructionConsentProject extends mfBaseModel {
return [];
}
foreach($networks as $network) {
$this->networks[$network->adb_netzgebiet->id] = $network->adb_netzgebiet_id;
$this->networks[$network->adb_netzgebiet->id] = $network->adb_netzgebiet;
}
return $this->networks;
}
@@ -67,7 +67,7 @@ class ConstructionConsentProject extends mfBaseModel {
$model = new ConstructionConsentProject();
$table_fields = [
"name", "note",
"name", "sender_name", "sender_email", "sender_reply_to", "email", "phone", "note",
"create_by","edit_by","create","edit"
];

View File

@@ -18,11 +18,55 @@ class ConstructionConsentProjectController extends mfBaseController {
protected function indexAction() : void {
$this->layout()->setTemplate("ConstructionConsentProject/Index");
if ($this->request->resetFilter) {
unset($_SESSION[MFAPPNAME . '-ConstructionConsentProject-filter']);
}
$filter = [];
if (is_array($this->request->filter)) {
$filter = $this->request->filter;
$_SESSION[MFAPPNAME . '-ConstructionConsentProject-filter'] = $filter;
} else {
if (array_key_exists(MFAPPNAME . '-ConstructionConsentProject-filter', $_SESSION) && count($_SESSION[MFAPPNAME . '-ConstructionConsentProject-filter'])) {
$filter = $_SESSION[MFAPPNAME . '-ConstructionConsentProject-filter'];
}
}
$this->layout->set("filter", $filter);
$filter = $this->getPreparedFilter($filter);
// pagination defaults
$pagination = [];
$pagination['start'] = 0;
$pagination['count'] = 25;
$pagination['maxItems'] = 0;
if (is_numeric($this->request->s)) {
$pagination['start'] = intval($this->request->s);
}
//var_dump($filter);exit;
$pagination['maxItems'] = ConstructionConsentProject::count($filter);
$projects = ConstructionConsentProject::getAll();
$this->layout()->set("projects", $projects);
$this->layout()->set("pagination", $pagination);
}
private function getPreparedFilter($filter) {
$new_filter = [];
if (is_array($filter) && count($filter)) {
foreach ($filter as $name => $value) {
$new_filter[$name] = $value;
}
}
return $new_filter;
}
protected function addAction() {
$this->layout()->setTemplate("ConstructionConsentProject/Form");
@@ -68,18 +112,36 @@ class ConstructionConsentProjectController extends mfBaseController {
$data = [];
$data["name"] = $r->name;
$data["sender_name"] = $r->sender_name;
$data["sender_email"] = $r->sender_email;
$data["sender_reply_to"] = $r->sender_reply_to;
$data["email"] = $r->email;
$data["phone"] = $r->phone;
$data["note"] = $r->note;
if(!$r->name) {
if($mode == "add") {
$project = ConstructionConsentProject::create($data);
} else {
$project->update($data);
}
$this->layout()->set("project", $project);
if(!$r->name || !$r->sender_name || !$r->sender_email || !$r->email || !$r->phone) {
$this->layout()->setFlash("Bitte alle erforderlichen Felder ausfüllen", "error");
$this->redirect("ConstructionConsentProject");
return $this->addAction();
}
if(!is_array($r->adb_netzgebiet_id) || !count($r->adb_netzgebiet_id)) {
$this->layout()->setFlash("Bitte alle erforderlichen Felder ausfüllen", "error");
$this->redirect("ConstructionConsentProject");
$this->layout()->setFlash("Bitte mindestens ein Netzgebiet auswählen", "error");
return $this->addAction();
}
$netzgebiete = [];
if(!$project->save()) {
$this->layout()->setFlash("Fehler beim Speichern", "error");
return $this->addAction();
}
foreach($r->adb_netzgebiet_id as $netzgebiet_id) {
$netzgebiet = new ADBNetzgebiet($netzgebiet_id);
if(!$netzgebiet->id) continue;
@@ -87,20 +149,14 @@ class ConstructionConsentProjectController extends mfBaseController {
$netzgebiete[] = $netzgebiet_id;
}
/*
if($mode == "add") {
$project = ConstructionConsentProject::create($data);
} else {
$project->update($data);
}
}*/
if(!$project->save()) {
$this->layout()->setFlash("Fehler beim Speichern", "error");
if($mode == "add") {
$this->redirect("ConstructionConsentProject", "add");
} else {
$this->redirect("ConstructionConsentProject", "edit", ["id" => $project->id]);
}
}
//save networks
foreach($netzgebiete as $netzgebiet_id) {