Merge branch 'fronkdev' into 'master'
ADB status change & RTR Reporting a10 See merge request fronk/thetool!780
This commit is contained in:
@@ -9,8 +9,8 @@
|
||||
<div class="page-title-box">
|
||||
<div class="page-title-right">
|
||||
<ol class="breadcrumb m-0">
|
||||
<li class="breadcrumb-item"><a href="javascript: void(0);"><?=MFAPPNAME_SLUG?></a></li>
|
||||
<li class="breadcrumb-item"><a href="javascript: void(0);">GWR / AddressDB</a></li>
|
||||
<li class="breadcrumb-item"><a href="<?=self::getUrl("Dashboard")?>"><?=MFAPPNAME_SLUG?></a></li>
|
||||
<li class="breadcrumb-item"><a href="<?=self::getUrl("AddressDB")?>">GWR / AddressDB</a></li>
|
||||
<li class="breadcrumb-item active"><?=$address->strasse->name?> <?=$address->hausnummer?>, <?=$address->plz->plz?> <?=$address->ortschaft->name?></li>
|
||||
</ol>
|
||||
</div>
|
||||
@@ -66,12 +66,22 @@
|
||||
</tr><tr>
|
||||
<td colspan="2"><h4>Status</h4></td>
|
||||
</tr><tr>
|
||||
<th>Status Code</th>
|
||||
<td class="text-monospace"><?=$address->status->code?></td>
|
||||
</tr><tr>
|
||||
<th>Status Text</th>
|
||||
<td class="text-monospace"><?=$address->status->name?></td>
|
||||
</tr><tr>
|
||||
<th>Status</th>
|
||||
<td class="text-monospace">
|
||||
<span id="addressstatus-<?=$address->id?>-text" data-status-id="<?=$address->status_id?>"><span id="addressstatus-<?=$address->id?>-statustext"><?=$address->status->code?> - <?=$address->status->name?></span> <a href="#" onclick="return toggleAddressStatusControl(<?=$address->id?>)"><i class="fas fa-fw fa-edit"></i></a></span>
|
||||
<div class="input-group" id="addressstatus-<?=$address->id?>-input" style="display:none">
|
||||
<select class="form-control">
|
||||
<?php foreach(ADBStatusModel::search(["!type" => "wohneinheit"]) as $status): ?>
|
||||
<option value="<?=$status->id?>" <?=($address->status_id == $status->id) ? "selected='selected'" : ""?>><?=$status->code?> - <?=$status->name?></option>
|
||||
<?php endforeach; ?>
|
||||
</select>
|
||||
<div class="input-group-append">
|
||||
<button type="button" class="btn btn-primary" title="Speichern" onclick="saveAddressStatusControl(<?=$address->id?>)"><i class="fas fa-check"></i></button>
|
||||
<button type="button" class="btn btn-secondary" title="Abbrechen" onclick="toggleAddressStatusControl(<?=$address->id?>)"><i class="fas fa-times"></i></button>
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
</tr><tr>
|
||||
<th>Statusflags</th>
|
||||
<td>
|
||||
<table class="table table-sm table-bordered table-striped bg-white">
|
||||
@@ -158,7 +168,20 @@
|
||||
<?php endif; ?>
|
||||
<?php endif; ?>
|
||||
</td>
|
||||
<td class="text-monospace"><?=$unit->status->code?> - <?=$unit->status->name?></td>
|
||||
<td id="unit-<?=$unit->id?>-status" class="text-monospace">
|
||||
<span id="unitstatus-<?=$unit->id?>-text" data-status-id="<?=$unit->status_id?>"><span id="unitstatus-<?=$unit->id?>-statustext"><?=$unit->status->code?> - <?=$unit->status->name?></span> <a href="#" onclick="return toggleUnitStatusControl(<?=$unit->id?>)"><i class="fas fa-fw fa-edit"></i></a></span>
|
||||
<div class="input-group" id="unitstatus-<?=$unit->id?>-input" style="display:none">
|
||||
<select class="form-control">
|
||||
<?php foreach(ADBStatusModel::search(["!type" => "hausnummer"]) as $status): ?>
|
||||
<option value="<?=$status->id?>" <?=($unit->status_id == $status->id) ? "selected='selected'" : ""?>><?=$status->code?> - <?=$status->name?></option>
|
||||
<?php endforeach; ?>
|
||||
</select>
|
||||
<div class="input-group-append">
|
||||
<button type="button" class="btn btn-primary" title="Speichern" onclick="saveUnitStatusControl(<?=$unit->id?>)"><i class="fas fa-check"></i></button>
|
||||
<button type="button" class="btn btn-secondary" title="Abbrechen" onclick="toggleUnitStatusControl(<?=$unit->id?>)"><i class="fas fa-times"></i></button>
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
<td><?=((string)$unit) ? "<strong>".(string)$unit."</strong>" : ""?></td>
|
||||
<td><?=($unit->extref) ? "[".$unit->extref."]" : ""?></td>
|
||||
<td title="Anzahl Bestellungen"><?=PreorderModel::countActive(["adb_wohneinheit_id" => $unit->id])?></td>
|
||||
@@ -183,4 +206,148 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
|
||||
function toggleAddressStatusControl(pid) {
|
||||
// set select to current status id
|
||||
$("#addressstatus-" + pid + "-input select").val($("#addressstatus-" + pid + "-text").data("status-id"));
|
||||
|
||||
// toggle controls
|
||||
$("#addressstatus-" + pid + "-text").toggle();
|
||||
$("#addressstatus-" + pid + "-input").toggle();
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
function toggleUnitStatusControl(pid) {
|
||||
// set select to current status id
|
||||
$("#unitstatus-" + pid + "-input select").val($("#unitstatus-" + pid + "-text").data("status-id"));
|
||||
|
||||
// toggle controls
|
||||
$("#unitstatus-" + pid + "-text").toggle();
|
||||
$("#unitstatus-" + pid + "-input").toggle();
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
function saveAddressStatusControl(aid) {
|
||||
if(!Number.isInteger(aid) || aid < 1) {
|
||||
return false;
|
||||
}
|
||||
|
||||
var value = $("#addressstatus-" + aid + "-input select").val();
|
||||
|
||||
$.post("<?=self::getUrl("AddressDB","Api")?>",
|
||||
{
|
||||
'do': "updateAddressStatus",
|
||||
id: aid,
|
||||
status_id: value
|
||||
},
|
||||
function(success) {
|
||||
if(success.status == "OK") {
|
||||
var updates = success.result.updates;
|
||||
//console.log(updates);
|
||||
|
||||
$("#addressstatus-" + updates.id + "-statustext").text(updates.status_code + " - " + updates.status_text);
|
||||
$("#addressstatus-" + updates.id + "-text")
|
||||
.addClass("text-success")
|
||||
.data("status-id", updates.status_id);
|
||||
|
||||
setTimeout(() => {
|
||||
$("#addressstatus-" + updates.id + "-text").removeClass("text-success")
|
||||
}, 1500);
|
||||
|
||||
if("units" in updates && updates.units.length) {
|
||||
updates.units.forEach(function (u) {
|
||||
//console.log(u);
|
||||
// update detail status text
|
||||
|
||||
|
||||
/*// update list status text
|
||||
$("#addressstatus-" + u.id + " .status").text(u.code + " - " + u.text);
|
||||
$("#addressstatus-" + u.id + " .status").addClass("text-success");
|
||||
setTimeout(() => { $("#preorder-" + u.id + " .status").removeClass("text-success") }, 1500);
|
||||
*/
|
||||
|
||||
|
||||
if (u.status_code) {
|
||||
// update units
|
||||
$("#unitstatus-" + u.id + "-statustext").text(u.status_code + " - " + u.status_text);
|
||||
$("#unitstatus-" + u.id + "-text").addClass("text-success");
|
||||
setTimeout(() => {
|
||||
$("#unitstatus-" + u.id + "-text").removeClass("text-success")
|
||||
}, 1500);
|
||||
}
|
||||
});
|
||||
}
|
||||
toggleAddressStatusControl(aid);
|
||||
|
||||
}
|
||||
|
||||
},
|
||||
'json');
|
||||
}
|
||||
|
||||
function saveUnitStatusControl(aid) {
|
||||
if(!Number.isInteger(aid) || aid < 1) {
|
||||
return false;
|
||||
}
|
||||
|
||||
var value = $("#unitstatus-" + aid + "-input select").val();
|
||||
|
||||
$.post("<?=self::getUrl("AddressDB","Api")?>",
|
||||
{
|
||||
'do': "updateUnitStatus",
|
||||
id: aid,
|
||||
status_id: value
|
||||
},
|
||||
function(success) {
|
||||
if(success.status == "OK") {
|
||||
var updates = success.result.updates;
|
||||
//console.log(updates);
|
||||
|
||||
/*$("#unitstatus-" + updates.id + "-statustext")
|
||||
.text(updates.status_code + " - " + updates.status_text)
|
||||
.addClass("text-success")
|
||||
$("#unitstatus-" + updates.id + "-text").data("status-id", updates.status_id);
|
||||
|
||||
setTimeout(() => {
|
||||
$("#unitstatus-" + updates.id + "-text").removeClass("text-success")
|
||||
}, 1500);
|
||||
*/
|
||||
|
||||
//console.log(updates.units.length);
|
||||
if("units" in updates && updates.units.length) {
|
||||
updates.units.forEach(function (u) {
|
||||
//console.log(u);
|
||||
// update detail status text
|
||||
|
||||
|
||||
/*// update list status text
|
||||
$("#unitstatus-" + u.id + " .status").text(u.code + " - " + u.text);
|
||||
$("#unitstatus-" + u.id + " .status").addClass("text-success");
|
||||
setTimeout(() => { $("#preorder-" + u.id + " .status").removeClass("text-success") }, 1500);
|
||||
*/
|
||||
|
||||
//console.log(u.status_code);
|
||||
//console.log((u.status_code));
|
||||
if(u.status_code) {
|
||||
// update units
|
||||
$("#unitstatus-" + u.id + "-statustext").text(u.status_code + " - " + u.status_text);
|
||||
$("#unitstatus-" + u.id + "-text").data("status-id", updates.status_id);
|
||||
$("#unit-" + u.id + "-status").addClass("text-success");
|
||||
setTimeout(() => {
|
||||
$("#unit-" + u.id + "-status").removeClass("text-success")
|
||||
}, 1500);
|
||||
}
|
||||
});
|
||||
}
|
||||
toggleUnitStatusControl(aid);
|
||||
|
||||
}
|
||||
|
||||
},
|
||||
'json');
|
||||
}
|
||||
</script>
|
||||
<?php include(realpath(dirname(__FILE__)."/../../$mfLayoutPackage")."/footer.php"); ?>
|
||||
@@ -24,6 +24,9 @@
|
||||
<div class="row col-12">
|
||||
<div><a href="<?=self::getUrl("Admin", "customerStatistics")?>">Kundenstatistiken</a></div>
|
||||
</div>
|
||||
<div class="row col-12">
|
||||
<div><a href="<?=self::getUrl("Admin", "RtrReporting")?>">RTR Reporting</a></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
42
Layout/default/Admin/RtrReporting/Index.php
Normal file
42
Layout/default/Admin/RtrReporting/Index.php
Normal file
@@ -0,0 +1,42 @@
|
||||
<?php include(realpath(dirname(__FILE__)."/../../../$mfLayoutPackage")."/header.php"); ?>
|
||||
|
||||
<!-- start page title -->
|
||||
<div class="row">
|
||||
<div class="col-12">
|
||||
<div class="page-title-box">
|
||||
<div class="page-title-right">
|
||||
<ol class="breadcrumb m-0">
|
||||
<li class="breadcrumb-item"><a href="<?=self::getUrl("Dashboard")?>"><?=MFAPPNAME_SLUG?></a></li>
|
||||
<li class="breadcrumb-item"><a href="<?=self::getUrl("Admin")?>">Admin</a></li>
|
||||
<li class="breadcrumb-item active">RTR Reporting</li>
|
||||
</ol>
|
||||
</div>
|
||||
<h4 class="page-title">RTR Reporting</h4>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- end page title -->
|
||||
|
||||
<div class="row">
|
||||
<div class="col-12 col-xl-10">
|
||||
<h3>RTR Reporting CSVs herunterladen</h3>
|
||||
<div class="card">
|
||||
<div class="card-body">
|
||||
<div class="row col mb-3">
|
||||
<a class="btn btn-primary" href="<?=self::getUrl("Admin", "rtrReporting", ["do" => "a10report"])?>"><i class="fas fa-fw fa-download"></i> A10</a>
|
||||
</div>
|
||||
<div class="row col mb-3">
|
||||
<a class="btn btn-primary" href="<?=self::getUrl("Admin", "rtrReporting", ["do" => "b10report"])?>"><i class="fas fa-fw fa-download"></i> B10</a>
|
||||
</div>
|
||||
<div class="row col mb-3">
|
||||
<a class="btn btn-primary" href="<?=self::getUrl("Admin", "rtrReporting", ["do" => "c10report"])?>"><i class="fas fa-fw fa-download"></i> C10</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
|
||||
<?php include(realpath(dirname(__FILE__)."/../../../$mfLayoutPackage")."/footer.php"); ?>
|
||||
@@ -35,6 +35,8 @@ class ADBHausnummer extends mfBaseModel {
|
||||
$this->getGpsCoords();
|
||||
}
|
||||
|
||||
$this->logChanges();
|
||||
|
||||
|
||||
// Statuschange from Rimo statuschange for all units
|
||||
foreach(ADBWohneinheitModel::search(["hausnummer_id" => $this->id]) as $wohneinheit) {
|
||||
@@ -42,6 +44,34 @@ class ADBHausnummer extends mfBaseModel {
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
public function resetSaveNesting() {
|
||||
mfValuecache::singleton()->delete("adbhausnummer-save-nesting-level-" . $this->id);
|
||||
}
|
||||
|
||||
private function logChanges() {
|
||||
$changes = $this->getChangedFields();
|
||||
if(!count($changes)) return true;
|
||||
|
||||
$logstr = "";
|
||||
|
||||
foreach($changes as $key) {
|
||||
if($key == "status_id") {
|
||||
$old_status = new ADBStatus($this->_old_data->status_id);
|
||||
$new_status = new ADBStatus($this->data->status_id);
|
||||
$logstr .= "| '$key' => FROM '".$this->_old_data->$key."' TO '".$this->data->$key."' [".$old_status->code." => ".$new_status->code."]";
|
||||
} else {
|
||||
$logstr .= "| '$key' => FROM '".$this->_old_data->$key."' TO '".$this->data->$key."'";
|
||||
}
|
||||
}
|
||||
|
||||
$me = new User();
|
||||
$me->loadMe();
|
||||
$this->log->info(__CLASS__." Changes: User ".$me->username." $logstr");
|
||||
|
||||
return true;
|
||||
|
||||
}
|
||||
|
||||
public function getBuildingType() {
|
||||
|
||||
195
application/ADBRimoFcp/ADBRimoFcp.php
Normal file
195
application/ADBRimoFcp/ADBRimoFcp.php
Normal file
@@ -0,0 +1,195 @@
|
||||
<?php
|
||||
|
||||
class ADBRimoFcp extends mfBaseModel {
|
||||
|
||||
protected function init() {
|
||||
$this->db = FronkDB::singleton(ADDRESSDB_DBHOST, ADDRESSDB_DBUSER, ADDRESSDB_DBPASS, ADDRESSDB_DBNAME);
|
||||
$this->table = "RimoFcp";
|
||||
}
|
||||
|
||||
public function getProperty($name) {
|
||||
if($this->$name == null) {
|
||||
|
||||
$classname = ucfirst($name);
|
||||
$idfield = $name."_id";
|
||||
$this->$name = new $classname($this->$idfield);
|
||||
|
||||
if($this->$name->id) {
|
||||
return $this->$name;
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
return $this->$name;
|
||||
}
|
||||
|
||||
/********************************
|
||||
* Begin static Model functions
|
||||
*/
|
||||
|
||||
public static function create(Array $data) {
|
||||
$model = new ADBRimoFcp();
|
||||
|
||||
$table_fields = [
|
||||
"netzgebiet_id", "name", "rimo_id", "label", "building_type", "rimo_ex_state", "rimo_op_state", "gps_lat", "gps_long",
|
||||
"create","edit"
|
||||
];
|
||||
|
||||
foreach($data as $field => $value) {
|
||||
if(in_array($field, $table_fields)) {
|
||||
$model->$field = $value;
|
||||
}
|
||||
}
|
||||
|
||||
return $model;
|
||||
}
|
||||
|
||||
public static function getFirst($filter) {
|
||||
$db = FronkDB::singleton(ADDRESSDB_DBHOST, ADDRESSDB_DBUSER, ADDRESSDB_DBPASS, ADDRESSDB_DBNAME);
|
||||
|
||||
$where = self::getSqlFilter($filter);
|
||||
$sql = "SELECT RimoFcp.* FROM RimoFcp
|
||||
WHERE $where
|
||||
ORDER BY name
|
||||
LIMIT 1";
|
||||
|
||||
mfLoghandler::singleton()->debug($sql);
|
||||
|
||||
$res = $db->query($sql);
|
||||
if($db->num_rows($res)) {
|
||||
$data = $db->fetch_object($res);
|
||||
$item = new ADBRimoFcp($data);
|
||||
if($item->id) {
|
||||
return $item;
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public static function getAll() {
|
||||
$items = [];
|
||||
|
||||
$db = FronkDB::singleton(ADDRESSDB_DBHOST, ADDRESSDB_DBUSER, ADDRESSDB_DBPASS, ADDRESSDB_DBNAME);
|
||||
|
||||
$res = $db->select("RimoFcp", "*", "1=1 ORDER BY name");
|
||||
if($db->num_rows($res)) {
|
||||
while($data = $db->fetch_object($res)) {
|
||||
$items[] = new ADBRimoFcp($data);
|
||||
}
|
||||
}
|
||||
return $items;
|
||||
|
||||
}
|
||||
|
||||
|
||||
public static function count($filter) {
|
||||
$db = FronkDB::singleton(ADDRESSDB_DBHOST, ADDRESSDB_DBUSER, ADDRESSDB_DBPASS, ADDRESSDB_DBNAME);
|
||||
|
||||
$where = self::getSqlFilter($filter);
|
||||
$sql = "SELECT COUNT(*) as cnt FROM RimoFcp
|
||||
WHERE $where
|
||||
";
|
||||
|
||||
$res = $db->query($sql);
|
||||
if($db->num_rows($res)) {
|
||||
$data = $db->fetch_object($res);
|
||||
return $data->cnt;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
public static function search($filter, $limit = false) {
|
||||
$items = [];
|
||||
$db = FronkDB::singleton(ADDRESSDB_DBHOST, ADDRESSDB_DBUSER, ADDRESSDB_DBPASS, ADDRESSDB_DBNAME);
|
||||
|
||||
$where = self::getSqlFilter($filter);
|
||||
$sql = "SELECT RimoFcp.* FROM RimoFcp
|
||||
WHERE $where
|
||||
ORDER BY name";
|
||||
|
||||
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'];
|
||||
} elseif(is_numeric($limit['count'])) {
|
||||
$sql .= " LIMIT ".$limit['count'];
|
||||
}
|
||||
}
|
||||
|
||||
$res = $db->query($sql);
|
||||
if($db->num_rows($res)) {
|
||||
while($data = $db->fetch_object($res)) {
|
||||
$items[] = new ADBRimoFcp($data);
|
||||
}
|
||||
}
|
||||
return $items;
|
||||
}
|
||||
|
||||
private static function getSqlFilter($filter) {
|
||||
$where = "1=1 ";
|
||||
|
||||
$db = FronkDB::singleton(ADDRESSDB_DBHOST, ADDRESSDB_DBUSER, ADDRESSDB_DBPASS, ADDRESSDB_DBNAME);
|
||||
|
||||
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).")";
|
||||
} elseif($netzgebiet_id === null) {
|
||||
$where .= " AND netzgebiet_id IS NULL";
|
||||
}
|
||||
}
|
||||
|
||||
if(array_key_exists("name", $filter)) {
|
||||
$name = $db->escape($filter['name']);
|
||||
if($name) {
|
||||
$where .= " AND RimoFcp.name='$name'";
|
||||
}
|
||||
}
|
||||
|
||||
if(array_key_exists("label", $filter)) {
|
||||
$label = $db->escape($filter['label']);
|
||||
if($label) {
|
||||
$where .= " AND RimoFcp.label='$label'";
|
||||
}
|
||||
}
|
||||
|
||||
if(array_key_exists("building_type", $filter)) {
|
||||
$building_type = $db->escape($filter['building_type']);
|
||||
if($building_type) {
|
||||
$where .= " AND RimoFcp.building_type='$building_type'";
|
||||
}
|
||||
}
|
||||
|
||||
if(array_key_exists("rimo_ex_state", $filter)) {
|
||||
$rimo_ex_state = $db->escape($filter['rimo_ex_state']);
|
||||
if($rimo_ex_state) {
|
||||
$where .= " AND RimoFcp.rimo_ex_state='$rimo_ex_state'";
|
||||
}
|
||||
}
|
||||
|
||||
if(array_key_exists("rimo_op_state", $filter)) {
|
||||
$rimo_op_state = $db->escape($filter['rimo_op_state']);
|
||||
if($rimo_op_state) {
|
||||
$where .= " AND RimoFcp.rimo_op_state='$rimo_op_state'";
|
||||
}
|
||||
}
|
||||
|
||||
if(array_key_exists("rimo_id", $filter)) {
|
||||
$rimo_id = $db->escape($filter['rimo_id']);
|
||||
if($rimo_id) {
|
||||
$where .= " AND RimoFcp.rimo_id='$rimo_id'";
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
//var_dump($filter, $where);exit;
|
||||
return $where;
|
||||
}
|
||||
}
|
||||
@@ -120,6 +120,7 @@ class ADBStatusModel {
|
||||
$where = "1=1 ";
|
||||
|
||||
//var_dump($filter);exit;
|
||||
$db = FronkDB::singleton(ADDRESSDB_DBHOST, ADDRESSDB_DBUSER, ADDRESSDB_DBPASS, ADDRESSDB_DBNAME);
|
||||
|
||||
if(array_key_exists("code", $filter)) {
|
||||
$code = $filter['code'];
|
||||
@@ -127,6 +128,20 @@ class ADBStatusModel {
|
||||
$where .= " AND code=$code";
|
||||
}
|
||||
}
|
||||
|
||||
if(array_key_exists("type", $filter)) {
|
||||
$type = $db->escape($filter['type']);
|
||||
if($type) {
|
||||
$where .= " AND type='$type'";
|
||||
}
|
||||
}
|
||||
|
||||
if(array_key_exists("!type", $filter)) {
|
||||
$type = $db->escape($filter['!type']);
|
||||
if($type) {
|
||||
$where .= " AND (type IS NULL OR NOT type='$type')";
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//var_dump($filter, $where);exit;
|
||||
|
||||
@@ -30,6 +30,7 @@ class ADBWohneinheit extends mfBaseModel {
|
||||
return true;
|
||||
}
|
||||
|
||||
$this->logChanges();
|
||||
// Statuschange from Rimo statuschange
|
||||
AddressDB::handleRimoStatusUpdate($this->id);
|
||||
|
||||
@@ -77,6 +78,34 @@ class ADBWohneinheit extends mfBaseModel {
|
||||
|
||||
}
|
||||
|
||||
public function resetSaveNesting() {
|
||||
mfValuecache::singleton()->delete("adbwohneinheit-save-nesting-level-" . $this->id);
|
||||
}
|
||||
|
||||
private function logChanges() {
|
||||
$changes = $this->getChangedFields();
|
||||
if(!count($changes)) return true;
|
||||
|
||||
$logstr = "";
|
||||
|
||||
foreach($changes as $key) {
|
||||
if($key == "status_id") {
|
||||
$old_status = new ADBStatus($this->_old_data->status_id);
|
||||
$new_status = new ADBStatus($this->data->status_id);
|
||||
$logstr .= "| '$key' => FROM '".$this->_old_data->$key."' TO '".$this->data->$key."' [".$old_status->code." => ".$new_status->code."]";
|
||||
} else {
|
||||
$logstr .= "| '$key' => FROM '".$this->_old_data->$key."' TO '".$this->data->$key."'";
|
||||
}
|
||||
}
|
||||
|
||||
$me = new User();
|
||||
$me->loadMe();
|
||||
$this->log->info(__CLASS__." Changes: User ".$me->username." $logstr");
|
||||
|
||||
return true;
|
||||
|
||||
}
|
||||
|
||||
public function setNewStatusCode($new_status_code) {
|
||||
if(!$new_status_code) return false;
|
||||
|
||||
|
||||
@@ -27,11 +27,54 @@ class Address extends mfBaseModel {
|
||||
|
||||
$this->generateFibuAccountNumber();
|
||||
$this->syncToFibuMerge();
|
||||
$this->getCoords();
|
||||
|
||||
$this->in_after_save--;
|
||||
|
||||
}
|
||||
|
||||
|
||||
public function getCoords() {
|
||||
$update_needed = false;
|
||||
if($this->id) {
|
||||
$changes = $this->getChangedFields();
|
||||
foreach($changes as $key => $change) {
|
||||
if($key == "street" || $key == "zip" || $key == "city") {
|
||||
$update_needed = true;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
$update_needed = true;
|
||||
}
|
||||
|
||||
|
||||
|
||||
if(!$this->gps_lat || !$this->gps_long || !$this->laea) {
|
||||
$update_needed = true;
|
||||
}
|
||||
|
||||
if(!$update_needed) return true;
|
||||
|
||||
|
||||
$gps_search = [
|
||||
'country' => $this->getProperty("country")->isocode,
|
||||
'city' => $this->city,
|
||||
'zip' => $this->zip,
|
||||
'street' => $this->street
|
||||
];
|
||||
|
||||
$gps = Gmaps_Geocoding::getCoords($gps_search);
|
||||
if(!is_array($gps) || !count($gps) == 2) return false;
|
||||
|
||||
$this->gps_lat = $gps[0];
|
||||
$this->gps_long = $gps[1];
|
||||
|
||||
$this->laea = (new Building())->getLaeaCoordinates($this->gps_lat, $this->gps_long);
|
||||
$this->save();
|
||||
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public function generateFibuAccountNumber() {
|
||||
if($this->fibu_account_number) {
|
||||
return true;
|
||||
|
||||
@@ -742,6 +742,12 @@ class AddressDBController extends mfBaseController {
|
||||
case "findAddress":
|
||||
$return = $this->findAddressApi();
|
||||
break;
|
||||
case "updateAddressStatus":
|
||||
$return = $this->updateAddressStatusApi();
|
||||
break;
|
||||
case "updateUnitStatus":
|
||||
$return = $this->updateUnitStatusApi();
|
||||
break;
|
||||
case "getFilteredBuildings":
|
||||
$return = $this->getFilteredBuildingsApi();
|
||||
break;
|
||||
@@ -783,7 +789,117 @@ class AddressDBController extends mfBaseController {
|
||||
$data['result'] = $return;
|
||||
$this->returnJson($data);
|
||||
}
|
||||
|
||||
|
||||
private function updateAddressStatusApi() {
|
||||
$address_id = $this->request->id;
|
||||
|
||||
if(!is_numeric($address_id) || $address_id < 1) {
|
||||
return ["error" => 1];
|
||||
return false;
|
||||
}
|
||||
|
||||
$address = new ADBHausnummer($address_id);
|
||||
if(!$address->id) {
|
||||
return ["error" => 2];
|
||||
return false;
|
||||
}
|
||||
|
||||
$status_id = $this->request->status_id;
|
||||
if(!is_numeric($status_id) || $status_id < 1) {
|
||||
return ["error" => 3];
|
||||
return false;
|
||||
}
|
||||
|
||||
$status = new ADBStatus($status_id);
|
||||
if(!$status->id) {
|
||||
return ["error" => 4];
|
||||
return false;
|
||||
}
|
||||
|
||||
$address->status_id = $status_id;
|
||||
$address->save();
|
||||
|
||||
$update = [
|
||||
"id" => $address_id,
|
||||
"status_id" => $status_id,
|
||||
"status_code" => $status->code,
|
||||
"status_text" => $status->name,
|
||||
"units" => []
|
||||
];
|
||||
|
||||
foreach(ADBWohneinheitModel::search(["hausnummer_id" => $address->id]) as $affected_unit) {
|
||||
$up = [
|
||||
"id" => $affected_unit->id,
|
||||
"status_id" => $affected_unit->status_id,
|
||||
"status_code" => $affected_unit->status->code,
|
||||
"status_text" => $affected_unit->status->name,
|
||||
];
|
||||
|
||||
$update["units"][] = $up;
|
||||
}
|
||||
|
||||
return ["message" => "Status saved successfully", "id" => $address_id, "updates" => $update];
|
||||
}
|
||||
|
||||
private function updateUnitStatusApi() {
|
||||
$unit_id = $this->request->id;
|
||||
|
||||
if(!is_numeric($unit_id) || $unit_id < 1) {
|
||||
return ["error" => 1];
|
||||
return false;
|
||||
}
|
||||
|
||||
$unit = new ADBWohneinheit($unit_id);
|
||||
if(!$unit->id) {
|
||||
return ["error" => 2];
|
||||
return false;
|
||||
}
|
||||
|
||||
$status_id = $this->request->status_id;
|
||||
if(!is_numeric($status_id) || $status_id < 1) {
|
||||
return ["error" => 3];
|
||||
return false;
|
||||
}
|
||||
|
||||
$status = new ADBStatus($status_id);
|
||||
if(!$status->id) {
|
||||
return ["error" => 4];
|
||||
return false;
|
||||
}
|
||||
|
||||
$linkes_units = [];
|
||||
foreach(ADBWohneinheitModel::search(["hausnummer_id" => $unit->hausnummer_id]) as $lu) {
|
||||
$linkes_units[$lu->id] = $lu->status_id;
|
||||
}
|
||||
|
||||
$unit->status_id = $status_id;
|
||||
$unit->save();
|
||||
|
||||
$update = [
|
||||
"id" => $unit_id,
|
||||
"status_id" => $status_id,
|
||||
"status_code" => $status->code,
|
||||
"status_text" => $status->name,
|
||||
"units" => []
|
||||
];
|
||||
|
||||
foreach(ADBWohneinheitModel::search(["hausnummer_id" => $unit->hausnummer_id]) as $affected_unit) {
|
||||
if(!array_key_exists($affected_unit->id, $linkes_units)) continue;
|
||||
if($linkes_units[$affected_unit->id] == $affected_unit->status_id) continue;
|
||||
|
||||
$up = [
|
||||
"id" => $affected_unit->id,
|
||||
"status_id" => $affected_unit->status_id,
|
||||
"status_code" => $affected_unit->status->code,
|
||||
"status_text" => $affected_unit->status->name,
|
||||
];
|
||||
|
||||
$update["units"][] = $up;
|
||||
}
|
||||
|
||||
return ["message" => "Status saved successfully", "id" => $unit_id, "updates" => $update];
|
||||
}
|
||||
|
||||
private function getUnitApi() {
|
||||
$id = $this->request->id;
|
||||
if(!$id) return false;
|
||||
|
||||
@@ -47,6 +47,37 @@ class AdminController extends mfBaseController {
|
||||
$this->layout()->set("xinon_active_customers_total", $xinon_active_customers_total);
|
||||
|
||||
|
||||
}
|
||||
|
||||
protected function rtrReporting() {
|
||||
require_once(realpath(dirname(__FILE__)."/functions")."/RtrReporting.php");
|
||||
|
||||
$this->layout()->setTemplate("Admin/RtrReporting/Index");
|
||||
|
||||
$rtrreporting = new Admin_RtrReporting($this->request);
|
||||
$response = $rtrreporting->runRequest();
|
||||
|
||||
foreach(["info", "success", "warning", "error"] as $level) {
|
||||
if(array_key_exists($level, $response) && $response[$level]) {
|
||||
$this->layout()->setFlash($response[$level], $level);
|
||||
}
|
||||
}
|
||||
|
||||
if($response["redirect"]) {
|
||||
$this->redirect($response["redirect"]);
|
||||
}
|
||||
|
||||
if($response["template"]) {
|
||||
$this->layout()->setTemplate($response["template"]);
|
||||
}
|
||||
|
||||
if(is_array($response["templateVars"]) && count($response["templateVars"])) {
|
||||
foreach($response["templateVars"] as $key => $value) {
|
||||
$this->layout()->set($key, $value);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
protected function createNetworkAddressForNetowner() {
|
||||
|
||||
154
application/Admin/functions/RtrReporting.php
Normal file
154
application/Admin/functions/RtrReporting.php
Normal file
@@ -0,0 +1,154 @@
|
||||
<?php
|
||||
|
||||
class Admin_RtrReporting {
|
||||
private $request;
|
||||
private $db;
|
||||
private $log;
|
||||
private $flash = [];
|
||||
|
||||
public function __construct($request = false) {
|
||||
$this->request = $request;
|
||||
$this->db = FronkDB::singleton();
|
||||
$this->log = mfLoghandler::singleton();
|
||||
|
||||
}
|
||||
|
||||
public function runRequest() {
|
||||
$action = $this->request->do;
|
||||
if(!$action) {
|
||||
return $this->indexAction();
|
||||
} else {
|
||||
$method = $action."Action";
|
||||
if(method_exists($this, $method)) {
|
||||
return $this->$method();
|
||||
} else {
|
||||
throw new Exception("Method not found", "404");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public function indexAction() {
|
||||
|
||||
return [
|
||||
"template" => "Admin/RtrReporting/Index",
|
||||
"redirect" => "",
|
||||
"templateVars" => []
|
||||
];
|
||||
}
|
||||
|
||||
public function a10reportAction() {
|
||||
// alle anschlüsse
|
||||
|
||||
$rasterpunkte = [];
|
||||
foreach(BuildingModel::getAll() as $building) {
|
||||
$raster = $building->laea;
|
||||
if(!$raster) continue;
|
||||
|
||||
$prod_code = 14310;
|
||||
$bb = "1000,00"; // glas = 1000, funk = 50
|
||||
//$user_count = TerminationModel::count(["building_id" => $building->id]);
|
||||
$rtr100m = Rtr100mRaster::getFirst(["raster" => $raster]);
|
||||
if(!$rtr100m) {
|
||||
die("RTR Raster fehlt ".$raster);
|
||||
}
|
||||
$user_count = $rtr100m->unit_count;
|
||||
|
||||
if(!array_key_exists($raster, $rasterpunkte)) {
|
||||
$rasterpunkte[$raster] = [];
|
||||
}
|
||||
if(!array_key_exists($prod_code, $rasterpunkte[$raster])) {
|
||||
$rasterpunkte[$raster][$prod_code] = [
|
||||
"bb" => $bb,
|
||||
"user_count" => 0
|
||||
];
|
||||
}
|
||||
$rasterpunkte[$raster][$prod_code]["user_count"] += $user_count;
|
||||
}
|
||||
|
||||
$building = new Building();
|
||||
$eigen_product_ids = $this->getEigenProductIds();
|
||||
foreach(ContractModel::search(["product_id" => $eigen_product_ids]) as $contract) {
|
||||
if($contract->termination_id) continue;
|
||||
|
||||
$address = $contract->owner;
|
||||
if(!$address->gps_lat || !$address->gps_long || !$address->laea) {
|
||||
$address->save(); // gets gps and laea
|
||||
}
|
||||
|
||||
$raster = $address->laea;
|
||||
if(!$raster) continue;
|
||||
|
||||
$rtr_code = $contract->product->attributes["rtr_tech_code"]->value;
|
||||
if(substr($rtr_code, 0, 4) == 1431) {
|
||||
$prod_code = 14310;
|
||||
$bb = "1000,00";
|
||||
} elseif(substr($rtr_code, 0, 4) == 1042) {
|
||||
$prod_code = 10420;
|
||||
$bb = "50,00";
|
||||
} else {
|
||||
continue; // incompatible product
|
||||
}
|
||||
|
||||
if(!array_key_exists($raster, $rasterpunkte)) {
|
||||
$rasterpunkte[$raster] = [];
|
||||
}
|
||||
if(!array_key_exists($prod_code, $rasterpunkte[$raster])) {
|
||||
$rasterpunkte[$raster][$prod_code] = [
|
||||
"bb" => $bb,
|
||||
"user_count" => 0
|
||||
];
|
||||
}
|
||||
|
||||
$rtr100m = Rtr100mRaster::getFirst(["raster" => $raster]);
|
||||
if(!$rtr100m) {
|
||||
$this->log->warn(__METHOD__.": RTR Raster fehlt ".$raster);
|
||||
continue;
|
||||
}
|
||||
|
||||
$rasterpunkte[$raster][$prod_code]["user_count"] += $rtr100m->unit_count;
|
||||
|
||||
}
|
||||
|
||||
$csv_header = "rasterid;code;dl_min_max_bb;dl_q25_max_bb;dl_avg_max_bb;dl_max_max_bb;ul_min_max_bb;ul_q25_max_bb;ul_avg_max_bb;ul_max_max_bb;dl_min_n_bb;dl_q25_n_bb;dl_avg_n_bb;dl_avg_n_bb;ul_min_n_bb;ul_q25_n_bb;ul_avg_n_bb;ul_avg_n_bb;anz_anschl_cov";
|
||||
$csv = $csv_header."\n";
|
||||
foreach($rasterpunkte as $rastercode => $raster) {
|
||||
foreach($raster as $prod_code => $data) {
|
||||
$csv .= $rastercode . ";";
|
||||
$csv .= $prod_code . ";";
|
||||
for($i = 0; $i < 16; $i++) {
|
||||
$csv .= $data["bb"] . ";";
|
||||
}
|
||||
$csv .= $data["user_count"];
|
||||
$csv .= "\n";
|
||||
}
|
||||
}
|
||||
|
||||
header("Content-type: text/csv; charset=utf-8");
|
||||
header('Content-disposition: attachment; filename="rtr-A10-report-'.date('Y-m-d_H-i-s').'.csv"');
|
||||
|
||||
echo $csv;
|
||||
exit;
|
||||
}
|
||||
|
||||
/*
|
||||
* 1042% = radio
|
||||
* 1431% = fiber
|
||||
*/
|
||||
private function getEigenProductIds() {
|
||||
$product_ids = [];
|
||||
|
||||
$sql = "SELECT product_id FROM `ProductAttribute`
|
||||
LEFT JOIN ProducttechAttribute ON (ProductAttribute.producttechattribute_id = ProducttechAttribute.id)
|
||||
WHERE ProducttechAttribute.name='rtr_tech_code'
|
||||
AND (ProductAttribute.value LIKE '1042%' OR ProductAttribute.value LIKE '1431%')";
|
||||
|
||||
$res = $this->db->query($sql);
|
||||
while($data = $this->db->fetch_object($res)) {
|
||||
$product_ids[] = $data->product_id;
|
||||
}
|
||||
|
||||
return $product_ids;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@@ -200,11 +200,17 @@ class Building extends mfBaseModel {
|
||||
return null;
|
||||
}
|
||||
|
||||
public function getLaeaCoordinates() {
|
||||
if(!$this->gps_lat || !$this->gps_lat) {
|
||||
return false;
|
||||
public function getLaeaCoordinates($gps_lat = 0, $gps_long = 0) {
|
||||
if(!$gps_lat || !$gps_long) {
|
||||
$gps_lat = $this->gps_lat;
|
||||
$gps_long = $this->gps_long;
|
||||
}
|
||||
|
||||
|
||||
|
||||
if(!$gps_lat || !$gps_long) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Elipsenparameter der Erdoberfläche
|
||||
$a = 6378137;
|
||||
$e = 0.081819191;
|
||||
@@ -221,8 +227,8 @@ class Building extends mfBaseModel {
|
||||
$PI = M_PI;
|
||||
|
||||
// Umrechnung der Eingabekoordinaten in rad
|
||||
$Lat = $this->gps_lat * $PI / 180;
|
||||
$Lon = $this->gps_long * $PI / 180;
|
||||
$Lat = $gps_lat * $PI / 180;
|
||||
$Lon = $gps_long * $PI / 180;
|
||||
|
||||
// Berechnungen
|
||||
$q = (1 - $e ** 2) * ((sin($Lat) / (1 - $e ** 2 * sin($Lat) ** 2)) - ((1 / (2 * $e)) * log((1 - $e * sin($Lat)) / (1 + $e * sin($Lat)))));
|
||||
|
||||
167
application/Rtr100mRaster/Rtr100mRaster.php
Normal file
167
application/Rtr100mRaster/Rtr100mRaster.php
Normal file
@@ -0,0 +1,167 @@
|
||||
<?php
|
||||
|
||||
class Rtr100mRaster extends mfBaseModel {
|
||||
|
||||
public function getProperty($name) {
|
||||
if($this->$name == null) {
|
||||
|
||||
$classname = ucfirst($name);
|
||||
$idfield = $name."_id";
|
||||
$this->$name = mfValuecache::singleton()->get("mfObjectmodel-$name-".$this->$idfield);
|
||||
if(!$this->$name) {
|
||||
$this->$name = new $classname($this->$idfield);
|
||||
}
|
||||
|
||||
if($this->$name->id) {
|
||||
mfValuecache::singleton()->set("mfObjectmodel-$name-".$this->$name->id, $this->$name);
|
||||
return $this->$name;
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return $this->$name;
|
||||
}
|
||||
|
||||
/********************************
|
||||
* Begin static Model functions
|
||||
*/
|
||||
|
||||
public static function create(Array $data) {
|
||||
$model = new Rtr100mRaster();
|
||||
|
||||
$table_fields = [
|
||||
"raster", "unit_count",
|
||||
"create_by","edit_by","create","edit"
|
||||
];
|
||||
|
||||
foreach($data as $field => $value) {
|
||||
if(in_array($field, $table_fields)) {
|
||||
$model->$field = $value;
|
||||
}
|
||||
}
|
||||
|
||||
$me = new User();
|
||||
$me->loadMe();
|
||||
|
||||
|
||||
if($model->create_by === null) {
|
||||
$model->create_by = $me->id;
|
||||
}
|
||||
if($model->edit_by === null) {
|
||||
$model->edit_by = $me->id;
|
||||
}
|
||||
|
||||
return $model;
|
||||
}
|
||||
|
||||
public static function getAll() {
|
||||
$items = [];
|
||||
|
||||
$db = FronkDB::singleton();
|
||||
|
||||
$res = $db->select("Rtr100mRaster", "*",);
|
||||
if($db->num_rows($res)) {
|
||||
while($data = $db->fetch_object($res)) {
|
||||
$items[] = new Rtr100mRaster($data);
|
||||
}
|
||||
}
|
||||
return $items;
|
||||
|
||||
}
|
||||
|
||||
public static function getFirst($filter) {
|
||||
$db = FronkDB::singleton();
|
||||
|
||||
$where = self::getSqlFilter($filter);
|
||||
$sql = "SELECT * FROM Rtr100mRaster
|
||||
WHERE $where
|
||||
LIMIT 1";
|
||||
//var_dump($sql);exit;
|
||||
$res = $db->query($sql);
|
||||
if($db->num_rows($res)) {
|
||||
$data = $db->fetch_object($res);
|
||||
$item = new Rtr100mRaster($data);
|
||||
if($item->id) {
|
||||
return $item;
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public static function count($filter) {
|
||||
$db = FronkDB::singleton();
|
||||
|
||||
$where = self::getSqlFilter($filter);
|
||||
$sql = "SELECT COUNT(*) as cnt FROM Rtr100mRaster
|
||||
WHERE $where";
|
||||
|
||||
//mfLoghandler::singleton()->debug($sql);
|
||||
|
||||
$res = $db->query($sql);
|
||||
if($db->num_rows($res)) {
|
||||
$data = $db->fetch_object($res);
|
||||
return $data->cnt;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
public static function search($filter, $limit = false, $order = false) {
|
||||
//var_dump($filter);exit;
|
||||
$items = [];
|
||||
|
||||
if(!$order) {
|
||||
$order = "";
|
||||
} else {
|
||||
$order = "ORDER BY $order";
|
||||
}
|
||||
|
||||
$db = FronkDB::singleton();
|
||||
|
||||
$where = self::getSqlFilter($filter);
|
||||
$sql = "SELECT * FROM Rtr100mRaster
|
||||
WHERE $where
|
||||
$order";
|
||||
|
||||
if(is_array($limit) && count($limit)) {
|
||||
if(is_numeric($limit['start']) && is_numeric($limit['count'])) {
|
||||
$sql .= " LIMIT ".$limit['start'].", ".$limit['count'];
|
||||
} elseif(is_numeric($limit['count'])) {
|
||||
$sql .= " LIMIT ".$limit['count'];
|
||||
}
|
||||
}
|
||||
|
||||
mfLoghandler::singleton()->debug($sql);
|
||||
|
||||
$res = $db->query($sql);
|
||||
if($db->num_rows($res)) {
|
||||
while($data = $db->fetch_object($res)) {
|
||||
$items[$data->id] = new Rtr100mRaster($data);
|
||||
}
|
||||
}
|
||||
|
||||
return $items;
|
||||
}
|
||||
|
||||
private static function getSqlFilter($filter) {
|
||||
$where = "1=1 ";
|
||||
|
||||
if(array_key_exists("raster", $filter)) {
|
||||
$raster = FronkDB::singleton()->escape($filter["raster"]);
|
||||
if($raster) {
|
||||
$where .= " AND raster='$raster'";
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if(array_key_exists("add-where", $filter)) {
|
||||
$where .= " ".$filter['add-where'];
|
||||
}
|
||||
|
||||
//var_dump($filter, $where);exit;
|
||||
return $where;
|
||||
}
|
||||
}
|
||||
37
db/migrations/20241128191804_address_add_gps_and_laea.php
Normal file
37
db/migrations/20241128191804_address_add_gps_and_laea.php
Normal file
@@ -0,0 +1,37 @@
|
||||
<?php
|
||||
declare(strict_types=1);
|
||||
|
||||
use Phinx\Migration\AbstractMigration;
|
||||
|
||||
final class AddressAddGpsAndLaea extends AbstractMigration
|
||||
{
|
||||
public function up(): void
|
||||
{
|
||||
if($this->getEnvironment() == "thetool") {
|
||||
$table = $this->table("Address");
|
||||
$table->addColumn("gps_lat", "decimal", ["null" => true, "default" => null, "precision" => 15, "scale" => 10, "after" => "country_id"]);
|
||||
$table->addColumn("gps_long", "decimal", ["null" => true, "default" => null, "precision" => 15, "scale" => 10, "after" => "gps_lat"]);
|
||||
$table->addColumn("laea", "string", ["null" => true, "default" => null, "limit" => 64, "after" => "gps_long"]);
|
||||
$table->update();
|
||||
}
|
||||
|
||||
if($this->getEnvironment() == "addressdb") {
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
public function down(): void
|
||||
{
|
||||
if($this->getEnvironment() == "thetool") {
|
||||
$this->table("Address")
|
||||
->removeColumn("laea")
|
||||
->removeColumn("gps_long")
|
||||
->removeColumn("gps_lat")
|
||||
->update();
|
||||
}
|
||||
|
||||
if($this->getEnvironment() == "addressdb") {
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
31
db/migrations/20241205145604_adb_status_add_type.php
Normal file
31
db/migrations/20241205145604_adb_status_add_type.php
Normal file
@@ -0,0 +1,31 @@
|
||||
<?php
|
||||
declare(strict_types=1);
|
||||
|
||||
use Phinx\Migration\AbstractMigration;
|
||||
|
||||
final class AdbStatusAddType extends AbstractMigration
|
||||
{
|
||||
public function up(): void
|
||||
{
|
||||
if($this->getEnvironment() == "thetool") {
|
||||
|
||||
}
|
||||
|
||||
if($this->getEnvironment() == "addressdb") {
|
||||
$table = $this->table("Status");
|
||||
$table->addColumn("type", "enum", ["null" => true, "default" => null, "values" => "hausnummer,wohneinheit", "after" => "name"]);
|
||||
$table->update();
|
||||
}
|
||||
}
|
||||
|
||||
public function down(): void
|
||||
{
|
||||
if($this->getEnvironment() == "thetool") {
|
||||
|
||||
}
|
||||
|
||||
if($this->getEnvironment() == "addressdb") {
|
||||
$this->table("Status")->removeColumn("type")->update();
|
||||
}
|
||||
}
|
||||
}
|
||||
38
db/migrations/20241205201225_create_rtr_100m_raster.php
Normal file
38
db/migrations/20241205201225_create_rtr_100m_raster.php
Normal file
@@ -0,0 +1,38 @@
|
||||
<?php
|
||||
declare(strict_types=1);
|
||||
|
||||
use Phinx\Migration\AbstractMigration;
|
||||
|
||||
final class CreateRtr100mRaster extends AbstractMigration
|
||||
{
|
||||
public function up(): void
|
||||
{
|
||||
if($this->getEnvironment() == "thetool") {
|
||||
$table = $this->table("Rtr100mRaster");
|
||||
$table->addColumn("raster", "string", ["null" => false, "limit" => 32]);
|
||||
$table->addColumn("unit_count", "integer", ["null" => false]);
|
||||
|
||||
$table->addColumn("create_by", "integer", ["null" => false]);
|
||||
$table->addColumn("edit_by", "integer", ["null" => false]);
|
||||
$table->addColumn("create", "integer", ["null" => false]);
|
||||
$table->addColumn("edit", "integer", ["null" => false]);
|
||||
|
||||
$table->create();
|
||||
}
|
||||
|
||||
if($this->getEnvironment() == "addressdb") {
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
public function down(): void
|
||||
{
|
||||
if($this->getEnvironment() == "thetool") {
|
||||
$this->table("Rtr100mRaster")->drop()->save();
|
||||
}
|
||||
|
||||
if($this->getEnvironment() == "addressdb") {
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -23,7 +23,7 @@ class Gmaps_Geocoding {
|
||||
$address = urlencode($address);
|
||||
|
||||
$url = TT_GEOCODING_API_URL."?address=$address&key=".TT_GEOCODING_API_SECRET;
|
||||
|
||||
|
||||
$cstr = "";
|
||||
if(count($components)) {
|
||||
$component_string = implode("|", $components);
|
||||
@@ -41,10 +41,10 @@ class Gmaps_Geocoding {
|
||||
return false;
|
||||
}
|
||||
$results = $json->results;
|
||||
if(count($results) > 1) {
|
||||
/*if(count($results) > 1) {
|
||||
$log->warn(__FILE__.": Got more then 1 result. Aborting. ($url)");
|
||||
return false;
|
||||
}
|
||||
}*/
|
||||
$lat = $results[0]->geometry->location->lat;
|
||||
$long = $results[0]->geometry->location->lng;
|
||||
|
||||
|
||||
4
scripts/import/.gitignore
vendored
Normal file
4
scripts/import/.gitignore
vendored
Normal file
@@ -0,0 +1,4 @@
|
||||
*
|
||||
!.gitignore
|
||||
!100mraster
|
||||
!100mraster/*
|
||||
108
scripts/import/100mraster/import-100m-raster.php
Normal file
108
scripts/import/100mraster/import-100m-raster.php
Normal file
@@ -0,0 +1,108 @@
|
||||
#!/usr/bin/php
|
||||
<?php
|
||||
|
||||
//require 'vendor/autoload.php';
|
||||
require("../../../config/config.php");
|
||||
|
||||
define('FRONKDB_SQLDEBUG',false);
|
||||
error_reporting(E_ALL & ~(E_NOTICE | E_STRICT | E_DEPRECATED));
|
||||
|
||||
require_once(LIBDIR."/mvcfronk/mfRouter/mfRouter.php");
|
||||
require_once(LIBDIR."/mvcfronk/mfBase/mfBaseModel.php");
|
||||
require_once(LIBDIR."/mvcfronk/mfBase/mfBaseController.php");
|
||||
|
||||
$me = new User(1);
|
||||
define("INTERNAL_USER_ID", $me->id);
|
||||
define("INTERNAL_USER_USERNAME", $me->username);
|
||||
|
||||
$bundeslaender = [
|
||||
"Burgenland",
|
||||
"Kaernten",
|
||||
"Niederoesterreich",
|
||||
"Oberoesterreich",
|
||||
"Salzburg",
|
||||
"Steiermark",
|
||||
"Tirol",
|
||||
"Vorarlberg",
|
||||
"Wien"
|
||||
];
|
||||
|
||||
$db = FronkDB::singleton();
|
||||
$log = mfLoghandler::singleton();
|
||||
|
||||
$start = date("U");
|
||||
$last_ts = $start;
|
||||
echo "Begin: ".date("Y-m-d H:i:s")."\n";
|
||||
|
||||
$c = 0;
|
||||
|
||||
$queries = [];
|
||||
$insert_values = [];
|
||||
|
||||
foreach($bundeslaender as $bland) {
|
||||
$filename = __DIR__ . "/csv/StatistikAustria_100mRaster_Anschlusspotential2022_$bland.csv";
|
||||
|
||||
if(!file_exists($filename)) {
|
||||
die("File $filename not found!\n");
|
||||
}
|
||||
|
||||
echo "$bland\n";
|
||||
|
||||
$input = fopen($filename, "r");
|
||||
|
||||
$bom = "\xef\xbb\xbf";
|
||||
if(fgets($input, 4) !== $bom) {
|
||||
// BOM not found - rewind pointer to start of file.
|
||||
rewind($input);
|
||||
|
||||
}
|
||||
|
||||
$headers = [];
|
||||
|
||||
$i = 0;
|
||||
while($csv = fgetcsv($input, 0, ";")) {
|
||||
$i++;
|
||||
|
||||
if($i == 1) {
|
||||
foreach($csv as $key => $name) {
|
||||
$headers[$name] = $key;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
if(!trim($csv[0])) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$raster = trim($csv[$headers["rasterid"]]);
|
||||
$unit_count = trim($csv[$headers["anschlusspotential"]]);
|
||||
|
||||
$sql = "INSERT INTO `Rtr100mRaster` (`raster`,`unit_count`,`create_by`,`edit_by`,`create`,`edit`) VALUES";
|
||||
$insert_values[] = "('$raster',$unit_count,1,1,1733431100,1733431100)";
|
||||
|
||||
$c++;
|
||||
|
||||
|
||||
if($c % 100000 == 0) {
|
||||
runQuery($sql.implode(",", $insert_values), $c);
|
||||
$insert_values = [];
|
||||
}
|
||||
}
|
||||
if(count($insert_values)) {
|
||||
runQuery($sql . implode(",", $insert_values), $c);
|
||||
$insert_values = [];
|
||||
$c = 0;
|
||||
}
|
||||
echo "\n";
|
||||
}
|
||||
|
||||
function runQuery($sql, $c) {
|
||||
global $db;
|
||||
global $last_ts;
|
||||
|
||||
mysqli_query($db->link, $sql);
|
||||
|
||||
$now = date("U");
|
||||
echo "$c: ".date("Y-m-d H:i:s")." - delta ".($now - $last_ts)."\n";
|
||||
$last_ts = $now;
|
||||
}
|
||||
Reference in New Issue
Block a user