Überarbeitung Dashboard
parent
8bef4b9621
commit
a5a21fb925
|
@ -8,11 +8,6 @@ use Illuminate\Support\Facades\Http;
|
||||||
class Api
|
class Api
|
||||||
{
|
{
|
||||||
|
|
||||||
public function __construct()
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public static function get(string $path, string $query = ''): ?array
|
public static function get(string $path, string $query = ''): ?array
|
||||||
{
|
{
|
||||||
|
|
||||||
|
@ -20,7 +15,7 @@ class Api
|
||||||
$request = $endpoint.$path;
|
$request = $endpoint.$path;
|
||||||
|
|
||||||
if (Cache::has($request)) {
|
if (Cache::has($request)) {
|
||||||
return Cache::get($request);
|
// return Cache::get($request);
|
||||||
}
|
}
|
||||||
|
|
||||||
$get = Http::timeout(1600)->get($request);
|
$get = Http::timeout(1600)->get($request);
|
||||||
|
|
|
@ -5,7 +5,7 @@ namespace App;
|
||||||
class Chart
|
class Chart
|
||||||
{
|
{
|
||||||
public static function colors(int $count = 5){
|
public static function colors(int $count = 5){
|
||||||
$colors = ['#fff7fb','#ece7f2','#d0d1e6','#a6bddb','#74a9cf','#3690c0','#0570b0','#045a8d','#023858'];
|
$colors = ['#bfd3e6','#8c96c6','#88419d','#810f7c','#4d004b'];
|
||||||
return json_encode($colors);
|
return json_encode($colors);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -59,7 +59,7 @@ span + button{
|
||||||
}
|
}
|
||||||
|
|
||||||
button[popovertarget]{
|
button[popovertarget]{
|
||||||
background: no-repeat center / .3em #5470c6 url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 192 512'%3E%3C!--!Font Awesome Free 6.7.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2025 Fonticons, Inc.--%3E%3Cpath fill='%23fff' d='M48 80a48 48 0 1 1 96 0A48 48 0 1 1 48 80zM0 224c0-17.7 14.3-32 32-32l64 0c17.7 0 32 14.3 32 32l0 224 32 0c17.7 0 32 14.3 32 32s-14.3 32-32 32L32 512c-17.7 0-32-14.3-32-32s14.3-32 32-32l32 0 0-192-32 0c-17.7 0-32-14.3-32-32z'/%3E%3C/svg%3E%0A");
|
background: no-repeat center / .3em #4d004b url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 192 512'%3E%3C!--!Font Awesome Free 6.7.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2025 Fonticons, Inc.--%3E%3Cpath fill='%23fff' d='M48 80a48 48 0 1 1 96 0A48 48 0 1 1 48 80zM0 224c0-17.7 14.3-32 32-32l64 0c17.7 0 32 14.3 32 32l0 224 32 0c17.7 0 32 14.3 32 32s-14.3 32-32 32L32 512c-17.7 0-32-14.3-32-32s14.3-32 32-32l32 0 0-192-32 0c-17.7 0-32-14.3-32-32z'/%3E%3C/svg%3E%0A");
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
width: 1.5em;
|
width: 1.5em;
|
||||||
|
@ -242,7 +242,7 @@ article>header>h2{
|
||||||
}
|
}
|
||||||
|
|
||||||
.leaflet-marker-icon span{
|
.leaflet-marker-icon span{
|
||||||
background: blue;
|
background: #4d004b;
|
||||||
width: 2rem;
|
width: 2rem;
|
||||||
height: 2rem;
|
height: 2rem;
|
||||||
display: block;
|
display: block;
|
||||||
|
@ -256,17 +256,17 @@ article>header>h2{
|
||||||
|
|
||||||
/*['#9ecae1','#6baed6','#4292c6','#2171b5','#084594'*/
|
/*['#9ecae1','#6baed6','#4292c6','#2171b5','#084594'*/
|
||||||
.leaflet-marker-icon.region1 span{
|
.leaflet-marker-icon.region1 span{
|
||||||
background: #9ecae1;
|
background: #8c96c6;
|
||||||
}
|
}
|
||||||
|
|
||||||
.leaflet-marker-icon.region2 span{
|
.leaflet-marker-icon.region2 span{
|
||||||
background: #6baed6;
|
background: #88419d;
|
||||||
}
|
}
|
||||||
|
|
||||||
.leaflet-marker-icon.region3 span{
|
.leaflet-marker-icon.region3 span{
|
||||||
background: #4292c6;
|
background: #810f7c;
|
||||||
}
|
}
|
||||||
|
|
||||||
.leaflet-marker-icon.region4 span{
|
.leaflet-marker-icon.region4 span{
|
||||||
background: #2171b5;
|
background: #4d004b;
|
||||||
}
|
}
|
||||||
|
|
|
@ -49,7 +49,7 @@
|
||||||
|
|
||||||
const sharedOptions = {
|
const sharedOptions = {
|
||||||
basic: {
|
basic: {
|
||||||
color: ['#9ecae1','#6baed6','#4292c6','#2171b5','#08519c','#08306b'],
|
color: {!! $chartOptions['colors'] !!},
|
||||||
grid: {
|
grid: {
|
||||||
top: 20,
|
top: 20,
|
||||||
left: 60,
|
left: 60,
|
||||||
|
@ -165,7 +165,7 @@ const cPropsPerRegionOptions = {
|
||||||
fontWeight: 'bold',
|
fontWeight: 'bold',
|
||||||
},
|
},
|
||||||
type: 'category',
|
type: 'category',
|
||||||
data: {!! $propsPerRegion[0] !!}
|
data: {!! $propsPerRegion[1] !!}
|
||||||
},
|
},
|
||||||
yAxis: {
|
yAxis: {
|
||||||
type: 'value',
|
type: 'value',
|
||||||
|
@ -178,7 +178,7 @@ const cPropsPerRegionOptions = {
|
||||||
},
|
},
|
||||||
series: [
|
series: [
|
||||||
{
|
{
|
||||||
data: {!! $propsPerRegion[1] !!},
|
data: {!! $propsPerRegion[2] !!},
|
||||||
type: 'bar',
|
type: 'bar',
|
||||||
itemStyle: {
|
itemStyle: {
|
||||||
color: (e) => {
|
color: (e) => {
|
||||||
|
|
|
@ -11,12 +11,6 @@
|
||||||
<dt>Zum letzten mal gefunden</dt>
|
<dt>Zum letzten mal gefunden</dt>
|
||||||
<dd>{{ $base['last_found'] }}</dd>
|
<dd>{{ $base['last_found'] }}</dd>
|
||||||
</dl>
|
</dl>
|
||||||
<h2>Kurzzeitmietobjekte in der Nähe</h2>
|
|
||||||
<ul>
|
|
||||||
@foreach($neighbours as $n)
|
|
||||||
<li><a href="/prop/{{ $n['id'] }}">{{ $n['lat'] }}, {{$n['lon']}}</a></li>
|
|
||||||
@endforeach
|
|
||||||
</ul>
|
|
||||||
</div>
|
</div>
|
||||||
@endsection
|
@endsection
|
||||||
|
|
||||||
|
@ -27,8 +21,13 @@
|
||||||
<article class="header" style="grid-area: chart1;">
|
<article class="header" style="grid-area: chart1;">
|
||||||
<header>
|
<header>
|
||||||
<h2 id="belegung-title">
|
<h2 id="belegung-title">
|
||||||
Belegung am
|
Kalenderansicht der Belegung am <span class="date">{{ $startDate }}</span>
|
||||||
</h2>
|
</h2><button popovertarget="popup-cal"></button>
|
||||||
|
<div popover id="popup-cal">
|
||||||
|
<p>
|
||||||
|
Das Kalenderdiagram zeigt die drei Verfügbarkeitskategorien des Mietobjekts.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
</header>
|
</header>
|
||||||
<div id="chart-calendar"></div>
|
<div id="chart-calendar"></div>
|
||||||
</article>
|
</article>
|
||||||
|
@ -43,7 +42,7 @@
|
||||||
<article class="header" style="grid-area: chart3;">
|
<article class="header" style="grid-area: chart3;">
|
||||||
<header>
|
<header>
|
||||||
<h2>
|
<h2>
|
||||||
Auslastung nach Monat am 2024-04-15T07:06:22
|
Belegung Mietobjekt Monate am <span class="date">{{ $startDate }}</span>
|
||||||
</h2>
|
</h2>
|
||||||
</header>
|
</header>
|
||||||
<div id="chart-capacity-monthly">
|
<div id="chart-capacity-monthly">
|
||||||
|
@ -65,12 +64,35 @@
|
||||||
<article class="header" style="grid-area: chart4;">
|
<article class="header" style="grid-area: chart4;">
|
||||||
<header>
|
<header>
|
||||||
<h2>
|
<h2>
|
||||||
Auslastung Tage für Monat
|
Belegung Mietobjekt Tage am <span class="date">{{ $startDate }}</span>
|
||||||
</h2>
|
</h2>
|
||||||
</header>
|
</header>
|
||||||
<div id="chart-capacity-daily">
|
<div id="chart-capacity-daily">
|
||||||
</article>
|
</article>
|
||||||
<script type="module">
|
<script type="module">
|
||||||
|
|
||||||
|
const sharedOptions = {
|
||||||
|
basic: {
|
||||||
|
color: {!! $chartOptions['colors'] !!},
|
||||||
|
grid: {
|
||||||
|
top: 20,
|
||||||
|
left: 60,
|
||||||
|
right: 0,
|
||||||
|
bottom: 50
|
||||||
|
},
|
||||||
|
name: (opt) => {
|
||||||
|
return {
|
||||||
|
name: opt.name,
|
||||||
|
nameLocation: opt.location,
|
||||||
|
nameGap: 24,
|
||||||
|
nameTextStyle: {
|
||||||
|
fontWeight: 'bold',
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
const chartTimeline = document.getElementById('timeline');
|
const chartTimeline = document.getElementById('timeline');
|
||||||
const cTimeline = echarts.init(chartTimeline);
|
const cTimeline = echarts.init(chartTimeline);
|
||||||
|
|
||||||
|
@ -123,6 +145,9 @@ const cCapacityMonthlyOptions = {
|
||||||
},
|
},
|
||||||
series: [{
|
series: [{
|
||||||
type: 'bar',
|
type: 'bar',
|
||||||
|
itemStyle: {
|
||||||
|
color: sharedOptions.basic.color[3]
|
||||||
|
},
|
||||||
data: {!! json_encode($cM['capacities']) !!}
|
data: {!! json_encode($cM['capacities']) !!}
|
||||||
}]
|
}]
|
||||||
},
|
},
|
||||||
|
@ -132,7 +157,6 @@ const cCapacityMonthlyOptions = {
|
||||||
|
|
||||||
cCapacityMonthly.setOption(cCapacityMonthlyOptions);
|
cCapacityMonthly.setOption(cCapacityMonthlyOptions);
|
||||||
|
|
||||||
|
|
||||||
const chartCapacityDaily = document.getElementById('chart-capacity-daily');
|
const chartCapacityDaily = document.getElementById('chart-capacity-daily');
|
||||||
const cCapacityDaily = echarts.init(chartCapacityDaily);
|
const cCapacityDaily = echarts.init(chartCapacityDaily);
|
||||||
|
|
||||||
|
@ -163,6 +187,9 @@ const cCapacityDailyOptions = {
|
||||||
},
|
},
|
||||||
series: [{
|
series: [{
|
||||||
type: 'bar',
|
type: 'bar',
|
||||||
|
itemStyle: {
|
||||||
|
color: sharedOptions.basic.color[3]
|
||||||
|
},
|
||||||
data: {!! json_encode($cD['capacities']) !!}
|
data: {!! json_encode($cD['capacities']) !!}
|
||||||
}]
|
}]
|
||||||
},
|
},
|
||||||
|
@ -176,7 +203,7 @@ const chartCapacity = document.getElementById('chart-capacity');
|
||||||
const cCapacity = echarts.init(chartCapacity);
|
const cCapacity = echarts.init(chartCapacity);
|
||||||
|
|
||||||
const cCapacityOptions = {
|
const cCapacityOptions = {
|
||||||
color: ['#9ecae1','#6baed6','#4292c6','#2171b5','#084594'],
|
color: sharedOptions.basic.color,
|
||||||
legend: {
|
legend: {
|
||||||
data: ['Auslastung Property', 'Auslastung {{ $base['region_name'] }}', 'Auslastung alle Regionen']
|
data: ['Auslastung Property', 'Auslastung {{ $base['region_name'] }}', 'Auslastung alle Regionen']
|
||||||
},
|
},
|
||||||
|
@ -324,7 +351,10 @@ cCalendar.setOption(cCalendarOptions);
|
||||||
|
|
||||||
cTimeline.on('timelinechanged', (e) => {
|
cTimeline.on('timelinechanged', (e) => {
|
||||||
|
|
||||||
h2Belegung.innerText = "Belegung am "+cCalendarOptions.timeline.data[e.currentIndex];
|
let dateTitles = document.querySelectorAll('span.date');
|
||||||
|
dateTitles.forEach(el => {
|
||||||
|
el.innerText = cTimelineOptions.timeline.data[e.currentIndex];
|
||||||
|
});
|
||||||
|
|
||||||
// Set markpoint on linechart
|
// Set markpoint on linechart
|
||||||
let x = cCapacityOptions.xAxis.data[e.currentIndex];
|
let x = cCapacityOptions.xAxis.data[e.currentIndex];
|
||||||
|
@ -373,6 +403,7 @@ function icon(id = 0){
|
||||||
}
|
}
|
||||||
|
|
||||||
const markers = L.featureGroup([
|
const markers = L.featureGroup([
|
||||||
|
L.marker([{{ $base['check_data'] }}], {icon: icon(1)}),
|
||||||
@foreach($neighbours as $n)
|
@foreach($neighbours as $n)
|
||||||
L.marker([{{ $n['lat'] }}, {{ $n['lon'] }}], {icon: icon()}).bindPopup('<a href="/property/{{ $n['id'] }}">{{ $n['lat'] }}, {{ $n['lon'] }}</a>'),
|
L.marker([{{ $n['lat'] }}, {{ $n['lon'] }}], {icon: icon()}).bindPopup('<a href="/property/{{ $n['id'] }}">{{ $n['lat'] }}, {{ $n['lon'] }}</a>'),
|
||||||
@endforeach
|
@endforeach
|
||||||
|
|
|
@ -32,7 +32,7 @@
|
||||||
<article class="header" style="grid-area: chart3;">
|
<article class="header" style="grid-area: chart3;">
|
||||||
<header>
|
<header>
|
||||||
<h2>
|
<h2>
|
||||||
Auslastung nach Monat am 2024-04-15T07:06:22
|
Auslastung der Region nach Monat am <span class="date">{{ $startDate }}</span>
|
||||||
</h2>
|
</h2>
|
||||||
</header>
|
</header>
|
||||||
<div id="chart-capacity-monthly">
|
<div id="chart-capacity-monthly">
|
||||||
|
@ -54,7 +54,7 @@
|
||||||
<article class="header" style="grid-area: chart4;">
|
<article class="header" style="grid-area: chart4;">
|
||||||
<header>
|
<header>
|
||||||
<h2>
|
<h2>
|
||||||
Auslastung Tage für Monat
|
Auslastung der Region nach Wochentage am <span class="date">{{ $startDate }}</span>
|
||||||
</h2>
|
</h2>
|
||||||
</header>
|
</header>
|
||||||
<div id="chart-capacity-daily">
|
<div id="chart-capacity-daily">
|
||||||
|
@ -64,7 +64,7 @@
|
||||||
|
|
||||||
const sharedOptions = {
|
const sharedOptions = {
|
||||||
basic: {
|
basic: {
|
||||||
color: ['#9ecae1','#6baed6','#4292c6','#2171b5','#084594'],
|
color: {!! $chartOptions['colors'] !!},
|
||||||
grid: {
|
grid: {
|
||||||
top: 20,
|
top: 20,
|
||||||
left: 60,
|
left: 60,
|
||||||
|
@ -95,6 +95,7 @@ const cCapacityOptions = {
|
||||||
trigger: 'axis',
|
trigger: 'axis',
|
||||||
valueFormatter: (value) => value.toFixed(2)+' %'
|
valueFormatter: (value) => value.toFixed(2)+' %'
|
||||||
},
|
},
|
||||||
|
color: sharedOptions.basic.color,
|
||||||
grid: {
|
grid: {
|
||||||
top: 20,
|
top: 20,
|
||||||
left: 25,
|
left: 25,
|
||||||
|
@ -134,7 +135,7 @@ const cCapacityOptions = {
|
||||||
name: 'Auslastung Region',
|
name: 'Auslastung Region',
|
||||||
type: 'line',
|
type: 'line',
|
||||||
symbolSize: 7,
|
symbolSize: 7,
|
||||||
data: {!! json_encode($regionCapacities['all']['capacities']) !!}
|
data: {!! json_encode($regionCapacities['region']['capacities']) !!}
|
||||||
}]
|
}]
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -170,6 +171,9 @@ const cCapacityMonthlyOptions = {
|
||||||
},
|
},
|
||||||
series: [{
|
series: [{
|
||||||
type: 'bar',
|
type: 'bar',
|
||||||
|
itemStyle: {
|
||||||
|
color: sharedOptions.basic.color[3]
|
||||||
|
},
|
||||||
data: {!! json_encode($m['capacities']) !!}
|
data: {!! json_encode($m['capacities']) !!}
|
||||||
}]
|
}]
|
||||||
},
|
},
|
||||||
|
@ -209,6 +213,9 @@ const cCapacityDailyOptions = {
|
||||||
},
|
},
|
||||||
series: [{
|
series: [{
|
||||||
type: 'bar',
|
type: 'bar',
|
||||||
|
itemStyle: {
|
||||||
|
color: sharedOptions.basic.color[3]
|
||||||
|
},
|
||||||
data: {!! json_encode($d['capacities']) !!}
|
data: {!! json_encode($d['capacities']) !!}
|
||||||
}]
|
}]
|
||||||
},
|
},
|
||||||
|
@ -284,6 +291,7 @@ const cPredictionOptions = {
|
||||||
},
|
},
|
||||||
@else
|
@else
|
||||||
{
|
{
|
||||||
|
color: sharedOptions.basic.color,
|
||||||
graphic: {
|
graphic: {
|
||||||
elements: []
|
elements: []
|
||||||
},
|
},
|
||||||
|
@ -424,6 +432,11 @@ cTimeline.setOption(cTimelineOptions);
|
||||||
|
|
||||||
cTimeline.on('timelinechanged', (e) => {
|
cTimeline.on('timelinechanged', (e) => {
|
||||||
|
|
||||||
|
let dateTitles = document.querySelectorAll('span.date');
|
||||||
|
dateTitles.forEach(el => {
|
||||||
|
el.innerText = cTimelineOptions.timeline.data[e.currentIndex];
|
||||||
|
});
|
||||||
|
|
||||||
// Set markpoint on linechart
|
// Set markpoint on linechart
|
||||||
let x = cCapacityOptions.xAxis.data[e.currentIndex];
|
let x = cCapacityOptions.xAxis.data[e.currentIndex];
|
||||||
let y = cCapacityOptions.series[0].data[e.currentIndex];
|
let y = cCapacityOptions.series[0].data[e.currentIndex];
|
||||||
|
@ -464,5 +477,10 @@ cCapacity.on('click', 'series', (e) => {
|
||||||
});
|
});
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
|
cHeatmap.on('click', 'series', (e) => {
|
||||||
|
window.open(`/property/${e.value[1]}?date=${e.value[0]}`, '_self');
|
||||||
|
})
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
@endsection
|
@endsection
|
||||||
|
|
|
@ -36,8 +36,57 @@ Route::get('/', function () {
|
||||||
"propsPerRegion" => [json_encode($propsPerRegionId), json_encode($propsPerRegionName), json_encode($propsPerRegionCounts)]]);
|
"propsPerRegion" => [json_encode($propsPerRegionId), json_encode($propsPerRegionName), json_encode($propsPerRegionCounts)]]);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
Route::get('/region/{id}', function (int $id) {
|
||||||
|
|
||||||
|
$regionBaseAll = Api::regionBase(-1);
|
||||||
|
$regionBaseAll[] = ['region_name' => 'Alle Regionen', 'region_id' => -1];
|
||||||
|
$regionBaseRegion = $id >= 0 ? Api::regionBase($id) : [['region_name' => 'Alle Regionen']];
|
||||||
|
|
||||||
|
$regionPropertiesCapacities = Api::regionPropertiesCapacities($id);
|
||||||
|
$regionCapacitiesRegion = Api::regionCapacities($id);
|
||||||
|
$regionCapacitiesAll = Api::regionCapacities(-1);
|
||||||
|
|
||||||
|
$regionCapacitiesMonthly = [];
|
||||||
|
$regionCapacitiesDaily = [];
|
||||||
|
$regionPredictions = [];
|
||||||
|
|
||||||
|
foreach ($regionCapacitiesRegion['dates'] as $date) {
|
||||||
|
$regionCapacitiesMonthly[] = Api::regionCapacitiesMonthly($id, $date);
|
||||||
|
$regionCapacitiesDaily[] = Api::regionCapacitiesDaily($id, $date);
|
||||||
|
$regionPredictions[] = Api::regionMovingAverage($id, $date);
|
||||||
|
}
|
||||||
|
|
||||||
|
$chartOptions = [
|
||||||
|
'colors' => Chart::colors()
|
||||||
|
];
|
||||||
|
|
||||||
|
$regionCapacities = [
|
||||||
|
'all' => $regionCapacitiesAll,
|
||||||
|
'region' => $regionCapacitiesRegion,
|
||||||
|
'region_monthly' => $regionCapacitiesMonthly,
|
||||||
|
'region_daily' => $regionCapacitiesDaily
|
||||||
|
|
||||||
|
];
|
||||||
|
|
||||||
|
return view('region', [
|
||||||
|
'chartOptions' => $chartOptions,
|
||||||
|
'startDate' => $regionCapacitiesRegion['dates'][0],
|
||||||
|
'regions' => $regionBaseAll,
|
||||||
|
'region' => $regionBaseRegion,
|
||||||
|
'region_id' => $id,
|
||||||
|
'regionCapacities' => $regionCapacities,
|
||||||
|
'regionPropertiesCapacities' => $regionPropertiesCapacities,
|
||||||
|
'predictions' => $regionPredictions]);
|
||||||
|
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
Route::get('/property/{id}', function (int $id) {
|
Route::get('/property/{id}', function (int $id) {
|
||||||
|
|
||||||
|
$chartOptions = [
|
||||||
|
'colors' => Chart::colors()
|
||||||
|
];
|
||||||
|
|
||||||
$propertyBase = Api::propertyBase($id);
|
$propertyBase = Api::propertyBase($id);
|
||||||
$calendars = Api::propertyExtractions($id);
|
$calendars = Api::propertyExtractions($id);
|
||||||
$propertyCapacities = Api::propertyCapacities($id);
|
$propertyCapacities = Api::propertyCapacities($id);
|
||||||
|
@ -85,6 +134,8 @@ Route::get('/property/{id}', function (int $id) {
|
||||||
}
|
}
|
||||||
|
|
||||||
return view('property', [
|
return view('property', [
|
||||||
|
'chartOptions' => $chartOptions,
|
||||||
|
'startDate' => $propertyCapacities['dates'][0],
|
||||||
'base' => $propertyBase[0],
|
'base' => $propertyBase[0],
|
||||||
'extractiondates' => json_encode($propertyCapacities['dates']),
|
'extractiondates' => json_encode($propertyCapacities['dates']),
|
||||||
'calendar' => $data,
|
'calendar' => $data,
|
||||||
|
@ -98,43 +149,3 @@ Route::get('/property/{id}', function (int $id) {
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
Route::get('/region/{id}', function (int $id) {
|
|
||||||
|
|
||||||
$regionBaseAll = Api::regionBase(-1);
|
|
||||||
$regionBaseAll[] = ['region_name' => 'Alle Regionen', 'region_id' => -1];
|
|
||||||
$regionBaseRegion = $id >= 0 ? Api::regionBase($id) : [['region_name' => 'Alle Regionen']];
|
|
||||||
|
|
||||||
$regionPropertiesCapacities = Api::regionPropertiesCapacities($id);
|
|
||||||
$regionCapacitiesRegion = Api::regionCapacities($id);
|
|
||||||
$regionCapacitiesAll = Api::regionCapacities(-1);
|
|
||||||
|
|
||||||
$regionCapacitiesMonthly = [];
|
|
||||||
$regionCapacitiesDaily = [];
|
|
||||||
$regionPredictions = [];
|
|
||||||
|
|
||||||
foreach ($regionCapacitiesRegion['dates'] as $date) {
|
|
||||||
$regionCapacitiesMonthly[] = Api::regionCapacitiesMonthly($id, $date);
|
|
||||||
$regionCapacitiesDaily[] = Api::regionCapacitiesDaily($id, $date);
|
|
||||||
$regionPredictions[] = Api::regionMovingAverage($id, $date);
|
|
||||||
}
|
|
||||||
|
|
||||||
$regionCapacities = [
|
|
||||||
'all' => $regionCapacitiesAll,
|
|
||||||
'region' => $regionCapacitiesRegion,
|
|
||||||
'region_monthly' => $regionCapacitiesMonthly,
|
|
||||||
'region_daily' => $regionCapacitiesDaily
|
|
||||||
|
|
||||||
];
|
|
||||||
|
|
||||||
dump($regionPredictions);
|
|
||||||
|
|
||||||
return view('region', [
|
|
||||||
'regions' => $regionBaseAll,
|
|
||||||
'region' => $regionBaseRegion,
|
|
||||||
'region_id' => $id,
|
|
||||||
'regionCapacities' => $regionCapacities,
|
|
||||||
'regionPropertiesCapacities' => $regionPropertiesCapacities,
|
|
||||||
'predictions' => $regionPredictions]);
|
|
||||||
|
|
||||||
|
|
||||||
});
|
|
||||||
|
|
|
@ -1,93 +1,184 @@
|
||||||
<mxfile host="app.diagrams.net" agent="Mozilla/5.0 (X11; Linux x86_64; rv:134.0) Gecko/20100101 Firefox/134.0" version="26.0.5">
|
<mxfile host="app.diagrams.net" agent="Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36" version="26.0.5" pages="2">
|
||||||
<diagram name="Seite-1" id="chpUGVRRn7alPJZ1I-il">
|
<diagram name="Seite-1" id="chpUGVRRn7alPJZ1I-il">
|
||||||
<mxGraphModel dx="819" dy="1052" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="827" pageHeight="1169" math="0" shadow="0">
|
<mxGraphModel dx="2761" dy="1531" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="827" pageHeight="1169" math="0" shadow="0">
|
||||||
<root>
|
<root>
|
||||||
<mxCell id="0" />
|
<mxCell id="0" />
|
||||||
<mxCell id="1" parent="0" />
|
<mxCell id="1" parent="0" />
|
||||||
<object placeholders="1" c4Name="RDBMS" c4Type="Container" c4Technology="DuckDB" c4Description="Aggregierte Daten." label="<font style="font-size: 16px"><b>%c4Name%</b></font><div>[%c4Type%:&nbsp;%c4Technology%]</div><br><div><font style="font-size: 11px"><font color="#E6E6E6">%c4Description%</font></div>" id="_wAeSdXpbb6KPP4DEc36-2">
|
<object placeholders="1" c4Name="RDBMS" c4Type="Container" c4Technology="DuckDB" c4Description="Aggregierte Daten." label="<font style="font-size: 16px"><b>%c4Name%</b></font><div>[%c4Type%:&nbsp;%c4Technology%]</div><br><div><font style="font-size: 11px"><font color="#E6E6E6">%c4Description%</font></div>" id="_wAeSdXpbb6KPP4DEc36-2">
|
||||||
<mxCell style="shape=cylinder3;size=15;whiteSpace=wrap;html=1;boundedLbl=1;rounded=0;labelBackgroundColor=none;fillColor=#23A2D9;fontSize=12;fontColor=#ffffff;align=center;strokeColor=#0E7DAD;metaEdit=1;points=[[0.5,0,0],[1,0.25,0],[1,0.5,0],[1,0.75,0],[0.5,1,0],[0,0.75,0],[0,0.5,0],[0,0.25,0]];resizable=0;" vertex="1" parent="1">
|
<mxCell style="shape=cylinder3;size=15;whiteSpace=wrap;html=1;boundedLbl=1;rounded=0;labelBackgroundColor=none;fillColor=#23A2D9;fontSize=12;fontColor=#ffffff;align=center;strokeColor=#0E7DAD;metaEdit=1;points=[[0.5,0,0],[1,0.25,0],[1,0.5,0],[1,0.75,0],[0.5,1,0],[0,0.75,0],[0,0.5,0],[0,0.25,0]];resizable=0;" parent="1" vertex="1">
|
||||||
<mxGeometry x="50" y="60" width="240" height="120" as="geometry" />
|
<mxGeometry x="50" y="60" width="240" height="120" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
</object>
|
</object>
|
||||||
<object placeholders="1" c4Name="ETL" c4Type="SQL, Python (Polars)" c4Description="Bereitet Daten mittels algorithmischer<br> Verfahren auf." label="<font style="font-size: 16px"><b>%c4Name%</b></font><div>[%c4Type%]</div><br><div><font style="font-size: 11px"><font color="#cccccc">%c4Description%</font></div>" id="_wAeSdXpbb6KPP4DEc36-3">
|
<object placeholders="1" c4Name="ETL" c4Type="SQL, Python (Polars)" c4Description="Bereitet Daten mittels algorithmischer<br> Verfahren auf." label="<font style="font-size: 16px"><b>%c4Name%</b></font><div>[%c4Type%]</div><br><div><font style="font-size: 11px"><font color="#cccccc">%c4Description%</font></div>" id="_wAeSdXpbb6KPP4DEc36-3">
|
||||||
<mxCell style="rounded=1;whiteSpace=wrap;html=1;labelBackgroundColor=none;fillColor=#1061B0;fontColor=#ffffff;align=center;arcSize=10;strokeColor=#0D5091;metaEdit=1;resizable=0;points=[[0.25,0,0],[0.5,0,0],[0.75,0,0],[1,0.25,0],[1,0.5,0],[1,0.75,0],[0.75,1,0],[0.5,1,0],[0.25,1,0],[0,0.75,0],[0,0.5,0],[0,0.25,0]];" vertex="1" parent="1">
|
<mxCell style="rounded=1;whiteSpace=wrap;html=1;labelBackgroundColor=none;fillColor=#1061B0;fontColor=#ffffff;align=center;arcSize=10;strokeColor=#0D5091;metaEdit=1;resizable=0;points=[[0.25,0,0],[0.5,0,0],[0.75,0,0],[1,0.25,0],[1,0.5,0],[1,0.75,0],[0.75,1,0],[0.5,1,0],[0.25,1,0],[0,0.75,0],[0,0.5,0],[0,0.25,0]];" parent="1" vertex="1">
|
||||||
<mxGeometry x="480" y="60" width="240" height="120" as="geometry" />
|
<mxGeometry x="480" y="60" width="240" height="120" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
</object>
|
</object>
|
||||||
<mxCell id="_wAeSdXpbb6KPP4DEc36-4" style="rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0;exitY=0.5;exitDx=0;exitDy=0;exitPerimeter=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;entryPerimeter=0;dashed=1;dashPattern=8 8;" edge="1" parent="1" source="_wAeSdXpbb6KPP4DEc36-3" target="_wAeSdXpbb6KPP4DEc36-2">
|
<mxCell id="_wAeSdXpbb6KPP4DEc36-4" style="rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0;exitY=0.5;exitDx=0;exitDy=0;exitPerimeter=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;entryPerimeter=0;dashed=1;dashPattern=8 8;" parent="1" source="_wAeSdXpbb6KPP4DEc36-3" target="_wAeSdXpbb6KPP4DEc36-2" edge="1">
|
||||||
<mxGeometry relative="1" as="geometry" />
|
<mxGeometry relative="1" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="_wAeSdXpbb6KPP4DEc36-5" value="Liest Datenbank" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="_wAeSdXpbb6KPP4DEc36-4">
|
<mxCell id="_wAeSdXpbb6KPP4DEc36-5" value="Liest Datenbank" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" parent="_wAeSdXpbb6KPP4DEc36-4" vertex="1" connectable="0">
|
||||||
<mxGeometry x="0.0412" y="1" relative="1" as="geometry">
|
<mxGeometry x="0.0412" y="1" relative="1" as="geometry">
|
||||||
<mxPoint x="-1" y="-1" as="offset" />
|
<mxPoint x="-1" y="-1" as="offset" />
|
||||||
</mxGeometry>
|
</mxGeometry>
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="_wAeSdXpbb6KPP4DEc36-15" style="rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;exitPerimeter=0;dashed=1;dashPattern=8 8;entryX=0;entryY=0.5;entryDx=0;entryDy=0;entryPerimeter=0;" edge="1" parent="1" source="_wAeSdXpbb6KPP4DEc36-6" target="_wAeSdXpbb6KPP4DEc36-13">
|
<mxCell id="_wAeSdXpbb6KPP4DEc36-15" style="rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;exitPerimeter=0;dashed=1;dashPattern=8 8;entryX=0;entryY=0.5;entryDx=0;entryDy=0;entryPerimeter=0;" parent="1" source="_wAeSdXpbb6KPP4DEc36-6" target="_wAeSdXpbb6KPP4DEc36-13" edge="1">
|
||||||
<mxGeometry relative="1" as="geometry" />
|
<mxGeometry relative="1" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="_wAeSdXpbb6KPP4DEc36-21" value="<div>Führt Abfragen aus</div><div>[JSON/HTTPS]<br></div>" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="_wAeSdXpbb6KPP4DEc36-15">
|
<mxCell id="_wAeSdXpbb6KPP4DEc36-21" value="<div>Führt Abfragen aus</div><div>[JSON/HTTPS]<br></div>" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" parent="_wAeSdXpbb6KPP4DEc36-15" vertex="1" connectable="0">
|
||||||
<mxGeometry x="-0.0541" y="-1" relative="1" as="geometry">
|
<mxGeometry x="-0.0541" y="-1" relative="1" as="geometry">
|
||||||
<mxPoint as="offset" />
|
<mxPoint as="offset" />
|
||||||
</mxGeometry>
|
</mxGeometry>
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<object placeholders="1" c4Name="Webapplikation" c4Type="PHP (Laravel)" c4Description="Verarbeitet Anfragen von Benutzer:innen" label="<font style="font-size: 16px"><b>%c4Name%</b></font><div>[%c4Type%]</div><br><div><font style="font-size: 11px"><font color="#cccccc">%c4Description%</font></div>" id="_wAeSdXpbb6KPP4DEc36-6">
|
<object placeholders="1" c4Name="Webapplikation" c4Type="PHP (Laravel)" c4Description="Verarbeitet Anfragen von Benutzer:innen" label="<font style="font-size: 16px"><b>%c4Name%</b></font><div>[%c4Type%]</div><br><div><font style="font-size: 11px"><font color="#cccccc">%c4Description%</font></div>" id="_wAeSdXpbb6KPP4DEc36-6">
|
||||||
<mxCell style="rounded=1;whiteSpace=wrap;html=1;labelBackgroundColor=none;fillColor=#1061B0;fontColor=#ffffff;align=center;arcSize=10;strokeColor=#0D5091;metaEdit=1;resizable=0;points=[[0.25,0,0],[0.5,0,0],[0.75,0,0],[1,0.25,0],[1,0.5,0],[1,0.75,0],[0.75,1,0],[0.5,1,0],[0.25,1,0],[0,0.75,0],[0,0.5,0],[0,0.25,0]];" vertex="1" parent="1">
|
<mxCell style="rounded=1;whiteSpace=wrap;html=1;labelBackgroundColor=none;fillColor=#1061B0;fontColor=#ffffff;align=center;arcSize=10;strokeColor=#0D5091;metaEdit=1;resizable=0;points=[[0.25,0,0],[0.5,0,0],[0.75,0,0],[1,0.25,0],[1,0.5,0],[1,0.75,0],[0.75,1,0],[0.5,1,0],[0.25,1,0],[0,0.75,0],[0,0.5,0],[0,0.25,0]];" parent="1" vertex="1">
|
||||||
<mxGeometry x="50" y="230" width="240" height="120" as="geometry" />
|
<mxGeometry x="50" y="230" width="240" height="120" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
</object>
|
</object>
|
||||||
<object placeholders="1" c4Name="Dashboard" c4Type="Container" c4Technology="Apache Echarts" c4Description="Stellt Benutzer:innen Auswertungs-<br>möglichkeiten zur Verfügbarkeit von Kurzzeitmietobjekten." label="<font style="font-size: 16px"><b>%c4Name%</b></font><div>[%c4Type%:&nbsp;%c4Technology%]</div><br><div><font style="font-size: 11px"><font color="#E6E6E6">%c4Description%</font></div>" id="_wAeSdXpbb6KPP4DEc36-8">
|
<object placeholders="1" c4Name="Dashboard" c4Type="Container" c4Technology="Apache Echarts" c4Description="Stellt Benutzer:innen Auswertungs-<br>möglichkeiten zur Verfügbarkeit von Kurzzeitmietobjekten." label="<font style="font-size: 16px"><b>%c4Name%</b></font><div>[%c4Type%:&nbsp;%c4Technology%]</div><br><div><font style="font-size: 11px"><font color="#E6E6E6">%c4Description%</font></div>" id="_wAeSdXpbb6KPP4DEc36-8">
|
||||||
<mxCell style="shape=mxgraph.c4.webBrowserContainer2;whiteSpace=wrap;html=1;boundedLbl=1;rounded=0;labelBackgroundColor=none;strokeColor=#118ACD;fillColor=#23A2D9;strokeColor=#118ACD;strokeColor2=#0E7DAD;fontSize=12;fontColor=#ffffff;align=center;metaEdit=1;points=[[0.5,0,0],[1,0.25,0],[1,0.5,0],[1,0.75,0],[0.5,1,0],[0,0.75,0],[0,0.5,0],[0,0.25,0]];resizable=0;" vertex="1" parent="1">
|
<mxCell style="shape=mxgraph.c4.webBrowserContainer2;whiteSpace=wrap;html=1;boundedLbl=1;rounded=0;labelBackgroundColor=none;strokeColor=#118ACD;fillColor=#23A2D9;strokeColor=#118ACD;strokeColor2=#0E7DAD;fontSize=12;fontColor=#ffffff;align=center;metaEdit=1;points=[[0.5,0,0],[1,0.25,0],[1,0.5,0],[1,0.75,0],[0.5,1,0],[0,0.75,0],[0,0.5,0],[0,0.25,0]];resizable=0;" parent="1" vertex="1">
|
||||||
<mxGeometry x="480" y="370" width="240" height="160" as="geometry" />
|
<mxGeometry x="480" y="370" width="240" height="160" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
</object>
|
</object>
|
||||||
<mxCell id="_wAeSdXpbb6KPP4DEc36-10" style="rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=0;exitDx=0;exitDy=0;exitPerimeter=0;dashed=1;dashPattern=8 8;" edge="1" parent="1" source="_wAeSdXpbb6KPP4DEc36-9" target="_wAeSdXpbb6KPP4DEc36-6">
|
<mxCell id="_wAeSdXpbb6KPP4DEc36-10" style="rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=0;exitDx=0;exitDy=0;exitPerimeter=0;dashed=1;dashPattern=8 8;" parent="1" source="_wAeSdXpbb6KPP4DEc36-9" target="_wAeSdXpbb6KPP4DEc36-6" edge="1">
|
||||||
<mxGeometry relative="1" as="geometry" />
|
<mxGeometry relative="1" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="_wAeSdXpbb6KPP4DEc36-16" value="<div>Besucht Webapplikation</div><div>[HTTPS]<br></div>" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="_wAeSdXpbb6KPP4DEc36-10">
|
<mxCell id="_wAeSdXpbb6KPP4DEc36-16" value="<div>Besucht Webapplikation</div><div>[HTTPS]<br></div>" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" parent="_wAeSdXpbb6KPP4DEc36-10" vertex="1" connectable="0">
|
||||||
<mxGeometry x="0.1247" y="-2" relative="1" as="geometry">
|
<mxGeometry x="0.1247" y="-2" relative="1" as="geometry">
|
||||||
<mxPoint as="offset" />
|
<mxPoint as="offset" />
|
||||||
</mxGeometry>
|
</mxGeometry>
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="_wAeSdXpbb6KPP4DEc36-11" style="rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=0;exitDx=0;exitDy=0;exitPerimeter=0;dashed=1;dashPattern=8 8;" edge="1" parent="1" source="_wAeSdXpbb6KPP4DEc36-9" target="_wAeSdXpbb6KPP4DEc36-8">
|
<mxCell id="_wAeSdXpbb6KPP4DEc36-11" style="rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=0;exitDx=0;exitDy=0;exitPerimeter=0;dashed=1;dashPattern=8 8;" parent="1" source="_wAeSdXpbb6KPP4DEc36-9" target="_wAeSdXpbb6KPP4DEc36-8" edge="1">
|
||||||
<mxGeometry relative="1" as="geometry" />
|
<mxGeometry relative="1" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="_wAeSdXpbb6KPP4DEc36-17" value="Betrachtet Auswertungen" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="_wAeSdXpbb6KPP4DEc36-11">
|
<mxCell id="_wAeSdXpbb6KPP4DEc36-17" value="Betrachtet Auswertungen" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" parent="_wAeSdXpbb6KPP4DEc36-11" vertex="1" connectable="0">
|
||||||
<mxGeometry x="0.2151" y="-1" relative="1" as="geometry">
|
<mxGeometry x="0.2151" y="-1" relative="1" as="geometry">
|
||||||
<mxPoint x="2" as="offset" />
|
<mxPoint x="2" as="offset" />
|
||||||
</mxGeometry>
|
</mxGeometry>
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<object placeholders="1" c4Name="Benutzer:in" c4Type="Person" c4Description="Person welche Auswertungen zur Verfügbarkeit von Kurzzeitmietobjekten in Ferienregionen durchführt." label="<font style="font-size: 16px"><b>%c4Name%</b></font><div>[%c4Type%]</div><br><div><font style="font-size: 11px"><font color="#cccccc">%c4Description%</font></div>" id="_wAeSdXpbb6KPP4DEc36-9">
|
<object placeholders="1" c4Name="Benutzer:in" c4Type="Person" c4Description="Person welche Auswertungen zur Verfügbarkeit von Kurzzeitmietobjekten in Ferienregionen durchführt." label="<font style="font-size: 16px"><b>%c4Name%</b></font><div>[%c4Type%]</div><br><div><font style="font-size: 11px"><font color="#cccccc">%c4Description%</font></div>" id="_wAeSdXpbb6KPP4DEc36-9">
|
||||||
<mxCell style="html=1;fontSize=11;dashed=0;whiteSpace=wrap;fillColor=#083F75;strokeColor=#06315C;fontColor=#ffffff;shape=mxgraph.c4.person2;align=center;metaEdit=1;points=[[0.5,0,0],[1,0.5,0],[1,0.75,0],[0.75,1,0],[0.5,1,0],[0.25,1,0],[0,0.75,0],[0,0.5,0]];resizable=0;" vertex="1" parent="1">
|
<mxCell style="html=1;fontSize=11;dashed=0;whiteSpace=wrap;fillColor=#083F75;strokeColor=#06315C;fontColor=#ffffff;shape=mxgraph.c4.person2;align=center;metaEdit=1;points=[[0.5,0,0],[1,0.5,0],[1,0.75,0],[0.75,1,0],[0.5,1,0],[0.25,1,0],[0,0.75,0],[0,0.5,0]];resizable=0;" parent="1" vertex="1">
|
||||||
<mxGeometry x="314" y="600" width="200" height="180" as="geometry" />
|
<mxGeometry x="314" y="600" width="200" height="180" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
</object>
|
</object>
|
||||||
<mxCell id="_wAeSdXpbb6KPP4DEc36-14" style="rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=0;exitDx=0;exitDy=0;exitPerimeter=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;entryPerimeter=0;dashed=1;dashPattern=8 8;" edge="1" parent="1" source="_wAeSdXpbb6KPP4DEc36-13" target="_wAeSdXpbb6KPP4DEc36-3">
|
<mxCell id="_wAeSdXpbb6KPP4DEc36-14" style="rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=0;exitDx=0;exitDy=0;exitPerimeter=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;entryPerimeter=0;dashed=1;dashPattern=8 8;" parent="1" source="_wAeSdXpbb6KPP4DEc36-13" target="_wAeSdXpbb6KPP4DEc36-3" edge="1">
|
||||||
<mxGeometry relative="1" as="geometry" />
|
<mxGeometry relative="1" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="_wAeSdXpbb6KPP4DEc36-20" value="Ruft ETL Verfahren auf" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="_wAeSdXpbb6KPP4DEc36-14">
|
<mxCell id="_wAeSdXpbb6KPP4DEc36-20" value="Ruft ETL Verfahren auf" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" parent="_wAeSdXpbb6KPP4DEc36-14" vertex="1" connectable="0">
|
||||||
<mxGeometry x="-0.0667" y="-1" relative="1" as="geometry">
|
<mxGeometry x="-0.0667" y="-1" relative="1" as="geometry">
|
||||||
<mxPoint as="offset" />
|
<mxPoint as="offset" />
|
||||||
</mxGeometry>
|
</mxGeometry>
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<object placeholders="1" c4Name="FastAPI" c4Type="Python (FastAPI)" c4Description="Stellt aufbereitete Daten via <br>JSON/HTTPS API zur Verfügung." label="<font style="font-size: 16px"><b>%c4Name%</b></font><div>[%c4Type%]</div><br><div><font style="font-size: 11px"><font color="#cccccc">%c4Description%</font></div>" id="_wAeSdXpbb6KPP4DEc36-13">
|
<object placeholders="1" c4Name="FastAPI" c4Type="Python (FastAPI)" c4Description="Stellt aufbereitete Daten via <br>JSON/HTTPS API zur Verfügung." label="<font style="font-size: 16px"><b>%c4Name%</b></font><div>[%c4Type%]</div><br><div><font style="font-size: 11px"><font color="#cccccc">%c4Description%</font></div>" id="_wAeSdXpbb6KPP4DEc36-13">
|
||||||
<mxCell style="rounded=1;whiteSpace=wrap;html=1;labelBackgroundColor=none;fillColor=#1061B0;fontColor=#ffffff;align=center;arcSize=10;strokeColor=#0D5091;metaEdit=1;resizable=0;points=[[0.25,0,0],[0.5,0,0],[0.75,0,0],[1,0.25,0],[1,0.5,0],[1,0.75,0],[0.75,1,0],[0.5,1,0],[0.25,1,0],[0,0.75,0],[0,0.5,0],[0,0.25,0]];" vertex="1" parent="1">
|
<mxCell style="rounded=1;whiteSpace=wrap;html=1;labelBackgroundColor=none;fillColor=#1061B0;fontColor=#ffffff;align=center;arcSize=10;strokeColor=#0D5091;metaEdit=1;resizable=0;points=[[0.25,0,0],[0.5,0,0],[0.75,0,0],[1,0.25,0],[1,0.5,0],[1,0.75,0],[0.75,1,0],[0.5,1,0],[0.25,1,0],[0,0.75,0],[0,0.5,0],[0,0.25,0]];" parent="1" vertex="1">
|
||||||
<mxGeometry x="480" y="230" width="240" height="120" as="geometry" />
|
<mxGeometry x="480" y="230" width="240" height="120" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
</object>
|
</object>
|
||||||
<mxCell id="_wAeSdXpbb6KPP4DEc36-18" style="rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;exitPerimeter=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;entryPerimeter=0;dashed=1;dashPattern=8 8;" edge="1" parent="1" source="_wAeSdXpbb6KPP4DEc36-6" target="_wAeSdXpbb6KPP4DEc36-8">
|
<mxCell id="_wAeSdXpbb6KPP4DEc36-18" style="rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;exitPerimeter=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;entryPerimeter=0;dashed=1;dashPattern=8 8;" parent="1" source="_wAeSdXpbb6KPP4DEc36-6" target="_wAeSdXpbb6KPP4DEc36-8" edge="1">
|
||||||
<mxGeometry relative="1" as="geometry" />
|
<mxGeometry relative="1" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="_wAeSdXpbb6KPP4DEc36-19" value="<div>Liefert Inhalte zum Webbrowser&nbsp;</div><div>von Benutzer:innen</div>" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="_wAeSdXpbb6KPP4DEc36-18">
|
<mxCell id="_wAeSdXpbb6KPP4DEc36-19" value="<div>Liefert Inhalte zum Webbrowser&nbsp;</div><div>von Benutzer:innen</div>" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" parent="_wAeSdXpbb6KPP4DEc36-18" vertex="1" connectable="0">
|
||||||
<mxGeometry x="-0.0888" y="-2" relative="1" as="geometry">
|
<mxGeometry x="-0.0888" y="-2" relative="1" as="geometry">
|
||||||
<mxPoint x="5" y="7" as="offset" />
|
<mxPoint x="5" y="7" as="offset" />
|
||||||
</mxGeometry>
|
</mxGeometry>
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<object placeholders="1" c4Name="Visual Analytics Tool" c4Type="SystemScopeBoundary" c4Application="Software System" label="<font style="font-size: 16px"><b><div style="text-align: left">%c4Name%</div></b></font><div style="text-align: left">[%c4Application%]</div>" id="_wAeSdXpbb6KPP4DEc36-23">
|
<object placeholders="1" c4Name="Visual Analytics Tool" c4Type="SystemScopeBoundary" c4Application="Software System" label="<font style="font-size: 16px"><b><div style="text-align: left">%c4Name%</div></b></font><div style="text-align: left">[%c4Application%]</div>" id="_wAeSdXpbb6KPP4DEc36-23">
|
||||||
<mxCell style="rounded=1;fontSize=11;whiteSpace=wrap;html=1;dashed=1;arcSize=20;fillColor=none;strokeColor=#666666;fontColor=#333333;labelBackgroundColor=none;align=left;verticalAlign=bottom;labelBorderColor=none;spacingTop=0;spacing=10;dashPattern=8 4;metaEdit=1;rotatable=0;perimeter=rectanglePerimeter;noLabel=0;labelPadding=0;allowArrows=0;connectable=0;expand=0;recursiveResize=0;editable=1;pointerEvents=0;absoluteArcSize=1;points=[[0.25,0,0],[0.5,0,0],[0.75,0,0],[1,0.25,0],[1,0.5,0],[1,0.75,0],[0.75,1,0],[0.5,1,0],[0.25,1,0],[0,0.75,0],[0,0.5,0],[0,0.25,0]];" vertex="1" parent="1">
|
<mxCell style="rounded=1;fontSize=11;whiteSpace=wrap;html=1;dashed=1;arcSize=20;fillColor=none;strokeColor=#666666;fontColor=#333333;labelBackgroundColor=none;align=left;verticalAlign=bottom;labelBorderColor=none;spacingTop=0;spacing=10;dashPattern=8 4;metaEdit=1;rotatable=0;perimeter=rectanglePerimeter;noLabel=0;labelPadding=0;allowArrows=0;connectable=0;expand=0;recursiveResize=0;editable=1;pointerEvents=0;absoluteArcSize=1;points=[[0.25,0,0],[0.5,0,0],[0.75,0,0],[1,0.25,0],[1,0.5,0],[1,0.75,0],[0.75,1,0],[0.5,1,0],[0.25,1,0],[0,0.75,0],[0,0.5,0],[0,0.25,0]];" parent="1" vertex="1">
|
||||||
<mxGeometry x="30" y="40" width="710" height="540" as="geometry" />
|
<mxGeometry x="30" y="40" width="710" height="540" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
</object>
|
</object>
|
||||||
</root>
|
</root>
|
||||||
</mxGraphModel>
|
</mxGraphModel>
|
||||||
</diagram>
|
</diagram>
|
||||||
|
<diagram id="2goo0GJ--Dnj9rEJibSb" name="Seite-2">
|
||||||
|
<mxGraphModel dx="2285" dy="1267" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="827" pageHeight="1169" math="0" shadow="0">
|
||||||
|
<root>
|
||||||
|
<mxCell id="0" />
|
||||||
|
<mxCell id="1" parent="0" />
|
||||||
|
<object placeholders="1" c4Name="RDBMS" c4Type="Container" c4Technology="DuckDB" c4Description="Aggregierte Daten." label="<font style="font-size: 16px"><b>%c4Name%</b></font><div>[%c4Type%:&nbsp;%c4Technology%]</div><br><div><font style="font-size: 11px"><font color="#E6E6E6">%c4Description%</font></div>" id="Xmw1x83A06H2_JC6hK8s-1">
|
||||||
|
<mxCell style="shape=cylinder3;size=15;whiteSpace=wrap;html=1;boundedLbl=1;rounded=0;labelBackgroundColor=none;fillColor=#23A2D9;fontSize=12;fontColor=#ffffff;align=center;strokeColor=#0E7DAD;metaEdit=1;points=[[0.5,0,0],[1,0.25,0],[1,0.5,0],[1,0.75,0],[0.5,1,0],[0,0.75,0],[0,0.5,0],[0,0.25,0]];resizable=0;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="40" y="230" width="240" height="120" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
</object>
|
||||||
|
<object placeholders="1" c4Name="ETL" c4Type="SQL, Python (Polars)" c4Description="Bereitet Daten mittels algorithmischer<br> Verfahren auf." label="<font style="font-size: 16px"><b>%c4Name%</b></font><div>[%c4Type%]</div><br><div><font style="font-size: 11px"><font color="#cccccc">%c4Description%</font></div>" id="Xmw1x83A06H2_JC6hK8s-2">
|
||||||
|
<mxCell style="rounded=1;whiteSpace=wrap;html=1;labelBackgroundColor=none;fillColor=#1061B0;fontColor=#ffffff;align=center;arcSize=10;strokeColor=#0D5091;metaEdit=1;resizable=0;points=[[0.25,0,0],[0.5,0,0],[0.75,0,0],[1,0.25,0],[1,0.5,0],[1,0.75,0],[0.75,1,0],[0.5,1,0],[0.25,1,0],[0,0.75,0],[0,0.5,0],[0,0.25,0]];" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="40" y="464" width="240" height="120" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
</object>
|
||||||
|
<mxCell id="Xmw1x83A06H2_JC6hK8s-3" style="rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=0;exitDx=0;exitDy=0;exitPerimeter=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;entryPerimeter=0;dashed=1;dashPattern=8 8;" edge="1" parent="1" source="Xmw1x83A06H2_JC6hK8s-2" target="Xmw1x83A06H2_JC6hK8s-1">
|
||||||
|
<mxGeometry relative="1" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="Xmw1x83A06H2_JC6hK8s-4" value="Liest Datenbank" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="Xmw1x83A06H2_JC6hK8s-3">
|
||||||
|
<mxGeometry x="0.0412" y="1" relative="1" as="geometry">
|
||||||
|
<mxPoint x="-1" y="-1" as="offset" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="Xmw1x83A06H2_JC6hK8s-5" style="rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0;exitY=0.5;exitDx=0;exitDy=0;exitPerimeter=0;dashed=1;dashPattern=8 8;entryX=1;entryY=0.5;entryDx=0;entryDy=0;entryPerimeter=0;" edge="1" parent="1" source="Xmw1x83A06H2_JC6hK8s-7" target="Xmw1x83A06H2_JC6hK8s-16">
|
||||||
|
<mxGeometry relative="1" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="Xmw1x83A06H2_JC6hK8s-6" value="<div>Führt Abfragen aus</div><div>[JSON/HTTPS]<br></div>" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="Xmw1x83A06H2_JC6hK8s-5">
|
||||||
|
<mxGeometry x="-0.0541" y="-1" relative="1" as="geometry">
|
||||||
|
<mxPoint as="offset" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<object placeholders="1" c4Name="Webapplikation" c4Type="PHP (Laravel)" c4Description="Verarbeitet Anfragen von Benutzer:innen" label="<font style="font-size: 16px"><b>%c4Name%</b></font><div>[%c4Type%]</div><br><div><font style="font-size: 11px"><font color="#cccccc">%c4Description%</font></div>" id="Xmw1x83A06H2_JC6hK8s-7">
|
||||||
|
<mxCell style="rounded=1;whiteSpace=wrap;html=1;labelBackgroundColor=none;fillColor=#1061B0;fontColor=#ffffff;align=center;arcSize=10;strokeColor=#0D5091;metaEdit=1;resizable=0;points=[[0.25,0,0],[0.5,0,0],[0.75,0,0],[1,0.25,0],[1,0.5,0],[1,0.75,0],[0.75,1,0],[0.5,1,0],[0.25,1,0],[0,0.75,0],[0,0.5,0],[0,0.25,0]];" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="710" y="240" width="240" height="120" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
</object>
|
||||||
|
<object placeholders="1" c4Name="Dashboard" c4Type="Container" c4Technology="Apache Echarts" c4Description="Stellt Benutzer:innen Auswertungs-<br>möglichkeiten zur Verfügbarkeit von Kurzzeitmietobjekten." label="<font style="font-size: 16px"><b>%c4Name%</b></font><div>[%c4Type%:&nbsp;%c4Technology%]</div><br><div><font style="font-size: 11px"><font color="#E6E6E6">%c4Description%</font></div>" id="Xmw1x83A06H2_JC6hK8s-8">
|
||||||
|
<mxCell style="shape=mxgraph.c4.webBrowserContainer2;whiteSpace=wrap;html=1;boundedLbl=1;rounded=0;labelBackgroundColor=none;strokeColor=#118ACD;fillColor=#23A2D9;strokeColor=#118ACD;strokeColor2=#0E7DAD;fontSize=12;fontColor=#ffffff;align=center;metaEdit=1;points=[[0.5,0,0],[1,0.25,0],[1,0.5,0],[1,0.75,0],[0.5,1,0],[0,0.75,0],[0,0.5,0],[0,0.25,0]];resizable=0;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="710" y="470" width="240" height="160" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
</object>
|
||||||
|
<mxCell id="Xmw1x83A06H2_JC6hK8s-9" style="rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0;exitY=0.5;exitDx=0;exitDy=0;exitPerimeter=0;dashed=1;dashPattern=8 8;entryX=1;entryY=0.5;entryDx=0;entryDy=0;entryPerimeter=0;" edge="1" parent="1" source="Xmw1x83A06H2_JC6hK8s-13" target="Xmw1x83A06H2_JC6hK8s-7">
|
||||||
|
<mxGeometry relative="1" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="Xmw1x83A06H2_JC6hK8s-10" value="<div>Besucht Webapplikation</div><div>[HTTPS]<br></div>" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="Xmw1x83A06H2_JC6hK8s-9">
|
||||||
|
<mxGeometry x="0.1247" y="-2" relative="1" as="geometry">
|
||||||
|
<mxPoint x="4" y="4" as="offset" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="Xmw1x83A06H2_JC6hK8s-11" style="rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0;exitY=0.5;exitDx=0;exitDy=0;exitPerimeter=0;dashed=1;dashPattern=8 8;entryX=1;entryY=0.5;entryDx=0;entryDy=0;entryPerimeter=0;" edge="1" parent="1" source="Xmw1x83A06H2_JC6hK8s-13" target="Xmw1x83A06H2_JC6hK8s-8">
|
||||||
|
<mxGeometry relative="1" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="Xmw1x83A06H2_JC6hK8s-12" value="Betrachtet Auswertungen" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="Xmw1x83A06H2_JC6hK8s-11">
|
||||||
|
<mxGeometry x="0.2151" y="-1" relative="1" as="geometry">
|
||||||
|
<mxPoint x="13" as="offset" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<object placeholders="1" c4Name="Benutzer:in" c4Type="Person" c4Description="Person welche Auswertungen zur Verfügbarkeit von Kurzzeitmietobjekten in Ferienregionen durchführt." label="<font style="font-size: 16px"><b>%c4Name%</b></font><div>[%c4Type%]</div><br><div><font style="font-size: 11px"><font color="#cccccc">%c4Description%</font></div>" id="Xmw1x83A06H2_JC6hK8s-13">
|
||||||
|
<mxCell style="html=1;fontSize=11;dashed=0;whiteSpace=wrap;fillColor=#083F75;strokeColor=#06315C;fontColor=#ffffff;shape=mxgraph.c4.person2;align=center;metaEdit=1;points=[[0.5,0,0],[1,0.5,0],[1,0.75,0],[0.75,1,0],[0.5,1,0],[0.25,1,0],[0,0.75,0],[0,0.5,0]];resizable=0;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="1120" y="320" width="200" height="180" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
</object>
|
||||||
|
<mxCell id="Xmw1x83A06H2_JC6hK8s-14" style="rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0;exitY=0.5;exitDx=0;exitDy=0;exitPerimeter=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;entryPerimeter=0;dashed=1;dashPattern=8 8;" edge="1" parent="1" source="Xmw1x83A06H2_JC6hK8s-16" target="Xmw1x83A06H2_JC6hK8s-2">
|
||||||
|
<mxGeometry relative="1" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="Xmw1x83A06H2_JC6hK8s-15" value="Ruft ETL Verfahren auf" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="Xmw1x83A06H2_JC6hK8s-14">
|
||||||
|
<mxGeometry x="-0.0667" y="-1" relative="1" as="geometry">
|
||||||
|
<mxPoint as="offset" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<object placeholders="1" c4Name="FastAPI" c4Type="Python (FastAPI)" c4Description="Stellt aufbereitete Daten via <br>JSON/HTTPS API zur Verfügung." label="<font style="font-size: 16px"><b>%c4Name%</b></font><div>[%c4Type%]</div><br><div><font style="font-size: 11px"><font color="#cccccc">%c4Description%</font></div>" id="Xmw1x83A06H2_JC6hK8s-16">
|
||||||
|
<mxCell style="rounded=1;whiteSpace=wrap;html=1;labelBackgroundColor=none;fillColor=#1061B0;fontColor=#ffffff;align=center;arcSize=10;strokeColor=#0D5091;metaEdit=1;resizable=0;points=[[0.25,0,0],[0.5,0,0],[0.75,0,0],[1,0.25,0],[1,0.5,0],[1,0.75,0],[0.75,1,0],[0.5,1,0],[0.25,1,0],[0,0.75,0],[0,0.5,0],[0,0.25,0]];" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="330" y="240" width="240" height="120" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
</object>
|
||||||
|
<mxCell id="Xmw1x83A06H2_JC6hK8s-17" style="rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;exitPerimeter=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;entryPerimeter=0;dashed=1;dashPattern=8 8;" edge="1" parent="1" source="Xmw1x83A06H2_JC6hK8s-7" target="Xmw1x83A06H2_JC6hK8s-8">
|
||||||
|
<mxGeometry relative="1" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="Xmw1x83A06H2_JC6hK8s-18" value="<div>Liefert Inhalte zum Webbrowser&nbsp;</div><div>von Benutzer:innen</div>" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="Xmw1x83A06H2_JC6hK8s-17">
|
||||||
|
<mxGeometry x="-0.0888" y="-2" relative="1" as="geometry">
|
||||||
|
<mxPoint x="5" as="offset" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<object placeholders="1" c4Name="Visual Analytics Tool" c4Type="SystemScopeBoundary" c4Application="Software System" label="<font style="font-size: 16px"><b><div style="text-align: left">%c4Name%</div></b></font><div style="text-align: left">[%c4Application%]</div>" id="Xmw1x83A06H2_JC6hK8s-19">
|
||||||
|
<mxCell style="rounded=1;fontSize=11;whiteSpace=wrap;html=1;dashed=1;arcSize=20;fillColor=none;strokeColor=#666666;fontColor=#333333;labelBackgroundColor=none;align=left;verticalAlign=bottom;labelBorderColor=none;spacingTop=0;spacing=10;dashPattern=8 4;metaEdit=1;rotatable=0;perimeter=rectanglePerimeter;noLabel=0;labelPadding=0;allowArrows=0;connectable=0;expand=0;recursiveResize=0;editable=1;pointerEvents=0;absoluteArcSize=1;points=[[0.25,0,0],[0.5,0,0],[0.75,0,0],[1,0.25,0],[1,0.5,0],[1,0.75,0],[0.75,1,0],[0.5,1,0],[0.25,1,0],[0,0.75,0],[0,0.5,0],[0,0.25,0]];" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="20" y="210" width="1080" height="460" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
</object>
|
||||||
|
</root>
|
||||||
|
</mxGraphModel>
|
||||||
|
</diagram>
|
||||||
</mxfile>
|
</mxfile>
|
||||||
|
|
|
@ -402,6 +402,7 @@ class Database:
|
||||||
p.property_platform_id,
|
p.property_platform_id,
|
||||||
p.created_at as first_found,
|
p.created_at as first_found,
|
||||||
p.last_found,
|
p.last_found,
|
||||||
|
p.check_data,
|
||||||
r.id as region_id,
|
r.id as region_id,
|
||||||
r.name as region_name
|
r.name as region_name
|
||||||
FROM
|
FROM
|
||||||
|
|
|
@ -55,4 +55,4 @@ def region_capacities(id: int):
|
||||||
result = {"capacities": df['capacity'].to_list(), "dates": df['scrape_date'].to_list()}
|
result = {"capacities": df['capacity'].to_list(), "dates": df['scrape_date'].to_list()}
|
||||||
|
|
||||||
etl_cache.saveObj(file, result)
|
etl_cache.saveObj(file, result)
|
||||||
return result
|
return result
|
||||||
|
|
Loading…
Reference in New Issue