diff --git a/analysis/settings.py b/analysis/settings.py index 7eb022dc..de5ef149 100644 --- a/analysis/settings.py +++ b/analysis/settings.py @@ -9,4 +9,8 @@ Created on: 19.10.21 # Defines the date of the legal publishing of the LKompVzVo from django.utils import timezone -LKOMPVZVO_PUBLISH_DATE = timezone.make_aware(timezone.datetime.fromisoformat("2018-06-16")).date() +LKOMPVZVO_PUBLISH_DATE = timezone.make_aware( + timezone.datetime.fromisoformat( + "2018-06-16" + ) +).date() diff --git a/analysis/templates/analysis/reports/detail.html b/analysis/templates/analysis/reports/detail.html index 31ca65c6..f553e573 100644 --- a/analysis/templates/analysis/reports/detail.html +++ b/analysis/templates/analysis/reports/detail.html @@ -31,6 +31,6 @@ {% include 'analysis/reports/includes/intervention/card_intervention.html' %} {% include 'analysis/reports/includes/compensation/card_compensation.html' %} {% include 'analysis/reports/includes/eco_account/card_eco_account.html' %} - {% include 'analysis/reports/includes/old_data/card_old_interventions.html' %} + {% include 'analysis/reports/includes/old_data/card_old_data.html' %} {% endblock %} \ No newline at end of file diff --git a/analysis/templates/analysis/reports/includes/compensation/card_compensation.html b/analysis/templates/analysis/reports/includes/compensation/card_compensation.html index 8fe2eec4..9a77c88f 100644 --- a/analysis/templates/analysis/reports/includes/compensation/card_compensation.html +++ b/analysis/templates/analysis/reports/includes/compensation/card_compensation.html @@ -10,6 +10,7 @@ {% fa5_icon 'leaf' %} {% trans 'Compensations' %} + {% trans 'Binding date after' %} 16.06.2018 diff --git a/analysis/templates/analysis/reports/includes/eco_account/card_eco_account.html b/analysis/templates/analysis/reports/includes/eco_account/card_eco_account.html index 850ac60a..f2562243 100644 --- a/analysis/templates/analysis/reports/includes/eco_account/card_eco_account.html +++ b/analysis/templates/analysis/reports/includes/eco_account/card_eco_account.html @@ -10,6 +10,7 @@ {% fa5_icon 'tree' %} {% trans 'Eco-Accounts' %} + {% trans 'Binding date after' %} 16.06.2018 diff --git a/analysis/templates/analysis/reports/includes/intervention/card_intervention.html b/analysis/templates/analysis/reports/includes/intervention/card_intervention.html index 6a9993a3..65897c69 100644 --- a/analysis/templates/analysis/reports/includes/intervention/card_intervention.html +++ b/analysis/templates/analysis/reports/includes/intervention/card_intervention.html @@ -9,6 +9,7 @@ {% fa5_icon 'pencil-ruler' %} {% trans 'Interventions' %} + {% trans 'Binding date after' %} 16.06.2018 diff --git a/analysis/templates/analysis/reports/includes/old_data/card_old_interventions.html b/analysis/templates/analysis/reports/includes/old_data/card_old_data.html similarity index 100% rename from analysis/templates/analysis/reports/includes/old_data/card_old_interventions.html rename to analysis/templates/analysis/reports/includes/old_data/card_old_data.html diff --git a/analysis/tests.py b/analysis/tests.py deleted file mode 100644 index 7ce503c2..00000000 --- a/analysis/tests.py +++ /dev/null @@ -1,3 +0,0 @@ -from django.test import TestCase - -# Create your tests here. diff --git a/analysis/tests/__init__.py b/analysis/tests/__init__.py new file mode 100644 index 00000000..a34406f3 --- /dev/null +++ b/analysis/tests/__init__.py @@ -0,0 +1,7 @@ +""" +Author: Michel Peltriaux +Organization: Struktur- und Genehmigungsdirektion Nord, Rhineland-Palatinate, Germany +Contact: ksp-servicestelle@sgdnord.rlp.de +Created on: 15.08.23 + +""" diff --git a/analysis/tests/unit/__init__.py b/analysis/tests/unit/__init__.py new file mode 100644 index 00000000..a34406f3 --- /dev/null +++ b/analysis/tests/unit/__init__.py @@ -0,0 +1,7 @@ +""" +Author: Michel Peltriaux +Organization: Struktur- und Genehmigungsdirektion Nord, Rhineland-Palatinate, Germany +Contact: ksp-servicestelle@sgdnord.rlp.de +Created on: 15.08.23 + +""" diff --git a/analysis/tests/unit/test_forms.py b/analysis/tests/unit/test_forms.py new file mode 100644 index 00000000..00356313 --- /dev/null +++ b/analysis/tests/unit/test_forms.py @@ -0,0 +1,47 @@ +""" +Author: Michel Peltriaux +Organization: Struktur- und Genehmigungsdirektion Nord, Rhineland-Palatinate, Germany +Contact: ksp-servicestelle@sgdnord.rlp.de +Created on: 15.08.23 + +""" +from datetime import timedelta + +from django.urls import reverse +from django.utils.timezone import now +from django.utils.translation import gettext_lazy as _ + +from analysis.forms import TimespanReportForm +from konova.tests.test_views import BaseTestCase + + +class TimeSpanReportFormTestCase(BaseTestCase): + def setUp(self) -> None: + super().setUp() + eiv = self.create_dummy_intervention() + + def test_init(self): + form = TimespanReportForm() + self.assertEqual(form.form_title, str(_("Generate report"))) + self.assertEqual(form.form_caption, str(_("Select a timespan and the desired conservation office") )) + self.assertEqual(form.action_url, reverse("analysis:reports")) + self.assertFalse(form.show_cancel_btn) + self.assertEqual(form.action_btn_label, str(_("Continue"))) + + def test_save(self): + date_from = now().date() - timedelta(days=365) + date_to = now().date() + office = self.get_conservation_office_code() + data = { + "date_from": date_from, + "date_to": date_to, + "conservation_office": office, + } + form = TimespanReportForm(data) + self.assertTrue(form.is_valid(), msg=f"{form.errors}") + + detail_report_url = form.save() + self.assertEqual( + detail_report_url, + reverse("analysis:report-detail", args=(office.id,)) + f"?df={date_from}&dt={date_to}" + ) diff --git a/analysis/tests/unit/test_report.py b/analysis/tests/unit/test_report.py new file mode 100644 index 00000000..ee7518cc --- /dev/null +++ b/analysis/tests/unit/test_report.py @@ -0,0 +1,94 @@ +""" +Author: Michel Peltriaux +Organization: Struktur- und Genehmigungsdirektion Nord, Rhineland-Palatinate, Germany +Contact: ksp-servicestelle@sgdnord.rlp.de +Created on: 17.08.23 + +""" +from datetime import timedelta + +from django.utils.timezone import now + +from analysis.settings import LKOMPVZVO_PUBLISH_DATE +from analysis.utils.report import TimespanReport +from konova.sub_settings.django_settings import DEFAULT_DATE_FORMAT +from konova.tests.test_views import BaseTestCase + + +class TimeSpanReportTestCase(BaseTestCase): + def setUp(self) -> None: + super().setUp() + + today = now().date() + old_date = LKOMPVZVO_PUBLISH_DATE - timedelta(days=1) + + self.conservation_office = self.get_conservation_office_code() + self.eiv_old = self.create_dummy_intervention() + self.kom_old = self.create_dummy_compensation(interv=self.eiv_old) + self.assertNotEqual(self.compensation.intervention, self.kom_old.intervention) + self.eiv = self.compensation.intervention + self.oek_old = self.create_dummy_eco_account() + + self.eiv_old.responsible.conservation_office = self.conservation_office + self.eiv_old.legal.binding_date = old_date + self.eiv_old.legal.registration_date = old_date + + self.eiv.responsible.conservation_office = self.conservation_office + self.eiv.legal.binding_date = today + self.eiv.legal.registration_date = today + + self.eco_account.responsible.conservation_office = self.conservation_office + self.eco_account.legal.registration_date = today + self.eco_account.legal.binding_date = today + + self.oek_old.responsible.conservation_office = self.conservation_office + self.oek_old.legal.registration_date = old_date + self.oek_old.legal.binding_date = old_date + + self.eiv.legal.save() + self.eiv.responsible.save() + + self.eiv_old.legal.save() + self.eiv_old.responsible.save() + + self.eco_account.legal.save() + self.eco_account.responsible.save() + + self.oek_old.legal.save() + self.oek_old.responsible.save() + + def test_init(self): + date_from = now().date() - timedelta(days=365) + date_to = now().date() + report = TimespanReport(self.conservation_office.id, date_from, date_to) + + self.assertEqual(report.office_id, self.conservation_office.id) + self.assertEqual(report.date_from, date_from) + self.assertEqual(report.date_to, date_to) + + self.assertIsNotNone(report.intervention_report) + self.assertIsNotNone(report.compensation_report) + self.assertIsNotNone(report.eco_account_report) + self.assertIsNotNone(report.old_data_report) + + self.assertEqual(report.excel_map["date_from"], date_from.strftime(DEFAULT_DATE_FORMAT)) + self.assertEqual(report.excel_map["date_to"], date_to.strftime(DEFAULT_DATE_FORMAT)) + + self.assertEqual(report.old_data_report.queryset_intervention_count, 1) + self.assertEqual(report.old_data_report.queryset_intervention_recorded_count, 0) + self.assertEqual(report.old_data_report.queryset_comps_count, 1) + self.assertEqual(report.old_data_report.queryset_acc_count, 1) + self.assertEqual(report.old_data_report.queryset_acc_recorded_count, 0) + + self.assertEqual(report.intervention_report.queryset_count, 1) + self.assertEqual(report.intervention_report.queryset_checked_count, 0) + self.assertEqual(report.intervention_report.queryset_recorded_count, 0) + + self.assertEqual(report.compensation_report.queryset_count, 1) + self.assertEqual(report.compensation_report.queryset_checked_count, 0) + self.assertEqual(report.compensation_report.queryset_recorded_count, 0) + + self.assertEqual(report.eco_account_report.queryset_count, 1) + self.assertEqual(report.eco_account_report.queryset_recorded_count, 0) + self.assertEqual(report.eco_account_report.queryset_deductions_count, 1) + self.assertEqual(report.eco_account_report.queryset_deductions_recorded_count, 0) diff --git a/analysis/utils/report.py b/analysis/utils/report.py index 9bbd7d3d..4e118fae 100644 --- a/analysis/utils/report.py +++ b/analysis/utils/report.py @@ -413,6 +413,7 @@ class TimespanReport: def __init__(self, id: str, date_from: str, date_to: str): # First fetch all eco account for this office self.queryset = EcoAccount.objects.filter( + legal__registration_date__gt=LKOMPVZVO_PUBLISH_DATE, responsible__conservation_office__id=id, deleted=None, created__timestamp__date__gte=date_from, @@ -516,8 +517,8 @@ class TimespanReport: legal__registration_date__lte=LKOMPVZVO_PUBLISH_DATE, responsible__conservation_office__id=id, deleted=None, - created__timestamp__gte=date_from, - created__timestamp__lte=date_to, + created__timestamp__date__gte=date_from, + created__timestamp__date__lte=date_to, ) self.queryset_acc_recorded = self.queryset_acc.filter( recorded__isnull=False, diff --git a/konova/tests/test_views.py b/konova/tests/test_views.py index 437f114a..608336fd 100644 --- a/konova/tests/test_views.py +++ b/konova/tests/test_views.py @@ -65,7 +65,7 @@ class BaseTestCase(TestCase): self.compensation = self.create_dummy_compensation() self.eco_account = self.create_dummy_eco_account() self.ema = self.create_dummy_ema() - self.deduction = self.create_dummy_deduction() + self.deduction = self.create_dummy_deduction(acc=self.eco_account, interv=self.intervention) self.create_dummy_states() self.create_dummy_action() self.codes = self.create_dummy_codes() @@ -157,14 +157,17 @@ class BaseTestCase(TestCase): intervention.generate_access_token(make_unique=True) return intervention - def create_dummy_compensation(self): + def create_dummy_compensation(self, interv: Intervention=None): """ Creates a compensation which can be used for tests Returns: """ - if self.intervention is None: - self.intervention = self.create_dummy_intervention() + if not interv: + if self.intervention is None: + interv = self.create_dummy_intervention() + else: + interv = self.intervention # Create dummy data # Create log entry action = UserActionLogEntry.get_created_action(self.superuser) @@ -173,7 +176,7 @@ class BaseTestCase(TestCase): compensation = Compensation.objects.create( identifier="TEST", title="Test_title", - intervention=self.intervention, + intervention=interv, created=action, geometry=geometry, comment="Test", @@ -196,9 +199,11 @@ class BaseTestCase(TestCase): handler = self.handler responsible_data.handler = handler responsible_data.save() + + identifier = EcoAccount().generate_new_identifier() # Finally create main object, holding the other objects eco_account = EcoAccount.objects.create( - identifier="TEST", + identifier=identifier, title="Test_title", deductable_surface=500, legal=lega_data, @@ -234,10 +239,15 @@ class BaseTestCase(TestCase): ) return ema - def create_dummy_deduction(self): + def create_dummy_deduction(self, acc: EcoAccount = None, interv: Intervention = None): + if not acc: + acc = self.create_dummy_eco_account() + if not interv: + interv = self.create_dummy_intervention() + return EcoAccountDeduction.objects.create( - account=self.create_dummy_eco_account(), - intervention=self.create_dummy_intervention(), + account=acc, + intervention=interv, surface=100, ) @@ -270,12 +280,14 @@ class BaseTestCase(TestCase): Returns: """ - codes = KonovaCode.objects.bulk_create([ - KonovaCode(id=1, is_selectable=True, is_archived=False, is_leaf=True, long_name="Test1"), - KonovaCode(id=2, is_selectable=True, is_archived=False, is_leaf=True, long_name="Test2"), - KonovaCode(id=3, is_selectable=True, is_archived=False, is_leaf=True, long_name="Test3"), - KonovaCode(id=4, is_selectable=True, is_archived=False, is_leaf=True, long_name="Test4"), - ]) + codes = KonovaCode.objects.all() + if codes.count() == 0: + codes = KonovaCode.objects.bulk_create([ + KonovaCode(id=1, is_selectable=True, is_archived=False, is_leaf=True, long_name="Test1"), + KonovaCode(id=2, is_selectable=True, is_archived=False, is_leaf=True, long_name="Test2"), + KonovaCode(id=3, is_selectable=True, is_archived=False, is_leaf=True, long_name="Test3"), + KonovaCode(id=4, is_selectable=True, is_archived=False, is_leaf=True, long_name="Test4"), + ]) return codes def create_dummy_team(self): diff --git a/locale/de/LC_MESSAGES/django.mo b/locale/de/LC_MESSAGES/django.mo index 93455db5..a2539a32 100644 Binary files a/locale/de/LC_MESSAGES/django.mo and b/locale/de/LC_MESSAGES/django.mo differ diff --git a/locale/de/LC_MESSAGES/django.po b/locale/de/LC_MESSAGES/django.po index dc2c6271..b917005d 100644 --- a/locale/de/LC_MESSAGES/django.po +++ b/locale/de/LC_MESSAGES/django.po @@ -43,7 +43,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-10 10:16+0200\n" +"POT-Creation-Date: 2023-08-17 10:09+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -96,15 +96,16 @@ msgstr "Verantwortliche Stelle" msgid "Click for selection" msgstr "Auswählen..." -#: analysis/forms.py:70 +#: analysis/forms.py:70 analysis/tests/unit/test_forms.py:25 msgid "Generate report" msgstr "Bericht generieren" -#: analysis/forms.py:71 +#: analysis/forms.py:71 analysis/tests/unit/test_forms.py:26 msgid "Select a timespan and the desired conservation office" msgstr "Wählen Sie die Zeitspanne und die gewünschte Eintragungsstelle" -#: analysis/forms.py:74 konova/forms/modals/base_form.py:30 +#: analysis/forms.py:74 analysis/tests/unit/test_forms.py:29 +#: konova/forms/modals/base_form.py:30 msgid "Continue" msgstr "Weiter" @@ -231,6 +232,12 @@ msgstr "Andere Zulassungsbehörden" msgid "Compensations" msgstr "Kompensationen" +#: analysis/templates/analysis/reports/includes/compensation/card_compensation.html:13 +#: analysis/templates/analysis/reports/includes/eco_account/card_eco_account.html:13 +#: analysis/templates/analysis/reports/includes/intervention/card_intervention.html:12 +msgid "Binding date after" +msgstr "Bestandskraft- bzw. Rechtskraftdatum nach" + #: analysis/templates/analysis/reports/includes/eco_account/card_eco_account.html:11 msgid "Eco-Accounts" msgstr "Ökokonten" @@ -345,11 +352,11 @@ msgstr "Eingriff" msgid "Eco-account" msgstr "Ökokonto" -#: analysis/templates/analysis/reports/includes/old_data/card_old_interventions.html:11 +#: analysis/templates/analysis/reports/includes/old_data/card_old_data.html:11 msgid "Old interventions" msgstr "Altfälle" -#: analysis/templates/analysis/reports/includes/old_data/card_old_interventions.html:13 +#: analysis/templates/analysis/reports/includes/old_data/card_old_data.html:13 msgid "Binding date before" msgstr "Bestandskraft- bzw. Rechtskraftdatum vor" @@ -2291,7 +2298,7 @@ msgstr "" "Dieses Datum ist unrealistisch. Geben Sie bitte das korrekte Datum ein " "(>1950)." -#: konova/views/home.py:74 templates/navbars/navbar.html:16 +#: konova/views/home.py:75 templates/navbars/navbar.html:16 msgid "Home" msgstr "Home" @@ -2299,13 +2306,13 @@ msgstr "Home" msgid "Log" msgstr "Log" -#: konova/views/map_proxy.py:71 +#: konova/views/map_proxy.py:70 msgid "" "The external service is currently unavailable.
Please try again in a few " "moments..." msgstr "" -"Der externe Dienst ist zur Zeit nicht erreichbar.
Versuchen Sie es in ein paar " -"Sekunden nochmal." +"Der externe Dienst ist zur Zeit nicht erreichbar.
Versuchen Sie es in ein " +"paar Sekunden nochmal." #: konova/views/record.py:30 msgid "{} unrecorded"