#26 Annual conservation report

* finishes compensation analysis report
This commit is contained in:
2021-10-19 13:34:33 +02:00
parent d744e22d94
commit 647d087efe
9 changed files with 266 additions and 43 deletions

View File

@@ -10,7 +10,7 @@
</div>
<div class="col-sm-12 col-md-12 col-lg-12">
{% include 'analysis/reports/includes/intervention/card_intervention.html' %}
{% include 'analysis/reports/includes/card_compensation.html' %}
{% include 'analysis/reports/includes/compensation/card_compensation.html' %}
{% include 'analysis/reports/includes/card_eco_account.html' %}
{% include 'analysis/reports/includes/card_old_interventions.html' %}
</div>

View File

@@ -0,0 +1,55 @@
{% load i18n fontawesome_5 ksp_filters %}
<h3>{% trans 'Amount' %}</h3>
<strong>
{% blocktrans %}
Checked = Has been checked by the registration office according to LKompVzVo
{% endblocktrans %}
<br>
{% blocktrans %}
Recorded = Has been checked and published by the conservation office
{% endblocktrans %}
</strong>
<div class="table-container">
<table class="table table-hover">
<thead>
<tr>
<th scope="col">{% trans 'Area of responsibility' %}</th>
<th scope="col">{% fa5_icon 'star' %} {% trans 'Checked' %}</th>
<th scope="col">{% fa5_icon 'bookmark' %} {% trans 'Recorded' %}</th>
<th scope="col">{% trans 'Number single areas' %}</th>
<th scope="col">{% trans 'Total' %}</th>
</tr>
</thead>
<tbody>
<tr>
<td>{% trans 'Conservation office by law' %}</td>
<td>{{report.compensation_report.queryset_registration_office_unb_checked.count|default_if_zero:"-"}}</td>
<td>{{report.compensation_report.queryset_registration_office_unb_recorded.count|default_if_zero:"-"}}</td>
<td>{{report.compensation_report.num_single_surfaces_total_unb|default_if_zero:"-"}}</td>
<td>{{report.compensation_report.queryset_registration_office_unb.count|default_if_zero:"-"}}</td>
</tr>
<tr>
<td>{% trans 'Land-use planning' %}</td>
<td>{{report.compensation_report.queryset_registration_office_tbp_checked.count|default_if_zero:"-"}}</td>
<td>{{report.compensation_report.queryset_registration_office_tbp_recorded.count|default_if_zero:"-"}}</td>
<td>{{report.compensation_report.num_single_surfaces_total_tbp|default_if_zero:"-"}}</td>
<td>{{report.compensation_report.queryset_registration_office_tbp.count|default_if_zero:"-"}}</td>
</tr>
<tr>
<td>{% trans 'Other registration office' %}</td>
<td>{{report.compensation_report.queryset_registration_office_other_checked.count|default_if_zero:"-"}}</td>
<td>{{report.compensation_report.queryset_registration_office_other_recorded.count|default_if_zero:"-"}}</td>
<td>{{report.compensation_report.num_single_surfaces_total_other|default_if_zero:"-"}}</td>
<td>{{report.compensation_report.queryset_registration_office_other.count|default_if_zero:"-"}}</td>
</tr>
<tr>
<td><strong>{% trans 'Total' %}</strong></td>
<td><strong>{{report.compensation_report.queryset_checked.count|default_if_zero:"-"}}</strong></td>
<td><strong>{{report.compensation_report.queryset_recorded.count|default_if_zero:"-"}}</strong></td>
<td><strong>{{report.compensation_report.num_single_surfaces_total|default_if_zero:"-"}}</strong></td>
<td><strong>{{report.compensation_report.queryset.count|default_if_zero:"-"}}</strong></td>
</tr>
</tbody>
</table>
</div>

View File

@@ -15,7 +15,7 @@
</div>
<div id="compensationBody" class="collapse" aria-labelledby="compensation">
<div class="card-body">
{% include 'form/table/generic_table_form_body.html' %}
{% include 'analysis/reports/includes/compensation/amount.html' %}
</div>
</div>
</div>

View File

@@ -13,18 +13,18 @@
<div class="table-container">
<table class="table table-hover">
<thead>
<tr>
<th scope="col" class="w-25">{% trans 'Total' %}</th>
<th scope="col">{% fa5_icon 'star' %} {% trans 'Checked' %}</th>
<th scope="col">{% fa5_icon 'bookmark' %} {% trans 'Recorded' %}</th>
</tr>
<tr>
<th scope="col">{% fa5_icon 'star' %} {% trans 'Checked' %}</th>
<th scope="col">{% fa5_icon 'bookmark' %} {% trans 'Recorded' %}</th>
<th scope="col" class="w-25">{% trans 'Total' %}</th>
</tr>
</thead>
<tbody>
<tr>
<td>{{report.intervention_report.queryset.count|default_if_zero:"-"}}</td>
<td>{{report.intervention_report.queryset_checked.count|default_if_zero:"-"}}</td>
<td>{{report.intervention_report.queryset_recorded.count|default_if_zero:"-"}}</td>
</tr>
<tr>
<td>{{report.intervention_report.queryset_checked.count|default_if_zero:"-"}}</td>
<td>{{report.intervention_report.queryset_recorded.count|default_if_zero:"-"}}</td>
<td>{{report.intervention_report.queryset.count|default_if_zero:"-"}}</td>
</tr>
</tbody>
</table>
</div>

View File

@@ -5,29 +5,29 @@
<thead>
<tr>
<th class="w-25" scope="col">{% trans 'Compensation type' %}</th>
<th class="w-25" scope="col">{% fa5_icon 'star' %} {% trans 'Checked' %}</th>
<th class="w-25" scope="col">{% fa5_icon 'bookmark' %} {% trans 'Recorded' %}</th>
<th class="w-25" scope="col">{% trans 'Total' %}</th>
<th class="w-25" scope="col">{% trans 'Checked' %}</th>
<th class="w-25" scope="col">{% trans 'Recorded' %}</th>
</tr>
</thead>
<tbody>
<tr>
<th>{% trans 'Compensation' %}</th>
<td>{{report.intervention_report.compensation_sum|default_if_zero:"-"}}</td>
<td>{{report.intervention_report.compensation_sum_checked|default_if_zero:"-"}}</td>
<td>{{report.intervention_report.compensation_sum_recorded|default_if_zero:"-"}}</td>
<td>{{report.intervention_report.compensation_sum|default_if_zero:"-"}}</td>
</tr>
<tr>
<th>{% trans 'Payment' %}</th>
<td>{{report.intervention_report.payment_sum|default_if_zero:"-"}}</td>
<td>{{report.intervention_report.payment_sum_checked|default_if_zero:"-"}}</td>
<td>{{report.intervention_report.payment_sum_recorded|default_if_zero:"-"}}</td>
<td>{{report.intervention_report.payment_sum|default_if_zero:"-"}}</td>
</tr>
<tr>
<th>{% trans 'Deductions' %}</th>
<td>{{report.intervention_report.deduction_sum|default_if_zero:"-"}}</td>
<td>{{report.intervention_report.deduction_sum_checked|default_if_zero:"-"}}</td>
<td>{{report.intervention_report.deduction_sum_recorded|default_if_zero:"-"}}</td>
<td>{{report.intervention_report.deduction_sum|default_if_zero:"-"}}</td>
</tr>
</tbody>
</table>

View File

@@ -14,10 +14,10 @@
{% trans 'Law' %}
</th>
<th scope="col">
{% trans 'Checked' %}
{% fa5_icon 'star' %} {% trans 'Checked' %}
</th>
<th scope="col">
{% trans 'Recorded' %}
{% fa5_icon 'bookmark' %} {% trans 'Recorded' %}
</th>
<th scope="col">
{% trans 'Total' %}

View File

@@ -5,12 +5,14 @@ Contact: michel.peltriaux@sgdnord.rlp.de
Created on: 18.10.21
"""
from django.contrib.gis.db.models.functions import NumGeometries
from django.db.models import Count, Sum, Q
from codelist.models import KonovaCode
from codelist.settings import CODELIST_LAW_ID
from compensation.models import Compensation, Payment, EcoAccountDeduction
from intervention.models import Intervention
from konova.models import Geometry
class TimespanReport:
@@ -122,6 +124,144 @@ class TimespanReport:
self.deduction_sum_checked = deductions.filter(intervention__checked__isnull=False).count()
self.deduction_sum_recorded = deductions.filter(intervention__recorded__isnull=False).count()
class CompensationReport:
queryset = Compensation.objects.none()
queryset_checked = Compensation.objects.none()
queryset_recorded = Compensation.objects.none()
queryset_registration_office_unb = Compensation.objects.none()
queryset_registration_office_unb_checked = Compensation.objects.none()
queryset_registration_office_unb_recorded = Compensation.objects.none()
num_single_surfaces_total_unb = -1
queryset_registration_office_tbp = Compensation.objects.none()
queryset_registration_office_tbp_checked = Compensation.objects.none()
queryset_registration_office_tbp_recorded = Compensation.objects.none()
num_single_surfaces_total_tbp = -1
queryset_registration_office_other = Compensation.objects.none()
queryset_registration_office_other_checked = Compensation.objects.none()
queryset_registration_office_other_recorded = Compensation.objects.none()
num_single_surfaces_total_other = -1
num_single_surfaces_total = -1
num_single_surfaces_recorded = -1
# Code list id for 'Träger der Bauleitplanung' parent
id_tbp = 1943695
# Code list id for 'untere Naturschutzbehörde'
id_unb = 1943087
# Code list id for 'obere Naturschutzbehörde'
id_onb = 1943084
def __init__(self, id: str):
self.queryset = Compensation.objects.filter(
intervention__responsible__conservation_office__id=id,
deleted=None,
)
self.queryset_checked = self.queryset.filter(
intervention__checked__isnull=False
)
self.queryset_recorded = self.queryset.filter(
intervention__recorded__isnull=False
)
self._create_report()
def _create_report(self):
""" Creates all report information
Returns:
"""
self._evaluate_compensation_responsibility()
self._evaluate_surfaces()
def _evaluate_surfaces(self):
""" Evaluates the surfaces of compensation Multipolygon fields
Returns:
"""
# Evaluate all surfaces
ids = self.queryset.values_list("geometry_id")
self.num_single_surfaces_total = self._count_geometry_surfaces(ids)
# Evaluate surfaces where the conservation office is the registration office as well
ids = self.queryset_registration_office_unb.values_list("geometry_id")
self.num_single_surfaces_total_unb = self._count_geometry_surfaces(ids)
# Evaluates surfaces where the registration office is a Träger Bauleitplanung
ids = self.queryset_registration_office_tbp.values_list("geometry_id")
self.num_single_surfaces_total_tbp = self._count_geometry_surfaces(ids)
# Evaluates surfaces where any other registration office is responsible
ids = self.queryset_registration_office_other.values_list("geometry_id")
self.num_single_surfaces_total_other = self._count_geometry_surfaces(ids)
def _count_geometry_surfaces(self, ids: list):
""" Wraps counting of geometry surfaces from a given list of ids
Args:
ids (list): List of geometry ids
Returns:
"""
# Now select all geometries matching the ids
# Then perform a ST_NumGeometries variant over all geometries
# Then sum up all of the calculated surface numbers
return Geometry.objects.filter(
id__in=ids
).annotate(
num=NumGeometries("geom")
).aggregate(
num_geoms=Sum("num")
)["num_geoms"] or 0
def _evaluate_compensation_responsibility(self):
""" Evaluates compensations based on different responsibility areas
unb -> Untere Naturschutzbehörde
Holds entries where conservation_office and registration_office basically are the same
tbp -> Träger Bauleitplanung
Holds entries where registration_office is a Träger der Bauleitplanung
other -> Other registration offices
Holds all other entries
Returns:
"""
self.queryset_registration_office_unb = self.queryset.filter(
intervention__responsible__registration_office__parent__id=self.id_unb
)
self.queryset_registration_office_unb_recorded = self.queryset_registration_office_unb.filter(
intervention__recorded__isnull=False,
)
self.queryset_registration_office_unb_checked = self.queryset_registration_office_unb.filter(
intervention__checked__isnull=False,
)
self.queryset_registration_office_tbp = self.queryset.filter(
intervention__responsible__registration_office__parent__id=self.id_tbp
)
self.queryset_registration_office_tbp_recorded = self.queryset_registration_office_tbp.filter(
intervention__recorded__isnull=False,
)
self.queryset_registration_office_tbp_checked = self.queryset_registration_office_tbp.filter(
intervention__checked__isnull=False,
)
self.queryset_registration_office_other = self.queryset.exclude(
Q(id__in=self.queryset_registration_office_tbp) | Q(id__in=self.queryset_registration_office_unb)
)
self.queryset_registration_office_other_recorded = self.queryset_registration_office_other.filter(
intervention__recorded__isnull=False,
)
self.queryset_registration_office_other_checked = self.queryset_registration_office_other.filter(
intervention__checked__isnull=False,
)
def __init__(self, office_id: str):
self.office_id = office_id
self.intervention_report = self.InterventionReport(self.office_id)
self.compensation_report = self.CompensationReport(self.office_id)