Merge pull request '36_Quality_checks' (#37) from 36_Quality_checks into master
Reviewed-on: SGD-Nord/konova#37
This commit is contained in:
		
						commit
						e2d2e0317c
					
				@ -19,9 +19,10 @@ from codelist.settings import CODELIST_COMPENSATION_ACTION_ID, CODELIST_BIOTOPES
 | 
			
		||||
    CODELIST_COMPENSATION_FUNDING_ID
 | 
			
		||||
from compensation.managers import CompensationStateManager, EcoAccountDeductionManager, CompensationActionManager, \
 | 
			
		||||
    EcoAccountManager, CompensationManager
 | 
			
		||||
from compensation.utils.quality import CompensationQualityChecker, EcoAccountQualityChecker
 | 
			
		||||
from intervention.models import Intervention, ResponsibilityData, LegalData
 | 
			
		||||
from konova.models import BaseObject, BaseResource, Geometry, UuidModel, AbstractDocument, \
 | 
			
		||||
    generate_document_file_upload_path
 | 
			
		||||
    generate_document_file_upload_path, RecordableMixin
 | 
			
		||||
from konova.settings import DEFAULT_SRID_RLP, LANIS_LINK_TEMPLATE
 | 
			
		||||
from user.models import UserActionLogEntry
 | 
			
		||||
 | 
			
		||||
@ -163,13 +164,42 @@ class AbstractCompensation(BaseObject):
 | 
			
		||||
    class Meta:
 | 
			
		||||
        abstract = True
 | 
			
		||||
 | 
			
		||||
    def get_surface(self) -> float:
 | 
			
		||||
    def get_surface_after_states(self) -> float:
 | 
			
		||||
        """ Calculates the compensation's/account's surface
 | 
			
		||||
 | 
			
		||||
        Returns:
 | 
			
		||||
            sum_surface (float)
 | 
			
		||||
        """
 | 
			
		||||
        return self.after_states.all().aggregate(Sum("surface"))["surface__sum"]
 | 
			
		||||
        return self._calc_surface(self.after_states.all())
 | 
			
		||||
 | 
			
		||||
    def get_surface_before_states(self) -> float:
 | 
			
		||||
        """ Calculates the compensation's/account's surface
 | 
			
		||||
 | 
			
		||||
        Returns:
 | 
			
		||||
            sum_surface (float)
 | 
			
		||||
        """
 | 
			
		||||
        return self._calc_surface(self.before_states.all())
 | 
			
		||||
 | 
			
		||||
    def _calc_surface(self, qs: QuerySet):
 | 
			
		||||
        """ Calculates the surface sum of a given queryset
 | 
			
		||||
 | 
			
		||||
        Args:
 | 
			
		||||
            qs (QuerySet): The queryset containing CompensationState entries
 | 
			
		||||
 | 
			
		||||
        Returns:
 | 
			
		||||
 | 
			
		||||
        """
 | 
			
		||||
        return qs.aggregate(Sum("surface"))["surface__sum"] or 0
 | 
			
		||||
 | 
			
		||||
    def quality_check(self) -> CompensationQualityChecker:
 | 
			
		||||
        """ Performs data quality check
 | 
			
		||||
 | 
			
		||||
        Returns:
 | 
			
		||||
            checker (CompensationQualityChecker): Holds validity data and error messages
 | 
			
		||||
        """
 | 
			
		||||
        checker = CompensationQualityChecker(self)
 | 
			
		||||
        checker.run_check()
 | 
			
		||||
        return checker
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class Compensation(AbstractCompensation):
 | 
			
		||||
@ -191,11 +221,12 @@ class Compensation(AbstractCompensation):
 | 
			
		||||
 | 
			
		||||
    def save(self, *args, **kwargs):
 | 
			
		||||
        if self.identifier is None or len(self.identifier) == 0:
 | 
			
		||||
            # Create new identifier
 | 
			
		||||
            new_id = self.generate_new_identifier()
 | 
			
		||||
            while Compensation.objects.filter(identifier=new_id).exists():
 | 
			
		||||
                new_id = self.generate_new_identifier()
 | 
			
		||||
            self.identifier = new_id
 | 
			
		||||
            # Create new identifier is none was given
 | 
			
		||||
            self.identifier = self.generate_new_identifier()
 | 
			
		||||
 | 
			
		||||
        # Before saving, make sure a given identifier has not been taken already in the meanwhile
 | 
			
		||||
        while Compensation.objects.filter(identifier=self.identifier).exclude(id=self.id).exists():
 | 
			
		||||
            self.identifier = self.generate_new_identifier()
 | 
			
		||||
        super().save(*args, **kwargs)
 | 
			
		||||
 | 
			
		||||
    def get_LANIS_link(self) -> str:
 | 
			
		||||
@ -280,7 +311,7 @@ class CompensationDocument(AbstractDocument):
 | 
			
		||||
                pass
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class EcoAccount(AbstractCompensation):
 | 
			
		||||
class EcoAccount(AbstractCompensation, RecordableMixin):
 | 
			
		||||
    """
 | 
			
		||||
    An eco account is a kind of 'prepaid' compensation. It can be compared to an account that already has been filled
 | 
			
		||||
    with some kind of currency. From this account one is able to deduct currency for current projects.
 | 
			
		||||
@ -338,11 +369,12 @@ class EcoAccount(AbstractCompensation):
 | 
			
		||||
 | 
			
		||||
    def save(self, *args, **kwargs):
 | 
			
		||||
        if self.identifier is None or len(self.identifier) == 0:
 | 
			
		||||
            # Create new identifier
 | 
			
		||||
            new_id = self.generate_new_identifier()
 | 
			
		||||
            while EcoAccount.objects.filter(identifier=new_id).exists():
 | 
			
		||||
                new_id = self.generate_new_identifier()
 | 
			
		||||
            self.identifier = new_id
 | 
			
		||||
            # Create new identifier if none was given
 | 
			
		||||
            self.identifier = self.generate_new_identifier()
 | 
			
		||||
 | 
			
		||||
        # Before saving, make sure the given identifier is not used, yet
 | 
			
		||||
        while EcoAccount.objects.filter(identifier=self.identifier).exclude(id=self.id).exists():
 | 
			
		||||
            self.identifier = self.generate_new_identifier()
 | 
			
		||||
        super().save(*args, **kwargs)
 | 
			
		||||
 | 
			
		||||
    @property
 | 
			
		||||
@ -417,17 +449,15 @@ class EcoAccount(AbstractCompensation):
 | 
			
		||||
            y,
 | 
			
		||||
        )
 | 
			
		||||
 | 
			
		||||
    def quality_check(self) -> list:
 | 
			
		||||
    def quality_check(self) -> EcoAccountQualityChecker:
 | 
			
		||||
        """ Quality check
 | 
			
		||||
 | 
			
		||||
        Returns:
 | 
			
		||||
            ret_msgs (list): Holds error messages
 | 
			
		||||
            ret_msgs (EcoAccountQualityChecker): Holds validity and error messages
 | 
			
		||||
        """
 | 
			
		||||
        ret_msgs = []
 | 
			
		||||
 | 
			
		||||
        # ToDo: Add check methods!
 | 
			
		||||
 | 
			
		||||
        return ret_msgs
 | 
			
		||||
        checker = EcoAccountQualityChecker(self)
 | 
			
		||||
        checker.run_check()
 | 
			
		||||
        return checker
 | 
			
		||||
 | 
			
		||||
    def get_documents(self) -> QuerySet:
 | 
			
		||||
        """ Getter for all documents of an EcoAccount
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										104
									
								
								compensation/utils/quality.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										104
									
								
								compensation/utils/quality.py
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,104 @@
 | 
			
		||||
"""
 | 
			
		||||
Author: Michel Peltriaux
 | 
			
		||||
Organization: Struktur- und Genehmigungsdirektion Nord, Rhineland-Palatinate, Germany
 | 
			
		||||
Contact: michel.peltriaux@sgdnord.rlp.de
 | 
			
		||||
Created on: 25.10.21
 | 
			
		||||
 | 
			
		||||
"""
 | 
			
		||||
from django.utils.translation import gettext_lazy as _, pgettext_lazy as _con
 | 
			
		||||
from konova.utils.quality import AbstractQualityChecker
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class CompensationQualityChecker(AbstractQualityChecker):
 | 
			
		||||
    def run_check(self):
 | 
			
		||||
        """ Perform all defined data checks
 | 
			
		||||
 | 
			
		||||
        Returns:
 | 
			
		||||
 | 
			
		||||
        """
 | 
			
		||||
        self._check_states()
 | 
			
		||||
        self._check_actions()
 | 
			
		||||
        self._check_geometry()
 | 
			
		||||
        self.valid = len(self.messages) == 0
 | 
			
		||||
 | 
			
		||||
    def _check_states(self):
 | 
			
		||||
        """ Checks data quality for related CompensationState objects
 | 
			
		||||
 | 
			
		||||
        Returns:
 | 
			
		||||
 | 
			
		||||
        """
 | 
			
		||||
        after_states = self.obj.get_surface_after_states()
 | 
			
		||||
        before_states = self.obj.get_surface_before_states()
 | 
			
		||||
        if after_states != before_states:
 | 
			
		||||
            self.messages.append(
 | 
			
		||||
                _("States unequal")
 | 
			
		||||
            )
 | 
			
		||||
        if before_states == 0:
 | 
			
		||||
            self._add_missing_attr_name(_("States before"))
 | 
			
		||||
        if after_states == 0:
 | 
			
		||||
            self._add_missing_attr_name(_("States after"))
 | 
			
		||||
 | 
			
		||||
    def _check_actions(self):
 | 
			
		||||
        """ Checks data quality for related CompensationState objects
 | 
			
		||||
 | 
			
		||||
        Returns:
 | 
			
		||||
 | 
			
		||||
        """
 | 
			
		||||
        if not self.obj.actions.all():
 | 
			
		||||
            self._add_missing_attr_name(_con("Compensation", "Actions"))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class EcoAccountQualityChecker(CompensationQualityChecker):
 | 
			
		||||
    def run_check(self):
 | 
			
		||||
        """ Checks on data quality for an EcoAccount
 | 
			
		||||
 | 
			
		||||
        Returns:
 | 
			
		||||
 | 
			
		||||
        """
 | 
			
		||||
        self._check_deductable_surface()
 | 
			
		||||
        self._check_responsible_data()
 | 
			
		||||
        self._check_legal_data()
 | 
			
		||||
        super().run_check()
 | 
			
		||||
 | 
			
		||||
    def _check_legal_data(self):
 | 
			
		||||
        """ Checks the data quality for LegalData
 | 
			
		||||
 | 
			
		||||
        Returns:
 | 
			
		||||
 | 
			
		||||
        """
 | 
			
		||||
        try:
 | 
			
		||||
            legal = self.obj.legal
 | 
			
		||||
            if legal.registration_date is None:
 | 
			
		||||
                self._add_missing_attr_name(_("Agreement date"))
 | 
			
		||||
        except AttributeError:
 | 
			
		||||
            self._add_missing_attr_name(_("Legal data"))
 | 
			
		||||
 | 
			
		||||
    def _check_deductable_surface(self):
 | 
			
		||||
        """ Checks the quality of the deductable surface value
 | 
			
		||||
 | 
			
		||||
        Returns:
 | 
			
		||||
 | 
			
		||||
        """
 | 
			
		||||
        surface = self.obj.deductable_surface
 | 
			
		||||
        if surface is None or surface == 0:
 | 
			
		||||
            self._add_missing_attr_name(_("Available Surface"))
 | 
			
		||||
        after_state_surface = self.obj.get_state_after_surface_sum()
 | 
			
		||||
        if surface > after_state_surface:
 | 
			
		||||
            self.messages.append(
 | 
			
		||||
                _("Deductable surface can not be larger than state surface")
 | 
			
		||||
            )
 | 
			
		||||
 | 
			
		||||
    def _check_responsible_data(self):
 | 
			
		||||
        """ Checks on responsible data quality
 | 
			
		||||
 | 
			
		||||
        Returns:
 | 
			
		||||
 | 
			
		||||
        """
 | 
			
		||||
        try:
 | 
			
		||||
            resp = self.obj.responsible
 | 
			
		||||
            if resp.conservation_office is None:
 | 
			
		||||
                self._add_missing_attr_name(_("Conservation office"))
 | 
			
		||||
            if resp.conservation_file_number is None or len(resp.conservation_file_number) == 0:
 | 
			
		||||
                self._add_missing_attr_name(_("Conservation office file number"))
 | 
			
		||||
        except AttributeError:
 | 
			
		||||
            self._add_missing_attr_name(_("Responsible data"))
 | 
			
		||||
@ -6,12 +6,13 @@ from django.db.models import QuerySet
 | 
			
		||||
 | 
			
		||||
from compensation.models import AbstractCompensation
 | 
			
		||||
from ema.managers import EmaManager
 | 
			
		||||
from konova.models import AbstractDocument, generate_document_file_upload_path
 | 
			
		||||
from konova.settings import DEFAULT_SRID_RLP, LANIS_LINK_TEMPLATE, EMA_DOC_PATH
 | 
			
		||||
from ema.utils.quality import EmaQualityChecker
 | 
			
		||||
from konova.models import AbstractDocument, generate_document_file_upload_path, RecordableMixin
 | 
			
		||||
from konova.settings import DEFAULT_SRID_RLP, LANIS_LINK_TEMPLATE
 | 
			
		||||
from user.models import UserActionLogEntry
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class Ema(AbstractCompensation):
 | 
			
		||||
class Ema(AbstractCompensation, RecordableMixin):
 | 
			
		||||
    """
 | 
			
		||||
    EMA = Ersatzzahlungsmaßnahme
 | 
			
		||||
    (compensation actions from payments)
 | 
			
		||||
@ -80,17 +81,15 @@ class Ema(AbstractCompensation):
 | 
			
		||||
            y,
 | 
			
		||||
        )
 | 
			
		||||
 | 
			
		||||
    def quality_check(self) -> list:
 | 
			
		||||
    def quality_check(self) -> EmaQualityChecker:
 | 
			
		||||
        """ Quality check
 | 
			
		||||
 | 
			
		||||
        Returns:
 | 
			
		||||
            ret_msgs (list): Holds error messages
 | 
			
		||||
            ret_msgs (EmaQualityChecker): Holds validity error messages
 | 
			
		||||
        """
 | 
			
		||||
        ret_msgs = []
 | 
			
		||||
 | 
			
		||||
        # ToDo: Add check methods!
 | 
			
		||||
 | 
			
		||||
        return ret_msgs
 | 
			
		||||
        checker = EmaQualityChecker(self)
 | 
			
		||||
        checker.run_check()
 | 
			
		||||
        return checker
 | 
			
		||||
 | 
			
		||||
    def get_documents(self) -> QuerySet:
 | 
			
		||||
        """ Getter for all documents of an EMA
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										30
									
								
								ema/utils/quality.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								ema/utils/quality.py
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,30 @@
 | 
			
		||||
"""
 | 
			
		||||
Author: Michel Peltriaux
 | 
			
		||||
Organization: Struktur- und Genehmigungsdirektion Nord, Rhineland-Palatinate, Germany
 | 
			
		||||
Contact: michel.peltriaux@sgdnord.rlp.de
 | 
			
		||||
Created on: 25.10.21
 | 
			
		||||
 | 
			
		||||
"""
 | 
			
		||||
from django.utils.translation import gettext_lazy as _
 | 
			
		||||
from compensation.utils.quality import CompensationQualityChecker
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class EmaQualityChecker(CompensationQualityChecker):
 | 
			
		||||
    def run_check(self):
 | 
			
		||||
        super().run_check()
 | 
			
		||||
        self._check_responsible_data()
 | 
			
		||||
 | 
			
		||||
    def _check_responsible_data(self):
 | 
			
		||||
        """ Checks on responsible data quality
 | 
			
		||||
 | 
			
		||||
        Returns:
 | 
			
		||||
 | 
			
		||||
        """
 | 
			
		||||
        try:
 | 
			
		||||
            resp = self.obj.responsible
 | 
			
		||||
            if resp.conservation_office is None:
 | 
			
		||||
                self._add_missing_attr_name(_("Conservation office"))
 | 
			
		||||
            if resp.conservation_file_number is None or len(resp.conservation_file_number) == 0:
 | 
			
		||||
                self._add_missing_attr_name(_("Conservation office file number"))
 | 
			
		||||
        except AttributeError:
 | 
			
		||||
            self._add_missing_attr_name(_("Responsible data"))
 | 
			
		||||
@ -355,5 +355,9 @@ class EditInterventionForm(NewInterventionForm):
 | 
			
		||||
            self.instance.modified = user_action
 | 
			
		||||
            self.instance.save()
 | 
			
		||||
 | 
			
		||||
            # Uncheck and unrecord intervention due to changed data
 | 
			
		||||
            self.instance.set_unchecked(user)
 | 
			
		||||
            self.instance.set_unrecorded(user)
 | 
			
		||||
 | 
			
		||||
        return self.instance
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -208,13 +208,21 @@ class RunCheckModalForm(BaseModalForm):
 | 
			
		||||
        """
 | 
			
		||||
        super_result = super().is_valid()
 | 
			
		||||
        # Perform check
 | 
			
		||||
        msgs = self.instance.quality_check()
 | 
			
		||||
        for msg in msgs:
 | 
			
		||||
        checker = self.instance.quality_check()
 | 
			
		||||
        for msg in checker.messages:
 | 
			
		||||
            self.add_error(
 | 
			
		||||
                "checked_intervention",
 | 
			
		||||
                msg
 | 
			
		||||
            )
 | 
			
		||||
        return super_result and (len(msgs) == 0)
 | 
			
		||||
        comps = self.instance.compensations.all()
 | 
			
		||||
        for comp in comps:
 | 
			
		||||
            checker = comp.quality_check()
 | 
			
		||||
            for msg in checker.messages:
 | 
			
		||||
                self.add_error(
 | 
			
		||||
                    "checked_comps",
 | 
			
		||||
                    f"{comp.identifier}: {msg}"
 | 
			
		||||
                )
 | 
			
		||||
        return super_result and checker.valid
 | 
			
		||||
 | 
			
		||||
    def save(self):
 | 
			
		||||
        """ Saving logic
 | 
			
		||||
@ -336,7 +344,7 @@ class NewDeductionModalForm(BaseModalForm):
 | 
			
		||||
            return False
 | 
			
		||||
 | 
			
		||||
        # Calculate valid surface
 | 
			
		||||
        sum_surface = acc.get_surface()
 | 
			
		||||
        sum_surface = acc.get_surface_after_states()
 | 
			
		||||
        sum_surface_deductions = acc.get_deductions_surface()
 | 
			
		||||
        rest_surface = sum_surface - sum_surface_deductions
 | 
			
		||||
        form_surface = float(self.cleaned_data["surface"])
 | 
			
		||||
 | 
			
		||||
@ -10,14 +10,14 @@ import shutil
 | 
			
		||||
from django.contrib.auth.models import User
 | 
			
		||||
from django.contrib.gis.db import models
 | 
			
		||||
from django.db.models import QuerySet
 | 
			
		||||
from django.utils.translation import gettext_lazy as _
 | 
			
		||||
 | 
			
		||||
from codelist.models import KonovaCode
 | 
			
		||||
from codelist.settings import CODELIST_REGISTRATION_OFFICE_ID, CODELIST_CONSERVATION_OFFICE_ID, CODELIST_LAW_ID, \
 | 
			
		||||
    CODELIST_PROCESS_TYPE_ID
 | 
			
		||||
from intervention.managers import InterventionManager
 | 
			
		||||
from intervention.utils.quality import InterventionQualityChecker
 | 
			
		||||
from konova.models import BaseObject, Geometry, UuidModel, BaseResource, AbstractDocument, \
 | 
			
		||||
    generate_document_file_upload_path
 | 
			
		||||
    generate_document_file_upload_path, RecordableMixin, CheckableMixin
 | 
			
		||||
from konova.settings import DEFAULT_SRID_RLP, LANIS_LINK_TEMPLATE, LANIS_ZOOM_LUT
 | 
			
		||||
from konova.utils import generators
 | 
			
		||||
from user.models import UserActionLogEntry
 | 
			
		||||
@ -56,7 +56,6 @@ class ResponsibilityData(UuidModel):
 | 
			
		||||
    conservation_file_number = models.CharField(max_length=1000, blank=True, null=True)
 | 
			
		||||
    handler = models.CharField(max_length=500, null=True, blank=True, help_text="Refers to 'Eingriffsverursacher' or 'Maßnahmenträger'")
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    def __str__(self):
 | 
			
		||||
        return "ZB: {} | ETS: {} | Handler: {}".format(
 | 
			
		||||
            self.registration_office,
 | 
			
		||||
@ -172,7 +171,7 @@ class LegalData(UuidModel):
 | 
			
		||||
    revocation = models.OneToOneField(Revocation, null=True, blank=True, help_text="Refers to 'Widerspruch am'", on_delete=models.SET_NULL)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class Intervention(BaseObject):
 | 
			
		||||
class Intervention(BaseObject, RecordableMixin, CheckableMixin):
 | 
			
		||||
    """
 | 
			
		||||
    Interventions are e.g. construction sites where nature used to be.
 | 
			
		||||
    """
 | 
			
		||||
@ -274,11 +273,11 @@ class Intervention(BaseObject):
 | 
			
		||||
 | 
			
		||||
        """
 | 
			
		||||
        if self.identifier is None or len(self.identifier) == 0:
 | 
			
		||||
            # No identifier given
 | 
			
		||||
            # No identifier given by the user
 | 
			
		||||
            self.identifier = self.generate_new_identifier()
 | 
			
		||||
 | 
			
		||||
        # Before saving, make sure the set identifier is not used, yet
 | 
			
		||||
        while Intervention.objects.filter(identifier=self.identifier).exists():
 | 
			
		||||
        # Before saving, make sure the given identifier is not used in the meanwhile
 | 
			
		||||
        while Intervention.objects.filter(identifier=self.identifier).exclude(id=self.id).exists():
 | 
			
		||||
            self.identifier = self.generate_new_identifier()
 | 
			
		||||
        super().save(*args, **kwargs)
 | 
			
		||||
 | 
			
		||||
@ -296,62 +295,15 @@ class Intervention(BaseObject):
 | 
			
		||||
                pass
 | 
			
		||||
        super().delete(using, keep_parents)
 | 
			
		||||
 | 
			
		||||
    def quality_check(self) -> list:
 | 
			
		||||
    def quality_check(self) -> InterventionQualityChecker:
 | 
			
		||||
        """ Quality check
 | 
			
		||||
 | 
			
		||||
        Returns:
 | 
			
		||||
            ret_msgs (list): Holds error messages
 | 
			
		||||
        """
 | 
			
		||||
        ret_msgs = []
 | 
			
		||||
 | 
			
		||||
        self._check_quality_responsible_data(ret_msgs)
 | 
			
		||||
        self._check_quality_legal_data(ret_msgs)
 | 
			
		||||
 | 
			
		||||
        # ToDo: Extend for more!
 | 
			
		||||
 | 
			
		||||
        return ret_msgs
 | 
			
		||||
 | 
			
		||||
    def _check_quality_responsible_data(self, ret_msgs: list):
 | 
			
		||||
        """ Checks data quality of related ResponsibilityData
 | 
			
		||||
 | 
			
		||||
        Args:
 | 
			
		||||
            ret_msgs (dict): Holds error messages
 | 
			
		||||
 | 
			
		||||
        Returns:
 | 
			
		||||
 | 
			
		||||
        """
 | 
			
		||||
        try:
 | 
			
		||||
            # Check for file numbers
 | 
			
		||||
            if not self.responsible.registration_file_number or len(self.responsible.registration_file_number) == 0:
 | 
			
		||||
                ret_msgs.append(_("Registration office file number missing"))
 | 
			
		||||
 | 
			
		||||
            if not self.responsible.conservation_file_number or len(self.responsible.conservation_file_number) == 0:
 | 
			
		||||
                ret_msgs.append(_("Conservation office file number missing"))
 | 
			
		||||
        except AttributeError:
 | 
			
		||||
            # responsible data not found
 | 
			
		||||
            ret_msgs.append(_("Responsible data missing"))
 | 
			
		||||
 | 
			
		||||
    def _check_quality_legal_data(self, ret_msgs: list):
 | 
			
		||||
        """ Checks data quality of related LegalData
 | 
			
		||||
 | 
			
		||||
        Args:
 | 
			
		||||
            ret_msgs (dict): Holds error messages
 | 
			
		||||
 | 
			
		||||
        Returns:
 | 
			
		||||
 | 
			
		||||
        """
 | 
			
		||||
        try:
 | 
			
		||||
            # Check for a revocation
 | 
			
		||||
            if self.legal.revocation:
 | 
			
		||||
                ret_msgs.append(_("Revocation exists"))
 | 
			
		||||
 | 
			
		||||
            if self.legal.registration_date is None:
 | 
			
		||||
                ret_msgs.append(_("Registration date missing"))
 | 
			
		||||
 | 
			
		||||
            if self.legal.binding_date is None:
 | 
			
		||||
                ret_msgs.append(_("Binding on missing"))
 | 
			
		||||
        except AttributeError:
 | 
			
		||||
            ret_msgs.append(_("Legal data missing"))
 | 
			
		||||
        checker = InterventionQualityChecker(obj=self)
 | 
			
		||||
        checker.run_check()
 | 
			
		||||
        return checker
 | 
			
		||||
 | 
			
		||||
    def get_LANIS_link(self) -> str:
 | 
			
		||||
        """ Generates a link for LANIS depending on the geometry
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										99
									
								
								intervention/utils/quality.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										99
									
								
								intervention/utils/quality.py
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,99 @@
 | 
			
		||||
"""
 | 
			
		||||
Author: Michel Peltriaux
 | 
			
		||||
Organization: Struktur- und Genehmigungsdirektion Nord, Rhineland-Palatinate, Germany
 | 
			
		||||
Contact: michel.peltriaux@sgdnord.rlp.de
 | 
			
		||||
Created on: 25.10.21
 | 
			
		||||
 | 
			
		||||
"""
 | 
			
		||||
from django.utils.translation import gettext_lazy as _
 | 
			
		||||
from konova.utils.quality import AbstractQualityChecker
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class InterventionQualityChecker(AbstractQualityChecker):
 | 
			
		||||
    def run_check(self):
 | 
			
		||||
        """ Perform all defined data checks
 | 
			
		||||
 | 
			
		||||
        Returns:
 | 
			
		||||
 | 
			
		||||
        """
 | 
			
		||||
 | 
			
		||||
        self._check_responsible_data()
 | 
			
		||||
        self._check_legal_data()
 | 
			
		||||
        self._check_compensations()
 | 
			
		||||
        self._check_geometry()
 | 
			
		||||
        self.valid = len(self.messages) == 0
 | 
			
		||||
 | 
			
		||||
    def _check_responsible_data(self):
 | 
			
		||||
        """ Checks data quality of related ResponsibilityData
 | 
			
		||||
 | 
			
		||||
        Args:
 | 
			
		||||
            self.messages (dict): Holds error messages
 | 
			
		||||
 | 
			
		||||
        Returns:
 | 
			
		||||
 | 
			
		||||
        """
 | 
			
		||||
        try:
 | 
			
		||||
            resp = self.obj.responsible
 | 
			
		||||
            # Check for file numbers
 | 
			
		||||
            if not resp.registration_file_number or len(resp.registration_file_number) == 0:
 | 
			
		||||
                self._add_missing_attr_name(_("Registration office file number"))
 | 
			
		||||
 | 
			
		||||
            if not resp.conservation_file_number or len(resp.conservation_file_number) == 0:
 | 
			
		||||
                self._add_missing_attr_name(_("Conservation office file number"))
 | 
			
		||||
 | 
			
		||||
            # Check for selected offices
 | 
			
		||||
            if resp.registration_office is None:
 | 
			
		||||
                self._add_missing_attr_name(_("Registration office"))
 | 
			
		||||
 | 
			
		||||
            if resp.conservation_office is None:
 | 
			
		||||
                self._add_missing_attr_name(_("Conservation office"))
 | 
			
		||||
 | 
			
		||||
            if resp.handler is None:
 | 
			
		||||
                self._add_missing_attr_name(_("Intervention handler"))
 | 
			
		||||
        except AttributeError:
 | 
			
		||||
            # responsible data not found
 | 
			
		||||
            self._add_missing_attr_name(_("Responsible data"))
 | 
			
		||||
 | 
			
		||||
    def _check_legal_data(self):
 | 
			
		||||
        """ Checks data quality of related LegalData
 | 
			
		||||
 | 
			
		||||
        Args:
 | 
			
		||||
            self.messages (dict): Holds error messages
 | 
			
		||||
 | 
			
		||||
        Returns:
 | 
			
		||||
 | 
			
		||||
        """
 | 
			
		||||
        try:
 | 
			
		||||
            legal = self.obj.legal
 | 
			
		||||
            # Check for a revocation
 | 
			
		||||
            if legal.revocation:
 | 
			
		||||
                self.messages.append(_("Revocation exists"))
 | 
			
		||||
 | 
			
		||||
            if legal.registration_date is None:
 | 
			
		||||
                self._add_missing_attr_name(_("Registration date"))
 | 
			
		||||
 | 
			
		||||
            if legal.binding_date is None:
 | 
			
		||||
                self._add_missing_attr_name(_("Binding date"))
 | 
			
		||||
 | 
			
		||||
            if legal.laws.count() == 0:
 | 
			
		||||
                self._add_missing_attr_name(_("Laws"))
 | 
			
		||||
 | 
			
		||||
            if legal.process_type is None:
 | 
			
		||||
                self._add_missing_attr_name(_("Process type"))
 | 
			
		||||
        except AttributeError:
 | 
			
		||||
            self._add_missing_attr_name(_("Legal data"))
 | 
			
		||||
 | 
			
		||||
    def _check_compensations(self):
 | 
			
		||||
        """ Checks for compensation, deduction or payment
 | 
			
		||||
 | 
			
		||||
        Returns:
 | 
			
		||||
 | 
			
		||||
        """
 | 
			
		||||
        c_comps = self.obj.compensations.count()
 | 
			
		||||
        c_pays = self.obj.payments.count()
 | 
			
		||||
        c_deducs = self.obj.deductions.count()
 | 
			
		||||
        c_all = c_comps + c_pays + c_deducs
 | 
			
		||||
        if c_all == 0:
 | 
			
		||||
            self.messages.append(
 | 
			
		||||
                _("No compensation of any type found (Compensation, Payment, Deduction)")
 | 
			
		||||
            )
 | 
			
		||||
@ -15,7 +15,7 @@ from konova.sub_settings.django_settings import DEFAULT_DATE_FORMAT
 | 
			
		||||
from konova.utils.documents import remove_document, get_document
 | 
			
		||||
from konova.utils.generators import generate_qr_code
 | 
			
		||||
from konova.utils.message_templates import INTERVENTION_INVALID, FORM_INVALID, IDENTIFIER_REPLACED, \
 | 
			
		||||
    DATA_UNSHARED_EXPLANATION
 | 
			
		||||
    DATA_UNSHARED_EXPLANATION, CHECKED_RECORDED_RESET
 | 
			
		||||
from konova.utils.user_checks import in_group
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -270,8 +270,13 @@ def edit_view(request: HttpRequest, id: str):
 | 
			
		||||
    if request.method == "POST":
 | 
			
		||||
        if data_form.is_valid() and geom_form.is_valid():
 | 
			
		||||
            # The data form takes the geom form for processing, as well as the performing user
 | 
			
		||||
            # Save the current state of recorded|checked to inform the user in case of a status reset due to editing
 | 
			
		||||
            i_rec = intervention.recorded is not None
 | 
			
		||||
            i_check = intervention.checked is not None
 | 
			
		||||
            intervention = data_form.save(request.user, geom_form)
 | 
			
		||||
            messages.success(request, _("Intervention {} edited").format(intervention.identifier))
 | 
			
		||||
            if i_check or i_rec:
 | 
			
		||||
                messages.info(request, CHECKED_RECORDED_RESET)
 | 
			
		||||
            return redirect("intervention:detail", id=intervention.id)
 | 
			
		||||
        else:
 | 
			
		||||
            messages.error(request, FORM_INVALID, extra_tags="danger",)
 | 
			
		||||
 | 
			
		||||
@ -472,32 +472,38 @@ class RecordModalForm(BaseModalForm):
 | 
			
		||||
 | 
			
		||||
        """
 | 
			
		||||
        super_val = super().is_valid()
 | 
			
		||||
        msgs = self.instance.quality_check() or []
 | 
			
		||||
        for msg in msgs:
 | 
			
		||||
        if self.instance.recorded:
 | 
			
		||||
            # If user wants to unrecord an already recorded dataset, we do not need to perform custom checks
 | 
			
		||||
            return super_val
 | 
			
		||||
        checker = self.instance.quality_check()
 | 
			
		||||
        for msg in checker.messages:
 | 
			
		||||
            self.add_error(
 | 
			
		||||
                "confirm",
 | 
			
		||||
                msg
 | 
			
		||||
            )
 | 
			
		||||
        return super_val and (len(msgs) == 0)
 | 
			
		||||
        # Special case: Intervention
 | 
			
		||||
        # Add direct checks for related compensations
 | 
			
		||||
        if isinstance(self.instance, Intervention):
 | 
			
		||||
            self._are_compensations_valid()
 | 
			
		||||
        return super_val and checker.valid
 | 
			
		||||
 | 
			
		||||
    def _are_compensations_valid(self):
 | 
			
		||||
        """ Runs a special case for intervention-compensations validity
 | 
			
		||||
 | 
			
		||||
        Returns:
 | 
			
		||||
 | 
			
		||||
        """
 | 
			
		||||
        comps = self.instance.compensations.all()
 | 
			
		||||
        for comp in comps:
 | 
			
		||||
            checker = comp.quality_check()
 | 
			
		||||
            for msg in checker.messages:
 | 
			
		||||
                self.add_error(
 | 
			
		||||
                    "confirm",
 | 
			
		||||
                    f"{comp.identifier}: {msg}"
 | 
			
		||||
                )
 | 
			
		||||
 | 
			
		||||
    def save(self):
 | 
			
		||||
        with transaction.atomic():
 | 
			
		||||
            if self.cleaned_data["confirm"]:
 | 
			
		||||
                if self.instance.recorded:
 | 
			
		||||
                    # unrecord!
 | 
			
		||||
                    unrecord_action = UserActionLogEntry.objects.create(
 | 
			
		||||
                        user=self.user,
 | 
			
		||||
                        action=UserAction.UNRECORDED
 | 
			
		||||
                    )
 | 
			
		||||
                    # Do not delete the old .recorded attribute, since it shall stay in the .log list!
 | 
			
		||||
                    self.instance.recorded = None
 | 
			
		||||
                    self.instance.log.add(unrecord_action)
 | 
			
		||||
                else:
 | 
			
		||||
                    record_action = UserActionLogEntry.objects.create(
 | 
			
		||||
                        user=self.user,
 | 
			
		||||
                        action=UserAction.RECORDED
 | 
			
		||||
                    )
 | 
			
		||||
                    self.instance.recorded = record_action
 | 
			
		||||
                    self.instance.log.add(record_action)
 | 
			
		||||
                self.instance.save()
 | 
			
		||||
                self.instance.toggle_recorded(self.user)
 | 
			
		||||
        return self.instance
 | 
			
		||||
							
								
								
									
										104
									
								
								konova/models.py
									
									
									
									
									
								
							
							
						
						
									
										104
									
								
								konova/models.py
									
									
									
									
									
								
							@ -313,3 +313,107 @@ class Geometry(BaseResource):
 | 
			
		||||
    """
 | 
			
		||||
    from konova.settings import DEFAULT_SRID
 | 
			
		||||
    geom = MultiPolygonField(null=True, blank=True, srid=DEFAULT_SRID)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class RecordableMixin:
 | 
			
		||||
    """ Mixin to be combined with BaseObject class
 | 
			
		||||
 | 
			
		||||
    Provides functionality related to un/recording of data
 | 
			
		||||
 | 
			
		||||
    """
 | 
			
		||||
    def set_unrecorded(self, user: User):
 | 
			
		||||
        """ Perform unrecording
 | 
			
		||||
 | 
			
		||||
        Args:
 | 
			
		||||
            user (User): Performing user
 | 
			
		||||
 | 
			
		||||
        Returns:
 | 
			
		||||
 | 
			
		||||
        """
 | 
			
		||||
        action = UserActionLogEntry.objects.create(
 | 
			
		||||
            user=user,
 | 
			
		||||
            action=UserAction.UNRECORDED
 | 
			
		||||
        )
 | 
			
		||||
        self.recorded = None
 | 
			
		||||
        self.save()
 | 
			
		||||
        self.log.add(action)
 | 
			
		||||
 | 
			
		||||
    def set_recorded(self, user: User):
 | 
			
		||||
        """ Perform recording
 | 
			
		||||
 | 
			
		||||
        Args:
 | 
			
		||||
            user (User): Performing user
 | 
			
		||||
 | 
			
		||||
        Returns:
 | 
			
		||||
 | 
			
		||||
        """
 | 
			
		||||
        action = UserActionLogEntry.objects.create(
 | 
			
		||||
            user=user,
 | 
			
		||||
            action=UserAction.RECORDED
 | 
			
		||||
        )
 | 
			
		||||
        self.recorded = action
 | 
			
		||||
        self.save()
 | 
			
		||||
        self.log.add(action)
 | 
			
		||||
 | 
			
		||||
    def toggle_recorded(self, user: User):
 | 
			
		||||
        """ Un/Record intervention
 | 
			
		||||
 | 
			
		||||
        Args:
 | 
			
		||||
            user (User): Performing user
 | 
			
		||||
 | 
			
		||||
        Returns:
 | 
			
		||||
 | 
			
		||||
        """
 | 
			
		||||
        if not self.recorded:
 | 
			
		||||
            self.set_recorded(user)
 | 
			
		||||
        else:
 | 
			
		||||
            self.set_unrecorded(user)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class CheckableMixin:
 | 
			
		||||
    """ Mixin to be combined with BaseObject class
 | 
			
		||||
 | 
			
		||||
    Provides functionality related to un/checking of data
 | 
			
		||||
 | 
			
		||||
    """
 | 
			
		||||
    def set_unchecked(self, user: User):
 | 
			
		||||
        """ Perform unrecording
 | 
			
		||||
 | 
			
		||||
        Args:
 | 
			
		||||
 | 
			
		||||
        Returns:
 | 
			
		||||
 | 
			
		||||
        """
 | 
			
		||||
        self.checked = None
 | 
			
		||||
        self.save()
 | 
			
		||||
 | 
			
		||||
    def set_checked(self, user: User):
 | 
			
		||||
        """ Perform checking
 | 
			
		||||
 | 
			
		||||
        Args:
 | 
			
		||||
            user (User): Performing user
 | 
			
		||||
 | 
			
		||||
        Returns:
 | 
			
		||||
 | 
			
		||||
        """
 | 
			
		||||
        action = UserActionLogEntry.objects.create(
 | 
			
		||||
            user=user,
 | 
			
		||||
            action=UserAction.CHECKED
 | 
			
		||||
        )
 | 
			
		||||
        self.checked = action
 | 
			
		||||
        self.save()
 | 
			
		||||
        self.log.add(action)
 | 
			
		||||
 | 
			
		||||
    def toggle_checked(self, user: User):
 | 
			
		||||
        """ Un/Record intervention
 | 
			
		||||
 | 
			
		||||
        Args:
 | 
			
		||||
            user (User): Performing user
 | 
			
		||||
 | 
			
		||||
        Returns:
 | 
			
		||||
 | 
			
		||||
        """
 | 
			
		||||
        if not self.checked:
 | 
			
		||||
            self.set_checked(user)
 | 
			
		||||
        else:
 | 
			
		||||
            self.set_unchecked(user)
 | 
			
		||||
 | 
			
		||||
@ -15,3 +15,5 @@ IDENTIFIER_REPLACED = _("The identifier '{}' had to be changed to '{}' since ano
 | 
			
		||||
DATA_UNSHARED = _("This data is not shared with you")
 | 
			
		||||
DATA_UNSHARED_EXPLANATION = _("Remember: This data has not been shared with you, yet. This means you can only read but can not edit or perform any actions like running a check or recording.")
 | 
			
		||||
MISSING_GROUP_PERMISSION = _("You need to be part of another user group.")
 | 
			
		||||
 | 
			
		||||
CHECKED_RECORDED_RESET = _("Status of Checked and Recorded reseted")
 | 
			
		||||
							
								
								
									
										46
									
								
								konova/utils/quality.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										46
									
								
								konova/utils/quality.py
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,46 @@
 | 
			
		||||
"""
 | 
			
		||||
Author: Michel Peltriaux
 | 
			
		||||
Organization: Struktur- und Genehmigungsdirektion Nord, Rhineland-Palatinate, Germany
 | 
			
		||||
Contact: michel.peltriaux@sgdnord.rlp.de
 | 
			
		||||
Created on: 25.10.21
 | 
			
		||||
 | 
			
		||||
"""
 | 
			
		||||
from abc import abstractmethod
 | 
			
		||||
from django.utils.translation import  gettext_lazy as _
 | 
			
		||||
 | 
			
		||||
from konova.models import BaseObject
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class AbstractQualityChecker:
 | 
			
		||||
    valid = False
 | 
			
		||||
    messages = []
 | 
			
		||||
    obj = None
 | 
			
		||||
 | 
			
		||||
    class Meta:
 | 
			
		||||
        abstract = True
 | 
			
		||||
 | 
			
		||||
    def __init__(self, obj: BaseObject):
 | 
			
		||||
        self.obj = obj
 | 
			
		||||
        self.messages = []
 | 
			
		||||
        self.valid = False
 | 
			
		||||
 | 
			
		||||
    @abstractmethod
 | 
			
		||||
    def run_check(self):
 | 
			
		||||
        raise NotImplementedError
 | 
			
		||||
 | 
			
		||||
    def _add_missing_attr_name(self, attr_name: str):
 | 
			
		||||
        missing = _('missing')
 | 
			
		||||
        self.messages.append(f"{attr_name} {missing}")
 | 
			
		||||
 | 
			
		||||
    def _check_geometry(self):
 | 
			
		||||
        """ Checks on the geometry
 | 
			
		||||
 | 
			
		||||
        Returns:
 | 
			
		||||
 | 
			
		||||
        """
 | 
			
		||||
        try:
 | 
			
		||||
            geometry_obj = self.obj.geometry
 | 
			
		||||
            if geometry_obj.geom.empty:
 | 
			
		||||
                self._add_missing_attr_name(_("Geometry"))
 | 
			
		||||
        except AttributeError:
 | 
			
		||||
            self._add_missing_attr_name(_("Geometry"))
 | 
			
		||||
										
											Binary file not shown.
										
									
								
							@ -19,7 +19,7 @@ msgid ""
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Project-Id-Version: PACKAGE VERSION\n"
 | 
			
		||||
"Report-Msgid-Bugs-To: \n"
 | 
			
		||||
"POT-Creation-Date: 2021-10-22 13:14+0200\n"
 | 
			
		||||
"POT-Creation-Date: 2021-10-25 17:10+0200\n"
 | 
			
		||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 | 
			
		||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 | 
			
		||||
"Language-Team: LANGUAGE <LL@li.org>\n"
 | 
			
		||||
@ -37,22 +37,24 @@ msgstr "Vom"
 | 
			
		||||
msgid "To"
 | 
			
		||||
msgstr "Bis"
 | 
			
		||||
 | 
			
		||||
#: analysis/forms.py:47 compensation/forms/forms.py:94
 | 
			
		||||
#: analysis/forms.py:47 compensation/forms/forms.py:93
 | 
			
		||||
#: compensation/templates/compensation/detail/eco_account/view.html:58
 | 
			
		||||
#: compensation/templates/compensation/report/eco_account/report.html:16
 | 
			
		||||
#: ema/templates/ema/detail/view.html:42
 | 
			
		||||
#: ema/templates/ema/report/report.html:16 intervention/forms/forms.py:101
 | 
			
		||||
#: compensation/utils/quality.py:100 ema/templates/ema/detail/view.html:42
 | 
			
		||||
#: ema/templates/ema/report/report.html:16 ema/utils/quality.py:26
 | 
			
		||||
#: intervention/forms/forms.py:101
 | 
			
		||||
#: intervention/templates/intervention/detail/view.html:56
 | 
			
		||||
#: intervention/templates/intervention/report/report.html:37
 | 
			
		||||
#: intervention/utils/quality.py:49
 | 
			
		||||
msgid "Conservation office"
 | 
			
		||||
msgstr "Eintragungsstelle"
 | 
			
		||||
 | 
			
		||||
#: analysis/forms.py:49 compensation/forms/forms.py:96
 | 
			
		||||
#: analysis/forms.py:49 compensation/forms/forms.py:95
 | 
			
		||||
msgid "Select the responsible office"
 | 
			
		||||
msgstr "Verantwortliche Stelle"
 | 
			
		||||
 | 
			
		||||
#: analysis/forms.py:58 compensation/forms/forms.py:68
 | 
			
		||||
#: compensation/forms/forms.py:105 compensation/forms/forms.py:156
 | 
			
		||||
#: analysis/forms.py:58 compensation/forms/forms.py:67
 | 
			
		||||
#: compensation/forms/forms.py:104 compensation/forms/forms.py:155
 | 
			
		||||
#: intervention/forms/forms.py:63 intervention/forms/forms.py:80
 | 
			
		||||
#: intervention/forms/forms.py:96 intervention/forms/forms.py:112
 | 
			
		||||
msgid "Click for selection"
 | 
			
		||||
@ -208,7 +210,7 @@ msgstr "Abbuchungen"
 | 
			
		||||
#: compensation/templates/compensation/detail/eco_account/includes/states-before.html:36
 | 
			
		||||
#: ema/templates/ema/detail/includes/states-after.html:36
 | 
			
		||||
#: ema/templates/ema/detail/includes/states-before.html:36
 | 
			
		||||
#: intervention/forms/modalForms.py:274
 | 
			
		||||
#: intervention/forms/modalForms.py:282
 | 
			
		||||
msgid "Surface"
 | 
			
		||||
msgstr "Fläche"
 | 
			
		||||
 | 
			
		||||
@ -271,7 +273,7 @@ msgid "Type"
 | 
			
		||||
msgstr "Typ"
 | 
			
		||||
 | 
			
		||||
#: analysis/templates/analysis/reports/includes/old_data/amount.html:24
 | 
			
		||||
#: intervention/forms/modalForms.py:285 intervention/forms/modalForms.py:292
 | 
			
		||||
#: intervention/forms/modalForms.py:293 intervention/forms/modalForms.py:300
 | 
			
		||||
#: intervention/tables.py:88
 | 
			
		||||
#: intervention/templates/intervention/detail/view.html:19
 | 
			
		||||
#: konova/templates/konova/home.html:11 templates/navbars/navbar.html:22
 | 
			
		||||
@ -281,7 +283,7 @@ msgstr "Eingriff"
 | 
			
		||||
#: analysis/templates/analysis/reports/includes/old_data/amount.html:34
 | 
			
		||||
#: compensation/tables.py:224
 | 
			
		||||
#: compensation/templates/compensation/detail/eco_account/view.html:19
 | 
			
		||||
#: intervention/forms/modalForms.py:258 intervention/forms/modalForms.py:265
 | 
			
		||||
#: intervention/forms/modalForms.py:266 intervention/forms/modalForms.py:273
 | 
			
		||||
#: konova/templates/konova/home.html:88 templates/navbars/navbar.html:34
 | 
			
		||||
msgid "Eco-account"
 | 
			
		||||
msgstr "Ökokonto"
 | 
			
		||||
@ -298,18 +300,18 @@ msgstr "Vor"
 | 
			
		||||
msgid "Show only unrecorded"
 | 
			
		||||
msgstr "Nur unverzeichnete anzeigen"
 | 
			
		||||
 | 
			
		||||
#: compensation/forms/forms.py:32 compensation/tables.py:25
 | 
			
		||||
#: compensation/forms/forms.py:31 compensation/tables.py:25
 | 
			
		||||
#: compensation/tables.py:166 ema/tables.py:28 intervention/forms/forms.py:27
 | 
			
		||||
#: intervention/tables.py:23
 | 
			
		||||
#: intervention/templates/intervention/detail/includes/compensations.html:30
 | 
			
		||||
msgid "Identifier"
 | 
			
		||||
msgstr "Kennung"
 | 
			
		||||
 | 
			
		||||
#: compensation/forms/forms.py:35 intervention/forms/forms.py:30
 | 
			
		||||
#: compensation/forms/forms.py:34 intervention/forms/forms.py:30
 | 
			
		||||
msgid "Generated automatically"
 | 
			
		||||
msgstr "Automatisch generiert"
 | 
			
		||||
 | 
			
		||||
#: compensation/forms/forms.py:44 compensation/tables.py:30
 | 
			
		||||
#: compensation/forms/forms.py:43 compensation/tables.py:30
 | 
			
		||||
#: compensation/tables.py:171
 | 
			
		||||
#: compensation/templates/compensation/detail/compensation/includes/documents.html:28
 | 
			
		||||
#: compensation/templates/compensation/detail/compensation/view.html:31
 | 
			
		||||
@ -329,23 +331,23 @@ msgstr "Automatisch generiert"
 | 
			
		||||
msgid "Title"
 | 
			
		||||
msgstr "Bezeichnung"
 | 
			
		||||
 | 
			
		||||
#: compensation/forms/forms.py:46 intervention/forms/forms.py:41
 | 
			
		||||
#: compensation/forms/forms.py:45 intervention/forms/forms.py:41
 | 
			
		||||
msgid "An explanatory name"
 | 
			
		||||
msgstr "Aussagekräftiger Titel"
 | 
			
		||||
 | 
			
		||||
#: compensation/forms/forms.py:50 ema/forms.py:47 ema/forms.py:105
 | 
			
		||||
#: compensation/forms/forms.py:49 ema/forms.py:47 ema/forms.py:105
 | 
			
		||||
msgid "Compensation XY; Location ABC"
 | 
			
		||||
msgstr "Kompensation XY; Flur ABC"
 | 
			
		||||
 | 
			
		||||
#: compensation/forms/forms.py:56
 | 
			
		||||
#: compensation/forms/forms.py:55
 | 
			
		||||
msgid "Fundings"
 | 
			
		||||
msgstr "Förderungen"
 | 
			
		||||
 | 
			
		||||
#: compensation/forms/forms.py:59
 | 
			
		||||
#: compensation/forms/forms.py:58
 | 
			
		||||
msgid "Select fundings for this compensation"
 | 
			
		||||
msgstr "Wählen Sie ggf. Fördermittelprojekte"
 | 
			
		||||
 | 
			
		||||
#: compensation/forms/forms.py:74 compensation/forms/modalForms.py:61
 | 
			
		||||
#: compensation/forms/forms.py:73 compensation/forms/modalForms.py:61
 | 
			
		||||
#: compensation/forms/modalForms.py:272 compensation/forms/modalForms.py:367
 | 
			
		||||
#: compensation/templates/compensation/detail/compensation/includes/actions.html:34
 | 
			
		||||
#: compensation/templates/compensation/detail/compensation/includes/deadlines.html:34
 | 
			
		||||
@ -364,63 +366,67 @@ msgstr "Wählen Sie ggf. Fördermittelprojekte"
 | 
			
		||||
msgid "Comment"
 | 
			
		||||
msgstr "Kommentar"
 | 
			
		||||
 | 
			
		||||
#: compensation/forms/forms.py:76 intervention/forms/forms.py:181
 | 
			
		||||
#: compensation/forms/forms.py:75 intervention/forms/forms.py:181
 | 
			
		||||
msgid "Additional comment"
 | 
			
		||||
msgstr "Zusätzlicher Kommentar"
 | 
			
		||||
 | 
			
		||||
#: compensation/forms/forms.py:110
 | 
			
		||||
#: compensation/forms/forms.py:109
 | 
			
		||||
#: compensation/templates/compensation/detail/eco_account/view.html:62
 | 
			
		||||
#: compensation/templates/compensation/report/eco_account/report.html:20
 | 
			
		||||
#: ema/templates/ema/detail/view.html:46
 | 
			
		||||
#: ema/templates/ema/report/report.html:20 intervention/forms/forms.py:129
 | 
			
		||||
#: compensation/utils/quality.py:102 ema/templates/ema/detail/view.html:46
 | 
			
		||||
#: ema/templates/ema/report/report.html:20 ema/utils/quality.py:28
 | 
			
		||||
#: intervention/forms/forms.py:129
 | 
			
		||||
#: intervention/templates/intervention/detail/view.html:60
 | 
			
		||||
#: intervention/templates/intervention/report/report.html:41
 | 
			
		||||
#: intervention/utils/quality.py:42
 | 
			
		||||
msgid "Conservation office file number"
 | 
			
		||||
msgstr "Aktenzeichen Eintragungsstelle"
 | 
			
		||||
 | 
			
		||||
#: compensation/forms/forms.py:116 intervention/forms/forms.py:135
 | 
			
		||||
#: compensation/forms/forms.py:115 intervention/forms/forms.py:135
 | 
			
		||||
msgid "ETS-123/ABC.456"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: compensation/forms/forms.py:122
 | 
			
		||||
#: compensation/forms/forms.py:121
 | 
			
		||||
msgid "Eco-account handler"
 | 
			
		||||
msgstr "Maßnahmenträger"
 | 
			
		||||
 | 
			
		||||
#: compensation/forms/forms.py:126
 | 
			
		||||
#: compensation/forms/forms.py:125
 | 
			
		||||
msgid "Who handles the eco-account"
 | 
			
		||||
msgstr "Wer für die Herrichtung des Ökokontos verantwortlich ist"
 | 
			
		||||
 | 
			
		||||
#: compensation/forms/forms.py:129 intervention/forms/forms.py:148
 | 
			
		||||
#: compensation/forms/forms.py:128 intervention/forms/forms.py:148
 | 
			
		||||
msgid "Company Mustermann"
 | 
			
		||||
msgstr "Firma Mustermann"
 | 
			
		||||
 | 
			
		||||
#: compensation/forms/forms.py:147
 | 
			
		||||
#: compensation/forms/forms.py:146
 | 
			
		||||
#: compensation/templates/compensation/detail/compensation/view.html:35
 | 
			
		||||
#: compensation/templates/compensation/report/compensation/report.html:16
 | 
			
		||||
msgid "compensates intervention"
 | 
			
		||||
msgstr "kompensiert Eingriff"
 | 
			
		||||
 | 
			
		||||
#: compensation/forms/forms.py:149
 | 
			
		||||
#: compensation/forms/forms.py:148
 | 
			
		||||
msgid "Select the intervention for which this compensation compensates"
 | 
			
		||||
msgstr "Wählen Sie den Eingriff, für den diese Kompensation bestimmt ist"
 | 
			
		||||
 | 
			
		||||
#: compensation/forms/forms.py:174
 | 
			
		||||
#: compensation/forms/forms.py:173
 | 
			
		||||
msgid "New compensation"
 | 
			
		||||
msgstr "Neue Kompensation"
 | 
			
		||||
 | 
			
		||||
#: compensation/forms/forms.py:232
 | 
			
		||||
#: compensation/forms/forms.py:231
 | 
			
		||||
msgid "Edit compensation"
 | 
			
		||||
msgstr "Bearbeite Kompensation"
 | 
			
		||||
 | 
			
		||||
#: compensation/forms/forms.py:291
 | 
			
		||||
#: compensation/forms/forms.py:290 compensation/utils/quality.py:84
 | 
			
		||||
msgid "Available Surface"
 | 
			
		||||
msgstr "Verfügbare Fläche"
 | 
			
		||||
 | 
			
		||||
#: compensation/forms/forms.py:294
 | 
			
		||||
#: compensation/forms/forms.py:293
 | 
			
		||||
msgid "The amount that can be used for deductions"
 | 
			
		||||
msgstr "Die für Abbuchungen zur Verfügung stehende Menge"
 | 
			
		||||
 | 
			
		||||
#: compensation/forms/forms.py:303
 | 
			
		||||
#: compensation/forms/forms.py:302
 | 
			
		||||
#: compensation/templates/compensation/detail/eco_account/view.html:66
 | 
			
		||||
#: compensation/utils/quality.py:72
 | 
			
		||||
msgid "Agreement date"
 | 
			
		||||
msgstr "Vereinbarungsdatum"
 | 
			
		||||
 | 
			
		||||
@ -479,7 +485,7 @@ msgstr "Biotoptyp"
 | 
			
		||||
msgid "Select the biotope type"
 | 
			
		||||
msgstr "Biotoptyp wählen"
 | 
			
		||||
 | 
			
		||||
#: compensation/forms/modalForms.py:155 intervention/forms/modalForms.py:276
 | 
			
		||||
#: compensation/forms/modalForms.py:155 intervention/forms/modalForms.py:284
 | 
			
		||||
msgid "in m²"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
@ -589,38 +595,38 @@ msgstr "Geben Sie die Daten der neuen Maßnahme ein"
 | 
			
		||||
msgid "Added action"
 | 
			
		||||
msgstr "Maßnahme hinzugefügt"
 | 
			
		||||
 | 
			
		||||
#: compensation/models.py:82
 | 
			
		||||
#: compensation/models.py:83
 | 
			
		||||
msgid "cm"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: compensation/models.py:83
 | 
			
		||||
#: compensation/models.py:84
 | 
			
		||||
msgid "m"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: compensation/models.py:84
 | 
			
		||||
#: compensation/models.py:85
 | 
			
		||||
msgid "km"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: compensation/models.py:85
 | 
			
		||||
#: compensation/models.py:86
 | 
			
		||||
msgid "m²"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: compensation/models.py:86
 | 
			
		||||
#: compensation/models.py:87
 | 
			
		||||
msgid "ha"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: compensation/models.py:87
 | 
			
		||||
#: compensation/models.py:88
 | 
			
		||||
msgid "Pieces"
 | 
			
		||||
msgstr "Stück"
 | 
			
		||||
 | 
			
		||||
#: compensation/models.py:329
 | 
			
		||||
#: compensation/models.py:359
 | 
			
		||||
msgid ""
 | 
			
		||||
"Deductable surface can not be larger than existing surfaces in after states"
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Die abbuchbare Fläche darf die Gesamtfläche der Zielzustände nicht "
 | 
			
		||||
"überschreiten"
 | 
			
		||||
 | 
			
		||||
#: compensation/models.py:336
 | 
			
		||||
#: compensation/models.py:366
 | 
			
		||||
msgid ""
 | 
			
		||||
"Deductable surface can not be smaller than the sum of already existing "
 | 
			
		||||
"deductions. Please contact the responsible users for the deductions!"
 | 
			
		||||
@ -801,6 +807,7 @@ msgstr "Dokument löschen"
 | 
			
		||||
 | 
			
		||||
#: compensation/templates/compensation/detail/compensation/includes/states-after.html:8
 | 
			
		||||
#: compensation/templates/compensation/detail/eco_account/includes/states-after.html:8
 | 
			
		||||
#: compensation/utils/quality.py:39
 | 
			
		||||
#: ema/templates/ema/detail/includes/states-after.html:8
 | 
			
		||||
msgid "States after"
 | 
			
		||||
msgstr "Zielzustand"
 | 
			
		||||
@ -837,6 +844,7 @@ msgstr "Zustand entfernen"
 | 
			
		||||
 | 
			
		||||
#: compensation/templates/compensation/detail/compensation/includes/states-before.html:8
 | 
			
		||||
#: compensation/templates/compensation/detail/eco_account/includes/states-before.html:8
 | 
			
		||||
#: compensation/utils/quality.py:37
 | 
			
		||||
#: ema/templates/ema/detail/includes/states-before.html:8
 | 
			
		||||
msgid "States before"
 | 
			
		||||
msgstr "Ausgangszustand"
 | 
			
		||||
@ -876,7 +884,7 @@ msgid "Recorded on "
 | 
			
		||||
msgstr "Verzeichnet am"
 | 
			
		||||
 | 
			
		||||
#: compensation/templates/compensation/detail/compensation/view.html:71
 | 
			
		||||
#: compensation/templates/compensation/detail/eco_account/view.html:70
 | 
			
		||||
#: compensation/templates/compensation/detail/eco_account/view.html:74
 | 
			
		||||
#: compensation/templates/compensation/report/compensation/report.html:24
 | 
			
		||||
#: compensation/templates/compensation/report/eco_account/report.html:28
 | 
			
		||||
#: ema/templates/ema/detail/view.html:54
 | 
			
		||||
@ -885,7 +893,7 @@ msgid "Funded by"
 | 
			
		||||
msgstr "Gefördert mit"
 | 
			
		||||
 | 
			
		||||
#: compensation/templates/compensation/detail/compensation/view.html:79
 | 
			
		||||
#: compensation/templates/compensation/detail/eco_account/view.html:78
 | 
			
		||||
#: compensation/templates/compensation/detail/eco_account/view.html:82
 | 
			
		||||
#: compensation/templates/compensation/report/compensation/report.html:31
 | 
			
		||||
#: compensation/templates/compensation/report/eco_account/report.html:35
 | 
			
		||||
#: compensation/templates/compensation/report/eco_account/report.html:49
 | 
			
		||||
@ -897,7 +905,7 @@ msgid "None"
 | 
			
		||||
msgstr "-"
 | 
			
		||||
 | 
			
		||||
#: compensation/templates/compensation/detail/compensation/view.html:84
 | 
			
		||||
#: compensation/templates/compensation/detail/eco_account/view.html:83
 | 
			
		||||
#: compensation/templates/compensation/detail/eco_account/view.html:87
 | 
			
		||||
#: compensation/templates/compensation/report/compensation/report.html:37
 | 
			
		||||
#: compensation/templates/compensation/report/eco_account/report.html:54
 | 
			
		||||
#: ema/templates/ema/detail/view.html:67
 | 
			
		||||
@ -908,7 +916,7 @@ msgid "Last modified"
 | 
			
		||||
msgstr "Zuletzt bearbeitet"
 | 
			
		||||
 | 
			
		||||
#: compensation/templates/compensation/detail/compensation/view.html:92
 | 
			
		||||
#: compensation/templates/compensation/detail/eco_account/view.html:91
 | 
			
		||||
#: compensation/templates/compensation/detail/eco_account/view.html:95
 | 
			
		||||
#: ema/templates/ema/detail/view.html:82 intervention/forms/modalForms.py:40
 | 
			
		||||
#: intervention/templates/intervention/detail/view.html:116
 | 
			
		||||
msgid "Shared with"
 | 
			
		||||
@ -962,6 +970,7 @@ msgstr "Keine Flächenmenge für Abbuchungen eingegeben. Bitte bearbeiten."
 | 
			
		||||
#: compensation/templates/compensation/detail/eco_account/view.html:57
 | 
			
		||||
#: compensation/templates/compensation/detail/eco_account/view.html:61
 | 
			
		||||
#: compensation/templates/compensation/detail/eco_account/view.html:65
 | 
			
		||||
#: compensation/templates/compensation/detail/eco_account/view.html:69
 | 
			
		||||
#: ema/templates/ema/detail/view.html:41 ema/templates/ema/detail/view.html:45
 | 
			
		||||
#: ema/templates/ema/detail/view.html:49
 | 
			
		||||
#: intervention/templates/intervention/detail/view.html:30
 | 
			
		||||
@ -975,9 +984,9 @@ msgstr "Keine Flächenmenge für Abbuchungen eingegeben. Bitte bearbeiten."
 | 
			
		||||
#: intervention/templates/intervention/detail/view.html:95
 | 
			
		||||
#: intervention/templates/intervention/detail/view.html:99
 | 
			
		||||
msgid "Missing"
 | 
			
		||||
msgstr "Fehlt"
 | 
			
		||||
msgstr "fehlt"
 | 
			
		||||
 | 
			
		||||
#: compensation/templates/compensation/detail/eco_account/view.html:66
 | 
			
		||||
#: compensation/templates/compensation/detail/eco_account/view.html:70
 | 
			
		||||
#: compensation/templates/compensation/report/eco_account/report.html:24
 | 
			
		||||
#: ema/templates/ema/detail/view.html:50
 | 
			
		||||
#: ema/templates/ema/report/report.html:24
 | 
			
		||||
@ -1009,6 +1018,25 @@ msgstr "In LANIS öffnen"
 | 
			
		||||
msgid "Deductions for"
 | 
			
		||||
msgstr "Abbuchungen für"
 | 
			
		||||
 | 
			
		||||
#: compensation/utils/quality.py:34
 | 
			
		||||
msgid "States unequal"
 | 
			
		||||
msgstr "Ungleiche Zustandsflächenmengen"
 | 
			
		||||
 | 
			
		||||
#: compensation/utils/quality.py:74 intervention/utils/quality.py:84
 | 
			
		||||
msgid "Legal data"
 | 
			
		||||
msgstr "Rechtliche Daten"
 | 
			
		||||
 | 
			
		||||
#: compensation/utils/quality.py:88
 | 
			
		||||
msgid "Deductable surface can not be larger than state surface"
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Die abbuchbare Fläche darf die Gesamtfläche der Zielzustände nicht "
 | 
			
		||||
"überschreiten"
 | 
			
		||||
 | 
			
		||||
#: compensation/utils/quality.py:104 ema/utils/quality.py:30
 | 
			
		||||
#: intervention/utils/quality.py:55
 | 
			
		||||
msgid "Responsible data"
 | 
			
		||||
msgstr "Daten zu den verantwortlichen Stellen"
 | 
			
		||||
 | 
			
		||||
#: compensation/views/compensation_views.py:77
 | 
			
		||||
msgid "Compensation {} added"
 | 
			
		||||
msgstr "Kompensation {} hinzugefügt"
 | 
			
		||||
@ -1017,42 +1045,42 @@ msgstr "Kompensation {} hinzugefügt"
 | 
			
		||||
msgid "Compensation {} edited"
 | 
			
		||||
msgstr "Kompensation {} bearbeitet"
 | 
			
		||||
 | 
			
		||||
#: compensation/views/compensation_views.py:213
 | 
			
		||||
#: compensation/views/eco_account_views.py:287 ema/views.py:175
 | 
			
		||||
#: intervention/views.py:437
 | 
			
		||||
#: compensation/views/compensation_views.py:216
 | 
			
		||||
#: compensation/views/eco_account_views.py:290 ema/views.py:178
 | 
			
		||||
#: intervention/views.py:448
 | 
			
		||||
msgid "Log"
 | 
			
		||||
msgstr "Log"
 | 
			
		||||
 | 
			
		||||
#: compensation/views/compensation_views.py:234
 | 
			
		||||
#: compensation/views/compensation_views.py:237
 | 
			
		||||
msgid "Compensation removed"
 | 
			
		||||
msgstr "Kompensation entfernt"
 | 
			
		||||
 | 
			
		||||
#: compensation/views/compensation_views.py:253
 | 
			
		||||
#: compensation/views/eco_account_views.py:386 ema/views.py:328
 | 
			
		||||
#: intervention/views.py:126
 | 
			
		||||
#: compensation/views/compensation_views.py:256
 | 
			
		||||
#: compensation/views/eco_account_views.py:389 ema/views.py:331
 | 
			
		||||
#: intervention/views.py:127
 | 
			
		||||
msgid "Document added"
 | 
			
		||||
msgstr "Dokument hinzugefügt"
 | 
			
		||||
 | 
			
		||||
#: compensation/views/compensation_views.py:309
 | 
			
		||||
#: compensation/views/eco_account_views.py:330 ema/views.py:272
 | 
			
		||||
#: compensation/views/compensation_views.py:321
 | 
			
		||||
#: compensation/views/eco_account_views.py:333 ema/views.py:275
 | 
			
		||||
msgid "State added"
 | 
			
		||||
msgstr "Zustand hinzugefügt"
 | 
			
		||||
 | 
			
		||||
#: compensation/views/compensation_views.py:328
 | 
			
		||||
#: compensation/views/eco_account_views.py:349 ema/views.py:291
 | 
			
		||||
#: compensation/views/compensation_views.py:340
 | 
			
		||||
#: compensation/views/eco_account_views.py:352 ema/views.py:294
 | 
			
		||||
msgid "Action added"
 | 
			
		||||
msgstr "Maßnahme hinzugefügt"
 | 
			
		||||
 | 
			
		||||
#: compensation/views/compensation_views.py:347
 | 
			
		||||
#: compensation/views/eco_account_views.py:368 ema/views.py:310
 | 
			
		||||
#: compensation/views/compensation_views.py:359
 | 
			
		||||
#: compensation/views/eco_account_views.py:371 ema/views.py:313
 | 
			
		||||
msgid "Deadline added"
 | 
			
		||||
msgstr "Frist/Termin hinzugefügt"
 | 
			
		||||
 | 
			
		||||
#: compensation/views/compensation_views.py:366
 | 
			
		||||
#: compensation/views/compensation_views.py:378
 | 
			
		||||
msgid "State removed"
 | 
			
		||||
msgstr "Zustand gelöscht"
 | 
			
		||||
 | 
			
		||||
#: compensation/views/compensation_views.py:385
 | 
			
		||||
#: compensation/views/compensation_views.py:397
 | 
			
		||||
msgid "Action removed"
 | 
			
		||||
msgstr "Maßnahme entfernt"
 | 
			
		||||
 | 
			
		||||
@ -1064,25 +1092,25 @@ msgstr "Ökokonto {} hinzugefügt"
 | 
			
		||||
msgid "Eco-Account {} edited"
 | 
			
		||||
msgstr "Ökokonto {} bearbeitet"
 | 
			
		||||
 | 
			
		||||
#: compensation/views/eco_account_views.py:237
 | 
			
		||||
#: compensation/views/eco_account_views.py:240
 | 
			
		||||
msgid "Eco-account removed"
 | 
			
		||||
msgstr "Ökokonto entfernt"
 | 
			
		||||
 | 
			
		||||
#: compensation/views/eco_account_views.py:264
 | 
			
		||||
#: compensation/views/eco_account_views.py:267
 | 
			
		||||
msgid "Deduction removed"
 | 
			
		||||
msgstr "Abbuchung entfernt"
 | 
			
		||||
 | 
			
		||||
#: compensation/views/eco_account_views.py:307 ema/views.py:249
 | 
			
		||||
#: intervention/views.py:477
 | 
			
		||||
#: compensation/views/eco_account_views.py:310 ema/views.py:252
 | 
			
		||||
#: intervention/views.py:488
 | 
			
		||||
msgid "{} unrecorded"
 | 
			
		||||
msgstr "{} entzeichnet"
 | 
			
		||||
 | 
			
		||||
#: compensation/views/eco_account_views.py:307 ema/views.py:249
 | 
			
		||||
#: intervention/views.py:477
 | 
			
		||||
#: compensation/views/eco_account_views.py:310 ema/views.py:252
 | 
			
		||||
#: intervention/views.py:488
 | 
			
		||||
msgid "{} recorded"
 | 
			
		||||
msgstr "{} verzeichnet"
 | 
			
		||||
 | 
			
		||||
#: compensation/views/eco_account_views.py:443 intervention/views.py:459
 | 
			
		||||
#: compensation/views/eco_account_views.py:455 intervention/views.py:470
 | 
			
		||||
msgid "Deduction added"
 | 
			
		||||
msgstr "Abbuchung hinzugefügt"
 | 
			
		||||
 | 
			
		||||
@ -1126,11 +1154,11 @@ msgstr "Ersatzzahlungsmaßnahme"
 | 
			
		||||
msgid "EMA {} added"
 | 
			
		||||
msgstr "EMA {} hinzugefügt"
 | 
			
		||||
 | 
			
		||||
#: ema/views.py:202
 | 
			
		||||
#: ema/views.py:205
 | 
			
		||||
msgid "EMA {} edited"
 | 
			
		||||
msgstr "EMA {} bearbeitet"
 | 
			
		||||
 | 
			
		||||
#: ema/views.py:232
 | 
			
		||||
#: ema/views.py:235
 | 
			
		||||
msgid "EMA removed"
 | 
			
		||||
msgstr "EMA entfernt"
 | 
			
		||||
 | 
			
		||||
@ -1157,6 +1185,7 @@ msgstr "Bauvorhaben XY; Flur ABC"
 | 
			
		||||
#: intervention/forms/forms.py:51
 | 
			
		||||
#: intervention/templates/intervention/detail/view.html:35
 | 
			
		||||
#: intervention/templates/intervention/report/report.html:16
 | 
			
		||||
#: intervention/utils/quality.py:82
 | 
			
		||||
msgid "Process type"
 | 
			
		||||
msgstr "Verfahrenstyp"
 | 
			
		||||
 | 
			
		||||
@ -1167,12 +1196,14 @@ msgstr "Mehrfachauswahl möglich"
 | 
			
		||||
#: intervention/forms/forms.py:85
 | 
			
		||||
#: intervention/templates/intervention/detail/view.html:48
 | 
			
		||||
#: intervention/templates/intervention/report/report.html:29
 | 
			
		||||
#: intervention/utils/quality.py:46
 | 
			
		||||
msgid "Registration office"
 | 
			
		||||
msgstr "Zulassungsbehörde"
 | 
			
		||||
 | 
			
		||||
#: intervention/forms/forms.py:117
 | 
			
		||||
#: intervention/templates/intervention/detail/view.html:52
 | 
			
		||||
#: intervention/templates/intervention/report/report.html:33
 | 
			
		||||
#: intervention/utils/quality.py:39
 | 
			
		||||
msgid "Registration office file number"
 | 
			
		||||
msgstr "Aktenzeichen Zulassungsbehörde"
 | 
			
		||||
 | 
			
		||||
@ -1183,6 +1214,7 @@ msgstr ""
 | 
			
		||||
#: intervention/forms/forms.py:141
 | 
			
		||||
#: intervention/templates/intervention/detail/view.html:64
 | 
			
		||||
#: intervention/templates/intervention/report/report.html:45
 | 
			
		||||
#: intervention/utils/quality.py:52
 | 
			
		||||
msgid "Intervention handler"
 | 
			
		||||
msgstr "Eingriffsverursacher"
 | 
			
		||||
 | 
			
		||||
@ -1193,6 +1225,7 @@ msgstr "Wer führt den Eingriff durch"
 | 
			
		||||
#: intervention/forms/forms.py:154
 | 
			
		||||
#: intervention/templates/intervention/detail/view.html:96
 | 
			
		||||
#: intervention/templates/intervention/report/report.html:83
 | 
			
		||||
#: intervention/utils/quality.py:73
 | 
			
		||||
msgid "Registration date"
 | 
			
		||||
msgstr "Datum Zulassung bzw. Satzungsbeschluss"
 | 
			
		||||
 | 
			
		||||
@ -1270,23 +1303,23 @@ msgstr ""
 | 
			
		||||
"Ich, {} {}, bestätige, dass die notwendigen Kontrollschritte durchgeführt "
 | 
			
		||||
"wurden:"
 | 
			
		||||
 | 
			
		||||
#: intervention/forms/modalForms.py:260
 | 
			
		||||
#: intervention/forms/modalForms.py:268
 | 
			
		||||
msgid "Only recorded accounts can be selected for deductions"
 | 
			
		||||
msgstr "Nur verzeichnete Ökokonten können für Abbuchungen verwendet werden."
 | 
			
		||||
 | 
			
		||||
#: intervention/forms/modalForms.py:287
 | 
			
		||||
#: intervention/forms/modalForms.py:295
 | 
			
		||||
msgid "Only shared interventions can be selected"
 | 
			
		||||
msgstr "Nur freigegebene Eingriffe können gewählt werden"
 | 
			
		||||
 | 
			
		||||
#: intervention/forms/modalForms.py:300
 | 
			
		||||
#: intervention/forms/modalForms.py:308
 | 
			
		||||
msgid "New Deduction"
 | 
			
		||||
msgstr "Neue Abbuchung"
 | 
			
		||||
 | 
			
		||||
#: intervention/forms/modalForms.py:301
 | 
			
		||||
#: intervention/forms/modalForms.py:309
 | 
			
		||||
msgid "Enter the information for a new deduction from a chosen eco-account"
 | 
			
		||||
msgstr "Geben Sie die Informationen für eine neue Abbuchung ein."
 | 
			
		||||
 | 
			
		||||
#: intervention/forms/modalForms.py:334
 | 
			
		||||
#: intervention/forms/modalForms.py:342
 | 
			
		||||
msgid ""
 | 
			
		||||
"Eco-account {} is not recorded yet. You can only deduct from recorded "
 | 
			
		||||
"accounts."
 | 
			
		||||
@ -1294,7 +1327,7 @@ msgstr ""
 | 
			
		||||
"Ökokonto {} ist noch nicht verzeichnet. Abbuchungen können nur von "
 | 
			
		||||
"verzeichneten Ökokonten erfolgen."
 | 
			
		||||
 | 
			
		||||
#: intervention/forms/modalForms.py:347
 | 
			
		||||
#: intervention/forms/modalForms.py:355
 | 
			
		||||
msgid ""
 | 
			
		||||
"The account {} has not enough surface for a deduction of {} m². There are "
 | 
			
		||||
"only {} m² left"
 | 
			
		||||
@ -1302,34 +1335,6 @@ msgstr ""
 | 
			
		||||
"Das Ökokonto {} hat für eine Abbuchung von {} m² nicht ausreichend "
 | 
			
		||||
"Restfläche. Es stehen noch {} m² zur Verfügung."
 | 
			
		||||
 | 
			
		||||
#: intervention/models.py:326
 | 
			
		||||
msgid "Registration office file number missing"
 | 
			
		||||
msgstr "Aktenzeichen Zulassungsbehörde fehlt"
 | 
			
		||||
 | 
			
		||||
#: intervention/models.py:329
 | 
			
		||||
msgid "Conservation office file number missing"
 | 
			
		||||
msgstr "Aktenzeichen Naturschutzbehörde fehlt"
 | 
			
		||||
 | 
			
		||||
#: intervention/models.py:332
 | 
			
		||||
msgid "Responsible data missing"
 | 
			
		||||
msgstr "Daten zu Verantwortlichen fehlen"
 | 
			
		||||
 | 
			
		||||
#: intervention/models.py:346
 | 
			
		||||
msgid "Revocation exists"
 | 
			
		||||
msgstr "Widerspruch liegt vor"
 | 
			
		||||
 | 
			
		||||
#: intervention/models.py:349
 | 
			
		||||
msgid "Registration date missing"
 | 
			
		||||
msgstr "Datum Zulassung bzw. Satzungsbeschluss fehlt"
 | 
			
		||||
 | 
			
		||||
#: intervention/models.py:352
 | 
			
		||||
msgid "Binding on missing"
 | 
			
		||||
msgstr "Datum Bestandskraft fehlt"
 | 
			
		||||
 | 
			
		||||
#: intervention/models.py:354
 | 
			
		||||
msgid "Legal data missing"
 | 
			
		||||
msgstr "Rechtliche Daten fehlen"
 | 
			
		||||
 | 
			
		||||
#: intervention/tables.py:45
 | 
			
		||||
#: intervention/templates/intervention/detail/includes/revocation.html:8
 | 
			
		||||
#: intervention/templates/intervention/detail/includes/revocation.html:57
 | 
			
		||||
@ -1404,61 +1409,73 @@ msgstr "Abbuchungen von Ökokonten"
 | 
			
		||||
msgid "Exist"
 | 
			
		||||
msgstr "Vorhanden"
 | 
			
		||||
 | 
			
		||||
#: intervention/views.py:79
 | 
			
		||||
#: intervention/utils/quality.py:70
 | 
			
		||||
msgid "Revocation exists"
 | 
			
		||||
msgstr "Widerspruch liegt vor"
 | 
			
		||||
 | 
			
		||||
#: intervention/utils/quality.py:76
 | 
			
		||||
msgid "Binding date"
 | 
			
		||||
msgstr "Datum Bestandskraft"
 | 
			
		||||
 | 
			
		||||
#: intervention/utils/quality.py:79
 | 
			
		||||
msgid "Laws"
 | 
			
		||||
msgstr "Gesetze"
 | 
			
		||||
 | 
			
		||||
#: intervention/utils/quality.py:98
 | 
			
		||||
msgid "No compensation of any type found (Compensation, Payment, Deduction)"
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Kein Ausgleich jeglicher Art gefunden (Kompensation, Ersatzzahlung, "
 | 
			
		||||
"Abbuchung)"
 | 
			
		||||
 | 
			
		||||
#: intervention/views.py:80
 | 
			
		||||
msgid "Intervention {} added"
 | 
			
		||||
msgstr "Eingriff {} hinzugefügt"
 | 
			
		||||
 | 
			
		||||
#: intervention/views.py:221
 | 
			
		||||
#: intervention/views.py:231
 | 
			
		||||
msgid "This intervention has a revocation from {}"
 | 
			
		||||
msgstr "Es existiert ein Widerspruch vom {}"
 | 
			
		||||
 | 
			
		||||
#: intervention/views.py:237
 | 
			
		||||
msgid ""
 | 
			
		||||
"Remember: This data has not been shared with you, yet. This means you can "
 | 
			
		||||
"only read but can not edit or perform any actions like running a check or "
 | 
			
		||||
"recording."
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Beachten Sie: Diese Daten sind für Sie noch nicht freigegeben worden. Das "
 | 
			
		||||
"bedeutet, dass Sie nur lesenden Zugriff hierauf haben und weder bearbeiten, "
 | 
			
		||||
"noch Prüfungen durchführen oder verzeichnen können."
 | 
			
		||||
 | 
			
		||||
#: intervention/views.py:264
 | 
			
		||||
#: intervention/views.py:274
 | 
			
		||||
msgid "Intervention {} edited"
 | 
			
		||||
msgstr "Eingriff {} bearbeitet"
 | 
			
		||||
 | 
			
		||||
#: intervention/views.py:296
 | 
			
		||||
#: intervention/views.py:275
 | 
			
		||||
msgid "Status of Checked and Recorded reseted"
 | 
			
		||||
msgstr "'Geprüft' und 'Verzeichnet' sind zurückgesetzt worden"
 | 
			
		||||
 | 
			
		||||
#: intervention/views.py:307
 | 
			
		||||
msgid "{} removed"
 | 
			
		||||
msgstr "{} entfernt"
 | 
			
		||||
 | 
			
		||||
#: intervention/views.py:317
 | 
			
		||||
#: intervention/views.py:328
 | 
			
		||||
msgid "Revocation removed"
 | 
			
		||||
msgstr "Widerspruch entfernt"
 | 
			
		||||
 | 
			
		||||
#: intervention/views.py:343
 | 
			
		||||
#: intervention/views.py:354
 | 
			
		||||
msgid "{} has already been shared with you"
 | 
			
		||||
msgstr "{} wurde bereits für Sie freigegeben"
 | 
			
		||||
 | 
			
		||||
#: intervention/views.py:348
 | 
			
		||||
#: intervention/views.py:359
 | 
			
		||||
msgid "{} has been shared with you"
 | 
			
		||||
msgstr "{} ist nun für Sie freigegeben"
 | 
			
		||||
 | 
			
		||||
#: intervention/views.py:355
 | 
			
		||||
#: intervention/views.py:366
 | 
			
		||||
msgid "Share link invalid"
 | 
			
		||||
msgstr "Freigabelink ungültig"
 | 
			
		||||
 | 
			
		||||
#: intervention/views.py:376
 | 
			
		||||
#: intervention/views.py:387
 | 
			
		||||
msgid "Share settings updated"
 | 
			
		||||
msgstr "Freigabe Einstellungen aktualisiert"
 | 
			
		||||
 | 
			
		||||
#: intervention/views.py:395
 | 
			
		||||
#: intervention/views.py:406
 | 
			
		||||
msgid "Check performed"
 | 
			
		||||
msgstr "Prüfung durchgeführt"
 | 
			
		||||
 | 
			
		||||
#: intervention/views.py:415
 | 
			
		||||
#: intervention/views.py:426
 | 
			
		||||
msgid "Revocation added"
 | 
			
		||||
msgstr "Widerspruch hinzugefügt"
 | 
			
		||||
 | 
			
		||||
#: intervention/views.py:482
 | 
			
		||||
#: intervention/views.py:493
 | 
			
		||||
msgid "There are errors on this intervention:"
 | 
			
		||||
msgstr "Es liegen Fehler in diesem Eingriff vor:"
 | 
			
		||||
 | 
			
		||||
@ -1499,7 +1516,8 @@ msgstr "Löschen"
 | 
			
		||||
msgid "You are about to remove {} {}"
 | 
			
		||||
msgstr "Sie sind dabei {} {} zu löschen"
 | 
			
		||||
 | 
			
		||||
#: konova/forms.py:246 templates/form/collapsable/form.html:45
 | 
			
		||||
#: konova/forms.py:246 konova/utils/quality.py:44 konova/utils/quality.py:46
 | 
			
		||||
#: templates/form/collapsable/form.html:45
 | 
			
		||||
msgid "Geometry"
 | 
			
		||||
msgstr "Geometrie"
 | 
			
		||||
 | 
			
		||||
@ -1653,6 +1671,16 @@ msgid "This data is not shared with you"
 | 
			
		||||
msgstr "Diese Daten sind für Sie nicht freigegeben"
 | 
			
		||||
 | 
			
		||||
#: konova/utils/message_templates.py:16
 | 
			
		||||
msgid ""
 | 
			
		||||
"Remember: This data has not been shared with you, yet. This means you can "
 | 
			
		||||
"only read but can not edit or perform any actions like running a check or "
 | 
			
		||||
"recording."
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Beachten Sie: Diese Daten sind für Sie noch nicht freigegeben worden. Das "
 | 
			
		||||
"bedeutet, dass Sie nur lesenden Zugriff hierauf haben und weder bearbeiten, "
 | 
			
		||||
"noch Prüfungen durchführen oder verzeichnen können."
 | 
			
		||||
 | 
			
		||||
#: konova/utils/message_templates.py:17
 | 
			
		||||
msgid "You need to be part of another user group."
 | 
			
		||||
msgstr "Hierfür müssen Sie einer anderen Nutzergruppe angehören!"
 | 
			
		||||
 | 
			
		||||
@ -1668,6 +1696,10 @@ msgstr "<a href=\"{}\">Schauen Sie rein</a>"
 | 
			
		||||
msgid "{} has been checked successfully by user {}! {}"
 | 
			
		||||
msgstr "{} wurde erfolgreich vom Nutzer {} geprüft! {}"
 | 
			
		||||
 | 
			
		||||
#: konova/utils/quality.py:32
 | 
			
		||||
msgid "missing"
 | 
			
		||||
msgstr "fehlt"
 | 
			
		||||
 | 
			
		||||
#: konova/views.py:115
 | 
			
		||||
msgid "Deadline removed"
 | 
			
		||||
msgstr "Frist gelöscht"
 | 
			
		||||
@ -3114,218 +3146,3 @@ msgstr ""
 | 
			
		||||
#: venv/lib/python3.7/site-packages/fontawesome_5/fields.py:16
 | 
			
		||||
msgid "A fontawesome icon field"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#~ msgid "After"
 | 
			
		||||
#~ msgstr "Nach"
 | 
			
		||||
 | 
			
		||||
#~ msgid "Total interventions"
 | 
			
		||||
#~ msgstr "Insgesamt"
 | 
			
		||||
 | 
			
		||||
#~ msgid "Amount total"
 | 
			
		||||
#~ msgstr "Anzahl insgesamt"
 | 
			
		||||
 | 
			
		||||
#~ msgid "Amount checked"
 | 
			
		||||
#~ msgstr "Anzahl geprüft"
 | 
			
		||||
 | 
			
		||||
#~ msgid "Amount recorded"
 | 
			
		||||
#~ msgstr "Anzahl verzeichnet"
 | 
			
		||||
 | 
			
		||||
#~ msgid "Funding by..."
 | 
			
		||||
#~ msgstr "Gefördert mit..."
 | 
			
		||||
 | 
			
		||||
#~ msgid "Invalid input"
 | 
			
		||||
#~ msgstr "Eingabe fehlerhaft"
 | 
			
		||||
 | 
			
		||||
#~ msgid "Map"
 | 
			
		||||
#~ msgstr "Karte"
 | 
			
		||||
 | 
			
		||||
#~ msgid "Where does the intervention take place"
 | 
			
		||||
#~ msgstr "Wo findet der Eingriff statt"
 | 
			
		||||
 | 
			
		||||
#~ msgid "Which intervention type is this"
 | 
			
		||||
#~ msgstr "Welcher Eingriffstyp"
 | 
			
		||||
 | 
			
		||||
#~ msgid "Based on which law"
 | 
			
		||||
#~ msgstr "Basiert auf welchem Recht"
 | 
			
		||||
 | 
			
		||||
#~ msgid "Data provider"
 | 
			
		||||
#~ msgstr "Datenbereitsteller"
 | 
			
		||||
 | 
			
		||||
#~ msgid "Who provides the data for the intervention"
 | 
			
		||||
#~ msgstr "Wer stellt die Daten für den Eingriff zur Verfügung"
 | 
			
		||||
 | 
			
		||||
#~ msgid "Organization"
 | 
			
		||||
#~ msgstr "Organisation"
 | 
			
		||||
 | 
			
		||||
#~ msgid "Data provider details"
 | 
			
		||||
#~ msgstr "Datenbereitsteller Details"
 | 
			
		||||
 | 
			
		||||
#~ msgid "Further details"
 | 
			
		||||
#~ msgstr "Weitere Details"
 | 
			
		||||
 | 
			
		||||
#~ msgid "Files"
 | 
			
		||||
#~ msgstr "Dateien"
 | 
			
		||||
 | 
			
		||||
#~ msgid "Transfer note"
 | 
			
		||||
#~ msgstr "Verwendungszweck"
 | 
			
		||||
 | 
			
		||||
#~ msgid "Note for money transfer"
 | 
			
		||||
#~ msgstr "Verwendungszweck für Überweisung"
 | 
			
		||||
 | 
			
		||||
#~ msgid "Transfer comment"
 | 
			
		||||
#~ msgstr "Verwendungszweck"
 | 
			
		||||
 | 
			
		||||
#~ msgid "Edit {}"
 | 
			
		||||
#~ msgstr "Bearbeite {}"
 | 
			
		||||
 | 
			
		||||
#~ msgid "Delete {}"
 | 
			
		||||
#~ msgstr "Lösche {}"
 | 
			
		||||
 | 
			
		||||
#~ msgid "Actions"
 | 
			
		||||
#~ msgstr "Aktionen"
 | 
			
		||||
 | 
			
		||||
#~ msgid "Missing surfaces: "
 | 
			
		||||
#~ msgstr "Fehlende Flächen: "
 | 
			
		||||
 | 
			
		||||
#~ msgid "This will remove '{}'. Are you sure?"
 | 
			
		||||
#~ msgstr "Hiermit wird '{}' gelöscht. Sind Sie sicher?"
 | 
			
		||||
 | 
			
		||||
#~ msgid "Your own"
 | 
			
		||||
#~ msgstr "Eigene"
 | 
			
		||||
 | 
			
		||||
#~ msgid "Quickstart"
 | 
			
		||||
#~ msgstr "Schnellstart"
 | 
			
		||||
 | 
			
		||||
#~ msgid "Logged in as"
 | 
			
		||||
#~ msgstr "Eingeloggt als"
 | 
			
		||||
 | 
			
		||||
#~ msgid "Last login on"
 | 
			
		||||
#~ msgstr "Zuletzt eingeloggt am"
 | 
			
		||||
 | 
			
		||||
#~ msgid "Add new eco account"
 | 
			
		||||
#~ msgstr "Neues Ökokonto hinzufügen"
 | 
			
		||||
 | 
			
		||||
#~ msgid "Delete EMA"
 | 
			
		||||
#~ msgstr "Lösche EMA"
 | 
			
		||||
 | 
			
		||||
#~ msgid "Menu"
 | 
			
		||||
#~ msgstr "Menü"
 | 
			
		||||
 | 
			
		||||
#~ msgid "Process"
 | 
			
		||||
#~ msgstr "Vorgang"
 | 
			
		||||
 | 
			
		||||
#~ msgid "Process management"
 | 
			
		||||
#~ msgstr "Vorgangsverwaltung"
 | 
			
		||||
 | 
			
		||||
#~ msgid "New process"
 | 
			
		||||
#~ msgstr "Neuer Vorgang"
 | 
			
		||||
 | 
			
		||||
#~ msgid "Intervention management"
 | 
			
		||||
#~ msgstr "Eingriffsverwaltung"
 | 
			
		||||
 | 
			
		||||
#~ msgid "Show intervention"
 | 
			
		||||
#~ msgstr "Zeige Eingriffe"
 | 
			
		||||
 | 
			
		||||
#~ msgid "Eco-account management"
 | 
			
		||||
#~ msgstr "Ökokontoverwaltung"
 | 
			
		||||
 | 
			
		||||
#~ msgid "Show eco-accounts"
 | 
			
		||||
#~ msgstr "Zeige Ökokonten"
 | 
			
		||||
 | 
			
		||||
#~ msgid "You are currently working as "
 | 
			
		||||
#~ msgstr "Sie arbeiten gerade als "
 | 
			
		||||
 | 
			
		||||
#~ msgid "Change..."
 | 
			
		||||
#~ msgstr "Ändern..."
 | 
			
		||||
 | 
			
		||||
#~ msgid ""
 | 
			
		||||
#~ "Interventions must be part of a process. Please fill in the missing data "
 | 
			
		||||
#~ "for the process"
 | 
			
		||||
#~ msgstr ""
 | 
			
		||||
#~ "Eingriffe müssen zu einem Vorgang gehören. Bitte geben SIe die fehlenden "
 | 
			
		||||
#~ "Daten für den Vorgang ein."
 | 
			
		||||
 | 
			
		||||
#~ msgid "You are working as"
 | 
			
		||||
#~ msgstr "Sie arbeiten gerade als "
 | 
			
		||||
 | 
			
		||||
#~ msgid "Role changed"
 | 
			
		||||
#~ msgstr "Rolle geändert"
 | 
			
		||||
 | 
			
		||||
#~ msgid "Official"
 | 
			
		||||
#~ msgstr "Amtlich"
 | 
			
		||||
 | 
			
		||||
#~ msgid "Company"
 | 
			
		||||
#~ msgstr "Firma"
 | 
			
		||||
 | 
			
		||||
#~ msgid "NGO"
 | 
			
		||||
#~ msgstr "NGO"
 | 
			
		||||
 | 
			
		||||
#~ msgid "Licencing Authority"
 | 
			
		||||
#~ msgstr "Zulassungsbehörde"
 | 
			
		||||
 | 
			
		||||
#~ msgid "Proper title of the process"
 | 
			
		||||
#~ msgstr "Titel des Vorgangs"
 | 
			
		||||
 | 
			
		||||
#~ msgid "Which process type is this"
 | 
			
		||||
#~ msgstr "Welcher Vorgangstyp"
 | 
			
		||||
 | 
			
		||||
#~ msgid "Licencing document identifier"
 | 
			
		||||
#~ msgstr "Aktenzeichen Zulassungsbehörde"
 | 
			
		||||
 | 
			
		||||
#~ msgid "Comment licensing authority"
 | 
			
		||||
#~ msgstr "Kommentar Zulassungsbehörde"
 | 
			
		||||
 | 
			
		||||
#~ msgid "Registration document identifier"
 | 
			
		||||
#~ msgstr "Aktenzeichen Eintragungsstelle"
 | 
			
		||||
 | 
			
		||||
#~ msgid "Edit process"
 | 
			
		||||
#~ msgstr "Vorgang bearbeiten"
 | 
			
		||||
 | 
			
		||||
#~ msgid "private"
 | 
			
		||||
#~ msgstr "privat"
 | 
			
		||||
 | 
			
		||||
#~ msgid "accessible"
 | 
			
		||||
#~ msgstr "bereitgestellt"
 | 
			
		||||
 | 
			
		||||
#~ msgid "licensed"
 | 
			
		||||
#~ msgstr "genehmigt"
 | 
			
		||||
 | 
			
		||||
#~ msgid "official"
 | 
			
		||||
#~ msgstr "bestandskräftig"
 | 
			
		||||
 | 
			
		||||
#~ msgid ""
 | 
			
		||||
#~ "A process is based on an intervention. Please fill in the missing data "
 | 
			
		||||
#~ "for this intervention"
 | 
			
		||||
#~ msgstr ""
 | 
			
		||||
#~ "Ein Vorgang basiert immer auf einem Eingriff. Bitte geben Sie die "
 | 
			
		||||
#~ "fehlenden Daten für diesen Eingriff ein"
 | 
			
		||||
 | 
			
		||||
#~ msgid "{} status changed from {} to {}"
 | 
			
		||||
#~ msgstr "{} Status von {} auf {} geändert"
 | 
			
		||||
 | 
			
		||||
#~ msgid "Process {} added"
 | 
			
		||||
#~ msgstr "Vorgang {} hinzugefügt"
 | 
			
		||||
 | 
			
		||||
#~ msgid "Current role"
 | 
			
		||||
#~ msgstr "Aktuelle Rolle"
 | 
			
		||||
 | 
			
		||||
#~ msgid "Object title"
 | 
			
		||||
#~ msgstr "Objekt Titel"
 | 
			
		||||
 | 
			
		||||
#~ msgid "Object identifier"
 | 
			
		||||
#~ msgstr "Objekt Identifikator"
 | 
			
		||||
 | 
			
		||||
#~ msgid "Open process"
 | 
			
		||||
#~ msgstr "Vorgang öffnen"
 | 
			
		||||
 | 
			
		||||
#~ msgid "Delete process"
 | 
			
		||||
#~ msgstr "Vorgang löschen"
 | 
			
		||||
 | 
			
		||||
#~ msgid "Licensing authority document identifier"
 | 
			
		||||
#~ msgstr "Aktenzeichen Zulassungsbehörde"
 | 
			
		||||
 | 
			
		||||
#~ msgid "Registration office document identifier"
 | 
			
		||||
#~ msgstr "Aktenzeichen Eintragungsstelle"
 | 
			
		||||
 | 
			
		||||
#~ msgid "You have been logged out"
 | 
			
		||||
#~ msgstr "Sie wurden ausgeloggt"
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user