Added filter to Voiceplan

This commit is contained in:
Frank Schubert
2023-12-05 22:09:00 +01:00
parent 8717db1a4d
commit dbc8d24810
5 changed files with 123 additions and 13 deletions

View File

@@ -53,7 +53,7 @@
<div class="form-group row">
<label class="col-lg-2 col-form-label" for="price_multiplicator">Verkaufspreis Multiplikator *</label>
<div class="col-lg-10">
<input type="price_multiplicator" class="form-control" name="price_multiplicator" id="price_multiplicator" value="<?=(float)$plan->price_multiplicator?>" placeholder="1" />
<input type="price_multiplicator" class="form-control" name="price_multiplicator" id="price_multiplicator" value="<?=($plan->price_multiplicator) ? (float)$plan->price_multiplicator : ""?>" />
</div>
</div>

View File

@@ -21,10 +21,52 @@
</div>
</div>
<!-- end page title -->
<div class="row">
<div class="col-lg-12">
<div class="card">
<div class="card-body mb-3">
<h4 class="header-title mb-3">Filter</h4>
<form method="get" action="<?=self::getUrl("Voiceplan", "view")?>">
<input type="hidden" name="id" value="<?=$plan->id?>" />
<div class="row">
<div class="col-2">
<label class="form-label" for="filter_name">Zone</label>
<input type="text" class="form-control" name="filter[name]" id="filter_name" value="<?=$filter['name']?>" />
</div>
<div class="col-2">
<label class="form-label" for="filter_prefix">Destination Prefix</label>
<input type="text" class="form-control" name="filter[prefix]" id="filter_prefix" value="<?=$filter['prefix']?>" />
</div>
<div class="col-2">
<label class="form-label" for="filter_destination">Verkaufspreis</label>
<select name="filter[price_difference]" class="form-control">
<option></option>
<option value="same">Stimmt mit Multiplikator überein</option>
<option value="diff">Weicht von Multiplikator ab</option>
</select>
</div>
</div>
<div class="row mt-2">
<div class="col">
<button type="submit" class="btn btn-primary">Filter anwenden</button>
<a class="btn btn-secondary" href="<?=self::getUrl("Voiceplan", "view", ["id" => $plan->id, "resetFilter" => 1])?>">Filter zurücksetzen</a>
</div>
<!--<div class="col">
<button class="btn btn-info" type="button" onclick="refreshMap()"><i class="far fa-map"></i> Auf Karte anzeigen</button>
</div>-->
</div>
</form>
</div>
</div>
<div class="card">
<div class="card-body mb-3">
<div class="row">
@@ -55,8 +97,12 @@
<?php foreach($zones as $zone): ?>
<tr>
<td><a href="<?=self::getUrl("Voiceplanzone", "view", ["id" => $zone->id])?>"><?=$zone->name?></a></td>
<td><?=(count($zone->destinations) > 1) ? count($zone->destinations)." Destinations" : "<spam class='text-monospace'>+".$zone->destinations[0]->prefix."</span>"?></td>
<td><?=($zone->increment_first && $zone->increment) ? $zone->increment_first."/".$zone->increment : ""?></td>
<?php if(count($zone->destinations) > 1): ?>
<td title="<?php foreach($zone->destinations as $d): ?>+<?=$d->prefix."\n"?><?php endforeach; ?>"><?=count($zone->destinations)?> Destinations</td>
<?php else: ?>
<td><spam class='text-monospace'>+<?=$zone->destinations[0]->prefix?></span></td>
<?php endif; ?>
<td><?=($zone->increment_first && $zone->increment) ? $zone->increment_first."/".$zone->increment : ""?></td>
<td><?=$zone->purchase_price?></td>
<td><?=$zone->price?></td>
<td><?=date("d.m.Y H:i", $plan->create)?> (<?=$plan->creator->name?>)</td>

View File

@@ -64,6 +64,17 @@ class VoiceplanController extends mfBaseController {
$this->layout()->set("plan", $plan);
$filter = [];
if(is_array($this->request->filter)) {
$filter = $this->request->filter;
}
$this->layout->set("filter", $filter);
if($filter) {
$filter = $this->getPreparedViewFilter($filter);
}
$pagination = [];
$pagination['start'] = 0;
$pagination['count'] = 20;
@@ -73,14 +84,36 @@ class VoiceplanController extends mfBaseController {
$pagination['start'] = intval($this->request->s);
}
$pagination['maxItems'] = VoiceplanzoneModel::count(['voiceplan_id' => $id]);
$zones = VoiceplanzoneModel::search(['voiceplan_id' => $id], $pagination);
$zone_search = $filter;
$zone_search['voiceplan_id'] = $id;
$pagination['maxItems'] = VoiceplanzoneModel::count($zone_search);
$zones = VoiceplanzoneModel::search($zone_search, $pagination);
$this->layout()->set("zones", $zones);
$this->layout()->set("pagination", $pagination);
}
private function getPreparedViewFilter($filter) {
$new_filter = [];
if(array_key_exists("prefix", $filter) && $filter['prefix']) {
$prefix = $filter['prefix'];
if(substr($prefix, 0, 1) == "+") {
$prefix = substr($prefix, 1)."%";
}
$new_filter['prefix'] = $prefix;
unset($filter['prefix']);
}
foreach($filter as $name => $value) {
$new_filter[$name] = $value;
}
return $new_filter;
}
protected function addAction() {
$this->layout()->setTemplate("Voiceplan/Form");
@@ -124,7 +157,7 @@ class VoiceplanController extends mfBaseController {
$data = [];
$data['name'] = $r->name;
$data['description'] = $r->description;
$data['price_multiplicator'] = ($r->price_multiplicator) ? $r->price_multiplicator : 1;
$data['price_multiplicator'] = ($r->price_multiplicator) ? $r->price_multiplicator : null;
if($r->increment) {

View File

@@ -77,9 +77,20 @@ class VoiceplanzoneModel {
$db = FronkDB::singleton();
$where = self::getSqlFilter($filter);
$sql = "SELECT COUNT(*) as cnt FROM Voiceplanzone
/*$sql = "SELECT COUNT(*) as cnt FROM Voiceplanzone
LEFT JOIN Voiceplan ON (Voiceplanzone.voiceplan_id = Voiceplan.id)
LEFT JOIN Voiceplandestination ON (Voiceplandestination.voiceplanzone_id = Voiceplanzone.id)
WHERE $where
";
*/
$sql = "SELECT COUNT(*) as cnt FROM (
SELECT Voiceplanzone.* FROM Voiceplanzone
LEFT JOIN Voiceplan ON (Voiceplanzone.voiceplan_id = Voiceplan.id)
LEFT JOIN Voiceplandestination ON (Voiceplandestination.voiceplanzone_id = Voiceplanzone.id)
WHERE $where
GROUP BY Voiceplanzone.id
) c
";
$res = $db->query($sql);
if($db->num_rows($res)) {
@@ -95,9 +106,12 @@ class VoiceplanzoneModel {
$where = self::getSqlFilter($filter);
$sql = "SELECT * FROM Voiceplanzone
$sql = "SELECT Voiceplanzone.* FROM Voiceplanzone
LEFT JOIN Voiceplan ON (Voiceplanzone.voiceplan_id = Voiceplan.id)
LEFT JOIN Voiceplandestination ON (Voiceplandestination.voiceplanzone_id = Voiceplanzone.id)
WHERE $where
ORDER BY voiceplan_id,name";
GROUP BY Voiceplanzone.id
ORDER BY voiceplan_id,Voiceplanzone.name";
if(is_array($limit) && count($limit)) {
if(is_numeric($limit['start']) && is_numeric($limit['count'])) {
@@ -107,6 +121,7 @@ class VoiceplanzoneModel {
}
}
mfLoghandler::singleton()->debug($sql);
$res = $db->query($sql);
if($db->num_rows($res)) {
@@ -132,17 +147,33 @@ class VoiceplanzoneModel {
if(array_key_exists("name", $filter)) {
$name = FronkDB::singleton()->escape($filter['name']);
if($name) {
$where .= " AND name='$name'";
$where .= " AND Voiceplanzone.name like '%$name%'";
}
}
if(array_key_exists("extref", $filter)) {
$extref = FronkDB::singleton()->escape($filter['extref']);
if($extref) {
$where .= " AND extref='$extref'";
$where .= " AND Voiceplanzone.extref='$extref'";
}
}
if(array_key_exists("prefix", $filter)) {
$prefix = FronkDB::singleton()->escape($filter['prefix']);
if($prefix) {
$where .= " AND Voiceplandestination.prefix LIKE '$prefix'";
}
}
if(array_key_exists("price_difference", $filter)) {
if($filter['price_difference'] == "same") {
$where .= " AND IF(Voiceplan.price_multiplicator > 0, price = ROUND(Voiceplan.price_multiplicator * purchase_price, 4), 1=1)";
} elseif($filter['price_difference'] == "diff") {
$where .= " AND IF(Voiceplan.price_multiplicator > 0, price <> ROUND(Voiceplan.price_multiplicator * purchase_price, 4), 1=1)";
}
}
//var_dump($filter, $where);exit;
return $where;
}

View File

@@ -9,7 +9,7 @@ final class VoiceplanAddPriceMultiplicator extends AbstractMigration
{
if($this->getEnvironment() == "thetool") {
$table = $this->table("Voiceplan");
$table->addColumn("price_multiplicator", "decimal", ["null" => false, "default" => 1.000, "precision" => 8, "scale" => 4, "after" => "increment"]);
$table->addColumn("price_multiplicator", "decimal", ["null" => true, "default" => null, "precision" => 8, "scale" => 4, "after" => "increment"]);
$table->update();
}